1 //+------------------------------------------------------------------+
\r
3 //| Copyright © 2011, Zarko Asenov |
\r
5 //+------------------------------------------------------------------+
\r
6 #property copyright "Copyright © 2011, Zarko Asenov"
\r
9 //+------------------------------------------------------------------+
\r
11 //+------------------------------------------------------------------+
\r
12 // #define MacrosHello "Hello, world!"
\r
13 // #define MacrosYear 2005
\r
15 //+------------------------------------------------------------------+
\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
25 //+------------------------------------------------------------------+
\r
27 //+------------------------------------------------------------------+
\r
28 // #import "stdlib.ex4"
\r
29 // string ErrorDescription(int error_code);
\r
31 //+------------------------------------------------------------------+
\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
46 int i, j, iCounted, iLimit;
\r
47 double dGain, dBestGain, dError, dLeastError, dEC;
\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
56 gdAlpha = 2.0 / (ma_period + 1.0);
\r
58 for(i = iLimit-1; i >= 0; i--)
\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
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
70 dLeastError = MathAbs(dError);
\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
76 if (i == value_index) break;
\r