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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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