Hallo Bachus,
dein neuer Code enthält nicht die Korrekturen, die ich dir bereits genannt habe, dafür aber zusätzliche Fehler. Ich habe dir die Korrekturen in die Ausgangsfassung eingefügt. Damit du BlackScholes, was das auch immer ist, aufrufen kannst, solltest du S, K, T, r und TargetPrice öffentlich deklarieren, weil sie in der Funktion ImVola nicht initialisiert werden und daher bestenfalls den lokalen Wert 0 oder Leerstring haben. Es braucht differenz = 0 nicht erreicht zu werden. Ich würde das Abbruchkriterium für die Do-Loop-Schleife so wählen, dass hinreichende Genauigkeit erreicht wird.
Function ImVola(S As Double, K As Double, _
T As Double, r As Double, TargetPrice As Double, _
Optional PutCall As String = "CALL")
Application.Volatile 'ist das wirklich erforderlich?
Dim x1 As Double, x2 As Double
Dim differenz As Double, sigma As Double
x1 = 0
x2 = 20
Do While Abs(differenz) > 0.0000000001 'oder ein passender Wert
'Do While differenz <> 0
sigma = (x2 - x1 / 2)
differenz = (BlackScholes(S, K, T, r, sigma, [PutCall as String="call"])) - TargetPrice
If differenz > 0 Then x2 = sigma Else x1 = sigma 'falls =0 wird Schleife verlassen
'If differenz > 0 Then x2 As sigma
'If differenz 0 Then GoTo part1
if differenz 0 Then GoTo part1
If differenz 0
sigma = (x2 - x1 / 2)
differenz = (BlackScholes(S, K, T, r, sigma, [PutCall as String="call"])) - TargetPrice
If differenz > 0 Then x2 As sigma
If differenz < 0 Then x1 As sigma
Next
ImVola = sigma
End Function
Vielen Dank im voraus ;) |