-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathHMAInclude.mqh
127 lines (112 loc) · 4.13 KB
/
HMAInclude.mqh
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#property copyright "2023, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
class CHull
{
private :
int m_fullPeriod;
int m_halfPeriod;
int m_sqrtPeriod;
int m_arraySize;
double m_weight1;
double m_weight2;
double m_weight3;
struct sHullArrayStruct
{
double value;
double value3;
double wsum1;
double wsum2;
double wsum3;
double lsum1;
double lsum2;
double lsum3;
};
sHullArrayStruct m_array[];
public :
CHull() : m_fullPeriod(1), m_halfPeriod(1), m_sqrtPeriod(1), m_arraySize(-1) { }
~CHull() { ArrayFree(m_array); }
///
///
///
bool init(int period, double divisor)
{
m_fullPeriod = (int)(period>1 ? period : 1);
m_halfPeriod = (int)(m_fullPeriod>1 ? m_fullPeriod/(divisor>1 ? divisor : 1) : 1);
m_sqrtPeriod = (int) MathSqrt(m_fullPeriod);
m_arraySize = -1; m_weight1 = m_weight2 = m_weight3 = 1;
return(true);
}
//
//
//
double calculate( double value, int i, int bars)
{
if (m_arraySize<bars) { m_arraySize = ArrayResize(m_array,bars+500); if (m_arraySize<bars) return(0); }
//
//
//
m_array[i].value=value;
if (i>m_fullPeriod)
{
m_array[i].wsum1 = m_array[i-1].wsum1+value*m_halfPeriod-m_array[i-1].lsum1;
m_array[i].lsum1 = m_array[i-1].lsum1+value-m_array[i-m_halfPeriod].value;
m_array[i].wsum2 = m_array[i-1].wsum2+value*m_fullPeriod-m_array[i-1].lsum2;
m_array[i].lsum2 = m_array[i-1].lsum2+value-m_array[i-m_fullPeriod].value;
}
else
{
m_array[i].wsum1 = m_array[i].wsum2 =
m_array[i].lsum1 = m_array[i].lsum2 = m_weight1 = m_weight2 = 0;
for(int k=0, w1=m_halfPeriod, w2=m_fullPeriod; w2>0 && i>=k; k++, w1--, w2--)
{
if (w1>0)
{
m_array[i].wsum1 += m_array[i-k].value*w1;
m_array[i].lsum1 += m_array[i-k].value;
m_weight1 += w1;
}
m_array[i].wsum2 += m_array[i-k].value*w2;
m_array[i].lsum2 += m_array[i-k].value;
m_weight2 += w2;
}
}
m_array[i].value3=2.0*m_array[i].wsum1/m_weight1-m_array[i].wsum2/m_weight2;
//
//---
//
if (i>m_sqrtPeriod)
{
m_array[i].wsum3 = m_array[i-1].wsum3+m_array[i].value3*m_sqrtPeriod-m_array[i-1].lsum3;
m_array[i].lsum3 = m_array[i-1].lsum3+m_array[i].value3-m_array[i-m_sqrtPeriod].value3;
}
else
{
m_array[i].wsum3 =
m_array[i].lsum3 = m_weight3 = 0;
for(int k=0, w3=m_sqrtPeriod; w3>0 && i>=k; k++, w3--)
{
m_array[i].wsum3 += m_array[i-k].value3*w3;
m_array[i].lsum3 += m_array[i-k].value3;
m_weight3 += w3;
}
}
return(m_array[i].wsum3/m_weight3);
}
};
CHull iHull;
double getPrice(ENUM_APPLIED_PRICE tprice, const double &open[], const double &high[], const double &low[], const double &close[], int i)
{
switch(tprice)
{
case PRICE_CLOSE: return(close[i]);
case PRICE_OPEN: return(open[i]);
case PRICE_HIGH: return(high[i]);
case PRICE_LOW: return(low[i]);
case PRICE_MEDIAN: return((high[i]+low[i])/2.0);
case PRICE_TYPICAL: return((high[i]+low[i]+close[i])/3.0);
case PRICE_WEIGHTED: return((high[i]+low[i]+close[i]+close[i])/4.0);
}
return(0);
}