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
Partager