last works ...

This commit is contained in:
2024-11-24 13:48:12 +03:30
parent 0e2e474d46
commit 042fa88d3a
6 changed files with 701 additions and 203 deletions
+54
View File
@@ -654,6 +654,12 @@ class XCTrade : public XCBase
// //
void AddOnModifyPositionEventHandler(TOnModify handler) void AddOnModifyPositionEventHandler(TOnModify handler)
{ {
//
if (handler == NULL)
{
return;
}
// //
Add( Add(
handler, handler,
@@ -665,6 +671,12 @@ class XCTrade : public XCBase
// //
void AddOnForceClosePositionEventHandler(TOnForceClose handler) void AddOnForceClosePositionEventHandler(TOnForceClose handler)
{ {
//
if (handler == NULL)
{
return;
}
// //
Add( Add(
handler, handler,
@@ -676,6 +688,12 @@ class XCTrade : public XCBase
// //
void AddOnPartialClosePositionEventHandler(TOnPartialClose handler) void AddOnPartialClosePositionEventHandler(TOnPartialClose handler)
{ {
//
if (handler == NULL)
{
return;
}
// //
Add( Add(
handler, handler,
@@ -688,6 +706,12 @@ class XCTrade : public XCBase
// Add New Deals Changed Event Handler ... // Add New Deals Changed Event Handler ...
void AddOnTradeStateChangedEventHandler(TOnTradeStateChanged handler) void AddOnTradeStateChangedEventHandler(TOnTradeStateChanged handler)
{ {
//
if (handler == NULL)
{
return;
}
// //
Add( Add(
handler, handler,
@@ -700,6 +724,12 @@ class XCTrade : public XCBase
// Add New Deals Changed Event Handler ... // Add New Deals Changed Event Handler ...
void AddOnDealsChangedEventHandler(TOnDealsChanged handler) void AddOnDealsChangedEventHandler(TOnDealsChanged handler)
{ {
//
if (handler == NULL)
{
return;
}
// //
Add( Add(
handler, handler,
@@ -712,6 +742,12 @@ class XCTrade : public XCBase
// Add New Orders Changed Event Handler ... // Add New Orders Changed Event Handler ...
void AddOnOrdersChangedEventHandler(TOnOrdersChanged handler) void AddOnOrdersChangedEventHandler(TOnOrdersChanged handler)
{ {
//
if (handler == NULL)
{
return;
}
// //
Add( Add(
handler, handler,
@@ -724,6 +760,12 @@ class XCTrade : public XCBase
// Add New Positions Changed Event Handler ... // Add New Positions Changed Event Handler ...
void AddOnPositionsChangedEventHandler(TOnPositionsChanged handler) void AddOnPositionsChangedEventHandler(TOnPositionsChanged handler)
{ {
//
if (handler == NULL)
{
return;
}
// //
Add( Add(
handler, handler,
@@ -736,6 +778,12 @@ class XCTrade : public XCBase
// Add New Stop Loss Event Handler ... // Add New Stop Loss Event Handler ...
void AddOnStopLossEventHandler(TOnStopLoss handler) void AddOnStopLossEventHandler(TOnStopLoss handler)
{ {
//
if (handler == NULL)
{
return;
}
// //
Add( Add(
handler, handler,
@@ -748,6 +796,12 @@ class XCTrade : public XCBase
// Add New Stop Loss Event Handler ... // Add New Stop Loss Event Handler ...
void AddOnTakeProfitEventHandler(TOnTakeProfit handler) void AddOnTakeProfitEventHandler(TOnTakeProfit handler)
{ {
//
if (handler == NULL)
{
return;
}
// //
Add( Add(
handler, handler,
+6 -2
View File
@@ -44,11 +44,13 @@ input string eaSymbols = "EURUSDb,GBPUSDb,USDJPYb,USDCHFb,DowJones30,XAUUSDb"; /
// //
// Volume ... // Volume ...
input group "Volume"; input group "Volume";
input double eaR2R = 2; // Risk to Reward Ratio
input bool eaUseDynamicVolume = false; // Use Dynamic Volume input bool eaUseDynamicVolume = false; // Use Dynamic Volume
input double eaDynamicVolumeStep = 0.01; // Increase Volume Step input double eaDynamicVolumeStep = 0.01; // Increase Volume Step
input double eaDynamicVolumeBalanceFactor = 200; // Balance Factor for Generate Dynamic Volume input double eaDynamicVolumeBalanceFactor = 200; // Balance Factor for Generate Dynamic Volume
input double eaVolume = 0.05; // Static Volume input double eaVolume = 0.05; // Static Volume
input double eaRiskPercentPerBalance = 0.25; // Risk Percent Per Balance on Each Trade input bool eaDynamicRiskManagement = true; // Dynamic Risk Management
input double eaRiskPercentPerBalance = 0.5; // Risk Percent Per Balance on Each Trade
// //
// Signalling ... // Signalling ...
@@ -72,7 +74,7 @@ input bool eaTerminalAlerts = false; // Terminal Alerts
input group "Reports"; input group "Reports";
input bool eaReportNewMonths = false; // Report New Month input bool eaReportNewMonths = false; // Report New Month
input bool eaReportNewWeeks = false; // Report New Weeks input bool eaReportNewWeeks = false; // Report New Weeks
input bool eaReportNewDays = false; // Report New Days input bool eaReportNewDays = true; // Report New Days
input bool eaReportNewHours = false; // Report New Hours input bool eaReportNewHours = false; // Report New Hours
// //
@@ -140,9 +142,11 @@ int OnInit()
eaExpert.ReportNewHours(eaReportNewHours); eaExpert.ReportNewHours(eaReportNewHours);
// //
eaExpert.R2R(eaR2R);
eaExpert.Volume(eaVolume); eaExpert.Volume(eaVolume);
eaExpert.UseDynamicVolume(eaUseDynamicVolume); eaExpert.UseDynamicVolume(eaUseDynamicVolume);
eaExpert.DynamicVolumeStep(eaDynamicVolumeStep); eaExpert.DynamicVolumeStep(eaDynamicVolumeStep);
eaExpert.DynamicRiskManagement(eaDynamicRiskManagement);
eaExpert.RiskPercentPerBalance(eaRiskPercentPerBalance); eaExpert.RiskPercentPerBalance(eaRiskPercentPerBalance);
eaExpert.DynamicVolumeBalanceFactor(eaDynamicVolumeBalanceFactor); eaExpert.DynamicVolumeBalanceFactor(eaDynamicVolumeBalanceFactor);
@@ -58,6 +58,7 @@ struct X121SMCTradeData
string conditions; // Signal Conditions string conditions; // Signal Conditions
// //
bool forceTrail; // Force Trail
int trailStep; // Trail Step int trailStep; // Trail Step
bool partiallyClosed; // Partially Closed or not bool partiallyClosed; // Partially Closed or not
datetime lastProtectedOn; // Last Protected On datetime lastProtectedOn; // Last Protected On
@@ -200,6 +201,7 @@ struct X121SMCTradeData
// //
trailStep = 0; trailStep = 0;
forceTrail = false;
lastProtectedOn = NULL; lastProtectedOn = NULL;
partiallyClosed = false; partiallyClosed = false;
@@ -1948,8 +1950,11 @@ class XC121SMCTradeHandler : public XCBaseAlert
// First Step of Trade Handling ... // First Step of Trade Handling ...
// Since Must Call when a Signal Executed ... // Since Must Call when a Signal Executed ...
void AddData( void AddData(
XSignal &signal, // Executed Signal XSignal &signal, // Executed Signal
double commission = 0 // Commission double commission = 0, // Commission
//
// Force Protections ...
bool forceTrail = false // Force Trail Stops ...
) )
{ {
// //
@@ -1975,6 +1980,27 @@ class XC121SMCTradeHandler : public XCBaseAlert
// //
item.commission = commission; item.commission = commission;
//
// Checking Trailling Configs ...
double trailStep = TrailStep();
double trailStartDistance = TrailStartDistance();
bool enableTrail =
trailStep > 0 &&
trailStartDistance > 0;
//
bool onlyTrailUnprotecteds = OnlyTrailUnprotected();
bool canCheck =
(onlyTrailUnprotecteds
? !isSupport &&
!isRecovery
: true) &&
enableTrail;
if (canCheck)
{
item.forceTrail = forceTrail;
}
// //
Add(item); Add(item);
@@ -2326,6 +2352,71 @@ class XC121SMCTradeHandler : public XCBaseAlert
); );
} }
/**
* Retrieve Specified Symbols Info ...
*
* @param symbol: String ...
* @param info: X121SMCSymbolPositionInfo instance ...
*
* @return ( bool )
*/
bool GetSymbolInfo(
string symbol,
X121SMCSymbolPositionInfo &info //
)
{
//
bool result = false;
//
info.Clean();
//
int symbolIDX = -1;
result = HasSymbol(
symbol,
symbolIDX //
);
if (!result)
{
return result;
}
//
info = mSymbolInfos[symbolIDX];
//
return result;
}
/**
* Reset Specified Symbol Info ...
*
* @param symbol: String ...
*/
void ResetSymbolInfo(string symbol)
{
//
if (!IsValid(symbol))
{
return;
}
//
int symbolIDX = -1;
bool hasSymbol = HasSymbol(
symbol,
symbolIDX //
);
if (!hasSymbol)
{
return;
}
//
mSymbolInfos[symbolIDX].Reset();
}
// //
// Position Execute and Sync Functions ... // Position Execute and Sync Functions ...
@@ -2430,7 +2521,10 @@ class XC121SMCTradeHandler : public XCBaseAlert
bool ExecuteSignal( bool ExecuteSignal(
XSignal &signal, // Signal for Execution XSignal &signal, // Signal for Execution
ENUM_X_SIGNAL_EXECUTION_RESULT &state, // Execution State ENUM_X_SIGNAL_EXECUTION_RESULT &state, // Execution State
bool ignorePolicies = false // Ignore Execution Policies bool ignorePolicies = false, // Ignore Execution Policies
//
// Force Protections ...
bool forceTrail = false // Force Trail Position
) )
{ {
// //
@@ -2614,7 +2708,8 @@ class XC121SMCTradeHandler : public XCBaseAlert
// Add Signal to Trade Handler ... // Add Signal to Trade Handler ...
AddData( AddData(
signal, signal,
commission // commission,
forceTrail //
); );
// //
@@ -3046,7 +3141,7 @@ class XC121SMCTradeHandler : public XCBaseAlert
// //
// Reading Requirements for Trailling Stops ... // Reading Requirements for Trailling Stops ...
bool allowTrail = AllowTrail(); bool allowTrail = AllowTrail() || mData[iDX].forceTrail;
double trailStep = TrailStep(); double trailStep = TrailStep();
double trailStartDistance = TrailStartDistance(); double trailStartDistance = TrailStartDistance();
bool allowOnlyUnprotecteds = OnlyTrailUnprotected(); bool allowOnlyUnprotecteds = OnlyTrailUnprotected();
+138 -5
View File
@@ -53,6 +53,34 @@ class XC121SMCExpert : public XCBaseExpert
// //
// Getter(s) / Setter(s) ... // Getter(s) / Setter(s) ...
/**
* Get Risk to Reward Ratio ...
*
* @return ( double )
*/
double R2R()
{
return mR2R;
}
/**
* Set Risk to Reward Ratio ...
*
* @param value: Double ...
*/
void R2R(double value)
{
//
if (value < 1)
{
value = 1;
}
//
mR2R = value;
ReConfigureAllStrategies();
}
/** /**
* Get Use Dynamic Volume State ... * Get Use Dynamic Volume State ...
* *
@@ -154,6 +182,26 @@ class XC121SMCExpert : public XCBaseExpert
mRiskPercentPerBalance = value; mRiskPercentPerBalance = value;
} }
/**
* Get Dynamic Risk Management State ...
*
* @return ( bool )
*/
bool DynamicRiskManagement()
{
return mDynamicRiskManagement;
}
/**
* Set Dynamic Risk Management State ...
*
* @param value: Boolean ...
*/
void DynamicRiskManagement(bool value)
{
mDynamicRiskManagement = value;
}
/** /**
* Get Static Volume ... * Get Static Volume ...
* *
@@ -265,12 +313,27 @@ class XC121SMCExpert : public XCBaseExpert
// //
datetime currentTime = TimeCurrent(); datetime currentTime = TimeCurrent();
//
// Check Signal Protections ...
bool canTrail = false;
ENUM_X_121_SMC_PROVIDERS signalProvider = ParseProvider(signal.provider);
if (IsValid(signalProvider))
{
//
// Complete this in Force States ...
// canTrail = true;
}
// //
// Execute Signal Using Trade Handler ... // Execute Signal Using Trade Handler ...
ENUM_X_SIGNAL_EXECUTION_RESULT state; ENUM_X_SIGNAL_EXECUTION_RESULT state;
bool isExecuted = mTradeHandler.ExecuteSignal( bool isExecuted = mTradeHandler.ExecuteSignal(
signal, signal,
state // state,
false, // ignore Policies ...
//
// Force Protections ...
canTrail //
); );
// //
@@ -326,12 +389,19 @@ class XC121SMCExpert : public XCBaseExpert
ReportNewHours(false); ReportNewHours(false);
ReportNewMonths(false); ReportNewMonths(false);
//
R2R(1);
// //
// Volume Default Configurations ... // Volume Default Configurations ...
Volume(0.01); Volume(0.01);
UseDynamicVolume(false); UseDynamicVolume(false);
DynamicVolumeStep(0.01); DynamicVolumeStep(0.01);
DynamicVolumeBalanceFactor(200); DynamicVolumeBalanceFactor(200);
//
RiskPercentPerBalance(0);
DynamicRiskManagement(false);
} }
/** /**
@@ -495,8 +565,8 @@ class XC121SMCExpert : public XCBaseExpert
// TODO: Make This Configurable Later ... // TODO: Make This Configurable Later ...
// //
mTradeHandler.DelayBarBetweenTwoSignal(3);
mTradeHandler.MaxAllowedSLToPause(0); mTradeHandler.MaxAllowedSLToPause(0);
mTradeHandler.DelayBarBetweenTwoSignal(3);
mTradeHandler.MaxAllowedSLReachedPauseDelay(HoursToSeconds(24)); mTradeHandler.MaxAllowedSLReachedPauseDelay(HoursToSeconds(24));
// //
@@ -532,7 +602,7 @@ class XC121SMCExpert : public XCBaseExpert
mTradeHandler.TrailStep(15); mTradeHandler.TrailStep(15);
mTradeHandler.TrailStartDistance(30); mTradeHandler.TrailStartDistance(30);
mTradeHandler.OnlyTrailUnprotected(true); mTradeHandler.OnlyTrailUnprotected(true);
mTradeHandler.RemoveTPAfterTrailedLevel(4); mTradeHandler.RemoveTPAfterTrailedLevel(3);
// //
// Partial Close (In Profit) ... // Partial Close (In Profit) ...
@@ -676,6 +746,10 @@ class XC121SMCExpert : public XCBaseExpert
*/ */
void HandleStrategiesOnTick() override void HandleStrategiesOnTick() override
{ {
//
// Calling Protection Handler of TradeHandler ...
mTradeHandler.HandleProtection();
// //
int count = ArraySize(mStrategies); int count = ArraySize(mStrategies);
if (!IsValidSize(count)) if (!IsValidSize(count))
@@ -721,6 +795,13 @@ class XC121SMCExpert : public XCBaseExpert
// Finish ... // Finish ...
mTradeHandler.Finish(deal); mTradeHandler.Finish(deal);
//
bool useDynamicRiskManagement = DynamicRiskManagement();
if (useDynamicRiskManagement)
{
mTradeHandler.ResetSymbolInfo(deal.symbol);
}
// //
HandleReportBalance(); HandleReportBalance();
} }
@@ -781,7 +862,7 @@ class XC121SMCExpert : public XCBaseExpert
// //
result = result =
XCBaseExpertToken + result; XC121SMCExpertToken + result;
// //
return result; return result;
@@ -856,6 +937,23 @@ class XC121SMCExpert : public XCBaseExpert
riskInPoints // riskInPoints //
); );
//
// Check Dynamic Risk Management ...
bool allowDynamicRiskManagement = DynamicRiskManagement();
if (allowDynamicRiskManagement)
{
//
// Calculate Dynamic Additional Risk Management Volume Multiplier ...
double mAdditionalRiskMultiplier = CalculateAdditionalVolumeMultiplier(signal);
if (mAdditionalRiskMultiplier < 1)
{
mAdditionalRiskMultiplier = 1;
}
//
volume *= mAdditionalRiskMultiplier;
}
// //
if (volume > 0) if (volume > 0)
{ {
@@ -898,7 +996,7 @@ class XC121SMCExpert : public XCBaseExpert
// Confiugre Signalling ... // Confiugre Signalling ...
// //
strategy.R2R(2); strategy.R2R(R2R());
strategy.AllowLong(AllowLong()); strategy.AllowLong(AllowLong());
strategy.AllowShort(AllowShort()); strategy.AllowShort(AllowShort());
strategy.MaxAllowedSpread(20); strategy.MaxAllowedSpread(20);
@@ -968,12 +1066,47 @@ class XC121SMCExpert : public XCBaseExpert
// //
// Volume Management ... // Volume Management ...
double mR2R; // Signallers Risk to Reward Ratio ...
bool mUseDynamicVolume; // Use Dynamic Volume ... bool mUseDynamicVolume; // Use Dynamic Volume ...
double mDynamicVolumeStep; // Increase Volume Step ... double mDynamicVolumeStep; // Increase Volume Step ...
double mDynamicVolumeBalanceFactor; // Balance Factor for Generate Dynamic Volume ... double mDynamicVolumeBalanceFactor; // Balance Factor for Generate Dynamic Volume ...
double mVolume; // Static Volume ... double mVolume; // Static Volume ...
bool mDynamicRiskManagement; // Dynamic Risk Management ...
double mRiskPercentPerBalance; // Risk Percent Per Balance in Each Trade ... double mRiskPercentPerBalance; // Risk Percent Per Balance in Each Trade ...
//
double CalculateAdditionalVolumeMultiplier(XSignal &signal)
{
//
double result = 0;
//
if (!signal.IsValid())
{
return result;
}
//
X121SMCSymbolPositionInfo info;
bool hasInfo = mTradeHandler.GetSymbolInfo(
signal.symbol,
info //
);
if (!hasInfo)
{
return result;
}
//
if (info.countedSLs >= 2)
{
result = (info.countedSLs / 2) + 1;
}
//
return result;
}
// //
}; };
+134
View File
@@ -35,6 +35,23 @@
const string X121SMCStrategyToken = "X121SMC"; const string X121SMCStrategyToken = "X121SMC";
const string X121SMCPVToken = "X121SMCPV";
const string X121SMCBOSToken = "X121SMCBOS";
const string X121SMCSARToken = "X121SMCSAR";
const string X121SMCCHOCHToken = "X121SMCCHOCH";
const string X121SMCPULLBKToken = "X121SMCPULLBK";
enum ENUM_X_121_SMC_PROVIDERS
{
//
X_121_SMC_PROVIDER_NONE,
X_121_SMC_PROVIDER_PV,
X_121_SMC_PROVIDER_BOS,
X_121_SMC_PROVIDER_SAR,
X_121_SMC_PROVIDER_CHOCH,
X_121_SMC_PROVIDER_PULLBK,
};
enum ENUM_XPV_PIVOTS enum ENUM_XPV_PIVOTS
{ {
XPV_NONE, XPV_NONE,
@@ -1661,4 +1678,121 @@ void DetectPivotPOIs(
} }
} }
//
// Provider Extensions ...
/**
* Validate a Signal Provider ...
*
* @param value: ENUM_X_121_SMC_PROVIDERS member ...
*
* @return ( bool )
*/
bool IsValid(ENUM_X_121_SMC_PROVIDERS value)
{
//
bool result = false;
//
result = value != X_121_SMC_PROVIDER_NONE;
//
return result;
}
/**
* Converts a Signal Provider to String ...
*
* @param value: ENUM_X_121_SMC_PROVIDERS member ...
*
* @return ( string )
*/
string ToString(ENUM_X_121_SMC_PROVIDERS value)
{
//
string result = NULL;
//
if (!IsValid(value))
{
return result;
}
//
switch (value)
{
//
case X_121_SMC_PROVIDER_PV:
result = X121SMCPVToken;
break;
//
case X_121_SMC_PROVIDER_BOS:
result = X121SMCBOSToken;
break;
//
case X_121_SMC_PROVIDER_SAR:
result = X121SMCSARToken;
break;
//
case X_121_SMC_PROVIDER_CHOCH:
result = X121SMCCHOCHToken;
break;
//
case X_121_SMC_PROVIDER_PULLBK:
result = X121SMCPULLBKToken;
break;
}
//
return result;
}
/**
* Parse Specified String as a Signal Provider ...
*
* @param value: String ...
*
* @return ( ENUM_X_121_SMC_PROVIDERS )
*/
ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
{
//
ENUM_X_121_SMC_PROVIDERS result = X_121_SMC_PROVIDER_NONE;
//
if (!IsValid(value))
{
return result;
}
//
if (Contains(X121SMCPVToken, value))
{
result = X_121_SMC_PROVIDER_PV;
}
else if (Contains(X121SMCBOSToken, value))
{
result = X_121_SMC_PROVIDER_BOS;
}
else if (Contains(X121SMCSARToken, value))
{
result = X_121_SMC_PROVIDER_SAR;
}
else if (Contains(X121SMCCHOCHToken, value))
{
result = X_121_SMC_PROVIDER_CHOCH;
}
else if (Contains(X121SMCPULLBKToken, value))
{
result = X_121_SMC_PROVIDER_PULLBK;
}
//
return result;
}
// //
@@ -30,7 +30,7 @@
#include "../Classes/x-121.smc.base.strategy.class.mq5" #include "../Classes/x-121.smc.base.strategy.class.mq5"
// //
// Helper(s) ... // Definitions ...
// //
// XStrategy Class Implementation(s) ... // XStrategy Class Implementation(s) ...
@@ -392,6 +392,13 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
pBar.high > lastPivot.lower) pBar.high > lastPivot.lower)
// //
; ;
//
if (hasBOS)
{
mLastBOSOn = TimeCurrent();
}
bool hasCHOCH = bool hasCHOCH =
isOrderFlowBullish isOrderFlowBullish
? ?
@@ -412,6 +419,45 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
// //
; ;
//
if (hasCHOCH)
{
// RedrawOrderFlow();
mLastCHOCHOn = TimeCurrent();
// ClearDraws();
}
//
// Check PSar is Equals to Peak or Vale ...
bool isSAREqualsToPeak =
conditions.xchsarConditions.cSars[0] == conditions.xpvConditions.peaks[1];
bool isSAREqualsToVale =
conditions.xchsarConditions.cSars[0] == conditions.xpvConditions.vales[1];
//
bool hasNewPeak =
conditions.xpvConditions.peaks[0] != conditions.xpvConditions.peaks[1];
bool hasNewPeakOverLast =
hasNewPeak &&
conditions.xpvConditions.peaks[0] > conditions.xpvConditions.peaks[1];
bool hasNewPeakUnderLast =
hasNewPeak &&
conditions.xpvConditions.peaks[0] < conditions.xpvConditions.peaks[1];
//
bool hasNewVale =
conditions.xpvConditions.vales[0] != conditions.xpvConditions.vales[1];
bool hasNewValeOverLast =
hasNewVale &&
conditions.xpvConditions.vales[0] > conditions.xpvConditions.vales[1];
bool hasNewValeUnderLast =
hasNewVale &&
conditions.xpvConditions.vales[0] < conditions.xpvConditions.vales[1];
//
// START Signalling ...
//
// //
// BOS Signals ... // BOS Signals ...
bool has_BOS_Long = false; bool has_BOS_Long = false;
@@ -433,172 +479,192 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
bool has_PULLBK_Short = false; bool has_PULLBK_Short = false;
// //
// Detect BOS Or CHOCH Signals ... // PV Signals ...
if (hasBOS || hasCHOCH) bool has_PV_Long = false;
bool has_PV_Short = false;
//
// BOS Signals ...
//
has_BOS_Long =
//
hasBOS &&
isOrderFlowBullish &&
isCRMEBullish &&
cBar.IsBullish() &&
conditions.xchsarConditions.cSars[0] < cBar.low
//
;
//
if (has_BOS_Long)
{ {
// //
// Do on CHOCH ... selectedSL = cBar.low;
if (hasCHOCH) provider = ToString(X_121_SMC_PROVIDER_BOS);
{
//
has_CHOCH_Long =
//
!isOrderFlowBullish &&
cBar.IsBullish() &&
(isCBullishMomentumBar ||
isCBullishRejectionBar) &&
conditions.xchsarConditions.cSars[0] < cBar.low
//
;
if (has_CHOCH_Long)
{
//
provider = "CHOCH-Long";
selectedSL = cBar.low;
}
//
has_CHOCH_Short =
//
isOrderFlowBullish &&
cBar.IsBearish() &&
(isCBearishMomentumBar ||
isCBearishRejectionBar) &&
conditions.xchsarConditions.cSars[0] > cBar.high
//
;
if (has_CHOCH_Short)
{
//
provider = "CHOCH-Short";
selectedSL = cBar.high;
}
//
mLastCHOCHOn = TimeCurrent();
}
//
// Do on BOS ...
if (hasBOS)
{
//
has_BOS_Long =
//
isOrderFlowBullish &&
isCRMEBullish &&
cBar.IsBullish() &&
conditions.xchsarConditions.cSars[0] < cBar.low
//
;
//
if (has_BOS_Long)
{
//
provider = "BOS-Long";
selectedSL = cBar.low;
}
//
has_BOS_Short =
//
!isOrderFlowBullish &&
isCRMEBearish &&
cBar.IsBearish() &&
conditions.xchsarConditions.cSars[0] > cBar.high
//
;
if (has_BOS_Short)
{
//
provider = "BOS-Short";
selectedSL = cBar.high;
}
//
mLastBOSOn = TimeCurrent();
}
} }
else
//
has_BOS_Short =
//
hasBOS &&
!isOrderFlowBullish &&
isCRMEBearish &&
cBar.IsBearish() &&
conditions.xchsarConditions.cSars[0] > cBar.high
//
;
if (has_BOS_Short)
{ {
// //
// Check PSar is Equals to Peak or Vale ... selectedSL = cBar.high;
bool isSAREqualsToPeak = provider = ToString(X_121_SMC_PROVIDER_BOS);
conditions.xchsarConditions.cSars[0] == conditions.xpvConditions.peaks[1];
bool isSAREqualsToVale =
conditions.xchsarConditions.cSars[0] == conditions.xpvConditions.vales[1];
//
has_SAR_Long =
//
isSAREqualsToVale &&
isOrderFlowBullish &&
isPSarInDirectionOfOrderFlow
//
;
if (has_SAR_Long)
{
//
provider = "SAR_Long";
selectedSL = conditions.xchsarConditions.cSars[0];
}
//
has_SAR_Short =
//
isSAREqualsToPeak &&
!isOrderFlowBullish &&
isPSarInDirectionOfOrderFlow
//
;
if (has_SAR_Short)
{
//
provider = "SAR_Short";
selectedSL = conditions.xchsarConditions.cSars[0];
}
//
// Check PULLBK Conditions ...
//
has_PULLBK_Long =
//
isCRMEBullish &&
isPSarInDirectionOfOrderFlow &&
(cBar.low < conditions.x3maConditions.fasts[0] &&
cBar.GetDown() > conditions.x3maConditions.fasts[0]) &&
!(pBar.low < conditions.x3maConditions.fasts[1] &&
pBar.GetDown() > conditions.x3maConditions.fasts[1])
//
;
if (has_PULLBK_Long)
{
//
provider = "PULLBK-Long";
selectedSL = cBar.low;
}
//
has_PULLBK_Short =
//
isCRMEBearish &&
isPSarInDirectionOfOrderFlow &&
(cBar.high > conditions.x3maConditions.fasts[0] &&
cBar.GetUp() < conditions.x3maConditions.fasts[0]) &&
!(pBar.high > conditions.x3maConditions.fasts[1] &&
pBar.GetUp() < conditions.x3maConditions.fasts[1])
//
;
if (has_PULLBK_Short)
{
//
provider = "PULLBK-Short";
selectedSL = cBar.high;
}
} }
//
// CHOCH Signals ...
//
has_CHOCH_Long =
//
hasCHOCH &&
isCRMEBullish &&
cBar.IsBullish() &&
!isOrderFlowBullish &&
conditions.xchsarConditions.cSars[0] < cBar.low
//
;
if (has_CHOCH_Long)
{
//
selectedSL = cBar.low;
provider = ToString(X_121_SMC_PROVIDER_CHOCH);
}
//
has_CHOCH_Short =
//
hasCHOCH &&
isCRMEBearish &&
cBar.IsBearish() &&
isOrderFlowBullish &&
conditions.xchsarConditions.cSars[0] > cBar.high
//
;
if (has_CHOCH_Short)
{
//
selectedSL = cBar.high;
provider = ToString(X_121_SMC_PROVIDER_CHOCH);
}
//
// SAR Signals ...
//
has_SAR_Long =
//
isSAREqualsToVale &&
isOrderFlowBullish &&
isPSarInDirectionOfOrderFlow
//
;
if (has_SAR_Long)
{
//
provider = ToString(X_121_SMC_PROVIDER_SAR);
selectedSL = conditions.xchsarConditions.cSars[0];
}
//
has_SAR_Short =
//
isSAREqualsToPeak &&
!isOrderFlowBullish &&
isPSarInDirectionOfOrderFlow
//
;
if (has_SAR_Short)
{
//
provider = ToString(X_121_SMC_PROVIDER_SAR);
selectedSL = conditions.xchsarConditions.cSars[0];
}
//
// PULLBK Signals ...
//
has_PULLBK_Long =
//
isCRMEBullish &&
isPSarInDirectionOfOrderFlow &&
(cBar.low < conditions.x3maConditions.fasts[0] &&
cBar.GetDown() > conditions.x3maConditions.fasts[0])
//
;
if (has_PULLBK_Long)
{
//
selectedSL = cBar.low;
provider = ToString(X_121_SMC_PROVIDER_PULLBK);
}
//
has_PULLBK_Short =
//
isCRMEBearish &&
isPSarInDirectionOfOrderFlow &&
(cBar.high > conditions.x3maConditions.fasts[0] &&
cBar.GetUp() < conditions.x3maConditions.fasts[0])
//
;
if (has_PULLBK_Short)
{
//
selectedSL = cBar.high;
provider = ToString(X_121_SMC_PROVIDER_PULLBK);
}
//
// PV Signals ...
//
has_PV_Long =
//
isCRMEBullish &&
isOrderFlowBullish &&
!hasNewValeUnderLast &&
cBar.low == conditions.xpvConditions.vales[0]
//
;
if (has_PV_Long)
{
//
selectedSL = cBar.low;
provider = ToString(X_121_SMC_PROVIDER_PV);
}
//
has_PV_Short =
//
isCRMEBearish &&
!isOrderFlowBullish &&
!hasNewPeakOverLast &&
cBar.high == conditions.xpvConditions.peaks[0]
//
;
if (has_PV_Short)
{
//
selectedSL = cBar.high;
provider = ToString(X_121_SMC_PROVIDER_PV);
}
//
// END Signalling ...
//
// //
// Combine all Signals Conditions ... // Combine all Signals Conditions ...
@@ -610,18 +676,18 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
|| ||
// //
has_CHOCH_Long has_CHOCH_Long
// //
// ||
// //
// // has_SAR_Long
// //
// ||
// //
// has_PULLBK_Long
// //
// ||
// //
// false ||
//
has_SAR_Long
//
||
//
has_PULLBK_Long
//
||
//
has_PV_Long
// //
; ;
@@ -633,18 +699,18 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
|| ||
// //
has_CHOCH_Short has_CHOCH_Short
// //
// ||
// //
// // has_SAR_Short
// //
// ||
// //
// has_PULLBK_Short
// //
// ||
// //
// false ||
//
has_SAR_Short
//
||
//
has_PULLBK_Short
//
||
//
has_PV_Short
// //
; ;
@@ -652,6 +718,17 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
result = hasLong || result = hasLong ||
hasShort; hasShort;
//
// Reset Order Flow ...
if (hasCHOCH && !result)
{
ResetOrderFlow();
}
else if (hasBOS && !result)
{
UpdateOrderFlow();
}
// //
// Rmove Signal Condition ... // Rmove Signal Condition ...
if (result) if (result)
@@ -702,11 +779,6 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
? entry + reward ? entry + reward
: entry - reward; : entry - reward;
//
Print("PRV: ", provider);
RedrawOrderFlow();
ClearDraws();
// //
signal.sl = sl; signal.sl = sl;
signal.tp = tp; signal.tp = tp;
@@ -717,13 +789,20 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
signal.symbol = _symbol; signal.symbol = _symbol;
signal.period = _period; signal.period = _period;
signal.pushers = pushers; signal.pushers = pushers;
signal.provider = GetTag(); signal.provider = provider;
signal.time = TimeCurrent(); signal.time = TimeCurrent();
// //
result = PrepareSignal(signal); result = PrepareSignal(signal);
if (result) if (result)
{ {
//
Print("PRV: ", provider);
RedrawOrderFlow();
DrawSignal(signal);
ClearDraws();
//
ResetOrderFlow(); ResetOrderFlow();
} }
@@ -1425,10 +1504,9 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
* When a BOS Happens ... * When a BOS Happens ...
* we have to Update Order Flow ... * we have to Update Order Flow ...
*/ */
void UpdateOrderFlowOnBOS() void UpdateOrderFlow()
{ {
// ResetOrderFlow();
Print("UpdateOrderFlowOnBOS");
} }
/** /**