Reecriture de code VBA utilisant 1D-Array en 2D array
Bonjour a tous,
J'ai deux procedures SMA et EMA calculant des moyennes mobiles prenant en arguments une serie de donnees 1D (Prix), une periode et retournant le resultat que j'appelle result. Ces procedures fonctionnent bien.
Mon souci est que j'essaie de les utiliser avec des tableaux 2D (Date, Prix) dans la fonction ci-dessous Function CalcMACDf qui prend en argument varTimeSeries 2D (Date, Prix).
J'ai deux idees que je ne sais pas du tout mettre en pratique :( :
1- Adapter les routines SMA et EMA pour qu'elles puissent prendre en argument des tableaux 2D (en gardant l'ordre ascendant des dates)
2- Ou reecrire la fonction CalcMACDf pour ne passer que la deuxieme colonne de varTimeSeries dans les routines SMA et EMA. Le "hic" ici c'est qu'il faudrait "reconstruire" le tableau complet avec la date
strKey =CStr(varTimeSeries(i, 1)) qui represente ma cle dans d'autres fonctions.
Quelqu'un pourrait-il me guider avec ce probleme de reecriture?
Merci d'avance a tous!
Voici les codes:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Sub SMA(DataSeries, Period, result)
Dim count As Integer
count = UBound(DataSeries)
Dim smaarr() As Double
Dim i, j As Integer
Dim sum
ReDim smaarr(1 To count) As Double
For i = Period To count
sum = 0
For j = i - Period + 1 To i
sum = sum + DataSeries(j)
Next j
smaarr(i) = sum / Period
Next i
result = smaarr
End Sub |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Sub ema(DataSeries, Period, result)
Dim count, i
count = UBound(DataSeries)
Dim emaArr() As Double
Dim smaarr
ReDim emaArr(1 To count) As Double
SMA DataSeries, Period, smaarr
' EMA calculation
emaArr(Period) = smaarr(Period)
For i = Period + 1 To count
emaArr(i) = (2 / (Period + 1)) * DataSeries(i) + ((1 - (2 / (Period + 1))) * emaArr(i - 1))
Next i
result = emaArr
End Sub |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| Public Function CalcMACDf(ByRef varTimeSeries As Variant, _
ByVal intPeriodDays1 As Integer, _
ByVal intPeriodDays2 As Integer, _
ByVal intPeriodDays3 As Integer, _
ByRef dicmacdArr As Dictionary, _
ByRef dicmacdtemp As Dictionary, _
ByRef dicPosMACDf As Dictionary, _
ByRef dicNegMACDf As Dictionary)
Dim dblMACDarray As Double
Dim dblMACDf As Double
Dim strKey As String
Dim i As Integer
Set dicmacdArr = New Dictionary
Set dicmacdtemp = New Dictionary
Set dicNegMACDf = New Dictionary
Set dicPosMACDf = New Dictionary
Dim count As Integer
Dim ema1, ema2
count = UBound(varTimeSeries)
ema varTimeSeries, intPeriodDays2, ema2
ema varTimeSeries, intPeriodDays1, ema1
' MACD Calculation
For i = intPeriodDays2 To count
strKey = CStr(varTimeSeries(i, 1))
dblMACDarray = -ema1(i) + ema2(i)
dicmacdArr.Add strKey, dblMACDarray
Next i
' MACD Calculation
SMA dicmacdArr, intPeriodDays3, dicmacdtemp
For i = intPeriodDays2 To count
strKey = CStr(varTimeSeries(i, 1))
dblMACDf = dicmacdArr(i - intPeriodDays2 + 1) - dicmacdtemp(i - intPeriodDays2 + 1)
If dblMACDf < 0 Then
dicNegMACDf.Add strKey, dblMACDf
Else
dicPosMACDf.Add strKey, dblMACDf
End If
Next i
End Function |