bleh
[mqlkit.git] / include / EhlersLib.mqh
blob8bbbd6d790d5ddd909be40bb9f39d9659d3948aa
1 //+------------------------------------------------------------------+\r
2 //|                                                    EhlersLib.mq4 |\r
3 //|                                   Copyright © 2011, Zarko Asenov |\r
4 //|                                                                  |\r
5 //+------------------------------------------------------------------+\r
6 #property copyright "Copyright © 2011, Zarko Asenov"\r
7 #property link      ""\r
8 \r
9 //+------------------------------------------------------------------+\r
10 //| defines                                                          |\r
11 //+------------------------------------------------------------------+\r
12 // #define MacrosHello   "Hello, world!"\r
13 // #define MacrosYear    2005\r
15 //+------------------------------------------------------------------+\r
16 //| DLL imports                                                      |\r
17 //+------------------------------------------------------------------+\r
18 // #import "user32.dll"\r
19 //   int      SendMessageA(int hWnd,int Msg,int wParam,int lParam);\r
21 // #import "my_expert.dll"\r
22 //   int      ExpertRecalculate(int wParam,int lParam);\r
23 // #import\r
25 //+------------------------------------------------------------------+\r
26 //| EX4 imports                                                      |\r
27 //+------------------------------------------------------------------+\r
28 // #import "stdlib.ex4"\r
29 //   string ErrorDescription(int error_code);\r
30 // #import\r
31 //+------------------------------------------------------------------+\r
33 double gdAlpha = 0;\r
35 void\r
36 iEhlersMAOnArray(\r
37      double &in_signal_buffer[], \r
38      double &in_ema_buffer[],\r
39      int in_buffer_length, \r
40      double &out_ec_buffer[], \r
41      int out_buffer_length, \r
42      int ma_period,\r
43      int ma_gain_limit,\r
44      int value_index)\r
45 {\r
46     int    i, j, iCounted, iLimit;\r
47     double dGain, dBestGain, dError, dLeastError, dEC;\r
48     \r
49     iCounted = IndicatorCounted();\r
50     if(iCounted > 0) iCounted--;\r
51     iLimit = Bars - iCounted;\r
52     if (iLimit > out_buffer_length) iLimit = out_buffer_length;\r
54     if (in_buffer_length < 1 || value_index >= in_buffer_length) return (0.0);\r
55     \r
56     gdAlpha = 2.0 / (ma_period + 1.0);\r
57     \r
58     for(i = iLimit-1; i >= 0; i--)\r
59     {\r
60         double currentPrice = in_signal_buffer[i];\r
61         in_ema_buffer[i] = gdAlpha * currentPrice + (1.0 - gdAlpha) * in_ema_buffer[i+1];\r
62         dLeastError = 1000000.0;\r
63         for(j = -ma_gain_limit; j <= ma_gain_limit; j++)\r
64         {\r
65             dGain = j / 10.0;\r
66             dEC = gdAlpha * (in_ema_buffer[i] + dGain * (currentPrice - out_ec_buffer[i+1])) + (1.0 - gdAlpha) * out_ec_buffer[i+1];\r
67             dError = currentPrice - dEC;\r
68             if(MathAbs(dError) < dLeastError)\r
69             {\r
70                 dLeastError = MathAbs(dError);\r
71                 dBestGain = dGain;\r
72             }\r
73         }\r
74         out_ec_buffer[i] = gdAlpha * (in_ema_buffer[i] + dBestGain * (currentPrice - out_ec_buffer[i+1])) + (1.0 - gdAlpha) * out_ec_buffer[i+1];\r
75         \r
76         if (i == value_index) break;\r
77     }\r