last ...
This commit is contained in:
@@ -0,0 +1,367 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// ----------------------------------------------
|
||||
// Name: X92Signaller
|
||||
// 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 X92Signaller : public XSignallerDescriptor
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void X92Signaller()
|
||||
{
|
||||
//
|
||||
name = X92;
|
||||
Default();
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~X92Signaller() {}
|
||||
|
||||
//
|
||||
void SetSymbol(string value)
|
||||
{
|
||||
this.symbol = value;
|
||||
}
|
||||
|
||||
//
|
||||
void SetPeriod(ENUM_TIMEFRAMES value)
|
||||
{
|
||||
this.period = value;
|
||||
}
|
||||
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
|
||||
//
|
||||
if (IsLookingForBoundary())
|
||||
{
|
||||
//
|
||||
FindBoundary(conditions);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isRejected =
|
||||
//
|
||||
(conditions.bars[1].low > lastLower &&
|
||||
conditions.bars[2].low > lastLower &&
|
||||
conditions.bars[3].low > lastLower &&
|
||||
conditions.bars[4].low > lastLower &&
|
||||
conditions.bars[5].low > lastLower)
|
||||
//
|
||||
||
|
||||
//
|
||||
conditions.bars[1].IsSupportRejected(lastLower)
|
||||
//
|
||||
;
|
||||
bool isBreaked =
|
||||
//
|
||||
(conditions.bars[1].low > lastUpper &&
|
||||
conditions.bars[2].low > lastUpper &&
|
||||
conditions.bars[3].low > lastUpper &&
|
||||
conditions.bars[4].low > lastUpper &&
|
||||
conditions.bars[5].low > lastUpper)
|
||||
//
|
||||
||
|
||||
//
|
||||
conditions.bars[1].IsResistanceBreaked(lastUpper)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isBreaked
|
||||
//
|
||||
||
|
||||
//
|
||||
isRejected
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
sl = isBreaked
|
||||
? lastUpper
|
||||
: lastLower;
|
||||
}
|
||||
|
||||
//
|
||||
HandleResetBundary();
|
||||
|
||||
//
|
||||
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;
|
||||
}
|
||||
|
||||
//
|
||||
if (IsLookingForBoundary())
|
||||
{
|
||||
//
|
||||
FindBoundary(conditions);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isRejected =
|
||||
//
|
||||
(conditions.bars[1].high < lastUpper &&
|
||||
conditions.bars[2].high < lastUpper &&
|
||||
conditions.bars[3].high < lastUpper &&
|
||||
conditions.bars[4].high < lastUpper &&
|
||||
conditions.bars[5].high < lastUpper)
|
||||
//
|
||||
||
|
||||
//
|
||||
conditions.bars[1].IsResistanceRejected(lastUpper)
|
||||
//
|
||||
;
|
||||
bool isBreaked =
|
||||
//
|
||||
(conditions.bars[1].high < lastLower &&
|
||||
conditions.bars[2].high < lastLower &&
|
||||
conditions.bars[3].high < lastLower &&
|
||||
conditions.bars[4].high < lastLower &&
|
||||
conditions.bars[5].high < lastLower)
|
||||
//
|
||||
||
|
||||
//
|
||||
conditions.bars[1].IsSupportBreaked(lastLower)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isBreaked
|
||||
//
|
||||
||
|
||||
//
|
||||
isRejected
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
sl = isBreaked
|
||||
? lastLower
|
||||
: lastUpper;
|
||||
}
|
||||
|
||||
//
|
||||
HandleResetBundary();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Props ...
|
||||
double lastUpper;
|
||||
double lastLower;
|
||||
datetime lastTime;
|
||||
|
||||
//
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
|
||||
//
|
||||
bool IsLookingForBoundary()
|
||||
{
|
||||
//
|
||||
bool result = lastUpper == 0 && lastLower == 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
void FindBoundary(const X121MCycleConditions &conditions)
|
||||
{
|
||||
//
|
||||
int zIndex = 0;
|
||||
int cIndex = 1;
|
||||
int pIndex = 2;
|
||||
int ppIndex = 3;
|
||||
|
||||
//
|
||||
// Detect Inside Bar ...
|
||||
if (conditions.bars[cIndex].IsInsideBar())
|
||||
{
|
||||
//
|
||||
lastUpper = conditions.bars[pIndex].high;
|
||||
lastLower = conditions.bars[pIndex].low;
|
||||
|
||||
//
|
||||
lastTime = TimeCurrent();
|
||||
|
||||
//
|
||||
DrawPivot(lastUpper, clrOrangeRed);
|
||||
DrawPivot(lastLower, clrLimeGreen);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
void HandleResetBundary()
|
||||
{
|
||||
//
|
||||
if (!IsSpecifiedValid(lastTime))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
int age = iBarShift(
|
||||
symbol,
|
||||
period,
|
||||
lastTime,
|
||||
false //
|
||||
);
|
||||
|
||||
//
|
||||
if (age < 7)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
RemoveDraws("X92_");
|
||||
|
||||
//
|
||||
lastLower = 0;
|
||||
lastUpper = 0;
|
||||
lastTime = NULL;
|
||||
}
|
||||
|
||||
//
|
||||
void DrawPivot(
|
||||
double price,
|
||||
color clr //
|
||||
)
|
||||
{
|
||||
//
|
||||
long chartID = ChartID();
|
||||
datetime time1 = iTime(
|
||||
symbol,
|
||||
period,
|
||||
2 //
|
||||
);
|
||||
datetime time = iTime(
|
||||
symbol,
|
||||
period,
|
||||
0 //
|
||||
);
|
||||
|
||||
//
|
||||
string pPrefix = "X92_P_" +
|
||||
ToString(price);
|
||||
|
||||
//
|
||||
if (IsDrawExists(pPrefix))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
DrawTrendLine(
|
||||
chartID,
|
||||
pPrefix,
|
||||
0,
|
||||
time1,
|
||||
price,
|
||||
time,
|
||||
price,
|
||||
clr,
|
||||
STYLE_SOLID,
|
||||
2,
|
||||
false,
|
||||
false,
|
||||
true //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
};
|
||||
Reference in New Issue
Block a user