Skip to content

Commit

Permalink
Adds initial strategy signal logic
Browse files Browse the repository at this point in the history
  • Loading branch information
kenorb committed Sep 3, 2023
1 parent 80e3c5c commit 30049ed
Showing 1 changed file with 26 additions and 87 deletions.
113 changes: 26 additions & 87 deletions Stg_MA_Cross_Pivot.mqh
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ enum ENUM_STG_MA_CROSS_PIVOT_TYPE {

// User params.
INPUT_GROUP("MA Cross Pivot strategy: main strategy params");
INPUT ENUM_STG_MA_CROSS_PIVOT_TYPE MA_Cross_Pivot_Type = STG_MA_CROSS_PIVOT_TYPE_MA; // Indicator MA type
INPUT ENUM_STG_MA_CROSS_PIVOT_TYPE MA_Cross_Pivot_Type = STG_MA_CROSS_PIVOT_TYPE_FRAMA; // Indicator MA type
INPUT_GROUP("MA Cross Pivot strategy: strategy params");
INPUT float MA_Cross_Pivot_LotSize = 0; // Lot size
INPUT int MA_Cross_Pivot_SignalOpenMethod = 0; // Signal open method (-127-127)
INPUT int MA_Cross_Pivot_SignalOpenMethod = 1; // Signal open method (-3-3)
INPUT float MA_Cross_Pivot_SignalOpenLevel = 0.0f; // Signal open level
INPUT int MA_Cross_Pivot_SignalOpenFilterMethod = 32; // Signal open filter method
INPUT int MA_Cross_Pivot_SignalOpenFilterTime = 3; // Signal open filter time
INPUT int MA_Cross_Pivot_SignalOpenBoostMethod = 0; // Signal open boost method
INPUT int MA_Cross_Pivot_SignalCloseMethod = 0; // Signal close method (-127-127)
INPUT int MA_Cross_Pivot_SignalCloseMethod = 1; // Signal close method (-3-3)
INPUT int MA_Cross_Pivot_SignalCloseFilter = 0; // Signal close filter (-127-127)
INPUT float MA_Cross_Pivot_SignalCloseLevel = 0.0f; // Signal close level
INPUT int MA_Cross_Pivot_PriceStopMethod = 1; // Price stop method (0-127)
Expand All @@ -43,70 +43,60 @@ INPUT int MA_Cross_Pivot_Indi_AMA_InpFastPeriodEMA = 4;
INPUT int MA_Cross_Pivot_Indi_AMA_InpSlowPeriodEMA = 30; // Slow EMA period
INPUT int MA_Cross_Pivot_Indi_AMA_InpShiftAMA = 4; // AMA shift
INPUT int MA_Cross_Pivot_Indi_AMA_Shift = 0; // Shift
INPUT int MA_Cross_Pivot_Indi_AMA_Shift2 = 10; // Shift 2
INPUT ENUM_IDATA_SOURCE_TYPE MA_Cross_Pivot_Indi_AMA_SourceType = IDATA_BUILTIN; // Source type
INPUT_GROUP("MA Cross Pivot strategy: DEMA indicator params");
INPUT int MA_Cross_Pivot_Indi_DEMA_Period = 25; // Period
INPUT int MA_Cross_Pivot_Indi_DEMA_MA_Shift = 6; // MA Shift
INPUT ENUM_APPLIED_PRICE MA_Cross_Pivot_Indi_DEMA_Applied_Price = PRICE_TYPICAL; // Applied Price
INPUT int MA_Cross_Pivot_Indi_DEMA_Shift = 0; // Shift
INPUT int MA_Cross_Pivot_Indi_DEMA_Shift2 = 10; // Shift 2
INPUT ENUM_IDATA_SOURCE_TYPE MA_Cross_Pivot_Indi_DEMA_SourceType = IDATA_BUILTIN; // Source type
INPUT_GROUP("MA Cross Pivot strategy: FrAMA indicator params");
INPUT int MA_Cross_Pivot_Indi_FrAMA_Period = 10; // Period
INPUT ENUM_APPLIED_PRICE MA_Cross_Pivot_Indi_FrAMA_Applied_Price = PRICE_MEDIAN; // Applied Price
INPUT int MA_Cross_Pivot_Indi_FrAMA_MA_Shift = 0; // MA Shift
INPUT int MA_Cross_Pivot_Indi_FrAMA_Shift = 0; // Shift
INPUT int MA_Cross_Pivot_Indi_FrAMA_Shift2 = 10; // Shift 2
INPUT ENUM_IDATA_SOURCE_TYPE MA_Cross_Pivot_Indi_FrAMA_SourceType = IDATA_BUILTIN; // Source type
INPUT_GROUP("MA Cross Pivot strategy: Ichimoku indicator params");
// INPUT ENUM_ICHIMOKU_LINE MA_Cross_Pivot_Indi_Ichimoku_MA_Line = LINE_TENKANSEN; // Ichimoku line for MA
INPUT int MA_Cross_Pivot_Indi_Ichimoku_Period_Tenkan_Sen = 30; // Period Tenkan Sen
INPUT int MA_Cross_Pivot_Indi_Ichimoku_Period_Kijun_Sen = 10; // Period Kijun Sen
INPUT int MA_Cross_Pivot_Indi_Ichimoku_Period_Senkou_Span_B = 30; // Period Senkou Span B
INPUT int MA_Cross_Pivot_Indi_Ichimoku_Shift = 1; // Shift
INPUT int MA_Cross_Pivot_Indi_Ichimoku_Shift2 = 1; // Shift 2
INPUT ENUM_IDATA_SOURCE_TYPE MA_Cross_Pivot_Indi_Ichimoku_SourceType = IDATA_BUILTIN; // Source type
INPUT_GROUP("MA Cross Pivot strategy: MA indicator params");
INPUT int MA_Cross_Pivot_Indi_MA_Period = 26; // Period
INPUT int MA_Cross_Pivot_Indi_MA_MA_Shift = 0; // MA Shift
INPUT ENUM_MA_METHOD MA_Cross_Pivot_Indi_MA_Method = MODE_LWMA; // MA Method
INPUT ENUM_APPLIED_PRICE MA_Cross_Pivot_Indi_MA_Applied_Price = PRICE_WEIGHTED; // Applied Price
INPUT int MA_Cross_Pivot_Indi_MA_Shift = 0; // Shift
INPUT int MA_Cross_Pivot_Indi_MA_Shift2 = 10; // Shift 2
INPUT ENUM_IDATA_SOURCE_TYPE MA_Cross_Pivot_Indi_MA_SourceType = IDATA_BUILTIN; // Source type
INPUT_GROUP("MA Cross Pivot strategy: Price Channel indicator params");
INPUT int MA_Cross_Pivot_Indi_PriceChannel_Period = 26; // Period
INPUT int MA_Cross_Pivot_Indi_PriceChannel_Shift = 0; // Shift
INPUT int MA_Cross_Pivot_Indi_PriceChannel_Shift2 = 10; // Shift 2
INPUT ENUM_IDATA_SOURCE_TYPE MA_Cross_Pivot_Indi_PriceChannel_SourceType = IDATA_ICUSTOM; // Source type
INPUT_GROUP("MA Cross Pivot strategy: SAR indicator params");
INPUT float MA_Cross_Pivot_Indi_SAR_Step = 0.04f; // Step
INPUT float MA_Cross_Pivot_Indi_SAR_Maximum_Stop = 0.4f; // Maximum stop
INPUT int MA_Cross_Pivot_Indi_SAR_Shift = 0; // Shift
INPUT int MA_Cross_Pivot_Indi_SAR_Shift2 = 10; // Shift 2
INPUT ENUM_IDATA_SOURCE_TYPE MA_Cross_Pivot_Indi_SAR_SourceType = IDATA_ICUSTOM; // Source type
INPUT_GROUP("MA Cross Pivot strategy: TEMA indicator params");
INPUT int MA_Cross_Pivot_Indi_TEMA_Period = 10; // Period
INPUT int MA_Cross_Pivot_Indi_TEMA_MA_Shift = 0; // MA Shift
INPUT ENUM_APPLIED_PRICE MA_Cross_Pivot_Indi_TEMA_Applied_Price = PRICE_WEIGHTED; // Applied Price
INPUT int MA_Cross_Pivot_Indi_TEMA_Shift = 0; // Shift
INPUT int MA_Cross_Pivot_Indi_TEMA_Shift2 = 10; // Shift 2
INPUT ENUM_IDATA_SOURCE_TYPE MA_Cross_Pivot_Indi_TEMA_SourceType = IDATA_BUILTIN; // Source type
INPUT_GROUP("MA Cross Pivot strategy: VIDYA indicator params");
INPUT int MA_Cross_Pivot_Indi_VIDYA_Period = 30; // Period
INPUT int MA_Cross_Pivot_Indi_VIDYA_MA_Period = 20; // MA Period
INPUT int MA_Cross_Pivot_Indi_VIDYA_MA_Shift = 1; // MA Shift
INPUT ENUM_APPLIED_PRICE MA_Cross_Pivot_Indi_VIDYA_Applied_Price = PRICE_WEIGHTED; // Applied Price
INPUT int MA_Cross_Pivot_Indi_VIDYA_Shift = 0; // Shift
INPUT int MA_Cross_Pivot_Indi_VIDYA_Shift2 = 10; // Shift 2
INPUT ENUM_IDATA_SOURCE_TYPE MA_Cross_Pivot_Indi_VIDYA_SourceType = IDATA_BUILTIN; // Source type

// Structs.

// Defines struct with default user strategy values.
struct Stg_MA_Cross_Pivot_Params_Defaults : StgParams {
uint shift1, shift2;
Stg_MA_Cross_Pivot_Params_Defaults()
: StgParams(::MA_Cross_Pivot_SignalOpenMethod, ::MA_Cross_Pivot_SignalOpenFilterMethod,
::MA_Cross_Pivot_SignalOpenLevel, ::MA_Cross_Pivot_SignalOpenBoostMethod,
Expand All @@ -119,12 +109,6 @@ struct Stg_MA_Cross_Pivot_Params_Defaults : StgParams {
Set(STRAT_PARAM_OCT, MA_Cross_Pivot_OrderCloseTime);
Set(STRAT_PARAM_SOFT, MA_Cross_Pivot_SignalOpenFilterTime);
}
// Getters.
uint GetShift1() { return shift1; }
uint GetShift2() { return shift2; }
// Setters.
void SetShift1(uint _value) { shift1 = _value; }
void SetShift2(uint _value) { shift2 = _value; }
};

class Stg_MA_Cross_Pivot : public Strategy {
Expand Down Expand Up @@ -160,10 +144,6 @@ class Stg_MA_Cross_Pivot : public Strategy {
_indi_params.SetDataSourceType(::MA_Cross_Pivot_Indi_AMA_SourceType);
_indi_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
SetIndicator(new Indi_AMA(_indi_params), ::MA_Cross_Pivot_Type);
_indi_params.SetShift(::MA_Cross_Pivot_Indi_AMA_Shift2);
SetIndicator(new Indi_AMA(_indi_params), ::MA_Cross_Pivot_Type + 1);
ssparams.SetShift1(MA_Cross_Pivot_Indi_AMA_Shift);
ssparams.SetShift2(MA_Cross_Pivot_Indi_AMA_Shift2);
break;
}
case STG_MA_CROSS_PIVOT_TYPE_DEMA: // DEMA
Expand All @@ -173,10 +153,6 @@ class Stg_MA_Cross_Pivot : public Strategy {
_indi_params.SetDataSourceType(::MA_Cross_Pivot_Indi_DEMA_SourceType);
_indi_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
SetIndicator(new Indi_DEMA(_indi_params), ::MA_Cross_Pivot_Type);
_indi_params.SetShift(::MA_Cross_Pivot_Indi_DEMA_Shift2);
SetIndicator(new Indi_DEMA(_indi_params), ::MA_Cross_Pivot_Type + 1);
ssparams.SetShift1(MA_Cross_Pivot_Indi_DEMA_Shift);
ssparams.SetShift2(MA_Cross_Pivot_Indi_DEMA_Shift2);
break;
}
case STG_MA_CROSS_PIVOT_TYPE_FRAMA: // FrAMA
Expand All @@ -186,10 +162,6 @@ class Stg_MA_Cross_Pivot : public Strategy {
_indi_params.SetDataSourceType(::MA_Cross_Pivot_Indi_FrAMA_SourceType);
_indi_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
SetIndicator(new Indi_FrAMA(_indi_params), ::MA_Cross_Pivot_Type);
_indi_params.SetShift(::MA_Cross_Pivot_Indi_FrAMA_Shift2);
SetIndicator(new Indi_FrAMA(_indi_params), ::MA_Cross_Pivot_Type + 1);
ssparams.SetShift1(MA_Cross_Pivot_Indi_FrAMA_Shift);
ssparams.SetShift2(MA_Cross_Pivot_Indi_FrAMA_Shift2);
break;
}
case STG_MA_CROSS_PIVOT_TYPE_ICHIMOKU: // Ichimoku
Expand All @@ -200,10 +172,6 @@ class Stg_MA_Cross_Pivot : public Strategy {
_indi_params.SetDataSourceType(::MA_Cross_Pivot_Indi_Ichimoku_SourceType);
_indi_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
SetIndicator(new Indi_Ichimoku(_indi_params), ::MA_Cross_Pivot_Type);
_indi_params.SetShift(::MA_Cross_Pivot_Indi_Ichimoku_Shift2);
SetIndicator(new Indi_Ichimoku(_indi_params), ::MA_Cross_Pivot_Type + 1);
ssparams.SetShift1(MA_Cross_Pivot_Indi_Ichimoku_Shift);
ssparams.SetShift2(MA_Cross_Pivot_Indi_Ichimoku_Shift2);
break;
}
case STG_MA_CROSS_PIVOT_TYPE_MA: // MA
Expand All @@ -214,10 +182,6 @@ class Stg_MA_Cross_Pivot : public Strategy {
_indi_params.SetDataSourceType(::MA_Cross_Pivot_Indi_MA_SourceType);
_indi_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
SetIndicator(new Indi_MA(_indi_params), ::MA_Cross_Pivot_Type);
_indi_params.SetShift(::MA_Cross_Pivot_Indi_MA_Shift2);
SetIndicator(new Indi_MA(_indi_params), ::MA_Cross_Pivot_Type + 1);
ssparams.SetShift1(MA_Cross_Pivot_Indi_MA_Shift);
ssparams.SetShift2(MA_Cross_Pivot_Indi_MA_Shift2);
break;
}
case STG_MA_CROSS_PIVOT_TYPE_PRICE_CHANNEL: // Price Channel
Expand All @@ -227,10 +191,6 @@ class Stg_MA_Cross_Pivot : public Strategy {
_indi_params.SetDataSourceType(::MA_Cross_Pivot_Indi_PriceChannel_SourceType);
_indi_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
SetIndicator(new Indi_PriceChannel(_indi_params), ::MA_Cross_Pivot_Type);
_indi_params.SetShift(::MA_Cross_Pivot_Indi_PriceChannel_Shift2);
SetIndicator(new Indi_PriceChannel(_indi_params), ::MA_Cross_Pivot_Type + 1);
ssparams.SetShift1(MA_Cross_Pivot_Indi_PriceChannel_Shift);
ssparams.SetShift2(MA_Cross_Pivot_Indi_PriceChannel_Shift2);
break;
}
case STG_MA_CROSS_PIVOT_TYPE_SAR: // SAR
Expand All @@ -240,10 +200,6 @@ class Stg_MA_Cross_Pivot : public Strategy {
_indi_params.SetDataSourceType(::MA_Cross_Pivot_Indi_SAR_SourceType);
_indi_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
SetIndicator(new Indi_SAR(_indi_params), ::MA_Cross_Pivot_Type);
_indi_params.SetShift(::MA_Cross_Pivot_Indi_SAR_Shift2);
SetIndicator(new Indi_SAR(_indi_params), ::MA_Cross_Pivot_Type + 1);
ssparams.SetShift1(MA_Cross_Pivot_Indi_SAR_Shift);
ssparams.SetShift2(MA_Cross_Pivot_Indi_SAR_Shift2);
break;
}
case STG_MA_CROSS_PIVOT_TYPE_TEMA: // TEMA
Expand All @@ -253,10 +209,6 @@ class Stg_MA_Cross_Pivot : public Strategy {
_indi_params.SetDataSourceType(::MA_Cross_Pivot_Indi_TEMA_SourceType);
_indi_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
SetIndicator(new Indi_TEMA(_indi_params), ::MA_Cross_Pivot_Type);
_indi_params.SetShift(::MA_Cross_Pivot_Indi_TEMA_Shift2);
SetIndicator(new Indi_TEMA(_indi_params), ::MA_Cross_Pivot_Type + 1);
ssparams.SetShift1(MA_Cross_Pivot_Indi_TEMA_Shift);
ssparams.SetShift2(MA_Cross_Pivot_Indi_TEMA_Shift2);
break;
}
case STG_MA_CROSS_PIVOT_TYPE_VIDYA: // VIDYA
Expand All @@ -267,10 +219,6 @@ class Stg_MA_Cross_Pivot : public Strategy {
_indi_params.SetDataSourceType(::MA_Cross_Pivot_Indi_VIDYA_SourceType);
_indi_params.SetTf(Get<ENUM_TIMEFRAMES>(STRAT_PARAM_TF));
SetIndicator(new Indi_VIDYA(_indi_params), ::MA_Cross_Pivot_Type);
_indi_params.SetShift(::MA_Cross_Pivot_Indi_VIDYA_Shift2);
SetIndicator(new Indi_VIDYA(_indi_params), ::MA_Cross_Pivot_Type + 1);
ssparams.SetShift1(MA_Cross_Pivot_Indi_VIDYA_Shift);
ssparams.SetShift2(MA_Cross_Pivot_Indi_VIDYA_Shift2);
break;
}
case STG_MA_CROSS_PIVOT_TYPE_0_NONE: // (None)
Expand All @@ -283,54 +231,45 @@ class Stg_MA_Cross_Pivot : public Strategy {
* Check strategy's opening signal.
*/
bool SignalOpen(ENUM_ORDER_TYPE _cmd, int _method = 0, float _level = 0.0f, int _shift = 0) {
IndicatorBase *_indi1 = GetIndicator(::MA_Cross_Pivot_Type);
IndicatorBase *_indi2 = GetIndicator(::MA_Cross_Pivot_Type + 1);
// uint _ishift1 = _indi1.GetParams().GetShift(); // @todo: Convert into Get().
// uint _ishift2 = _indi2.GetParams().GetShift(); // @todo: Convert into Get().
uint _ishift1 = ssparams.GetShift1();
uint _ishift2 = ssparams.GetShift2();
Chart *_chart = trade.GetChart();
IndicatorBase *_indi = GetIndicator(::MA_Cross_Pivot_Type);
// uint _ishift = _indi.GetParams().GetShift(); // @todo: Convert into Get().
// bool _result = _indi.GetFlag(INDI_ENTRY_FLAG_IS_VALID, _shift); // @fixme
uint _ishift = _shift;
bool _result = true;
if (!_result) {
// Returns false when indicator data is not valid.
return false;
}
// float _level_pips = (float)(_level * _chart.GetPipSize());
double _value1 = _indi1[_ishift1][0];
double _value2 = _indi2[_ishift2][0];
double _value1 = _indi[_ishift][0];
ChartEntry _ohlc_d1 = _chart.GetEntry(PERIOD_D1, _shift, _chart.GetSymbol());
double _d1_pivot = _ohlc_d1.bar.ohlc.GetPivot();
switch (_cmd) {
case ORDER_TYPE_BUY:
// Buy signal.
_result &= _indi1.IsIncreasing(1, 0, _ishift1);
_result &= _indi1[_ishift1][0] > _indi2[_ishift2][0];
_result &= _indi1[_ishift1 + 1][0] < _indi2[_ishift2 + 1][0];
//_result &= Math::ChangeInPct(_indi1[_ishift1 + 1][0], _indi1[_ishift1][0], true) > _level;
_result &= _indi.IsIncreasing(1, 0, _ishift);
_result &= _indi[_shift][0] > _d1_pivot;
_result &= _indi[_shift + 1][0] < _d1_pivot;
//_result &= Math::ChangeInPct(_indi[_ishift + 1][0], _indi[_ishift][0], true) > _level;
if (_result && _method != 0) {
if (METHOD(_method, 0)) _result &= _indi1[_ishift1][0] < _indi1[_ishift1 + 3][0];
if (METHOD(_method, 1)) _result &= _indi2[_ishift2][0] < _indi2[_ishift2 + 3][0];
if (METHOD(_method, 2))
_result &= fmax4(_indi1[_ishift1][0], _indi1[_ishift1 + 1][0], _indi1[_ishift1 + 2][0],
_indi1[_ishift1 + 3][0]) == _indi1[_ishift1][0];
if (METHOD(_method, 3))
_result &= fmax4(_indi2[_ishift2][0], _indi2[_ishift2 + 1][0], _indi2[_ishift2 + 2][0],
_indi2[_ishift2 + 3][0]) == _indi2[_ishift2][0];
if (METHOD(_method, 0)) _result &= _indi[_ishift + 3][0] < _d1_pivot;
if (METHOD(_method, 1))
_result &= fmax4(_indi[_ishift][0], _indi[_ishift + 1][0], _indi[_ishift + 2][0], _indi[_ishift + 3][0]) ==
_indi[_ishift][0];
}
break;
case ORDER_TYPE_SELL:
// Sell signal.
_result &= _indi1.IsDecreasing(1, 0, _ishift1);
_result &= _indi1[_ishift1][0] < _indi2[_ishift2][0];
_result &= _indi1[_ishift1 + 1][0] > _indi2[_ishift2 + 1][0];
//_result &= Math::ChangeInPct(_indi1[_ishift1 + 1][0], _indi1[_ishift1][0], true) < _level;
_result &= _indi.IsDecreasing(1, 0, _ishift);
_result &= _indi[_shift][0] < _d1_pivot;
_result &= _indi[_shift + 1][0] > _d1_pivot;
//_result &= Math::ChangeInPct(_indi[_ishift + 1][0], _indi[_ishift][0], true) < _level;
if (_result && _method != 0) {
if (METHOD(_method, 0)) _result &= _indi1[_ishift1][0] > _indi1[_ishift1 + 3][0];
if (METHOD(_method, 1)) _result &= _indi2[_ishift2][0] > _indi2[_ishift2 + 3][0];
if (METHOD(_method, 2))
_result &= fmin4(_indi1[_ishift1][0], _indi1[_ishift1 + 1][0], _indi1[_ishift1 + 2][0],
_indi1[_ishift1 + 3][0]) == _indi1[_ishift1][0];
if (METHOD(_method, 3))
_result &= fmin4(_indi2[_ishift2][0], _indi2[_ishift2 + 1][0], _indi2[_ishift2 + 2][0],
_indi2[_ishift2 + 3][0]) == _indi2[_ishift2][0];
if (METHOD(_method, 0)) _result &= _indi[_ishift + 3][0] > _d1_pivot;
if (METHOD(_method, 1))
_result &= fmin4(_indi[_ishift][0], _indi[_ishift + 1][0], _indi[_ishift + 2][0], _indi[_ishift + 3][0]) ==
_indi[_ishift][0];
}
break;
}
Expand Down

0 comments on commit 30049ed

Please sign in to comment.