last works ...
This commit is contained in:
@@ -0,0 +1,314 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// 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(
|
||||
const 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;
|
||||
}
|
||||
|
||||
//
|
||||
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
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
sl = conditions.ichSenkouSpanBs[1];
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool HasShortConditions(
|
||||
const 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;
|
||||
}
|
||||
|
||||
//
|
||||
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
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
sl = conditions.ichSenkouSpanAs[1];
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
void Default()
|
||||
{
|
||||
//
|
||||
allowLong = true;
|
||||
allowShort = true;
|
||||
|
||||
//
|
||||
r2r = 1;
|
||||
|
||||
//
|
||||
staticVolumeLong = 0.01;
|
||||
staticVolumeShort = 0.01;
|
||||
}
|
||||
};
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
tp = 0;
|
||||
|
||||
//
|
||||
result = enableLong;
|
||||
result = allowLong;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
@@ -123,7 +123,7 @@ public:
|
||||
tp = 0;
|
||||
|
||||
//
|
||||
result = enableShort;
|
||||
result = allowShort;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
@@ -175,8 +175,8 @@ public:
|
||||
void Default()
|
||||
{
|
||||
//
|
||||
enableLong = true;
|
||||
enableShort = true;
|
||||
allowLong = true;
|
||||
allowShort = true;
|
||||
|
||||
//
|
||||
r2r = 1;
|
||||
|
||||
@@ -68,7 +68,7 @@ public:
|
||||
tp = 0;
|
||||
|
||||
//
|
||||
result = enableLong;
|
||||
result = allowLong;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
@@ -125,7 +125,7 @@ public:
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = enableShort;
|
||||
result = allowShort;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
@@ -180,8 +180,8 @@ public:
|
||||
void Default()
|
||||
{
|
||||
//
|
||||
enableLong = true;
|
||||
enableShort = true;
|
||||
allowLong = true;
|
||||
allowShort = true;
|
||||
|
||||
//
|
||||
r2r = 1;
|
||||
|
||||
Reference in New Issue
Block a user