-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathStg_ADX.mqh
131 lines (122 loc) · 5.9 KB
/
Stg_ADX.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
124
125
126
127
128
129
130
131
/**
* @file
* Implements ADX strategy based on the Average Directional Movement Index indicator.
*/
// Includes.
#include "include/enum.h"
// User input params.
INPUT_GROUP("ADX strategy: strategy params");
INPUT float ADX_LotSize = 0; // Lot size
INPUT int ADX_SignalOpenMethod = 0; // Signal open method (-127-127)
INPUT float ADX_SignalOpenLevel = 2.0f; // Signal open level
INPUT int ADX_SignalOpenFilterMethod = 32; // Signal open filter method
INPUT int ADX_SignalOpenFilterTime = 3; // Signal open filter time
INPUT int ADX_SignalOpenBoostMethod = 0; // Signal open boost method
INPUT int ADX_SignalCloseMethod = 4; // Signal close method (-127-127)
INPUT int ADX_SignalCloseFilter = 0; // Signal close filter (-127-127)
INPUT float ADX_SignalCloseLevel = 0.0f; // Signal close level (>0.0001)
INPUT int ADX_PriceStopMethod = 3; // Price stop method (0-127)
INPUT float ADX_PriceStopLevel = 2; // Price stop level
INPUT int ADX_TickFilterMethod = 32; // Tick filter method
INPUT float ADX_MaxSpread = 4.0; // Max spread to trade (pips)
INPUT short ADX_Shift = 0; // Shift (relative to the current bar, 0 - default)
INPUT float ADX_OrderCloseLoss = 80; // Order close loss
INPUT float ADX_OrderCloseProfit = 80; // Order close profit
INPUT int ADX_OrderCloseTime = -30; // Order close time in mins (>0) or bars (<0)
INPUT_GROUP("ADX strategy: ADX indicator params");
INPUT int ADX_Indi_ADX_Period = 16; // Averaging period
INPUT ENUM_APPLIED_PRICE ADX_Indi_ADX_AppliedPrice = PRICE_TYPICAL; // Applied price
INPUT int ADX_Indi_ADX_Shift = 0; // Shift
INPUT ENUM_IDATA_SOURCE_TYPE ADX_Indi_ADX_SourceType = IDATA_BUILTIN; // Source type
INPUT STG_ADX_INDI_ADX_MODE ADX_Indi_ADX_Mode = STG_ADX_INDI_ADX_MODE_ADXW; // Calculation mode
// Structs.
// Defines struct with default user strategy values.
struct Stg_ADX_Params_Defaults : StgParams {
Stg_ADX_Params_Defaults()
: StgParams(::ADX_SignalOpenMethod, ::ADX_SignalOpenFilterMethod, ::ADX_SignalOpenLevel,
::ADX_SignalOpenBoostMethod, ::ADX_SignalCloseMethod, ::ADX_SignalCloseFilter, ::ADX_SignalCloseLevel,
::ADX_PriceStopMethod, ::ADX_PriceStopLevel, ::ADX_TickFilterMethod, ::ADX_MaxSpread, ::ADX_Shift) {
Set(STRAT_PARAM_LS, ADX_LotSize);
Set(STRAT_PARAM_OCL, ADX_OrderCloseLoss);
Set(STRAT_PARAM_OCP, ADX_OrderCloseProfit);
Set(STRAT_PARAM_OCT, ADX_OrderCloseTime);
Set(STRAT_PARAM_SOFT, ADX_SignalOpenFilterTime);
}
};
#ifdef __config__
// Loads pair specific param values.
#include "config/H1.h"
#include "config/H4.h"
#include "config/H8.h"
#include "config/M1.h"
#include "config/M15.h"
#include "config/M30.h"
#include "config/M5.h"
#endif
class Stg_ADX : public Strategy {
public:
Stg_ADX(StgParams &_sparams, TradeParams &_tparams, ChartParams &_cparams, string _name = "")
: Strategy(_sparams, _tparams, _cparams, _name) {}
static Stg_ADX *Init(ENUM_TIMEFRAMES _tf = NULL) {
// Initialize strategy initial values.
Stg_ADX_Params_Defaults _stg_params;
#ifdef __config__
SetParamsByTf<StgParams>(_stg_params, _tf, stg_adx_m1, stg_adx_m5, stg_adx_m15, stg_adx_m30, stg_adx_h1, stg_adx_h4,
stg_adx_h8);
#endif
// Initialize Strategy instance.
ChartParams _cparams(_tf, _Symbol);
TradeParams _tparams;
Strategy *_strat = new Stg_ADX(_stg_params, _tparams, _cparams, "ADX");
// Initialize indicator.
return _strat;
}
/**
* Event on strategy's init.
*/
void OnInit() {
IndiADXParams _adx_params(::ADX_Indi_ADX_Period, ::ADX_Indi_ADX_AppliedPrice, ::ADX_Indi_ADX_Shift);
_adx_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
IndiADXWParams _adxw_params(::ADX_Indi_ADX_Period, ::ADX_Indi_ADX_AppliedPrice, ::ADX_Indi_ADX_Shift);
_adxw_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
switch (ADX_Indi_ADX_Mode) {
case STG_ADX_INDI_ADX_MODE_ADX:
SetIndicator(new Indi_ADX(_adx_params, ::ADX_Indi_ADX_SourceType));
break;
case STG_ADX_INDI_ADX_MODE_ADXW:
SetIndicator(new Indi_ADXW(_adxw_params, ::ADX_Indi_ADX_SourceType));
break;
}
}
/**
* Check strategy's opening signal.
*/
bool SignalOpen(ENUM_ORDER_TYPE _cmd, int _method = 0, float _level = 0.0f, int _shift = 0) {
IndicatorData *_indi = GetIndicator();
bool _result = true;
_result &= _indi.GetFlag(INDI_ENTRY_FLAG_IS_VALID, _shift) && _indi.GetFlag(INDI_ENTRY_FLAG_IS_VALID, _shift + 3);
if (!_result) {
// Returns false when indicator data is not valid.
return false;
}
IndicatorSignal _signals = _indi.GetSignals(4, _shift, LINE_MINUSDI, LINE_PLUSDI);
// IndicatorSignal _signals = dynamic_cast<Indi_ADX *>(_indi).GetSignals(4, _shift, LINE_MINUSDI, LINE_PLUSDI);
switch (_cmd) {
// Buy: +DI line is above -DI line, ADX is more than a certain value and grows (i.e. trend strengthens).
case ORDER_TYPE_BUY:
_result &= _indi[_shift][(int)LINE_MINUSDI] < _indi[_shift][(int)LINE_PLUSDI];
_result &= _indi.IsIncByPct(_level, 0, _shift, 3);
// _result &= dynamic_cast<Indi_ADX *>(_indi).IsIncByPct(_level, 0, _shift, 3);
// _result &= _method > 0 ? _signals.CheckSignals(_method) : _signals.CheckSignalsAll(-_method);
break;
// Sell: -DI line is above +DI line, ADX is more than a certain value and grows (i.e. trend strengthens).
case ORDER_TYPE_SELL:
_result &= _indi[_shift][(int)LINE_MINUSDI] > _indi[_shift][(int)LINE_PLUSDI];
_result &= _indi.IsDecByPct(-_level, 0, _shift, 3);
//_result &= dynamic_cast<Indi_ADX *>(_indi).IsDecByPct(-_level, 0, _shift, 3);
// _result &= _method > 0 ? _signals.CheckSignals(_method) : _signals.CheckSignalsAll(-_method);
break;
}
return _result;
}
};