attach conditions to x121 conditions ...
This commit is contained in:
@@ -0,0 +1,830 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XC121SMCExpert
|
||||
// Description: provides all based classes for use ...
|
||||
//
|
||||
//
|
||||
// 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 "../../Classes/x-saherelm.x-expert.class.mq5"
|
||||
#include "../../Classes/x-saherelm.x-poi.class.mq5"
|
||||
// #include "../Classes/x-121.smc.xtradehandler.class.mq5"
|
||||
|
||||
//
|
||||
// Definitions ...
|
||||
string XC121SMCExpertToken = "XC121SMCEA";
|
||||
|
||||
//
|
||||
// Implementation ...
|
||||
|
||||
class XC121SMCExpert : public XCBaseExpert
|
||||
{
|
||||
//
|
||||
public:
|
||||
//
|
||||
|
||||
//
|
||||
// Signal Event Listener ...
|
||||
TOnStopLoss OnPositionSLEventListener;
|
||||
TOnTakeProfit OnPositionTPEventListener;
|
||||
TOnPartialClose OnPositionPartialCloseEventListener;
|
||||
TOnModify OnPositionModifiedEventListener;
|
||||
TOnForceClose OnPositionForceCloseEventListener;
|
||||
|
||||
//
|
||||
// Getter(s) / Setter(s) ...
|
||||
|
||||
/**
|
||||
* Get Use Dynamic Volume State ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool UseDynamicVolume()
|
||||
{
|
||||
return mUseDynamicVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Use Dynamic Volume State ...
|
||||
*
|
||||
* @param value: Boolean ...
|
||||
*/
|
||||
void UseDynamicVolume(bool value)
|
||||
{
|
||||
mUseDynamicVolume = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Increase Volume Step ...
|
||||
*
|
||||
* @return ( double )
|
||||
*/
|
||||
double DynamicVolumeStep()
|
||||
{
|
||||
return mDynamicVolumeStep;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Increase Volume Step ...
|
||||
*
|
||||
* @param value: Double ...
|
||||
*/
|
||||
void DynamicVolumeStep(double value)
|
||||
{
|
||||
//
|
||||
if (value < 0.01)
|
||||
{
|
||||
value = 0.01;
|
||||
}
|
||||
|
||||
//
|
||||
mDynamicVolumeStep = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Balance Factor for Generate Dynamic Volume ...
|
||||
*
|
||||
* @return ( double )
|
||||
*/
|
||||
double DynamicVolumeBalanceFactor()
|
||||
{
|
||||
return mDynamicVolumeBalanceFactor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Balance Factor for Generate Dynamic Volume ...
|
||||
*
|
||||
* @param value: Double ...
|
||||
*/
|
||||
void DynamicVolumeBalanceFactor(double value)
|
||||
{
|
||||
//
|
||||
if (value < 0)
|
||||
{
|
||||
value = 0;
|
||||
}
|
||||
|
||||
//
|
||||
mDynamicVolumeBalanceFactor = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Static Volume ...
|
||||
*
|
||||
* @return ( double )
|
||||
*/
|
||||
double Volume()
|
||||
{
|
||||
return mVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Static Volume ...
|
||||
*
|
||||
* @param value: Double ...
|
||||
*/
|
||||
void Volume(double value)
|
||||
{
|
||||
//
|
||||
if (value < 0.01)
|
||||
{
|
||||
value = 0.01;
|
||||
}
|
||||
|
||||
//
|
||||
mVolume = value;
|
||||
}
|
||||
|
||||
//
|
||||
// Actions ...
|
||||
|
||||
//
|
||||
// Override Actions ...
|
||||
|
||||
/**
|
||||
* Apply Default Configurations ...
|
||||
*/
|
||||
void DefaultConfigure() override
|
||||
{
|
||||
//
|
||||
// Commons ...
|
||||
Slippage(10);
|
||||
TagPrefix("");
|
||||
MagicNumber(1694056);
|
||||
|
||||
//
|
||||
// Symbol ...
|
||||
SetSymbol(_Symbol);
|
||||
SetPeriod(_Period);
|
||||
MultiSymbol(false);
|
||||
Symbols("EURUSDb,GBPUSDb,USDJPYb,USDCHFb,DowJones30,XAUUSDb");
|
||||
|
||||
//
|
||||
// Signalling ...
|
||||
Disabled(false);
|
||||
AllowLong(true);
|
||||
AllowShort(true);
|
||||
|
||||
//
|
||||
string tag = GetTag();
|
||||
|
||||
//
|
||||
// Alert ...
|
||||
SetAlertPrefix(tag);
|
||||
SetAlertLogAlerts(true);
|
||||
SetAlertPushAlerts(true);
|
||||
SetAlertMailAlerts(false);
|
||||
SetAlertEnableAlerts(true);
|
||||
SetAlertTerminalAlerts(false);
|
||||
|
||||
//
|
||||
// Reports ...
|
||||
ReportNewDays(true);
|
||||
ReportNewWeeks(false);
|
||||
ReportNewHours(false);
|
||||
ReportNewMonths(false);
|
||||
|
||||
//
|
||||
// Volume Default Configurations ...
|
||||
Volume(0.01);
|
||||
UseDynamicVolume(false);
|
||||
DynamicVolumeStep(0.01);
|
||||
DynamicVolumeBalanceFactor(200);
|
||||
}
|
||||
|
||||
/**
|
||||
* Vaslidate Inputs ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool ValidateInputs() override
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
string errMessage = "";
|
||||
|
||||
//
|
||||
bool isCommonValid = (
|
||||
//
|
||||
Slippage() > 0 &&
|
||||
MagicNumber() > 0
|
||||
//
|
||||
);
|
||||
if (!isCommonValid)
|
||||
{
|
||||
//
|
||||
errMessage += "common configurations error;" + "\n";
|
||||
}
|
||||
|
||||
//
|
||||
// Checking Volume ...
|
||||
bool isVolumeValid = true;
|
||||
if (UseDynamicVolume())
|
||||
{
|
||||
//
|
||||
isVolumeValid =
|
||||
DynamicVolumeStep() > 0 &&
|
||||
DynamicVolumeBalanceFactor() > 0;
|
||||
if (!isVolumeValid)
|
||||
{
|
||||
errMessage += "Dynamic Volume configurations error;" + "\n";
|
||||
}
|
||||
}
|
||||
isVolumeValid = isVolumeValid &&
|
||||
Volume() > 0;
|
||||
if (!isVolumeValid)
|
||||
{
|
||||
errMessage += "Static Volume configurations error;" + "\n";
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
// Common ...
|
||||
isCommonValid &&
|
||||
//
|
||||
// Volume Coniguration ...
|
||||
isVolumeValid &&
|
||||
//
|
||||
// Otere ...
|
||||
true
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
// Since here Logger not Initiallized, we Use Raw Print Command ...
|
||||
errMessage = " Errors: \n" + errMessage;
|
||||
Alert(errMessage);
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Initializers and DeInitializers ...
|
||||
|
||||
/**
|
||||
* Initial EA Requirements ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool InitEA() override
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Initialize Indicator Helpers ...
|
||||
|
||||
//
|
||||
string symbol = GetSymbol();
|
||||
ENUM_TIMEFRAMES period = GetPeriod();
|
||||
|
||||
//
|
||||
mPOIDetector = new XCPOIDetector(
|
||||
symbol,
|
||||
period //
|
||||
);
|
||||
mPOIDetector.Init();
|
||||
|
||||
//
|
||||
// Bar Timer ...
|
||||
XCTInputs ctInputs;
|
||||
ctInputs.Default(); // Default Configurations ...
|
||||
mCTHelper = new XCXCTHelper();
|
||||
result = mCTHelper.Init(
|
||||
GetSymbol(),
|
||||
GetPeriod(),
|
||||
ctInputs //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Bar Styles ...
|
||||
XCCInputs ccInputs;
|
||||
ccInputs.Default(); // Default Configurations ...
|
||||
mCCHelper = new XCXCCHelper();
|
||||
result = mCCHelper.Init(
|
||||
GetSymbol(),
|
||||
GetPeriod(),
|
||||
ccInputs //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Create Trader Instance and Configure it ...
|
||||
mTrader = new XCTrade(
|
||||
Slippage(),
|
||||
MagicNumber() //
|
||||
);
|
||||
mTrader.AddOnStopLossEventHandler(OnPositionSLEventListener);
|
||||
mTrader.AddOnTakeProfitEventHandler(OnPositionTPEventListener);
|
||||
mTrader.AddOnModifyPositionEventHandler(OnPositionModifiedEventListener);
|
||||
mTrader.AddOnForceClosePositionEventHandler(OnPositionForceCloseEventListener);
|
||||
mTrader.AddOnPartialClosePositionEventHandler(OnPositionPartialCloseEventListener);
|
||||
|
||||
// //
|
||||
// // Initialize Trade Handler ...
|
||||
// mTradeHandler = new XC121SMCTradeHandler(mTrader);
|
||||
// mTradeHandler.SaveTrades(true);
|
||||
// mTradeHandler.SaveSignals(true);
|
||||
// mTradeHandler.SaveConditions(true);
|
||||
|
||||
// //
|
||||
// // Configure Alerts ...
|
||||
// mTradeHandler.SetAlertPrefix(GetTag());
|
||||
// mTradeHandler.SetAlertEnableAlerts(GetAlertEnableAlerts());
|
||||
// mTradeHandler.SetAlertLogAlerts(GetAlertLogAlerts());
|
||||
// mTradeHandler.SetAlertMailAlerts(GetAlertMailAlerts());
|
||||
// mTradeHandler.SetAlertPushAlerts(GetAlertPushAlerts());
|
||||
// mTradeHandler.SetAlertTerminalAlerts(GetAlertTerminalAlerts());
|
||||
|
||||
// //
|
||||
// // TODO: Make This Configurable Later ...
|
||||
|
||||
// //
|
||||
// mTradeHandler.DelayBarBetweenTwoSignal(3);
|
||||
// mTradeHandler.MaxAllowedSLToPause(0);
|
||||
// mTradeHandler.MaxAllowedSLReachedPauseDelay(HoursToSeconds(24));
|
||||
|
||||
// //
|
||||
// // Configure Trade Management ...
|
||||
// mTradeHandler.AllowLong(AllowLong());
|
||||
// mTradeHandler.AllowShort(AllowShort());
|
||||
// mTradeHandler.MaxAllowedLongs(0);
|
||||
// mTradeHandler.MaxAllowedShorts(0);
|
||||
// mTradeHandler.UseMaxAllowedTradesPerSymbol(true);
|
||||
// mTradeHandler.MaxDrawdownPercentForOpenTrades(5);
|
||||
|
||||
// //
|
||||
// // Configure Position Protector ...
|
||||
|
||||
// //
|
||||
// mTradeHandler.UseForceMomentumsInProtection(true);
|
||||
// mTradeHandler.DelayBarBetweenTwoSignal(2);
|
||||
|
||||
// //
|
||||
// // Configure Hedging ...
|
||||
// mTradeHandler.AllowHedge(false);
|
||||
// mTradeHandler.HedgeMinVolumeStep(0.01);
|
||||
// mTradeHandler.MinimumOpenPositionsForHEHedge(2);
|
||||
// mTradeHandler.HedgeHEMinProfitPerVolumeStep(0.2);
|
||||
// mTradeHandler.HedgeBEMinProfitPerVolumeStep(0.06);
|
||||
|
||||
// //
|
||||
// // In Profit Position Protecting ...
|
||||
|
||||
// //
|
||||
// // Trail ...
|
||||
// mTradeHandler.AllowTrail(false);
|
||||
// mTradeHandler.TrailStep(15);
|
||||
// mTradeHandler.TrailStartDistance(30);
|
||||
// mTradeHandler.OnlyTrailUnprotected(true);
|
||||
// mTradeHandler.RemoveTPAfterTrailedLevel(4);
|
||||
|
||||
// //
|
||||
// // Partial Close (In Profit) ...
|
||||
// mTradeHandler.PartialCloseInProfitDistance(0);
|
||||
// mTradeHandler.PartialCloseInProfitVolume(0);
|
||||
|
||||
// //
|
||||
// // In Drawdown Positions Protecting ...
|
||||
|
||||
// //
|
||||
// // Protect ...
|
||||
// mTradeHandler.AllowProtect(false);
|
||||
// mTradeHandler.ProtectionDelay(20);
|
||||
// mTradeHandler.MaxAllowedProtection(0);
|
||||
// mTradeHandler.UseEntryAsProtectionSL(true);
|
||||
// mTradeHandler.ProtectOnConditions(true);
|
||||
// mTradeHandler.AllowDirectionProtct(false);
|
||||
// mTradeHandler.ProtectionStartDistance(50);
|
||||
// mTradeHandler.ProtectionVolumeMultiplier(2);
|
||||
|
||||
// //
|
||||
// // Partial Close (In Profit) ...
|
||||
// mTradeHandler.PartialCloseInDrawdownDistance(0);
|
||||
// mTradeHandler.PartialCloseInDrawdownVolume(0);
|
||||
|
||||
//
|
||||
// Parsers ...
|
||||
XSymbolParser _symbolParser;
|
||||
|
||||
//
|
||||
// Single Symbol ...
|
||||
if (!MultiSymbol())
|
||||
{
|
||||
//
|
||||
// Register Strategy ...
|
||||
|
||||
//
|
||||
// Create Class Instance ...
|
||||
// XCX121SMCBaseStrategy *iX121SMCStrategy;
|
||||
// iX121SMCStrategy = new XCX121SMCTestStrategy(
|
||||
// _Symbol,
|
||||
// _Period //
|
||||
// );
|
||||
|
||||
// //
|
||||
// iX121SMCStrategy.AddXSignalEventHandler(OnSignalEventListener);
|
||||
|
||||
// //
|
||||
// ConfigureStrategy(iX121SMCStrategy);
|
||||
// RegisterStrategy(iX121SMCStrategy);
|
||||
}
|
||||
//
|
||||
// Multi Symbol ...
|
||||
else
|
||||
{
|
||||
//
|
||||
// Parse Symbols ...
|
||||
string symbols[];
|
||||
int symbolsCount = SplitContent(
|
||||
symbols,
|
||||
Symbols() //
|
||||
);
|
||||
result = IsValidSize(symbolsCount);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < symbolsCount; i++)
|
||||
{
|
||||
//
|
||||
// Select Symbol ...
|
||||
string iSymbol = symbols[i];
|
||||
|
||||
//
|
||||
// Register Strategy Based On Symbol ...
|
||||
|
||||
//
|
||||
// Parse Symbol ...
|
||||
bool isEURUSD = _symbolParser.IsEURUSD(_Symbol);
|
||||
bool isGBPUSD = _symbolParser.IsGBPUSD(_Symbol);
|
||||
bool isEURGBP = _symbolParser.IsEURGBP(_Symbol);
|
||||
bool isUSDCHF = _symbolParser.IsUSDCHF(_Symbol);
|
||||
bool isEURCHF = _symbolParser.IsEURCHF(_Symbol);
|
||||
bool isUSDJPY = _symbolParser.IsUSDJPY(_Symbol);
|
||||
bool isEURJPY = _symbolParser.IsEURJPY(_Symbol);
|
||||
bool isUSDCAD = _symbolParser.IsUSDCAD(_Symbol);
|
||||
bool isEURCAD = _symbolParser.IsEURCAD(_Symbol);
|
||||
bool isAUDUSD = _symbolParser.IsAUDUSD(_Symbol);
|
||||
bool isEURAUD = _symbolParser.IsEURAUD(_Symbol);
|
||||
bool isNZDUSD = _symbolParser.IsNZDUSD(_Symbol);
|
||||
bool isEURNZD = _symbolParser.IsEURNZD(_Symbol);
|
||||
|
||||
//
|
||||
// Check Symbol Can Register or not ...
|
||||
bool canRegisterStrategy = true;
|
||||
|
||||
//
|
||||
if (canRegisterStrategy)
|
||||
{
|
||||
// //
|
||||
// // Create Class Instance ...
|
||||
// XCX121SMCBaseStrategy *iX121SMCStrategy;
|
||||
// iX121SMCStrategy = new XCX121SMCTestStrategy(
|
||||
// iSymbol,
|
||||
// _Period //
|
||||
// );
|
||||
|
||||
// //
|
||||
// iX121SMCStrategy.AddXSignalEventHandler(OnSignalEventListener);
|
||||
|
||||
// //
|
||||
// // Register Strategy ...
|
||||
// ConfigureStrategy(iX121SMCStrategy);
|
||||
// RegisterStrategy(iX121SMCStrategy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy all Initialized EA Requirements ...
|
||||
*/
|
||||
void DestroyEA() override
|
||||
{
|
||||
//
|
||||
delete mCTHelper;
|
||||
delete mCCHelper;
|
||||
// delete mTradeHandler;
|
||||
|
||||
//
|
||||
// Clean(mStrategies);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call all Registered Strategies On Tick ...
|
||||
*/
|
||||
void HandleStrategiesOnTick() override
|
||||
{
|
||||
//
|
||||
ENUM_XPOI_EVENTS events[];
|
||||
mPOIDetector.Update(events);
|
||||
|
||||
//
|
||||
// int count = ArraySize(mStrategies);
|
||||
// if (!IsValidSize(count))
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// //
|
||||
// for (int i = 0; i < count; i++)
|
||||
// {
|
||||
// //
|
||||
// // Call Tick Handler Function ...
|
||||
// mStrategies[i].HandleTick();
|
||||
// }
|
||||
}
|
||||
|
||||
//
|
||||
// Event Handlers ...
|
||||
|
||||
/**
|
||||
* Calls When a Position's SL Triggered ...
|
||||
*
|
||||
* @param deal: XDeal instance ...
|
||||
*/
|
||||
void HandleOnStopLossTriggered(const XDeal &deal) override
|
||||
{
|
||||
//
|
||||
// Finish ...
|
||||
// mTradeHandler.Finish(deal);
|
||||
|
||||
//
|
||||
HandleReportBalance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls When a Position's TP Triggered ...
|
||||
*
|
||||
* @param deal: XDeal instance ...
|
||||
*/
|
||||
void HandleOnTakeProfitTriggered(const XDeal &deal) override
|
||||
{
|
||||
//
|
||||
// Finish ...
|
||||
// mTradeHandler.Finish(deal);
|
||||
|
||||
//
|
||||
HandleReportBalance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Force Close a Position ...
|
||||
*
|
||||
* @param ticket: Position Ticket ...
|
||||
* @param position: XPosition ...
|
||||
* @param comment: Closing Comment ...
|
||||
*/
|
||||
void HandleOnPositionForceClosed(
|
||||
const ulong ticket,
|
||||
const XPosition &position,
|
||||
const string comment //
|
||||
) override
|
||||
{
|
||||
//
|
||||
// Finish ...
|
||||
// mTradeHandler.Finish(
|
||||
// ticket,
|
||||
// position,
|
||||
// comment //
|
||||
// );
|
||||
|
||||
//
|
||||
HandleReportBalance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset All Paused Symbols on Each New Days ...
|
||||
*/
|
||||
void HandleOnNewDay() override
|
||||
{
|
||||
// mTradeHandler.ResumePausedSymbols();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate Identifier Tag ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string GetTag() override
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
string tagPrefix = TagPrefix();
|
||||
if (IsValid(tagPrefix))
|
||||
{
|
||||
result = tagPrefix;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = "";
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
XCBaseExpertToken + result;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
protected:
|
||||
//
|
||||
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
datetime mLastSignalOn;
|
||||
|
||||
//
|
||||
XCPOIDetector *mPOIDetector;
|
||||
|
||||
//
|
||||
// XC121SMCTradeHandler *mTradeHandler; // Trade Handler ...
|
||||
// XCX121SMCBaseStrategy *mStrategies[]; // Registere Strategies in EA ...
|
||||
|
||||
//
|
||||
// Actions ...
|
||||
|
||||
/**
|
||||
* Apply Volume Based On Configurations on Signal ...
|
||||
*
|
||||
* @param signal: XSignal instance
|
||||
*/
|
||||
void ApplyVolumeOnSignal(XSignal &signal)
|
||||
{
|
||||
//
|
||||
// Prepare Signal Dynamic Volume
|
||||
// if Provided ...
|
||||
if (UseDynamicVolume() &&
|
||||
DynamicVolumeStep() > 0 &&
|
||||
DynamicVolumeBalanceFactor() > 0)
|
||||
{
|
||||
//
|
||||
double dVolume = mTrader.GetDynamicVolume(
|
||||
signal.symbol,
|
||||
DynamicVolumeBalanceFactor(),
|
||||
DynamicVolumeStep() //
|
||||
);
|
||||
|
||||
//
|
||||
if (dVolume > 0)
|
||||
{
|
||||
signal.volume = dVolume;
|
||||
}
|
||||
else
|
||||
{
|
||||
signal.volume = Volume();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
signal.volume = Volume();
|
||||
}
|
||||
|
||||
//
|
||||
// mTradeHandler.UpdateSignal(signal);
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure Startegy ...
|
||||
*/
|
||||
// void ConfigureStrategy(XCX121SMCBaseStrategy *&strategy)
|
||||
// {
|
||||
// //
|
||||
// if (strategy == NULL)
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// //
|
||||
// // Configure Alerts ...
|
||||
// strategy.SetAlertPrefix(GetTag());
|
||||
// strategy.SetAlertLogAlerts(GetAlertLogAlerts());
|
||||
// strategy.SetAlertMailAlerts(GetAlertMailAlerts());
|
||||
// strategy.SetAlertPushAlerts(GetAlertPushAlerts());
|
||||
// strategy.SetAlertEnableAlerts(GetAlertEnableAlerts());
|
||||
// strategy.SetAlertTerminalAlerts(GetAlertTerminalAlerts());
|
||||
|
||||
// //
|
||||
// // Confiugre Signalling ...
|
||||
|
||||
// //
|
||||
// strategy.R2R(2);
|
||||
// strategy.AllowLong(AllowLong());
|
||||
// strategy.AllowShort(AllowShort());
|
||||
|
||||
// //
|
||||
// if (Disabled())
|
||||
// {
|
||||
// strategy.Disable();
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// strategy.Enable();
|
||||
// }
|
||||
|
||||
// //
|
||||
// }
|
||||
|
||||
/**
|
||||
* Register an Strategy in EA ...
|
||||
*
|
||||
* @param strategy: XCX121SMCBaseStrategy instance ...
|
||||
*/
|
||||
// void RegisterStrategy(XCX121SMCBaseStrategy *strategy)
|
||||
// {
|
||||
// //
|
||||
// if (strategy == NULL)
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// //
|
||||
// ArrayResize(
|
||||
// mStrategies,
|
||||
// ArraySize(mStrategies) + 1 //
|
||||
// );
|
||||
|
||||
// //
|
||||
// mStrategies[ArraySize(mStrategies) - 1] = strategy;
|
||||
// }
|
||||
|
||||
/**
|
||||
* Re Configure All Registered Strategies ...
|
||||
*/
|
||||
// void ReConfigureAllStrategies()
|
||||
// {
|
||||
// //
|
||||
// int count = ArraySize(mStrategies);
|
||||
// if (!IsValidSize(count))
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// //
|
||||
// for (int i = 0; i < count; i++)
|
||||
// {
|
||||
// //
|
||||
// ConfigureStrategy(mStrategies[i]);
|
||||
// }
|
||||
// }
|
||||
|
||||
//
|
||||
private:
|
||||
//
|
||||
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Volume Management ...
|
||||
bool mUseDynamicVolume; // Use Dynamic Volume ...
|
||||
double mDynamicVolumeStep; // Increase Volume Step ...
|
||||
double mDynamicVolumeBalanceFactor; // Balance Factor for Generate Dynamic Volume ...
|
||||
double mVolume; // Static Volume ...
|
||||
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -76,6 +76,15 @@ enum ENUM_X121_BUFFERS
|
||||
X121_VALID_VALES_LINE = 38,
|
||||
};
|
||||
|
||||
//
|
||||
enum ENUM_XVWAP_STATES
|
||||
{
|
||||
//
|
||||
XVWAP_STATE_BULLISH = 1,
|
||||
XVWAP_STATE_BEARISH = 2,
|
||||
XVWAP_STATE_NEUTURAL = 3,
|
||||
};
|
||||
|
||||
//
|
||||
// Inputs ...
|
||||
struct X121Inputs
|
||||
@@ -507,6 +516,114 @@ struct X121Conditions
|
||||
double validPeaksBuffer[];
|
||||
double validValesBuffer[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
// XSAR ...
|
||||
|
||||
//
|
||||
bool isSarBullish;
|
||||
bool isSarBearish;
|
||||
|
||||
//
|
||||
bool isSarSwitchedBullish;
|
||||
bool isSarSwitchedBearish;
|
||||
|
||||
//
|
||||
// XPV ...
|
||||
|
||||
//
|
||||
bool isNewPeak;
|
||||
bool isNewPeakOverLast;
|
||||
bool isNewPeakUnderLast;
|
||||
|
||||
//
|
||||
bool isNewVale;
|
||||
bool isNewValeOverLast;
|
||||
bool isNewValeUnderLast;
|
||||
|
||||
//
|
||||
// XVWAP ...
|
||||
|
||||
//
|
||||
bool isVWapFastBullish;
|
||||
bool isVWapFastBearish;
|
||||
bool isVWapFastNeutural;
|
||||
|
||||
//
|
||||
bool isVWapMidBullish;
|
||||
bool isVWapMidBearish;
|
||||
bool isVWapMidNeutural;
|
||||
|
||||
//
|
||||
bool isVWapSlowBullish;
|
||||
bool isVWapSlowBearish;
|
||||
bool isVWapSlowNeutural;
|
||||
|
||||
//
|
||||
bool isVWapFastOverMid;
|
||||
bool isVWapMidOverSlow;
|
||||
|
||||
//
|
||||
bool isVWapFastUnderMid;
|
||||
bool isVWapMidUnderSlow;
|
||||
|
||||
//
|
||||
bool isVWapBullishState;
|
||||
bool isVWapBearishState;
|
||||
bool isVWapNeuturalState;
|
||||
|
||||
//
|
||||
bool isVWapBullishOrdered;
|
||||
bool isVWapBearishOrdered;
|
||||
|
||||
//
|
||||
bool isVWapSwitchedToBullishOrdered;
|
||||
bool isVWapSwitchedToBearishOrdered;
|
||||
|
||||
//
|
||||
bool isVWapSwitchedToBullishState;
|
||||
bool isVWapSwitchedToBearishState;
|
||||
bool isVWapSwitchedToNeuturalState;
|
||||
|
||||
//
|
||||
// XDON ...
|
||||
|
||||
//
|
||||
// bool isCloseLower
|
||||
|
||||
//
|
||||
// XFIBONACCI ...
|
||||
|
||||
//
|
||||
bool isOerFib1;
|
||||
bool isOerFib2;
|
||||
bool isOerFib3;
|
||||
bool isOerFib4;
|
||||
bool isOerFib5;
|
||||
|
||||
//
|
||||
bool isUnderFib1;
|
||||
bool isUnderFib2;
|
||||
bool isUnderFib3;
|
||||
bool isUnderFib4;
|
||||
bool isUnderFib5;
|
||||
|
||||
//
|
||||
bool isCloseOerFib1;
|
||||
bool isCloseOerFib2;
|
||||
bool isCloseOerFib3;
|
||||
bool isCloseOerFib4;
|
||||
bool isCloseOerFib5;
|
||||
|
||||
//
|
||||
bool isCloseUnderFib1;
|
||||
bool isCloseUnderFib2;
|
||||
bool isCloseUnderFib3;
|
||||
bool isCloseUnderFib4;
|
||||
bool isCloseUnderFib5;
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
X121Conditions()
|
||||
@@ -606,6 +723,111 @@ struct X121Conditions
|
||||
ArraySetAsSeries(vwapSlowStateBuffer, true);
|
||||
ArraySetAsSeries(validPeaksBuffer, true);
|
||||
ArraySetAsSeries(validValesBuffer, true);
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
// XSAR ...
|
||||
|
||||
//
|
||||
isSarBullish = false;
|
||||
isSarBearish = false;
|
||||
|
||||
//
|
||||
isSarSwitchedBullish = false;
|
||||
isSarSwitchedBearish = false;
|
||||
|
||||
//
|
||||
// XPV ...
|
||||
|
||||
//
|
||||
isNewPeak = false;
|
||||
isNewPeakOverLast = false;
|
||||
isNewPeakUnderLast = false;
|
||||
|
||||
//
|
||||
isNewVale = false;
|
||||
isNewValeOverLast = false;
|
||||
isNewValeUnderLast = false;
|
||||
|
||||
//
|
||||
// XVWAP ...
|
||||
|
||||
//
|
||||
isVWapFastBullish = false;
|
||||
isVWapFastBearish = false;
|
||||
isVWapFastNeutural = false;
|
||||
|
||||
//
|
||||
isVWapMidBullish = false;
|
||||
isVWapMidBearish = false;
|
||||
isVWapMidNeutural = false;
|
||||
|
||||
//
|
||||
isVWapSlowBullish = false;
|
||||
isVWapSlowBearish = false;
|
||||
isVWapSlowNeutural = false;
|
||||
|
||||
//
|
||||
isVWapFastOverMid = false;
|
||||
isVWapMidOverSlow = false;
|
||||
|
||||
//
|
||||
isVWapFastUnderMid = false;
|
||||
isVWapMidUnderSlow = false;
|
||||
|
||||
//
|
||||
isVWapBullishState = false;
|
||||
isVWapBearishState = false;
|
||||
isVWapNeuturalState = false;
|
||||
|
||||
//
|
||||
isVWapBullishOrdered = false;
|
||||
isVWapBearishOrdered = false;
|
||||
|
||||
//
|
||||
isVWapSwitchedToBullishOrdered = false;
|
||||
isVWapSwitchedToBearishOrdered = false;
|
||||
|
||||
//
|
||||
isVWapSwitchedToBullishState = false;
|
||||
isVWapSwitchedToBearishState = false;
|
||||
isVWapSwitchedToNeuturalState = false;
|
||||
|
||||
//
|
||||
// XDON ...
|
||||
|
||||
//
|
||||
// XFIBONACCI ...
|
||||
|
||||
//
|
||||
isOerFib1 = false;
|
||||
isOerFib2 = false;
|
||||
isOerFib3 = false;
|
||||
isOerFib4 = false;
|
||||
isOerFib5 = false;
|
||||
|
||||
//
|
||||
isUnderFib1 = false;
|
||||
isUnderFib2 = false;
|
||||
isUnderFib3 = false;
|
||||
isUnderFib4 = false;
|
||||
isUnderFib5 = false;
|
||||
|
||||
//
|
||||
isCloseOerFib1 = false;
|
||||
isCloseOerFib2 = false;
|
||||
isCloseOerFib3 = false;
|
||||
isCloseOerFib4 = false;
|
||||
isCloseOerFib5 = false;
|
||||
|
||||
//
|
||||
isCloseUnderFib1 = false;
|
||||
isCloseUnderFib2 = false;
|
||||
isCloseUnderFib3 = false;
|
||||
isCloseUnderFib4 = false;
|
||||
isCloseUnderFib5 = false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -677,7 +899,72 @@ struct X121Conditions
|
||||
|
||||
//
|
||||
// TODO: Implement this if required ...
|
||||
string conditionsStr = "";
|
||||
string conditionsStr =
|
||||
//
|
||||
// XSAR ...
|
||||
ToString("isSarBullish", isSarBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isSarBearish", isSarBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isSarSwitchedBullish", isSarSwitchedBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isSarSwitchedBearish", isSarSwitchedBearish, ignoreFalseConditions, separator) +
|
||||
//
|
||||
// XPV ...
|
||||
ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) +
|
||||
ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) +
|
||||
ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) +
|
||||
ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) +
|
||||
ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) +
|
||||
ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) +
|
||||
//
|
||||
// XVWAP ...
|
||||
ToString("isVWapFastBullish", isVWapFastBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapFastBearish", isVWapFastBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapFastNeutural", isVWapFastNeutural, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapMidBullish", isVWapMidBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapMidBearish", isVWapMidBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapMidNeutural", isVWapMidNeutural, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapSlowBullish", isVWapSlowBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapSlowBearish", isVWapSlowBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapSlowNeutural", isVWapSlowNeutural, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapFastOverMid", isVWapFastOverMid, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapMidOverSlow", isVWapMidOverSlow, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapFastUnderMid", isVWapFastUnderMid, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapMidUnderSlow", isVWapMidUnderSlow, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapBullishState", isVWapBullishState, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapBearishState", isVWapBearishState, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapNeuturalState", isVWapNeuturalState, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapBullishOrdered", isVWapBullishOrdered, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapBearishOrdered", isVWapBearishOrdered, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapSwitchedToBullishOrdered", isVWapSwitchedToBullishOrdered, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapSwitchedToBearishOrdered", isVWapSwitchedToBearishOrdered, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapSwitchedToBullishState", isVWapSwitchedToBullishState, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapSwitchedToBearishState", isVWapSwitchedToBearishState, ignoreFalseConditions, separator) +
|
||||
ToString("isVWapSwitchedToNeuturalState", isVWapSwitchedToNeuturalState, ignoreFalseConditions, separator) +
|
||||
//
|
||||
// XFIBONACCI ...
|
||||
ToString("isOerFib1", isOerFib1, ignoreFalseConditions, separator) +
|
||||
ToString("isOerFib2", isOerFib2, ignoreFalseConditions, separator) +
|
||||
ToString("isOerFib3", isOerFib3, ignoreFalseConditions, separator) +
|
||||
ToString("isOerFib4", isOerFib4, ignoreFalseConditions, separator) +
|
||||
ToString("isOerFib5", isOerFib5, ignoreFalseConditions, separator) +
|
||||
ToString("isUnderFib1", isUnderFib1, ignoreFalseConditions, separator) +
|
||||
ToString("isUnderFib2", isUnderFib2, ignoreFalseConditions, separator) +
|
||||
ToString("isUnderFib3", isUnderFib3, ignoreFalseConditions, separator) +
|
||||
ToString("isUnderFib4", isUnderFib4, ignoreFalseConditions, separator) +
|
||||
ToString("isUnderFib5", isUnderFib5, ignoreFalseConditions, separator) +
|
||||
ToString("isCloseOerFib1", isCloseOerFib1, ignoreFalseConditions, separator) +
|
||||
ToString("isCloseOerFib2", isCloseOerFib2, ignoreFalseConditions, separator) +
|
||||
ToString("isCloseOerFib3", isCloseOerFib3, ignoreFalseConditions, separator) +
|
||||
ToString("isCloseOerFib4", isCloseOerFib4, ignoreFalseConditions, separator) +
|
||||
ToString("isCloseOerFib5", isCloseOerFib5, ignoreFalseConditions, separator) +
|
||||
ToString("isCloseUnderFib1", isCloseUnderFib1, ignoreFalseConditions, separator) +
|
||||
ToString("isCloseUnderFib2", isCloseUnderFib2, ignoreFalseConditions, separator) +
|
||||
ToString("isCloseUnderFib3", isCloseUnderFib3, ignoreFalseConditions, separator) +
|
||||
ToString("isCloseUnderFib4", isCloseUnderFib4, ignoreFalseConditions, separator) +
|
||||
ToString("isCloseUnderFib5", isCloseUnderFib5, ignoreFalseConditions, separator) +
|
||||
//
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
@@ -2169,6 +2456,61 @@ class XCX121Helper : public XCBaseHelper
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Converts to State ...
|
||||
ENUM_XVWAP_STATES ToVWAPState(double value)
|
||||
{
|
||||
//
|
||||
ENUM_XVWAP_STATES result =
|
||||
value == 1
|
||||
? XVWAP_STATE_BULLISH
|
||||
: value == 2
|
||||
? XVWAP_STATE_BEARISH
|
||||
: XVWAP_STATE_NEUTURAL;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool IsVWAPBullish(double value)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = ToVWAPState(value) == XVWAP_STATE_BULLISH;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool IsVWAPBearish(double value)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = ToVWAPState(value) == XVWAP_STATE_BEARISH;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool IsVWAPNeutural(double value)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = ToVWAPState(value) == XVWAP_STATE_NEUTURAL;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XDON ...
|
||||
|
||||
@@ -2868,8 +3210,8 @@ class XCX121Helper : public XCBaseHelper
|
||||
|
||||
bool GetConditions(
|
||||
X121Conditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 5 //
|
||||
int barIndex = 0, //
|
||||
int loopback = 5 //
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -2895,6 +3237,42 @@ class XCX121Helper : public XCBaseHelper
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
XOHCL zBar;
|
||||
result = zBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
zIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
cIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
result = pBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
pIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
|
||||
@@ -3152,7 +3530,237 @@ class XCX121Helper : public XCBaseHelper
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
// TODO: Implement this if Required ...
|
||||
|
||||
//
|
||||
// XSAR ...
|
||||
|
||||
//
|
||||
bool isSarBullish = conditions.sarBuffer[cIndex] < cBar.low;
|
||||
bool isSarBullishPrev = conditions.sarBuffer[pIndex] < pBar.low;
|
||||
|
||||
//
|
||||
bool isSarBearish = conditions.sarBuffer[cIndex] > cBar.high;
|
||||
bool isSarBearishPrev = conditions.sarBuffer[pIndex] > pBar.high;
|
||||
|
||||
//
|
||||
bool isSarSwitchedBullish = isSarBullish &&
|
||||
!isSarBullishPrev;
|
||||
bool isSarSwitchedBearish = isSarBearish &&
|
||||
!isSarBearishPrev;
|
||||
|
||||
//
|
||||
// XPV ...
|
||||
|
||||
//
|
||||
bool isNewPeak = conditions.peaksBuffer[cIndex] != conditions.peaksBuffer[pIndex];
|
||||
bool isNewPeakOverLast = isNewPeak &&
|
||||
conditions.peaksBuffer[cIndex] > conditions.peaksBuffer[pIndex];
|
||||
bool isNewPeakUnderLast = isNewPeak &&
|
||||
conditions.peaksBuffer[cIndex] < conditions.peaksBuffer[pIndex];
|
||||
|
||||
//
|
||||
bool isNewVale = conditions.valesBuffer[cIndex] != conditions.valesBuffer[pIndex];
|
||||
bool isNewValeOverLast = isNewVale &&
|
||||
conditions.valesBuffer[cIndex] > conditions.valesBuffer[pIndex];
|
||||
bool isNewValeUnderLast = isNewVale &&
|
||||
conditions.valesBuffer[cIndex] < conditions.valesBuffer[pIndex];
|
||||
|
||||
//
|
||||
// XVWAP ...
|
||||
|
||||
//
|
||||
bool isVWapFastBullish = IsVWAPBullish(conditions.vwapFastStateBuffer[cIndex]);
|
||||
bool isVWapFastBullishPrev = IsVWAPBullish(conditions.vwapFastStateBuffer[pIndex]);
|
||||
|
||||
//
|
||||
bool isVWapFastBearish = IsVWAPBearish(conditions.vwapFastStateBuffer[cIndex]);
|
||||
bool isVWapFastBearishPrev = IsVWAPBearish(conditions.vwapFastStateBuffer[pIndex]);
|
||||
|
||||
//
|
||||
bool isVWapFastNeutural = IsVWAPNeutural(conditions.vwapFastStateBuffer[cIndex]);
|
||||
bool isVWapFastNeuturalPrev = IsVWAPNeutural(conditions.vwapFastStateBuffer[pIndex]);
|
||||
|
||||
//
|
||||
bool isVWapMidBullish = IsVWAPBullish(conditions.vwapMidStateBuffer[cIndex]);
|
||||
bool isVWapMidBullishPrev = IsVWAPBullish(conditions.vwapMidStateBuffer[pIndex]);
|
||||
|
||||
//
|
||||
bool isVWapMidBearish = IsVWAPBearish(conditions.vwapMidStateBuffer[cIndex]);
|
||||
bool isVWapMidBearishPrev = IsVWAPBearish(conditions.vwapMidStateBuffer[pIndex]);
|
||||
|
||||
//
|
||||
bool isVWapMidNeutural = IsVWAPNeutural(conditions.vwapMidStateBuffer[cIndex]);
|
||||
bool isVWapMidNeuturalPrev = IsVWAPNeutural(conditions.vwapMidStateBuffer[pIndex]);
|
||||
|
||||
//
|
||||
bool isVWapSlowBullish = IsVWAPBullish(conditions.vwapSlowStateBuffer[cIndex]);
|
||||
bool isVWapSlowBullishPrev = IsVWAPBullish(conditions.vwapSlowStateBuffer[pIndex]);
|
||||
|
||||
//
|
||||
bool isVWapSlowBearish = IsVWAPBearish(conditions.vwapSlowStateBuffer[cIndex]);
|
||||
bool isVWapSlowBearishPrev = IsVWAPBearish(conditions.vwapSlowStateBuffer[pIndex]);
|
||||
|
||||
//
|
||||
bool isVWapSlowNeutural = IsVWAPNeutural(conditions.vwapSlowStateBuffer[cIndex]);
|
||||
bool isVWapSlowNeuturalPrev = IsVWAPNeutural(conditions.vwapSlowStateBuffer[pIndex]);
|
||||
|
||||
//
|
||||
bool isVWapFastOverMid = conditions.vwapFastBuffer[cIndex] > conditions.vwapMidBuffer[cIndex];
|
||||
bool isVWapFastOverMidPrev = conditions.vwapFastBuffer[pIndex] > conditions.vwapMidBuffer[pIndex];
|
||||
|
||||
//
|
||||
bool isVWapMidOverSlow = conditions.vwapMidBuffer[cIndex] > conditions.vwapSlowBuffer[cIndex];
|
||||
bool isVWapMidOverSlowPrev = conditions.vwapMidBuffer[pIndex] > conditions.vwapSlowBuffer[pIndex];
|
||||
|
||||
//
|
||||
bool isVWapFastUnderMid = conditions.vwapFastBuffer[cIndex] < conditions.vwapMidBuffer[cIndex];
|
||||
bool isVWapFastUnderMidPrev = conditions.vwapFastBuffer[pIndex] < conditions.vwapMidBuffer[pIndex];
|
||||
|
||||
//
|
||||
bool isVWapMidUnderSlow = conditions.vwapMidBuffer[cIndex] < conditions.vwapSlowBuffer[cIndex];
|
||||
bool isVWapMidUnderSlowPrev = conditions.vwapMidBuffer[pIndex] < conditions.vwapSlowBuffer[pIndex];
|
||||
|
||||
//
|
||||
bool isVWapBullishState = isVWapFastBullish &&
|
||||
isVWapMidBullish &&
|
||||
isVWapSlowBullish;
|
||||
bool isVWapBullishStatePrev = isVWapFastBullishPrev &&
|
||||
isVWapMidBullishPrev &&
|
||||
isVWapSlowBullishPrev;
|
||||
|
||||
//
|
||||
bool isVWapBearishState = isVWapFastBearish &&
|
||||
isVWapMidBearish &&
|
||||
isVWapSlowBearish;
|
||||
bool isVWapBearishStatePrev = isVWapFastBearishPrev &&
|
||||
isVWapMidBearishPrev &&
|
||||
isVWapSlowBearishPrev;
|
||||
|
||||
//
|
||||
bool isVWapNeuturalState = isVWapFastNeutural &&
|
||||
isVWapMidNeutural &&
|
||||
isVWapSlowNeutural;
|
||||
bool isVWapNeuturalStatePrev = isVWapFastNeuturalPrev &&
|
||||
isVWapMidNeuturalPrev &&
|
||||
isVWapSlowNeuturalPrev;
|
||||
|
||||
//
|
||||
bool isVWapBullishOrdered = isVWapFastOverMid &&
|
||||
isVWapMidOverSlow;
|
||||
bool isVWapBullishOrderedPrev = isVWapFastOverMidPrev &&
|
||||
isVWapMidOverSlowPrev;
|
||||
|
||||
//
|
||||
bool isVWapBearishOrdered = isVWapFastUnderMid &&
|
||||
isVWapMidUnderSlow;
|
||||
bool isVWapBearishOrderedPrev = isVWapFastUnderMidPrev &&
|
||||
isVWapMidUnderSlowPrev;
|
||||
|
||||
//
|
||||
bool isVWapSwitchedToBullishOrdered = isVWapBullishOrdered &&
|
||||
!isVWapBullishOrderedPrev;
|
||||
bool isVWapSwitchedToBearishOrdered = isVWapBearishOrdered &&
|
||||
!isVWapBearishOrderedPrev;
|
||||
|
||||
//
|
||||
bool isVWapSwitchedToBullishState = isVWapBullishState &&
|
||||
!isVWapBullishStatePrev;
|
||||
bool isVWapSwitchedToBearishState = isVWapBearishState &&
|
||||
!isVWapBearishStatePrev;
|
||||
bool isVWapSwitchedToNeuturalState = isVWapNeuturalState &&
|
||||
!isVWapNeuturalStatePrev;
|
||||
|
||||
//
|
||||
// XDON ...
|
||||
|
||||
//
|
||||
// XFIBONACCI ...
|
||||
|
||||
//
|
||||
bool isOerFib1 = cBar.low > conditions.fl1Buffer[cIndex];
|
||||
bool isOerFib2 = cBar.low > conditions.fl2Buffer[cIndex];
|
||||
bool isOerFib3 = cBar.low > conditions.fl3Buffer[cIndex];
|
||||
bool isOerFib4 = cBar.low > conditions.fl4Buffer[cIndex];
|
||||
bool isOerFib5 = cBar.low > conditions.fl5Buffer[cIndex];
|
||||
|
||||
//
|
||||
bool isUnderFib1 = cBar.high < conditions.fl1Buffer[cIndex];
|
||||
bool isUnderFib2 = cBar.high < conditions.fl2Buffer[cIndex];
|
||||
bool isUnderFib3 = cBar.high < conditions.fl3Buffer[cIndex];
|
||||
bool isUnderFib4 = cBar.high < conditions.fl4Buffer[cIndex];
|
||||
bool isUnderFib5 = cBar.high < conditions.fl5Buffer[cIndex];
|
||||
|
||||
//
|
||||
bool isCloseOerFib1 = cBar.close > conditions.fl1Buffer[cIndex];
|
||||
bool isCloseOerFib2 = cBar.close > conditions.fl2Buffer[cIndex];
|
||||
bool isCloseOerFib3 = cBar.close > conditions.fl3Buffer[cIndex];
|
||||
bool isCloseOerFib4 = cBar.close > conditions.fl4Buffer[cIndex];
|
||||
bool isCloseOerFib5 = cBar.close > conditions.fl5Buffer[cIndex];
|
||||
|
||||
//
|
||||
bool isCloseUnderFib1 = cBar.close < conditions.fl1Buffer[cIndex];
|
||||
bool isCloseUnderFib2 = cBar.close < conditions.fl2Buffer[cIndex];
|
||||
bool isCloseUnderFib3 = cBar.close < conditions.fl3Buffer[cIndex];
|
||||
bool isCloseUnderFib4 = cBar.close < conditions.fl4Buffer[cIndex];
|
||||
bool isCloseUnderFib5 = cBar.close < conditions.fl5Buffer[cIndex];
|
||||
|
||||
//
|
||||
|
||||
//
|
||||
// Set ...
|
||||
conditions.isSarBullish = isSarBullish;
|
||||
conditions.isSarBearish = isSarBearish;
|
||||
conditions.isSarSwitchedBullish = isSarSwitchedBullish;
|
||||
conditions.isSarSwitchedBearish = isSarSwitchedBearish;
|
||||
conditions.isNewPeak = isNewPeak;
|
||||
conditions.isNewPeakOverLast = isNewPeakOverLast;
|
||||
conditions.isNewPeakUnderLast = isNewPeakUnderLast;
|
||||
conditions.isNewVale = isNewVale;
|
||||
conditions.isNewValeOverLast = isNewValeOverLast;
|
||||
conditions.isNewValeUnderLast = isNewValeUnderLast;
|
||||
conditions.isVWapFastBullish = isVWapFastBullish;
|
||||
conditions.isVWapFastBearish = isVWapFastBearish;
|
||||
conditions.isVWapFastNeutural = isVWapFastNeutural;
|
||||
conditions.isVWapMidBullish = isVWapMidBullish;
|
||||
conditions.isVWapMidBearish = isVWapMidBearish;
|
||||
conditions.isVWapMidNeutural = isVWapMidNeutural;
|
||||
conditions.isVWapSlowBullish = isVWapSlowBullish;
|
||||
conditions.isVWapSlowBearish = isVWapSlowBearish;
|
||||
conditions.isVWapSlowNeutural = isVWapSlowNeutural;
|
||||
conditions.isVWapFastOverMid = isVWapFastOverMid;
|
||||
conditions.isVWapMidOverSlow = isVWapMidOverSlow;
|
||||
conditions.isVWapFastUnderMid = isVWapFastUnderMid;
|
||||
conditions.isVWapMidUnderSlow = isVWapMidUnderSlow;
|
||||
conditions.isVWapBullishState = isVWapBullishState;
|
||||
conditions.isVWapBearishState = isVWapBearishState;
|
||||
conditions.isVWapNeuturalState = isVWapNeuturalState;
|
||||
conditions.isVWapBullishOrdered = isVWapBullishOrdered;
|
||||
conditions.isVWapBearishOrdered = isVWapBearishOrdered;
|
||||
conditions.isVWapSwitchedToBullishOrdered = isVWapSwitchedToBullishOrdered;
|
||||
conditions.isVWapSwitchedToBearishOrdered = isVWapSwitchedToBearishOrdered;
|
||||
conditions.isVWapSwitchedToBullishState = isVWapSwitchedToBullishState;
|
||||
conditions.isVWapSwitchedToBearishState = isVWapSwitchedToBearishState;
|
||||
conditions.isVWapSwitchedToNeuturalState = isVWapSwitchedToNeuturalState;
|
||||
conditions.isOerFib1 = isOerFib1;
|
||||
conditions.isOerFib2 = isOerFib2;
|
||||
conditions.isOerFib3 = isOerFib3;
|
||||
conditions.isOerFib4 = isOerFib4;
|
||||
conditions.isOerFib5 = isOerFib5;
|
||||
conditions.isUnderFib1 = isUnderFib1;
|
||||
conditions.isUnderFib2 = isUnderFib2;
|
||||
conditions.isUnderFib3 = isUnderFib3;
|
||||
conditions.isUnderFib4 = isUnderFib4;
|
||||
conditions.isUnderFib5 = isUnderFib5;
|
||||
conditions.isCloseOerFib1 = isCloseOerFib1;
|
||||
conditions.isCloseOerFib2 = isCloseOerFib2;
|
||||
conditions.isCloseOerFib3 = isCloseOerFib3;
|
||||
conditions.isCloseOerFib4 = isCloseOerFib4;
|
||||
conditions.isCloseOerFib5 = isCloseOerFib5;
|
||||
conditions.isCloseUnderFib1 = isCloseUnderFib1;
|
||||
conditions.isCloseUnderFib2 = isCloseUnderFib2;
|
||||
conditions.isCloseUnderFib3 = isCloseUnderFib3;
|
||||
conditions.isCloseUnderFib4 = isCloseUnderFib4;
|
||||
conditions.isCloseUnderFib5 = isCloseUnderFib5;
|
||||
|
||||
//
|
||||
return result;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -22,10 +22,7 @@
|
||||
//
|
||||
// Imports ...
|
||||
#include "../../Classes/x-saherelm.base.class.mq5"
|
||||
#include "../../Helpers/x-saherelm.x3ma.helper.mq5"
|
||||
#include "../../Helpers/x-saherelm.x3vwap.helper.mq5"
|
||||
#include "../../Helpers/x-saherelm.xchsar.helper.mq5"
|
||||
#include "../../Helpers/x-saherelm.xpv.helper.mq5"
|
||||
#include "../../Helpers/x-saherelm.x121.helper.mq5"
|
||||
#include "../../Libraries/x-saherelm.common.lib.mq5"
|
||||
#include "../../Libraries/x-saherelm.x-poi.lib.mq5"
|
||||
#include "../../Libraries/x-saherelm.x-trade.lib.mq5"
|
||||
@@ -436,10 +433,7 @@ struct X121SMCCycleConditions
|
||||
datetime time;
|
||||
|
||||
//
|
||||
XPVConditions xpvConditions;
|
||||
X3MAConditions x3maConditions;
|
||||
X3VWAPConditions x3vwapConditions;
|
||||
XCHSARConditions xchsarConditions;
|
||||
X121Conditions x121Conditions;
|
||||
|
||||
//
|
||||
XPOIState state;
|
||||
@@ -465,10 +459,7 @@ struct X121SMCCycleConditions
|
||||
|
||||
//
|
||||
state.Clean();
|
||||
xpvConditions.Clean();
|
||||
x3maConditions.Clean();
|
||||
x3vwapConditions.Clean();
|
||||
xchsarConditions.Clean();
|
||||
x121Conditions.Clean();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -492,94 +483,6 @@ struct X121SMCCycleConditions
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Cycle Conditions Has Bullish State ...
|
||||
*
|
||||
* @param bar: XOHCL instance ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsBullish(
|
||||
XOHCL &bar //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int index = bar.Index();
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
// Check Conditions Validation ...
|
||||
IsValid() &&
|
||||
//
|
||||
// Check Bar Validation ...
|
||||
bar.IsValid() &&
|
||||
//
|
||||
// Check XCHSar Current is Bullish ...
|
||||
xchsarConditions.isCBullish &&
|
||||
//
|
||||
// Check X3VWAP is Bullish State ...
|
||||
x3vwapConditions.isBullishState &&
|
||||
//
|
||||
// Check X3VWAP is Bullish Ordered ...
|
||||
x3vwapConditions.isBullishOrdered &&
|
||||
//
|
||||
// Check Close Over X3MA Fast ...
|
||||
bar.close > x3maConditions.fasts[index]
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Cycle Conditions Has Bearish State ...
|
||||
*
|
||||
* @param bar: XOHCL instance ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsBearish(
|
||||
XOHCL &bar //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int index = bar.Index();
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
// Check Conditions Validation ...
|
||||
IsValid() &&
|
||||
//
|
||||
// Check Bar Validation ...
|
||||
bar.IsValid() &&
|
||||
//
|
||||
// Check XCHSar Current is Bearish ...
|
||||
xchsarConditions.isCBearish &&
|
||||
//
|
||||
// Check X3VWAP is Bearish State ...
|
||||
x3vwapConditions.isBearishState &&
|
||||
//
|
||||
// Check X3VWAP is Bearish Ordered ...
|
||||
x3vwapConditions.isBearishOrdered &&
|
||||
//
|
||||
// Check Close Under X3MA Fast ...
|
||||
bar.close < x3maConditions.fasts[index]
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Reporter Functions ...
|
||||
|
||||
@@ -607,15 +510,6 @@ struct X121SMCCycleConditions
|
||||
//
|
||||
double bullScore = 0;
|
||||
double bearScore = 0;
|
||||
|
||||
// //
|
||||
// // XPV ...
|
||||
// pvConditions.GenerateScore(
|
||||
// bullScore,
|
||||
// bearScore //
|
||||
// );
|
||||
// bullishScore += bullScore;
|
||||
// bearishScore += bearScore;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -656,19 +550,9 @@ struct X121SMCCycleConditions
|
||||
true //
|
||||
);
|
||||
|
||||
// //
|
||||
// // XPV ...
|
||||
// string pvStr = pvConditions.GenerateSummary(
|
||||
// false,
|
||||
// true,
|
||||
// false,
|
||||
// ignoreFalseConditions //
|
||||
// );
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
// pvStr + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
@@ -805,182 +689,6 @@ struct X121SMCStrategyConditions
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Conditions has Ddirection or not ...
|
||||
*
|
||||
* @param dir: ENUM_X_DIRECTIOn member ...
|
||||
* @param bar: XOHCL instance ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool HasDirection(
|
||||
ENUM_X_DIRECTION &dir,
|
||||
XOHCL &bar //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
dir = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
result = IsValid() &&
|
||||
bar.IsValid() &&
|
||||
bar.Index() > 0;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int index = bar.Index();
|
||||
|
||||
//
|
||||
// Parse Cycles Conditions ...
|
||||
|
||||
//
|
||||
// Vision ...
|
||||
|
||||
//
|
||||
bool isVisionBullish =
|
||||
//
|
||||
// XCHSar Current is Bullish ...
|
||||
visionConditions.xchsarConditions.isCBullish &&
|
||||
//
|
||||
// Close Over X3MA Fast ...
|
||||
bar.close > visionConditions.x3maConditions.fasts[index] &&
|
||||
//
|
||||
// X3VWap Fast is Bullish ...
|
||||
visionConditions.x3vwapConditions.fastStates[index] ==
|
||||
X3VWAP_STATE_BULLISH
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool isVisionBearish =
|
||||
//
|
||||
// XCHSar Current is Bearish ...
|
||||
visionConditions.xchsarConditions.isCBearish &&
|
||||
//
|
||||
// Close Under X3MA Fast ...
|
||||
bar.close < visionConditions.x3maConditions.fasts[index] &&
|
||||
//
|
||||
// X3VWap Fast is Bearish ...
|
||||
visionConditions.x3vwapConditions.fastStates[index] ==
|
||||
X3VWAP_STATE_BEARISH
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Vision Has Conditions or not ...
|
||||
bool hasVisionConditions =
|
||||
isVisionBullish ||
|
||||
isVisionBearish;
|
||||
result = hasVisionConditions;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Consolidation ...
|
||||
|
||||
//
|
||||
bool isConsolidationBullish = consolidationConditions.IsBullish(bar);
|
||||
bool isConsolidationBearish = consolidationConditions.IsBearish(bar);
|
||||
bool hasConsolidationConditions =
|
||||
isConsolidationBullish ||
|
||||
isConsolidationBearish;
|
||||
result = hasConsolidationConditions;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Verification ...
|
||||
|
||||
//
|
||||
bool isVerificationBullish = verificationConditions.IsBullish(bar);
|
||||
bool isVerificationBearish = verificationConditions.IsBearish(bar);
|
||||
bool hasVerificationConditions =
|
||||
isVerificationBullish ||
|
||||
isVerificationBearish;
|
||||
result = hasVerificationConditions;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Analyse ...
|
||||
|
||||
//
|
||||
bool isAnalyseBullish = analyseConditions.IsBullish(bar);
|
||||
bool isAnalyseBearish = analyseConditions.IsBearish(bar);
|
||||
bool hasAnalyseConditions =
|
||||
isAnalyseBullish ||
|
||||
isAnalyseBearish;
|
||||
result = hasAnalyseConditions;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Decision ...
|
||||
|
||||
//
|
||||
bool isDecisionBullish = decisionConditions.IsBullish(bar);
|
||||
bool isDecisionBearish = decisionConditions.IsBearish(bar);
|
||||
bool hasDecisionConditions =
|
||||
isDecisionBullish ||
|
||||
isDecisionBearish;
|
||||
result = hasDecisionConditions;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Analyse Conditions ...
|
||||
bool hasBullishConditions =
|
||||
//
|
||||
isVisionBullish &&
|
||||
isConsolidationBullish &&
|
||||
isVerificationBullish &&
|
||||
isAnalyseBullish &&
|
||||
isDecisionBullish
|
||||
//
|
||||
;
|
||||
bool hasBearishConditions =
|
||||
//
|
||||
isVisionBearish &&
|
||||
isConsolidationBearish &&
|
||||
isVerificationBearish &&
|
||||
isAnalyseBearish &&
|
||||
isDecisionBearish
|
||||
//
|
||||
;
|
||||
result = hasBullishConditions ||
|
||||
hasBearishConditions;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Specified Conditions Direction ...
|
||||
dir =
|
||||
hasBullishConditions
|
||||
? X_DIRECTION_BULLISH
|
||||
: X_DIRECTION_BEARISH;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Reporter Functions ...
|
||||
|
||||
@@ -1008,15 +716,6 @@ struct X121SMCStrategyConditions
|
||||
//
|
||||
double bullScore = 0;
|
||||
double bearScore = 0;
|
||||
|
||||
// //
|
||||
// // XPV ...
|
||||
// pvConditions.GenerateScore(
|
||||
// bullScore,
|
||||
// bearScore //
|
||||
// );
|
||||
// bullishScore += bullScore;
|
||||
// bearishScore += bearScore;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1057,19 +756,9 @@ struct X121SMCStrategyConditions
|
||||
true //
|
||||
);
|
||||
|
||||
// //
|
||||
// // XPV ...
|
||||
// string pvStr = pvConditions.GenerateSummary(
|
||||
// false,
|
||||
// true,
|
||||
// false,
|
||||
// ignoreFalseConditions //
|
||||
// );
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
// pvStr + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user