Last ...
This commit is contained in:
@@ -743,6 +743,315 @@ class XC121SMCCycleHelper : public XCBase
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect XPV Based POI(s) ...
|
||||
*
|
||||
* @param barIndex: Start Bar Index ...
|
||||
* @param minRepetition: minimum Repeate of POI for Validation ...
|
||||
* @param requiredPivots: Number of Min Requirement POI(s) ...
|
||||
* @param pivotHelper: XC121SMCCycleHelper instance Pointer ...
|
||||
* @param orderFlow: XPVPivot instance Array Reference ...
|
||||
* @param orderFlowDirection: ENUM_X_DIRECTION member Reference which represents OrderFlow Direction ...
|
||||
* @param maxAllowedLoopbackBars: Integer, Max Allowed Loopback Bars ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool DetectOrderFlow(
|
||||
int barIndex,
|
||||
XPVPivot &orderFlow[], // OrderFlows ...
|
||||
ENUM_X_DIRECTION &orderFlowDirection, // Order Flow Direction ...
|
||||
int minRepetition = 0,
|
||||
int requiredPivots = 0,
|
||||
int maxAllowedLoopbackBars = 576 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
orderFlowDirection = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
if (maxAllowedLoopbackBars <= 0)
|
||||
{
|
||||
maxAllowedLoopbackBars = 1000;
|
||||
}
|
||||
|
||||
//
|
||||
if (minRepetition <= 0)
|
||||
{
|
||||
minRepetition = mX121Helper.GetDonChainLength();
|
||||
}
|
||||
|
||||
//
|
||||
if (requiredPivots <= 0)
|
||||
{
|
||||
requiredPivots = 3;
|
||||
}
|
||||
|
||||
//
|
||||
int start = barIndex;
|
||||
int end = start + maxAllowedLoopbackBars;
|
||||
|
||||
//
|
||||
Clean(orderFlow);
|
||||
|
||||
//
|
||||
result = minRepetition > 0 &&
|
||||
requiredPivots > 0;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string symbol = GetSymbol();
|
||||
ENUM_TIMEFRAMES period = GetPeriod();
|
||||
|
||||
//
|
||||
double peak = 0;
|
||||
XPVPivot peaks[];
|
||||
int peakRepeate = 0;
|
||||
int peakToBarIndex = 0;
|
||||
int peakFromBarIndex = 0;
|
||||
|
||||
//
|
||||
double vale = 0;
|
||||
XPVPivot vales[];
|
||||
int valeRepeate = 0;
|
||||
int valeToBarIndex = 0;
|
||||
int valeFromBarIndex = 0;
|
||||
|
||||
//
|
||||
bool canLookupPeak = true;
|
||||
bool canLookupVale = true;
|
||||
bool canLookup = true;
|
||||
while (canLookup)
|
||||
{
|
||||
//
|
||||
// Check Peak ...
|
||||
double iPeak = mX121Helper.GetPeak(barIndex);
|
||||
if (iPeak != peak)
|
||||
{
|
||||
//
|
||||
if (peak != 0 &&
|
||||
peakRepeate >= minRepetition)
|
||||
{
|
||||
//
|
||||
bool isExists = false;
|
||||
int count = ArraySize(peaks);
|
||||
if (IsValidSize(count))
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XPVPivot iPivot = peaks[i];
|
||||
|
||||
//
|
||||
if (iPivot.upper == iPeak)
|
||||
{
|
||||
//
|
||||
isExists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!isExists)
|
||||
{
|
||||
//
|
||||
XPVPivot iPivot;
|
||||
|
||||
//
|
||||
iPivot.lower = 0;
|
||||
iPivot.upper = peak;
|
||||
iPivot.symbol = symbol;
|
||||
iPivot.period = period;
|
||||
iPivot.type = XPV_PEAK;
|
||||
iPivot.repetition = peakRepeate;
|
||||
iPivot.to = iTime(
|
||||
symbol,
|
||||
period,
|
||||
peakToBarIndex //
|
||||
);
|
||||
iPivot.from = iTime(
|
||||
symbol,
|
||||
period,
|
||||
peakFromBarIndex //
|
||||
);
|
||||
|
||||
//
|
||||
iPivot.lower = iPivot.CalculateLower();
|
||||
|
||||
//
|
||||
bool isValid = iPivot.IsValid();
|
||||
if (isValid)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
iPivot,
|
||||
peaks //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
peak = iPeak;
|
||||
peakRepeate = 0;
|
||||
peakFromBarIndex = 0;
|
||||
peakToBarIndex = barIndex;
|
||||
}
|
||||
else if (iPeak == peak)
|
||||
{
|
||||
//
|
||||
peakRepeate++;
|
||||
peakFromBarIndex = barIndex;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Vale ...
|
||||
double iVale = mX121Helper.GetVale(barIndex);
|
||||
if (iVale != vale)
|
||||
{
|
||||
//
|
||||
if (vale != 0 &&
|
||||
valeRepeate >= minRepetition)
|
||||
{
|
||||
//
|
||||
bool isExists = false;
|
||||
int count = ArraySize(vales);
|
||||
if (IsValidSize(count))
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XPVPivot iPivot = vales[i];
|
||||
|
||||
//
|
||||
if (iPivot.lower == iVale)
|
||||
{
|
||||
//
|
||||
isExists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!isExists)
|
||||
{
|
||||
//
|
||||
XPVPivot iPivot;
|
||||
|
||||
//
|
||||
iPivot.upper = 0;
|
||||
iPivot.lower = vale;
|
||||
iPivot.symbol = symbol;
|
||||
iPivot.period = period;
|
||||
iPivot.type = XPV_VALE;
|
||||
iPivot.repetition = valeRepeate;
|
||||
iPivot.to = iTime(
|
||||
symbol,
|
||||
period,
|
||||
valeToBarIndex //
|
||||
);
|
||||
iPivot.from = iTime(
|
||||
symbol,
|
||||
period,
|
||||
valeFromBarIndex //
|
||||
);
|
||||
|
||||
//
|
||||
iPivot.upper = iPivot.CalculateUpper();
|
||||
|
||||
//
|
||||
bool isValid = iPivot.IsValid();
|
||||
if (isValid)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
iPivot,
|
||||
vales //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
vale = iVale;
|
||||
valeRepeate = 0;
|
||||
valeFromBarIndex = 0;
|
||||
valeToBarIndex = barIndex;
|
||||
}
|
||||
else if (iVale == vale)
|
||||
{
|
||||
//
|
||||
valeRepeate++;
|
||||
valeFromBarIndex = barIndex;
|
||||
}
|
||||
|
||||
//
|
||||
canLookupPeak = ArraySize(peaks) < requiredPivots;
|
||||
canLookupVale = ArraySize(vales) < requiredPivots;
|
||||
canLookup = barIndex < end &&
|
||||
(canLookupPeak ||
|
||||
canLookupVale);
|
||||
if (canLookup)
|
||||
{
|
||||
barIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = IsValidSize(ArraySize(peaks)) ||
|
||||
IsValidSize(ArraySize(vales));
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Order Flow ...
|
||||
Copy(
|
||||
peaks,
|
||||
orderFlow,
|
||||
false //
|
||||
);
|
||||
Copy(
|
||||
vales,
|
||||
orderFlow,
|
||||
false //
|
||||
);
|
||||
int count = ArraySize(orderFlow);
|
||||
result = IsValidSize(orderFlow);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Sort Pivots ...
|
||||
SortPivots(orderFlow);
|
||||
|
||||
//
|
||||
// Filter Broken Order Flows ...
|
||||
FilterBrokenPivots(orderFlow);
|
||||
|
||||
//
|
||||
// Detect Order Flow Direction ...
|
||||
result = DetectPivotDirection(
|
||||
orderFlow,
|
||||
orderFlowDirection //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Change Values Actions ...
|
||||
|
||||
|
||||
@@ -2666,6 +2666,29 @@ class XC121SMCTradeHandler : public XCBaseAlert
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (!youngestPosition.IsValid())
|
||||
{
|
||||
//
|
||||
int symbolIDX = FindLastExecutedSignalItem(signal);
|
||||
if (IsValidIndex(symbolIDX))
|
||||
{
|
||||
//
|
||||
datetime cTime = TimeCurrent();
|
||||
int signalPeriodSeconds = PeriodSeconds(signal.period);
|
||||
datetime lastExecutedTime = mLastExecutedSignals[symbolIDX].time;
|
||||
datetime passedTime = ((datetime)lastExecutedTime +
|
||||
((mDelayBarBetweenTwoSignal * signalPeriodSeconds)));
|
||||
|
||||
//
|
||||
result = cTime >= passedTime;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
@@ -2712,6 +2735,9 @@ class XC121SMCTradeHandler : public XCBaseAlert
|
||||
forceTrail //
|
||||
);
|
||||
|
||||
//
|
||||
HandleSignalExecuted(signal);
|
||||
|
||||
//
|
||||
string msg = (signal.type == POSITION_TYPE_BUY ? "Long" : "Short") +
|
||||
" Signal Provided by: " + signal.provider +
|
||||
@@ -3789,7 +3815,8 @@ class XC121SMCTradeHandler : public XCBaseAlert
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
double mAdditionalVolume; // Volume Additional
|
||||
double mAdditionalVolume; // Volume Additional
|
||||
XSymbolLastPosition mLastExecutedSignals[]; // Last Executed Signals
|
||||
|
||||
//
|
||||
// Read Only ...
|
||||
@@ -4131,6 +4158,78 @@ class XC121SMCTradeHandler : public XCBaseAlert
|
||||
mCollector.SaveSignal(item);
|
||||
}
|
||||
|
||||
//
|
||||
int FindLastExecutedSignalItem(XSignal &signal)
|
||||
{
|
||||
//
|
||||
int result = -1;
|
||||
|
||||
//
|
||||
if (!signal.IsValid())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int count = ArraySize(mLastExecutedSignals);
|
||||
if (!IsValidSize(count))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XSymbolLastPosition iLast = mLastExecutedSignals[i];
|
||||
if (iLast.symbol == signal.symbol &&
|
||||
iLast.provider == signal.provider)
|
||||
{
|
||||
//
|
||||
result = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
void HandleSignalExecuted(XSignal &signal)
|
||||
{
|
||||
//
|
||||
if (!signal.IsValid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
datetime cTime = TimeCurrent();
|
||||
int symbolIDX = FindLastExecutedSignalItem(signal);
|
||||
bool hasItem = IsValidIndex(symbolIDX);
|
||||
if (hasItem)
|
||||
{
|
||||
mLastExecutedSignals[symbolIDX].time = cTime;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
XSymbolLastPosition item;
|
||||
|
||||
//
|
||||
item.time = cTime;
|
||||
item.symbol = signal.symbol;
|
||||
item.provider = signal.provider;
|
||||
|
||||
//
|
||||
AddRef(
|
||||
item,
|
||||
mLastExecutedSignals //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
};
|
||||
|
||||
|
||||
@@ -1,830 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 ...
|
||||
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
@@ -563,7 +563,7 @@ class XC121SMCExpert : public XCBaseExpert
|
||||
|
||||
//
|
||||
mTradeHandler.MaxAllowedSLToPause(0);
|
||||
mTradeHandler.DelayBarBetweenTwoSignal(240);
|
||||
mTradeHandler.DelayBarBetweenTwoSignal(60);
|
||||
mTradeHandler.MaxAllowedSLReachedPauseDelay(HoursToSeconds(24));
|
||||
|
||||
//
|
||||
|
||||
@@ -35,6 +35,7 @@ const string X121SMCStrategyToken = "X121SMC";
|
||||
|
||||
//
|
||||
const string X121SMCSMPVToken = "X121SMCSMPV";
|
||||
const string X121SMCRJBPVToken = "X121SMCRJBPV";
|
||||
const string X121SMCVWAPCToken = "X121SMCVWAPC";
|
||||
|
||||
//
|
||||
@@ -44,6 +45,7 @@ enum ENUM_X_121_SMC_PROVIDERS
|
||||
//
|
||||
X_121_SMC_PROVIDER_NONE,
|
||||
X_121_SMC_PROVIDER_SMPV,
|
||||
X_121_SMC_PROVIDER_RJBPV,
|
||||
X_121_SMC_PROVIDER_VWAPC,
|
||||
};
|
||||
|
||||
@@ -1856,6 +1858,11 @@ string ToString(ENUM_X_121_SMC_PROVIDERS value)
|
||||
result = X121SMCSMPVToken;
|
||||
break;
|
||||
|
||||
//
|
||||
case X_121_SMC_PROVIDER_RJBPV:
|
||||
result = X121SMCRJBPVToken;
|
||||
break;
|
||||
|
||||
//
|
||||
case X_121_SMC_PROVIDER_VWAPC:
|
||||
result = X121SMCVWAPCToken;
|
||||
@@ -1889,6 +1896,10 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
|
||||
{
|
||||
result = X_121_SMC_PROVIDER_SMPV;
|
||||
}
|
||||
else if (Contains(X121SMCRJBPVToken, value))
|
||||
{
|
||||
result = X_121_SMC_PROVIDER_RJBPV;
|
||||
}
|
||||
else if (Contains(X121SMCVWAPCToken, value))
|
||||
{
|
||||
result = X_121_SMC_PROVIDER_VWAPC;
|
||||
@@ -1898,4 +1909,7 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Custom Providers Conditions ...
|
||||
|
||||
//
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user