Cześć,
tworzę symulację zakładów bukmacherskich i napisałem kod dla jednego z systemów stawkowania. Jest tutaj sporo liczenia, ponad 400 mln zakładów do przesymulowania. Sprawdzając kod na mniejszych liczbach wszystko działa jak należy. Próbując odpalić kod na docelowych wartościach wyskakuje błąd '1004'. Zmieniając wartości metodą prób i błędów stwierdzam, że dzieje się to zawsze po takiej samej ilości obliczeń (przejście najbardziej wewnętrznej pętli jakieś 7-9 mln razy). Kompletnie nie wiem dlaczego, bo jedynie nadpisuję wartości zmiennych.
Bardzo proszę o poradę. ;)
Option Explicit
Public Const ilosc_zakladow As Byte = 250
Public Const ilosc_symulacji As Integer = 10000
Public Const kapital_poczatkowy As Byte = 100
Public Const odchylenie_w_kurs As Single = 0.05
Public Const odchylenie_w_edge As Single = 0.1
Public Type zaklad
kurs As Single
edge As Single
prawdopodobienstwo As Single
wynik As Boolean
stawka As Single
zwrot As Single
budzet_po_zakladzie As Single
End Type
Sub plaska_stawka()
Application.ScreenUpdating = False
Cells(1, 1).Value = "edge"
Cells(1, 2).Value = "kurs"
Cells(1, 3).Value = "stawka"
Cells(1, 4).Value = "średni bankroll"
Cells(1, 5).Value = "odchylenie bankrolla"
Cells(1, 6).Value = "prawdopodobieństwo bankructwa"
Cells(1, 7).Value = "prawdopodobieństwo nie odniesienia zysku"
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
Dim m As Integer
Dim n As Integer
Dim o As Integer
Dim wyniki(1 To ilosc_symulacji) As Single
Dim wyniki3(1 To ilosc_symulacji) As Byte ' prawdpodobienstwo bankructwa
Dim wyniki4(1 To ilosc_symulacji) As Byte ' prawdpodobienstwo nie odniesienia zysku
Dim wyniki5(1 To ilosc_zakladow) As Single 'do zerowania wyniku, jeśli wykorzystało się budżet
Dim docelowy_edge(1 To 7) As Single
docelowy_edge(1) = 0.9
docelowy_edge(2) = 0.95
docelowy_edge(3) = 1
docelowy_edge(4) = 1.05
docelowy_edge(5) = 1.1
docelowy_edge(6) = 1.15
docelowy_edge(7) = 1.2
n = n + 1
Dim docelowy_kurs(1 To 5) As Single
docelowy_kurs(1) = 1.67
docelowy_kurs(2) = 2
docelowy_kurs(3) = 2.5
docelowy_kurs(4) = 3.33
docelowy_kurs(5) = 5
Dim ustalona_stawka(1 To 5) As Byte
ustalona_stawka(1) = 1
ustalona_stawka(2) = 2
ustalona_stawka(3) = 3
ustalona_stawka(4) = 5
ustalona_stawka(5) = 10
Dim plaska_stawka_tablica(1 To ilosc_zakladow) As zaklad
For m = 1 To 5
For k = 1 To 7
For l = 1 To 5
For j = 1 To ilosc_symulacji
For i = 1 To ilosc_zakladow
With plaska_stawka_tablica(i)
.kurs = Round(WorksheetFunction.Norm_Inv(Rnd(), docelowy_kurs(l), odchylenie_w_kurs), 2)
.edge = WorksheetFunction.Norm_Inv(Rnd(), docelowy_edge(k), odchylenie_w_edge)
.prawdopodobienstwo = plaska_stawka_tablica(i).edge / plaska_stawka_tablica(i).kurs
.wynik = Rnd() < plaska_stawka_tablica(i).prawdopodobienstwo
.stawka = ustalona_stawka(m)
.zwrot = Round(Abs(plaska_stawka_tablica(i).kurs * plaska_stawka_tablica(i).stawka * plaska_stawka_tablica(i).wynik), 2)
End With
Next i
plaska_stawka_tablica(1).budzet_po_zakladzie = kapital_poczatkowy + plaska_stawka_tablica(1).zwrot - plaska_stawka_tablica(1).stawka
For i = 2 To ilosc_zakladow
plaska_stawka_tablica(i).budzet_po_zakladzie = plaska_stawka_tablica(i - 1).budzet_po_zakladzie _
+ plaska_stawka_tablica(i).zwrot _
- plaska_stawka_tablica(i).stawka
Next i
For o = 1 To ilosc_zakladow
wyniki5(o) = plaska_stawka_tablica(o).budzet_po_zakladzie
Next o
wyniki(j) = plaska_stawka_tablica(ilosc_zakladow).budzet_po_zakladzie
If Application.WorksheetFunction.Min(wyniki5) <= 0 Then wyniki(j) = 0
Next j
'do wydrukowania symulacji
'For i = 1 To 250
'Cells(i + 1, 2).Value = i
'Cells(i + 1, 3).Value = plaska_stawka_tablica(i).kurs
'Cells(i + 1, 4).Value = plaska_stawka_tablica(i).edge
'Cells(i + 1, 5).Value = plaska_stawka_tablica(i).prawdopodobienstwo
'Cells(i + 1, 6).Value = plaska_stawka_tablica(i).wynik
'Cells(i + 1, 7).Value = plaska_stawka_tablica(i).stawka
'Cells(i + 1, 8).Value = plaska_stawka_tablica(i).zwrot
'Cells(i + 1, 9).Value = plaska_stawka_tablica(i).budzet_po_zakladzie
'Next i
For i = 1 To ilosc_symulacji
If wyniki(i) = 0 Then wyniki3(i) = 1 Else: wyniki3(i) = 0
If wyniki(i) <= kapital_poczatkowy Then wyniki4(i) = 1 Else: wyniki4(i) = 0
Next i
Cells(n + 1, 1).Value = docelowy_edge(k)
Cells(n + 1, 2).Value = docelowy_kurs(l)
Cells(n + 1, 3).Value = ustalona_stawka(m)
Cells(n + 1, 4).Value = Application.WorksheetFunction.Average(wyniki)
Cells(n + 1, 5).Value = Application.WorksheetFunction.StDev(wyniki)
Cells(n + 1, 6).Value = Application.WorksheetFunction.Average(wyniki3)
Cells(n + 1, 7).Value = Application.WorksheetFunction.Average(wyniki4)
n = n + 1
Next l
Next k
Next m
End Sub