1591 lines
35 KiB
Plaintext
1591 lines
35 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Expert Class Library
|
|
// ----------------------------------------------
|
|
// Name: XSCX121P
|
|
// Description: X121 Signal Provider ...
|
|
//
|
|
//
|
|
// 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
|
|
|
|
//
|
|
// START Definitions ...
|
|
//
|
|
|
|
//
|
|
// END Definitions ...
|
|
//
|
|
|
|
//
|
|
// START Import and Inclused requirements ...
|
|
//
|
|
|
|
//
|
|
// Includes ...
|
|
#include "../Classes/x-saherelm.xprovider.class.mq5"
|
|
#include "../Helpers/x-saherelm.x121.xpv.helper.mq5"
|
|
#include "../Helpers/x-saherelm.x121.xhk.helper.mq5"
|
|
#include "../Helpers/x-saherelm.x121.xmc.helper.mq5"
|
|
#include "../Helpers/x-saherelm.x121.xich.helper.mq5"
|
|
#include "../Helpers/x-saherelm.x121.xmrb.helper.mq5"
|
|
#include "../Helpers/x-saherelm.x121.xppsr.helper.mq5"
|
|
#include "../Helpers/x-saherelm.x121.xsslc.helper.mq5"
|
|
#include "../Helpers/x-saherelm.x121.xtrnd.helper.mq5"
|
|
#include "../Helpers/x-saherelm.x121.xatrsl.helper.mq5"
|
|
|
|
//
|
|
// END Import and Inclused requirements ...
|
|
//
|
|
|
|
//
|
|
// START Overrides ...
|
|
//
|
|
|
|
//
|
|
// END Overrides ...
|
|
//
|
|
|
|
//
|
|
// a Base Class for All of our EA's ...
|
|
class XSCX121Provider : public XSCEABaseProvider
|
|
{
|
|
//
|
|
// Public ...
|
|
public:
|
|
//
|
|
// Props ...
|
|
//
|
|
// Define Helpers ...
|
|
|
|
//
|
|
// MC ...
|
|
XSCXMCHelper mMCHelper;
|
|
|
|
//
|
|
// PV ...
|
|
XSCXPVHelper mPVHelper;
|
|
|
|
//
|
|
// HKENASHI ...
|
|
XSCXHKHelper mHKHelper;
|
|
|
|
//
|
|
// MRB ...
|
|
XSCXMRBHelper mMRBHelper;
|
|
|
|
//
|
|
// ICHIMOKU ...
|
|
XSCXICHHelper mIchiHelper;
|
|
|
|
//
|
|
// SSLC ...
|
|
XSCXSSLCHelper mSSLCHelper;
|
|
|
|
//
|
|
// PPSR ...
|
|
XSCXPPSRHelper mPPSRHelper;
|
|
|
|
//
|
|
// TRND ...
|
|
XSCXTRNDHelper mTRNDHelper;
|
|
|
|
//
|
|
// ATRSL ...
|
|
XSCXATRSLHelper mATRSLHelper;
|
|
|
|
//
|
|
// Constructor ...
|
|
void XSCX121Provider() : XSCEABaseProvider(){};
|
|
void XSCX121Provider(
|
|
//
|
|
// Symbol ...
|
|
string symbol,
|
|
//
|
|
// Period ...
|
|
ENUM_TIMEFRAMES period
|
|
//
|
|
) : XSCEABaseProvider(symbol, period)
|
|
{
|
|
//
|
|
mTag = "X121_Provider_" + mSymbol + "_" + ToString(mPeriod);
|
|
|
|
//
|
|
mCTimerHandler = iCustom(
|
|
mSymbol,
|
|
mPeriod,
|
|
"x-saherelm.x121.xct",
|
|
//
|
|
// Inputs ...
|
|
clrYellow,
|
|
CORNER_RIGHT_LOWER
|
|
//
|
|
);
|
|
|
|
// //
|
|
// ArraySetAsSeries(mEMA200Buffer, true);
|
|
// mEMA200Handler = iMA(
|
|
// mSymbol,
|
|
// mPeriod,
|
|
// 200,
|
|
// 0,
|
|
// MODE_EMA,
|
|
// PRICE_CLOSE);
|
|
|
|
// //
|
|
// ArraySetAsSeries(mRSIBuffer, true);
|
|
// mRSIHandler = iRSI(
|
|
// mSymbol,
|
|
// mPeriod,
|
|
// 14,
|
|
// PRICE_CLOSE);
|
|
|
|
//
|
|
// CCI Initialization ...
|
|
ArraySetAsSeries(mCCIBuffer, true);
|
|
mCCIHandler = iCCI(
|
|
mSymbol,
|
|
mPeriod,
|
|
14,
|
|
PRICE_TYPICAL);
|
|
|
|
//
|
|
// Instance Helpers ...
|
|
|
|
//
|
|
// MC ...
|
|
mMCHelper = new XSCXMCHelper(
|
|
mSymbol,
|
|
mPeriod);
|
|
|
|
//
|
|
// PV ...
|
|
mPVHelper = new XSCXPVHelper(
|
|
mSymbol,
|
|
mPeriod);
|
|
|
|
//
|
|
// HIKENASHI ...
|
|
mHKHelper = new XSCXHKHelper(
|
|
mSymbol,
|
|
mPeriod);
|
|
|
|
//
|
|
// MRB ...
|
|
mMRBHelper = new XSCXMRBHelper(
|
|
mSymbol,
|
|
mPeriod);
|
|
|
|
//
|
|
// ICHIMOKU ...
|
|
mIchiHelper = new XSCXICHHelper(
|
|
mSymbol,
|
|
mPeriod);
|
|
|
|
//
|
|
// SSLC ...
|
|
mSSLCHelper = new XSCXSSLCHelper(
|
|
mSymbol,
|
|
mPeriod);
|
|
|
|
//
|
|
// PPSR ...
|
|
mPPSRHelper = new XSCXPPSRHelper(
|
|
mSymbol,
|
|
mPeriod);
|
|
|
|
//
|
|
// TRND ...
|
|
mTRNDHelper = new XSCXTRNDHelper(
|
|
mSymbol,
|
|
mPeriod);
|
|
|
|
//
|
|
// ATRSL ...
|
|
mATRSLHelper = new XSCXATRSLHelper(
|
|
mSymbol,
|
|
mPeriod);
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
void ~XSCX121Provider()
|
|
{
|
|
//
|
|
IndicatorRelease(mCCIHandler);
|
|
IndicatorRelease(mCTimerHandler);
|
|
// IndicatorRelease(mRSIHandler);
|
|
// IndicatorRelease(mIchimokuHandler);
|
|
// IndicatorRelease(mEMA200Handler);
|
|
|
|
//
|
|
// De construct Helpers ...
|
|
}
|
|
|
|
//
|
|
virtual void ProcessBuffers()
|
|
{
|
|
//
|
|
mMCHelper.ReadBuffers();
|
|
mPVHelper.ReadBuffers();
|
|
mHKHelper.ReadBuffers();
|
|
mMRBHelper.ReadBuffers();
|
|
mSSLCHelper.ReadBuffers();
|
|
mIchiHelper.ReadBuffers();
|
|
mPPSRHelper.ReadBuffers();
|
|
mTRNDHelper.ReadBuffers();
|
|
mATRSLHelper.ReadBuffers();
|
|
|
|
// //
|
|
// /// EMA 200 ...
|
|
// CopyBuffer(mEMA200Handler, 0, 0, 10, mEMA200Buffer);
|
|
|
|
// //
|
|
// /// RSI 14 ...
|
|
// CopyBuffer(mRSIHandler, 0, 0, 10, mRSIBuffer);
|
|
|
|
//
|
|
// CCI 14 ...
|
|
CopyBuffer(mCCIHandler, 0, 0, 10, mCCIBuffer);
|
|
}
|
|
|
|
//
|
|
virtual void ProcessTick()
|
|
{
|
|
ProcessSignals();
|
|
}
|
|
|
|
//
|
|
// Protected ...
|
|
protected:
|
|
//
|
|
// Private ...
|
|
private:
|
|
//
|
|
// CCandle Timer ...
|
|
int mCTimerHandler;
|
|
|
|
// //
|
|
// // EMA 200 ...
|
|
// int mEMA200Handler;
|
|
// double mEMA200Buffer[];
|
|
|
|
// //
|
|
// // RSI ...
|
|
// int mRSIHandler;
|
|
// double mRSIBuffer[];
|
|
|
|
//
|
|
// CCI ...
|
|
int mCCIHandler;
|
|
double mCCIBuffer[];
|
|
|
|
//
|
|
// Here we are Capture Conditions and Check Signals ...
|
|
// The Signals Must be Unique for each providers ...
|
|
void ProcessSignals()
|
|
{
|
|
//
|
|
XSignalInfo signal;
|
|
|
|
//
|
|
// BUY ...
|
|
|
|
//
|
|
Clean(signal);
|
|
bool hasLongSignal = HasLongSignal(signal);
|
|
if (hasLongSignal)
|
|
{
|
|
//
|
|
NotifyOnSignalEvent(
|
|
signal);
|
|
mWaitUntilNewCandle = true;
|
|
return;
|
|
}
|
|
|
|
//
|
|
// SELL ...
|
|
|
|
//
|
|
Clean(signal);
|
|
bool hasShortignal = HasShortSignal(signal);
|
|
if (hasShortignal)
|
|
{
|
|
//
|
|
NotifyOnSignalEvent(
|
|
signal);
|
|
mWaitUntilNewCandle = true;
|
|
return;
|
|
}
|
|
}
|
|
|
|
//
|
|
// START Providers Signals ...
|
|
//
|
|
|
|
//
|
|
// Check has Long Signal on Each Strategies ...
|
|
bool HasLongSignal(XSignalInfo &info)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
double entry = GetEntry(POSITION_TYPE_BUY);
|
|
|
|
//
|
|
bool isXMRBHasSignal = false; // XMRBHasLongCondition();
|
|
if (isXMRBHasSignal)
|
|
{
|
|
//
|
|
Add(
|
|
"XMRB",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1.5;
|
|
|
|
//
|
|
// info.sl = mATRSLHelper.downBuffer[1];
|
|
}
|
|
|
|
//
|
|
bool isXPVHasSignal = false; // XPVHasLongCondition();
|
|
if (isXPVHasSignal)
|
|
{
|
|
//
|
|
Add(
|
|
"XPV",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1.4;
|
|
|
|
//
|
|
double slValue = mPVHelper.sLLBuffer[1];
|
|
// slValue -= PointToPrice(
|
|
// mSymbol,
|
|
// 5
|
|
// );
|
|
// info.sl = slValue;
|
|
info.sl = mATRSLHelper.downBuffer[1];
|
|
}
|
|
|
|
//
|
|
bool isXICHIHasSignal1 = false; // XICHIHasLongCondition1();
|
|
if (isXICHIHasSignal1)
|
|
{
|
|
//
|
|
Add(
|
|
"XICHI",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1.5;
|
|
|
|
//
|
|
double llValue = GetLowestLow(
|
|
mSymbol,
|
|
mPeriod,
|
|
3,
|
|
0);
|
|
llValue -= PointToPrice(
|
|
mSymbol,
|
|
5);
|
|
|
|
//
|
|
info.sl = llValue;
|
|
}
|
|
|
|
//
|
|
bool isXICHIHasSignal2 = false; // XICHIHasLongCondition2();
|
|
if (isXICHIHasSignal2)
|
|
{
|
|
//
|
|
Add(
|
|
"XICHI",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1;
|
|
|
|
//
|
|
double llValue = GetLowestLow(
|
|
mSymbol,
|
|
mPeriod,
|
|
3,
|
|
0);
|
|
llValue -= PointToPrice(
|
|
mSymbol,
|
|
5);
|
|
|
|
//
|
|
info.sl = llValue;
|
|
}
|
|
|
|
//
|
|
bool isXICHIHasSignal3 = false; // XICHIHasLongCondition3();
|
|
if (isXICHIHasSignal3)
|
|
{
|
|
//
|
|
Add(
|
|
"XICHI",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1.5;
|
|
|
|
//
|
|
double llValue = GetLowestLow(
|
|
mSymbol,
|
|
mPeriod,
|
|
3,
|
|
0);
|
|
llValue -= PointToPrice(
|
|
mSymbol,
|
|
5);
|
|
|
|
//
|
|
info.sl = llValue;
|
|
}
|
|
|
|
//
|
|
bool isXICHIHasSignal4 = XICHIHasLongCondition4();
|
|
if (isXICHIHasSignal4)
|
|
{
|
|
//
|
|
Add(
|
|
"XICHI",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1.5;
|
|
|
|
//
|
|
double slValue = mATRSLHelper.downBuffer[1];
|
|
slValue -= PointToPrice(
|
|
mSymbol,
|
|
5);
|
|
|
|
//
|
|
info.sl = slValue;
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
isXMRBHasSignal
|
|
//
|
|
||
|
|
//
|
|
isXPVHasSignal
|
|
//
|
|
||
|
|
//
|
|
isXICHIHasSignal1
|
|
//
|
|
||
|
|
//
|
|
isXICHIHasSignal2
|
|
//
|
|
||
|
|
//
|
|
isXICHIHasSignal3
|
|
//
|
|
||
|
|
//
|
|
isXICHIHasSignal4
|
|
//
|
|
;
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
//
|
|
info.entry = entry;
|
|
info.symbol = mSymbol;
|
|
info.period = mPeriod;
|
|
info.type = POSITION_TYPE_BUY;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Check has Short Signal on Each Strategies ...
|
|
bool HasShortSignal(XSignalInfo &info)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
double entry = GetEntry(POSITION_TYPE_SELL);
|
|
|
|
//
|
|
bool isXMRBHasSignal = false; // XMRBHasShortCondition();
|
|
if (isXMRBHasSignal)
|
|
{
|
|
//
|
|
Add(
|
|
"XMRB",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1.5;
|
|
|
|
//
|
|
// info.sl = mATRSLHelper.upBuffer[1];
|
|
}
|
|
|
|
//
|
|
bool isXPVHasSignal = false; // XPVHasShortCondition();
|
|
if (isXPVHasSignal)
|
|
{
|
|
//
|
|
Add(
|
|
"XPV",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1.4;
|
|
|
|
//
|
|
double slValue = mPVHelper.sHHBuffer[1];
|
|
// slValue -= PointToPrice(
|
|
// mSymbol,
|
|
// 5
|
|
// );
|
|
// info.sl = slValue;
|
|
info.sl = mATRSLHelper.upBuffer[1];
|
|
}
|
|
|
|
//
|
|
bool isXICHIHasSignal1 = false; // XICHIHasShortCondition1();
|
|
if (isXICHIHasSignal1)
|
|
{
|
|
//
|
|
Add(
|
|
"XICHI",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1.5;
|
|
|
|
//
|
|
double hhValue = GetHighestHigh(
|
|
mSymbol,
|
|
mPeriod,
|
|
3,
|
|
0);
|
|
hhValue += PointToPrice(
|
|
mSymbol,
|
|
5);
|
|
|
|
//
|
|
info.sl = hhValue;
|
|
}
|
|
|
|
//
|
|
bool isXICHIHasSignal2 = false; // XICHIHasShortCondition2();
|
|
if (isXICHIHasSignal2)
|
|
{
|
|
//
|
|
Add(
|
|
"XICHI",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1;
|
|
|
|
//
|
|
double hhValue = GetHighestHigh(
|
|
mSymbol,
|
|
mPeriod,
|
|
3,
|
|
0);
|
|
hhValue += PointToPrice(
|
|
mSymbol,
|
|
5);
|
|
|
|
//
|
|
info.sl = hhValue;
|
|
}
|
|
|
|
//
|
|
bool isXICHIHasSignal3 = false; // XICHIHasShortCondition3();
|
|
if (isXICHIHasSignal3)
|
|
{
|
|
//
|
|
Add(
|
|
"XICHI",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1.5;
|
|
|
|
//
|
|
double hhValue = GetHighestHigh(
|
|
mSymbol,
|
|
mPeriod,
|
|
3,
|
|
0);
|
|
hhValue += PointToPrice(
|
|
mSymbol,
|
|
5);
|
|
|
|
//
|
|
info.sl = hhValue;
|
|
}
|
|
|
|
//
|
|
bool isXICHIHasSignal4 = XICHIHasShortCondition4();
|
|
if (isXICHIHasSignal4)
|
|
{
|
|
//
|
|
Add(
|
|
"XICHI",
|
|
info.providers);
|
|
|
|
//
|
|
info.r2r = 1.5;
|
|
|
|
//
|
|
double slValue = mATRSLHelper.upBuffer[1];
|
|
slValue += PointToPrice(
|
|
mSymbol,
|
|
5);
|
|
|
|
//
|
|
info.sl = slValue;
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
isXMRBHasSignal
|
|
//
|
|
||
|
|
//
|
|
isXPVHasSignal
|
|
//
|
|
||
|
|
//
|
|
isXICHIHasSignal1
|
|
//
|
|
||
|
|
//
|
|
isXICHIHasSignal2
|
|
//
|
|
||
|
|
//
|
|
isXICHIHasSignal3
|
|
//
|
|
||
|
|
//
|
|
isXICHIHasSignal4
|
|
//
|
|
;
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
//
|
|
info.entry = entry;
|
|
info.symbol = mSymbol;
|
|
info.period = mPeriod;
|
|
info.type = POSITION_TYPE_SELL;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// START XMRB ...
|
|
|
|
//
|
|
bool XMRBHasLongCondition()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
// //
|
|
// XOHCL c1 = GetCandle(
|
|
// mSymbol,
|
|
// mPeriod,
|
|
// 1);
|
|
|
|
// //
|
|
// XOHCL c2 = GetCandle(
|
|
// mSymbol,
|
|
// mPeriod,
|
|
// 2);
|
|
|
|
// //
|
|
// double hhValue = GetHighestHigh(
|
|
// mSymbol,
|
|
// mPeriod,
|
|
// 5,
|
|
// 1);
|
|
// double llValue = GetLowestLow(
|
|
// mSymbol,
|
|
// mPeriod,
|
|
// 5,
|
|
// 1);
|
|
|
|
// //
|
|
// // Find Fast Cross Over Slow ...
|
|
// bool isFastCrossOverSlow =
|
|
// mMRBHelper.fastBuffer[1] > mMRBHelper.slowBuffer[1] &&
|
|
// mMRBHelper.fastBuffer[2] <= mMRBHelper.slowBuffer[2];
|
|
|
|
// //
|
|
// bool isTrendsUp =
|
|
// //
|
|
// // Trens by Other ...
|
|
// (
|
|
// //
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast1Buffer[1] > mMRBHelper.slow1Buffer[1] &&
|
|
// mMRBHelper.fast2Buffer[1] > mMRBHelper.slow2Buffer[1] &&
|
|
// mMRBHelper.fast3Buffer[1] > mMRBHelper.slow3Buffer[1] &&
|
|
// mMRBHelper.fast4Buffer[1] > mMRBHelper.slow4Buffer[1] &&
|
|
// mMRBHelper.fast5Buffer[1] > mMRBHelper.slow5Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// ||
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast1Buffer[1] > mMRBHelper.slow1Buffer[1] &&
|
|
// mMRBHelper.fast2Buffer[1] > mMRBHelper.slow2Buffer[1] &&
|
|
// mMRBHelper.fast3Buffer[1] > mMRBHelper.slow3Buffer[1] &&
|
|
// mMRBHelper.fast4Buffer[1] > mMRBHelper.slow4Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// ||
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast2Buffer[1] > mMRBHelper.slow2Buffer[1] &&
|
|
// mMRBHelper.fast3Buffer[1] > mMRBHelper.slow3Buffer[1] &&
|
|
// mMRBHelper.fast4Buffer[1] > mMRBHelper.slow4Buffer[1] &&
|
|
// mMRBHelper.fast5Buffer[1] > mMRBHelper.slow5Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// )
|
|
// //
|
|
// &&
|
|
// //
|
|
// // Trends By Them ...
|
|
// (
|
|
// //
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast2Buffer[1] > mMRBHelper.fast3Buffer[1] &&
|
|
// mMRBHelper.fast3Buffer[1] > mMRBHelper.fast4Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// ||
|
|
// //
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast3Buffer[1] > mMRBHelper.fast4Buffer[1] &&
|
|
// mMRBHelper.fast4Buffer[1] > mMRBHelper.fast5Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// )
|
|
// //
|
|
// ;
|
|
|
|
// //
|
|
// bool isCyclesTrendsUp =
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast1Buffer[1] > mMRBHelper.slow1Buffer[1] &&
|
|
// mMRBHelper.fast2Buffer[1] > mMRBHelper.slow2Buffer[1] &&
|
|
// mMRBHelper.fast3Buffer[1] > mMRBHelper.slow3Buffer[1] &&
|
|
// mMRBHelper.fast4Buffer[1] > mMRBHelper.slow4Buffer[1] &&
|
|
// mMRBHelper.fast5Buffer[1] > mMRBHelper.slow5Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// &&
|
|
// //
|
|
// !(
|
|
// //
|
|
// mMRBHelper.fast1Buffer[2] > mMRBHelper.slow1Buffer[2] &&
|
|
// mMRBHelper.fast2Buffer[2] > mMRBHelper.slow2Buffer[2] &&
|
|
// mMRBHelper.fast3Buffer[2] > mMRBHelper.slow3Buffer[2] &&
|
|
// mMRBHelper.fast4Buffer[2] > mMRBHelper.slow4Buffer[2] &&
|
|
// mMRBHelper.fast5Buffer[2] > mMRBHelper.slow5Buffer[2]
|
|
// //
|
|
// )
|
|
// //
|
|
// ;
|
|
|
|
// //
|
|
// bool candleCrossEMA200 =
|
|
// c1.open < mEMA200Buffer[1] &&
|
|
// c1.close > mEMA200Buffer[1];
|
|
|
|
// //
|
|
// bool llCrossEMA200 =
|
|
// llValue < mEMA200Buffer[1] &&
|
|
// hhValue > mEMA200Buffer[1];
|
|
|
|
// //
|
|
// bool candlesPullBack =
|
|
// //
|
|
// (
|
|
// //
|
|
// mMRBHelper.fastBuffer[1] > mMRBHelper.slowBuffer[1] &&
|
|
// mMRBHelper.fastBuffer[2] > mMRBHelper.slowBuffer[2] &&
|
|
// mMRBHelper.fastBuffer[3] > mMRBHelper.slowBuffer[3] &&
|
|
// //
|
|
// mMRBHelper.fastBuffer[1] > mMRBHelper.fastBuffer[2] &&
|
|
// mMRBHelper.fastBuffer[2] > mMRBHelper.fastBuffer[3] &&
|
|
// //
|
|
// c1.open < mMRBHelper.fastBuffer[1] &&
|
|
// c1.close > mMRBHelper.fastBuffer[2] &&
|
|
// //
|
|
// c2.open < mMRBHelper.fastBuffer[2] &&
|
|
// c2.close < mMRBHelper.fastBuffer[2] &&
|
|
// //
|
|
// MathMin(c1.high, c1.low) > mEMA200Buffer[1] &&
|
|
// MathMin(c2.high, c2.low) > mEMA200Buffer[2]
|
|
// //
|
|
// )
|
|
// //
|
|
// ;
|
|
|
|
// //
|
|
// result =
|
|
// //
|
|
// (isTrendsUp &&
|
|
// llCrossEMA200 &&
|
|
// isFastCrossOverSlow)
|
|
// //
|
|
// ||
|
|
// //
|
|
// (isTrendsUp &&
|
|
// isCyclesTrendsUp &&
|
|
// candleCrossEMA200)
|
|
// //
|
|
// // ||
|
|
// // //
|
|
// // llCrossEMA200
|
|
// // //
|
|
// ||
|
|
// //
|
|
// candlesPullBack
|
|
// //
|
|
// ;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool XMRBHasShortCondition()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
// //
|
|
// XOHCL c1 = GetCandle(
|
|
// mSymbol,
|
|
// mPeriod,
|
|
// 1);
|
|
// XOHCL c2 = GetCandle(
|
|
// mSymbol,
|
|
// mPeriod,
|
|
// 2);
|
|
|
|
// //
|
|
// double hhValue = GetHighestHigh(
|
|
// mSymbol,
|
|
// mPeriod,
|
|
// 5,
|
|
// 1);
|
|
// double llValue = GetLowestLow(
|
|
// mSymbol,
|
|
// mPeriod,
|
|
// 5,
|
|
// 1);
|
|
|
|
// //
|
|
// // Find Fast Cross Under Slow ...
|
|
// bool isFastCrossUnderSlow =
|
|
// mMRBHelper.fastBuffer[1] < mMRBHelper.slowBuffer[1] &&
|
|
// mMRBHelper.fastBuffer[2] >= mMRBHelper.slowBuffer[2];
|
|
|
|
// //
|
|
// bool isTrendsDown =
|
|
// //
|
|
// // Trens by Other ...
|
|
// (
|
|
// //
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast1Buffer[1] < mMRBHelper.slow1Buffer[1] &&
|
|
// mMRBHelper.fast2Buffer[1] < mMRBHelper.slow2Buffer[1] &&
|
|
// mMRBHelper.fast3Buffer[1] < mMRBHelper.slow3Buffer[1] &&
|
|
// mMRBHelper.fast4Buffer[1] < mMRBHelper.slow4Buffer[1] &&
|
|
// mMRBHelper.fast5Buffer[1] < mMRBHelper.slow5Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// ||
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast1Buffer[1] < mMRBHelper.slow1Buffer[1] &&
|
|
// mMRBHelper.fast2Buffer[1] < mMRBHelper.slow2Buffer[1] &&
|
|
// mMRBHelper.fast3Buffer[1] < mMRBHelper.slow3Buffer[1] &&
|
|
// mMRBHelper.fast4Buffer[1] < mMRBHelper.slow4Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// ||
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast2Buffer[1] < mMRBHelper.slow2Buffer[1] &&
|
|
// mMRBHelper.fast3Buffer[1] < mMRBHelper.slow3Buffer[1] &&
|
|
// mMRBHelper.fast4Buffer[1] < mMRBHelper.slow4Buffer[1] &&
|
|
// mMRBHelper.fast5Buffer[1] < mMRBHelper.slow5Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// )
|
|
// //
|
|
// &&
|
|
// //
|
|
// // Trends By Them ...
|
|
// (
|
|
// //
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast2Buffer[1] < mMRBHelper.fast3Buffer[1] &&
|
|
// mMRBHelper.fast3Buffer[1] < mMRBHelper.fast4Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// ||
|
|
// //
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast3Buffer[1] < mMRBHelper.fast4Buffer[1] &&
|
|
// mMRBHelper.fast4Buffer[1] < mMRBHelper.fast5Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// )
|
|
// //
|
|
// ;
|
|
|
|
// //
|
|
// bool isCyclesTrendsDown =
|
|
// (
|
|
// //
|
|
// mMRBHelper.fast1Buffer[1] < mMRBHelper.slow1Buffer[1] &&
|
|
// mMRBHelper.fast2Buffer[1] < mMRBHelper.slow2Buffer[1] &&
|
|
// mMRBHelper.fast3Buffer[1] < mMRBHelper.slow3Buffer[1] &&
|
|
// mMRBHelper.fast4Buffer[1] < mMRBHelper.slow4Buffer[1] &&
|
|
// mMRBHelper.fast5Buffer[1] < mMRBHelper.slow5Buffer[1]
|
|
// //
|
|
// )
|
|
// //
|
|
// &&
|
|
// //
|
|
// !(
|
|
// //
|
|
// mMRBHelper.fast1Buffer[2] < mMRBHelper.slow1Buffer[2] &&
|
|
// mMRBHelper.fast2Buffer[2] < mMRBHelper.slow2Buffer[2] &&
|
|
// mMRBHelper.fast3Buffer[2] < mMRBHelper.slow3Buffer[2] &&
|
|
// mMRBHelper.fast4Buffer[2] < mMRBHelper.slow4Buffer[2] &&
|
|
// mMRBHelper.fast5Buffer[2] < mMRBHelper.slow5Buffer[2]
|
|
// //
|
|
// )
|
|
// //
|
|
// ;
|
|
|
|
// //
|
|
// bool candleCrossEMA200 =
|
|
// c1.open > mEMA200Buffer[1] &&
|
|
// c1.close < mEMA200Buffer[1];
|
|
|
|
// //
|
|
// bool hhCrossEMA200 =
|
|
// hhValue > mEMA200Buffer[1] &&
|
|
// llValue < mEMA200Buffer[1];
|
|
|
|
// //
|
|
// bool candlesPullBack =
|
|
// //
|
|
// (
|
|
// //
|
|
// mMRBHelper.fastBuffer[1] < mMRBHelper.slowBuffer[1] &&
|
|
// mMRBHelper.fastBuffer[2] < mMRBHelper.slowBuffer[2] &&
|
|
// mMRBHelper.fastBuffer[3] < mMRBHelper.slowBuffer[3] &&
|
|
// //
|
|
// mMRBHelper.fastBuffer[1] < mMRBHelper.fastBuffer[2] &&
|
|
// mMRBHelper.fastBuffer[2] < mMRBHelper.fastBuffer[3] &&
|
|
// //
|
|
// c1.open > mMRBHelper.fastBuffer[1] &&
|
|
// c1.close < mMRBHelper.fastBuffer[2] &&
|
|
// //
|
|
// c2.open > mMRBHelper.slowBuffer[2] &&
|
|
// c2.close > mMRBHelper.slowBuffer[2] &&
|
|
// //
|
|
// MathMax(c1.high, c1.low) < mEMA200Buffer[1] &&
|
|
// MathMax(c2.high, c2.low) < mEMA200Buffer[2]
|
|
// //
|
|
// )
|
|
// //
|
|
// ;
|
|
|
|
// //
|
|
// result =
|
|
// //
|
|
// (isTrendsDown &&
|
|
// hhCrossEMA200 &&
|
|
// isFastCrossUnderSlow)
|
|
// //
|
|
// ||
|
|
// //
|
|
// (isTrendsDown &&
|
|
// isCyclesTrendsDown &&
|
|
// candleCrossEMA200)
|
|
// //
|
|
// // ||
|
|
// // //
|
|
// // hhCrossEMA200
|
|
// // //
|
|
// ||
|
|
// //
|
|
// candlesPullBack
|
|
// //
|
|
// ;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// END XMRB ...
|
|
//
|
|
|
|
//
|
|
// START XPV ...
|
|
//
|
|
|
|
//
|
|
bool XPVHasLongCondition()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
bool isSupportsHappens =
|
|
//
|
|
!mPVHelper.IsStrongSupport(1) &&
|
|
mPVHelper.IsStrongSupport(2) &&
|
|
mPVHelper.IsStrongSupport(3)
|
|
//
|
|
;
|
|
|
|
//
|
|
result =
|
|
//
|
|
false
|
|
//
|
|
// isSupportsHappens &&
|
|
// isFeautureKumoBullish
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool XPVHasShortCondition()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
!mPVHelper.IsStrongResistance(1) &&
|
|
mPVHelper.IsStrongResistance(2) &&
|
|
mPVHelper.IsStrongResistance(3);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// END XPV ...
|
|
//
|
|
|
|
//
|
|
// START Ichimoku ...
|
|
//
|
|
|
|
//
|
|
// CONDITION 1 ...
|
|
|
|
//
|
|
// Long Condition 1 ...
|
|
bool XICHIHasLongCondition1()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
XOHCL c1 = GetCandle(
|
|
mSymbol,
|
|
mPeriod,
|
|
1);
|
|
|
|
//
|
|
bool isTenkanSenCrossed =
|
|
mIchiHelper.IsTenkanSenCrossedOverKijunSen(1);
|
|
|
|
//
|
|
XIchiInfo info = mIchiHelper.GetInfo(1);
|
|
bool isCandleClosedOverCross =
|
|
c1.close > MathMax(info.tenkanSen, info.kijunSen);
|
|
|
|
//
|
|
double ll = GetLowestLow(
|
|
mSymbol,
|
|
mPeriod,
|
|
6,
|
|
1);
|
|
bool isCandlesOverKumo =
|
|
ll > MathMax(info.senkouSpanA, info.senkouSpanB);
|
|
|
|
//
|
|
result =
|
|
//
|
|
isTenkanSenCrossed &&
|
|
isCandlesOverKumo &&
|
|
isCandleClosedOverCross
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Short Condition 1 ...
|
|
bool XICHIHasShortCondition1()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
XOHCL c1 = GetCandle(
|
|
mSymbol,
|
|
mPeriod,
|
|
1);
|
|
|
|
//
|
|
bool isTenkanSenCrossed =
|
|
mIchiHelper.IsTenkanSenCrossedUnderKijunSen(1);
|
|
|
|
//
|
|
XIchiInfo info = mIchiHelper.GetInfo(1);
|
|
bool isCandleClosedUnderCross =
|
|
c1.close < MathMin(info.tenkanSen, info.kijunSen);
|
|
|
|
//
|
|
double hh = GetHighestHigh(
|
|
mSymbol,
|
|
mPeriod,
|
|
6,
|
|
1);
|
|
bool isCandlesUnderKumo =
|
|
hh < MathMin(info.senkouSpanA, info.senkouSpanB);
|
|
|
|
//
|
|
result =
|
|
//
|
|
isTenkanSenCrossed &&
|
|
isCandlesUnderKumo &&
|
|
isCandleClosedUnderCross
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// CONDITION 2 ...
|
|
|
|
//
|
|
// Long Condition 2 ...
|
|
// Ichimoku and CCI ...
|
|
bool XICHIHasLongCondition2()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
bool isCCICrossedOverNegative100 =
|
|
//
|
|
mCCIBuffer[1] > -100 &&
|
|
mCCIBuffer[2] <= -100
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isTenkanSenOverKijunSen =
|
|
mIchiHelper.IsTenkanSenOverKijunSen(1);
|
|
|
|
//
|
|
bool isKumoBullish =
|
|
mIchiHelper.IsKumoBullish(1);
|
|
|
|
//
|
|
XIchiInfo info = mIchiHelper.GetInfo(1);
|
|
double llValue = GetLowestLow(
|
|
mSymbol,
|
|
mPeriod,
|
|
12,
|
|
1);
|
|
bool isPriceOverKumo =
|
|
//
|
|
llValue > MathMax(info.senkouSpanA, info.senkouSpanB)
|
|
//
|
|
;
|
|
|
|
//
|
|
result =
|
|
//
|
|
isKumoBullish &&
|
|
isPriceOverKumo &&
|
|
isTenkanSenOverKijunSen &&
|
|
isCCICrossedOverNegative100
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Short Condition 2 ...
|
|
// Ichimoku and CCI ...
|
|
bool XICHIHasShortCondition2()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
bool isCCICrossedUnderPositive100 =
|
|
//
|
|
mCCIBuffer[1] < 100 &&
|
|
mCCIBuffer[2] >= 100
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isTenkanSenUnderKijunSen =
|
|
mIchiHelper.IsTenkanSenUnderKijunSen(1);
|
|
|
|
//
|
|
bool isKumoBearish =
|
|
mIchiHelper.IsKumoBearish(1);
|
|
|
|
//
|
|
XOHCL c1 = GetCandle(
|
|
mSymbol,
|
|
mPeriod,
|
|
1);
|
|
XIchiInfo info = mIchiHelper.GetInfo(1);
|
|
double hhValue = GetHighestHigh(
|
|
mSymbol,
|
|
mPeriod,
|
|
12,
|
|
1);
|
|
bool isPriceUnderKumo =
|
|
//
|
|
c1.high < MathMin(info.senkouSpanA, info.senkouSpanB) &&
|
|
hhValue < MathMin(info.senkouSpanA, info.senkouSpanB)
|
|
//
|
|
;
|
|
|
|
//
|
|
result =
|
|
//
|
|
isKumoBearish &&
|
|
isPriceUnderKumo &&
|
|
isTenkanSenUnderKijunSen &&
|
|
isCCICrossedUnderPositive100
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// CONDITIONS 3 ...
|
|
|
|
//
|
|
// Long Condition 3 ...
|
|
bool XICHIHasLongCondition3()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
XOHCL c1 = GetCandle(
|
|
mSymbol,
|
|
mPeriod,
|
|
1);
|
|
|
|
//
|
|
XIchiInfo info = mIchiHelper.GetInfo(1);
|
|
|
|
//
|
|
bool isFutureKumoSwitchedToBullish =
|
|
mIchiHelper.IsKumoSwitchedToBullish(1, true);
|
|
|
|
//
|
|
bool isCandleClosedOverFutureKumo =
|
|
c1.close > MathMax(info.senkouSpanAFuture, info.senkouSpanBFuture);
|
|
|
|
//
|
|
result =
|
|
//
|
|
isCandleClosedOverFutureKumo &&
|
|
isFutureKumoSwitchedToBullish
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Short Condition 3 ...
|
|
bool XICHIHasShortCondition3()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
XOHCL c1 = GetCandle(
|
|
mSymbol,
|
|
mPeriod,
|
|
1);
|
|
|
|
//
|
|
XIchiInfo info = mIchiHelper.GetInfo(1);
|
|
|
|
//
|
|
bool isFutureKumoSwitchedToBearish =
|
|
mIchiHelper.IsKumoSwitchedToBearish(1, true);
|
|
|
|
//
|
|
bool isCandleClosedUnderFutureKumo =
|
|
c1.close < MathMin(info.senkouSpanAFuture, info.senkouSpanBFuture);
|
|
|
|
//
|
|
result =
|
|
//
|
|
isCandleClosedUnderFutureKumo &&
|
|
isFutureKumoSwitchedToBearish
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// CONDITIONS 4 ...
|
|
|
|
//
|
|
// Long Condition 4 ...
|
|
bool XICHIHasLongCondition4()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
XOHCL c1 = GetCandle(
|
|
mSymbol,
|
|
mPeriod,
|
|
1);
|
|
|
|
//
|
|
XIchiInfo info = mIchiHelper.GetInfo(1);
|
|
|
|
//
|
|
bool isSSLUpCrossedOverDown =
|
|
mSSLCHelper.IsUpCrossedOverDown(1);
|
|
|
|
//
|
|
bool isCandleClosedOverKumo =
|
|
c1.low > MathMax(info.senkouSpanA, info.senkouSpanB);
|
|
|
|
//
|
|
bool isKumoBullish =
|
|
mIchiHelper.IsKumoBullish(1);
|
|
|
|
//
|
|
result =
|
|
//
|
|
isKumoBullish &&
|
|
isSSLUpCrossedOverDown &&
|
|
isCandleClosedOverKumo
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Short Condition 4 ...
|
|
bool XICHIHasShortCondition4()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
XOHCL c1 = GetCandle(
|
|
mSymbol,
|
|
mPeriod,
|
|
1);
|
|
|
|
//
|
|
XIchiInfo info = mIchiHelper.GetInfo(1);
|
|
|
|
//
|
|
bool isSSLUpCrossedUnderDown =
|
|
mSSLCHelper.IsUpCrossedUnderDown(1);
|
|
|
|
//
|
|
bool isCandleClosedUnderKumo =
|
|
c1.high < MathMin(info.senkouSpanA, info.senkouSpanB);
|
|
|
|
//
|
|
bool isKumoBearish =
|
|
mIchiHelper.IsKumoBearish(1);
|
|
|
|
//
|
|
result =
|
|
//
|
|
isKumoBearish &&
|
|
isSSLUpCrossedUnderDown &&
|
|
isCandleClosedUnderKumo
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// END Ichimoku ...
|
|
//
|
|
|
|
//
|
|
// END Providers Signals ...
|
|
//
|
|
};
|
|
|
|
//
|
|
// START Definitions ...
|
|
//
|
|
|
|
//
|
|
// Model Signal Providers Definitions ...
|
|
struct X121SignalProvider
|
|
{
|
|
//
|
|
// Provider use Which Symbol ...
|
|
string symbol;
|
|
|
|
//
|
|
// Provider use Which Time Frame ...
|
|
ENUM_TIMEFRAMES period;
|
|
|
|
//
|
|
// Risk Amount Per Trades Related to Time Frames ...
|
|
// Percent of Available Balance ...
|
|
double riskAmount;
|
|
|
|
//
|
|
// Desired Magic Number ...
|
|
ulong magicNumber;
|
|
|
|
//
|
|
// Provider ...
|
|
XSCX121Provider provider;
|
|
};
|
|
|
|
//
|
|
// END Definitions ...
|
|
//
|
|
|
|
//
|
|
// START Usefull Functions ...
|
|
//
|
|
|
|
//
|
|
// Add Specific Provider to List ...
|
|
void Add(
|
|
X121SignalProvider &item, // item want to add
|
|
X121SignalProvider &buffer[] // Destination buffer
|
|
)
|
|
{
|
|
//
|
|
ArrayResize(
|
|
buffer,
|
|
ArraySize(buffer) + 1);
|
|
|
|
//
|
|
buffer[ArraySize(buffer) - 1] = item;
|
|
}
|
|
|
|
//
|
|
// Generate Identifier Tag ...
|
|
string GenerateTag(X121SignalProvider &descriptor)
|
|
{
|
|
//
|
|
string result = "";
|
|
|
|
//
|
|
result = descriptor.symbol + "_" + ToString(descriptor.period);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// END Usefull Functions ...
|
|
//
|