358 lines
9.3 KiB
Plaintext
358 lines
9.3 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Class Library
|
|
// ----------------------------------------------
|
|
// Name: X110Signaller
|
|
// Description: Signalling using X121 rules ...
|
|
//
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property library
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://www.saherelm.ir"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
//
|
|
// Imports ...
|
|
#include "../Libraries/x-saherelm.xtrade.lib.mq5"
|
|
#include "../Classes/x-saherelm.x121.xmcycle.class.mq5"
|
|
|
|
//
|
|
// Definitions ...
|
|
|
|
//
|
|
// Class ...
|
|
class X110Signaller : public XSignallerDescriptor
|
|
{
|
|
//
|
|
// Public ...
|
|
public:
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
// Constructor(s) ...
|
|
void X110Signaller()
|
|
{
|
|
name = X110;
|
|
Default();
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
void ~X110Signaller() {}
|
|
|
|
//
|
|
// Override(s) ...
|
|
|
|
//
|
|
bool HasLongConditions(
|
|
X121MCycleConditions &conditions, // Market Conditions
|
|
double &sl, // Hold SL ...
|
|
double &tp // Hold TP ...
|
|
) override
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
sl = 0;
|
|
tp = 0;
|
|
|
|
//
|
|
result = allowLong;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double bullishScore = 0;
|
|
double bearishScore = 0;
|
|
conditions.GenerateScore(
|
|
bullishScore,
|
|
bearishScore //
|
|
);
|
|
|
|
//
|
|
bool isCloseOverSenkouSpanA = conditions.bars[1].close > conditions.ichSenkouSpanAs[1];
|
|
|
|
//
|
|
bool isBaseBullish = isCloseOverSenkouSpanA &&
|
|
conditions.isSenkouSpanAOverB &&
|
|
conditions.isSenkouSpanAOverLast;
|
|
|
|
//
|
|
bool isKijunSenOverSenkouSpanA = conditions.ichKijunSens[1] > conditions.ichSenkouSpanAs[1];
|
|
|
|
//
|
|
bool isCloseOverTenkanSen = conditions.bars[1].close > conditions.ichTenkanSens[1];
|
|
|
|
//
|
|
bool isPriceCloseCrossedUpTenkanSen = conditions.bars[2].close <= conditions.ichTenkanSens[2] &&
|
|
conditions.bars[1].close > conditions.ichTenkanSens[1];
|
|
|
|
//
|
|
double cKumoUpper = MathMax(conditions.ichSenkouSpanAs[1], conditions.ichSenkouSpanBs[1]);
|
|
double pKumoUpper = MathMax(conditions.ichSenkouSpanAs[2], conditions.ichSenkouSpanBs[2]);
|
|
|
|
//
|
|
double cKumoLower = MathMin(conditions.ichSenkouSpanAs[1], conditions.ichSenkouSpanBs[1]);
|
|
double pKumoLower = MathMin(conditions.ichSenkouSpanAs[2], conditions.ichSenkouSpanBs[2]);
|
|
|
|
//
|
|
bool isTenkanSenOverKumo = conditions.ichTenkanSens[1] > cKumoUpper;
|
|
bool isTenkanSenOverKumoPrev = conditions.ichTenkanSens[2] > pKumoUpper;
|
|
|
|
//
|
|
bool isTenkanSenUnderKumo = conditions.ichTenkanSens[1] < cKumoLower;
|
|
bool isTenkanSenUnderKumoPrev = conditions.ichTenkanSens[2] < pKumoLower;
|
|
|
|
//
|
|
bool isTenkanSenCrossedOverKumo = isTenkanSenOverKumo &&
|
|
!isTenkanSenOverKumoPrev;
|
|
|
|
//
|
|
bool isTenkanSenCrossedUnderKumo = isTenkanSenUnderKumo &&
|
|
!isTenkanSenUnderKumoPrev;
|
|
|
|
//
|
|
bool condition1 =
|
|
isBaseBullish &&
|
|
isCloseOverTenkanSen &&
|
|
isKijunSenOverSenkouSpanA &&
|
|
conditions.isTenkanSenCrossedOverKijunSen;
|
|
|
|
//
|
|
bool condition2 =
|
|
isBaseBullish &&
|
|
isCloseOverTenkanSen &&
|
|
isKijunSenOverSenkouSpanA &&
|
|
conditions.isTenkanSenOverKijunSen &&
|
|
conditions.isSenkouSpanACrossedOverB;
|
|
|
|
//
|
|
bool condition3 =
|
|
isBaseBullish &&
|
|
isKijunSenOverSenkouSpanA &&
|
|
isPriceCloseCrossedUpTenkanSen &&
|
|
conditions.isTenkanSenOverKijunSen;
|
|
|
|
//
|
|
bool condition4 =
|
|
isCloseOverTenkanSen &&
|
|
isTenkanSenCrossedOverKumo &&
|
|
conditions.isTenkanSenOverKijunSen &&
|
|
conditions.isFutureSenkouSpanAOverB &&
|
|
conditions.isFutureSenkouSpanAOverLast;
|
|
|
|
//
|
|
result =
|
|
//
|
|
condition1
|
|
//
|
|
||
|
|
//
|
|
condition2
|
|
//
|
|
||
|
|
//
|
|
condition3
|
|
//
|
|
||
|
|
//
|
|
condition4
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isOSCVerified =
|
|
//
|
|
(conditions.oscCcis[0] > 0 &&
|
|
conditions.oscCcis[1] > 0)
|
|
//
|
|
||
|
|
//
|
|
(conditions.oscMacdMains[0] > 0 &&
|
|
conditions.oscMacdMains[1] > 0)
|
|
//
|
|
;
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
result =
|
|
isOSCVerified &&
|
|
bullishScore > bearishScore * 1.5;
|
|
}
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
sl = conditions.ichSenkouSpanBs[1];
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool HasShortConditions(
|
|
X121MCycleConditions &conditions, // Market Conditions
|
|
double &sl, // Hold SL ...
|
|
double &tp // Hold TP ...
|
|
) override
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
sl = 0;
|
|
tp = 0;
|
|
|
|
//
|
|
result = allowLong;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double bullishScore = 0;
|
|
double bearishScore = 0;
|
|
conditions.GenerateScore(
|
|
bullishScore,
|
|
bearishScore //
|
|
);
|
|
|
|
//
|
|
bool isCloseUnderSenkouSpanB = conditions.bars[1].close < conditions.ichSenkouSpanBs[1];
|
|
|
|
//
|
|
bool isBaseBearish = isCloseUnderSenkouSpanB &&
|
|
conditions.isSenkouSpanAUnderB &&
|
|
conditions.isSenkouSpanAUnderLast;
|
|
|
|
//
|
|
bool isKijunSenUnderSenkouSpanB = conditions.ichKijunSens[1] < conditions.ichSenkouSpanBs[1];
|
|
|
|
//
|
|
bool isCloseUnderTenkanSen = conditions.bars[1].close < conditions.ichTenkanSens[1];
|
|
|
|
//
|
|
bool isPriceCloseCrossedDownTenkanSen = conditions.bars[2].close >= conditions.ichTenkanSens[2] &&
|
|
conditions.bars[1].close < conditions.ichTenkanSens[1];
|
|
|
|
//
|
|
double cKumoUpper = MathMax(conditions.ichSenkouSpanAs[1], conditions.ichSenkouSpanBs[1]);
|
|
double pKumoUpper = MathMax(conditions.ichSenkouSpanAs[2], conditions.ichSenkouSpanBs[2]);
|
|
|
|
//
|
|
double cKumoLower = MathMin(conditions.ichSenkouSpanAs[1], conditions.ichSenkouSpanBs[1]);
|
|
double pKumoLower = MathMin(conditions.ichSenkouSpanAs[2], conditions.ichSenkouSpanBs[2]);
|
|
|
|
//
|
|
bool isTenkanSenOverKumo = conditions.ichTenkanSens[1] > cKumoUpper;
|
|
bool isTenkanSenOverKumoPrev = conditions.ichTenkanSens[2] > pKumoUpper;
|
|
|
|
//
|
|
bool isTenkanSenUnderKumo = conditions.ichTenkanSens[1] < cKumoLower;
|
|
bool isTenkanSenUnderKumoPrev = conditions.ichTenkanSens[2] < pKumoLower;
|
|
|
|
//
|
|
bool isTenkanSenCrossedOverKumo = isTenkanSenOverKumo &&
|
|
!isTenkanSenOverKumoPrev;
|
|
|
|
//
|
|
bool isTenkanSenCrossedUnderKumo = isTenkanSenUnderKumo &&
|
|
!isTenkanSenUnderKumoPrev;
|
|
|
|
//
|
|
bool condition1 =
|
|
isBaseBearish &&
|
|
isCloseUnderTenkanSen &&
|
|
isKijunSenUnderSenkouSpanB &&
|
|
conditions.isTenkanSenCrossedUnderKijunSen;
|
|
|
|
//
|
|
bool condition2 =
|
|
isBaseBearish &&
|
|
isCloseUnderTenkanSen &&
|
|
isKijunSenUnderSenkouSpanB &&
|
|
conditions.isTenkanSenUnderKijunSen &&
|
|
conditions.isSenkouSpanACrossedUnderB;
|
|
|
|
//
|
|
bool condition3 =
|
|
isBaseBearish &&
|
|
isKijunSenUnderSenkouSpanB &&
|
|
isPriceCloseCrossedDownTenkanSen &&
|
|
conditions.isTenkanSenUnderKijunSen;
|
|
|
|
//
|
|
bool condition4 =
|
|
isCloseUnderTenkanSen &&
|
|
isTenkanSenCrossedUnderKumo &&
|
|
conditions.isTenkanSenUnderKijunSen &&
|
|
conditions.isFutureSenkouSpanAUnderB &&
|
|
conditions.isFutureSenkouSpanAUnderLast;
|
|
|
|
//
|
|
result =
|
|
//
|
|
condition1
|
|
|
|
||
|
|
//
|
|
condition2
|
|
//
|
|
||
|
|
//
|
|
condition3
|
|
//
|
|
||
|
|
//
|
|
condition4
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isOSCVerified =
|
|
//
|
|
(conditions.oscCcis[0] < 0 &&
|
|
conditions.oscCcis[1] < 0)
|
|
//
|
|
||
|
|
//
|
|
(conditions.oscMacdMains[0] < 0 &&
|
|
conditions.oscMacdMains[1] < 0)
|
|
//
|
|
;
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
result =
|
|
isOSCVerified &&
|
|
bearishScore > bullishScore * 1.5;
|
|
}
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
sl = conditions.ichSenkouSpanAs[1];
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
};
|
|
|
|
// |