complete break even risk free ...

This commit is contained in:
2024-12-24 16:29:31 +03:30
parent 7c4cfd4321
commit 8d6c48ede5
9 changed files with 2306 additions and 2795 deletions
+27
View File
@@ -724,6 +724,33 @@ class XCBaseExpert : public XCBaseAlert
{ {
} }
/**
* Handle Deals Changed ...
*
* @param count: Integer, Number of Changes ...
*/
virtual void HandleOnDealsChanged(int count)
{
}
/**
* Handle Orders Changed ...
*
* @param count: Integer, Number of Changes ...
*/
virtual void HandleOnOrdersChanged(int count)
{
}
/**
* Handle Positions Changed ...
*
* @param count: Integer, Number of Changes ...
*/
virtual void HandleOnPositionsChanged(int count)
{
}
/** /**
* Do All Signalling Processing Here ... * Do All Signalling Processing Here ...
*/ */
+9 -3
View File
@@ -1083,7 +1083,7 @@ class XCTrade : public XCBase
{ {
// //
// Retrieve Signal Spread ... // Retrieve Signal Spread ...
double spread = mSignal.GetSpread(); double spread = GetSpread(mSignal.symbol);
result = spread <= mMaxAllowedSpread; result = spread <= mMaxAllowedSpread;
} }
@@ -2145,8 +2145,11 @@ class XCTrade : public XCBase
) )
{ {
// //
return result bool isInited = result
.ByIndex(index); .ByIndex(index);
//
return isInited;
} }
// //
@@ -2157,8 +2160,11 @@ class XCTrade : public XCBase
) )
{ {
// //
return result bool isInited = result
.ByTicket(ticket); .ByTicket(ticket);
//
return isInited;
} }
// //
+33
View File
@@ -109,8 +109,11 @@ int OnInit()
// //
eaExpert.OnSignalEventListener = OnSignalRecieved; eaExpert.OnSignalEventListener = OnSignalRecieved;
eaExpert.OnDealsChangedEventListener = OnDealsChanged;
eaExpert.OnOrdersChangedEventListener = OnOrdersChanged;
eaExpert.OnPositionSLEventListener = OnStopLossTriggered; eaExpert.OnPositionSLEventListener = OnStopLossTriggered;
eaExpert.OnPositionTPEventListener = OnTakeProfitTriggered; eaExpert.OnPositionTPEventListener = OnTakeProfitTriggered;
eaExpert.OnPositionsChangedEventListener = OnPositionsChanged;
eaExpert.OnPositionForceCloseEventListener = OnPositionForceClosed; eaExpert.OnPositionForceCloseEventListener = OnPositionForceClosed;
// //
@@ -278,6 +281,36 @@ void OnPositionForceClosed(
); );
} }
/**
* Handle Deals Changes ...
*
* @param count: Integer, Number of Changes ...
*/
void OnDealsChanged(int count)
{
eaExpert.HandleOnDealsChanged(count);
}
/**
* Handle Orders Changes ...
*
* @param count: Integer, Number of Changes ...
*/
void OnOrdersChanged(int count)
{
eaExpert.HandleOnOrdersChanged(count);
}
/**
* Handle Positions Changes ...
*
* @param count: Integer, Number of Changes ...
*/
void OnPositionsChanged(int count)
{
eaExpert.HandleOnPositionsChanged(count);
}
// //
// Custom Functions ... // Custom Functions ...
+311 -71
View File
@@ -677,6 +677,91 @@ struct XPosition
return result; return result;
} }
//
// Calculate TP Levels ...
int CalculateTPLevels(double &tps[])
{
//
int result = 0;
//
Clean(tps);
//
bool isValid = IsValid();
if (!isValid)
{
return result;
}
//
double risk = GetRisk();
int r2r = (int)GetRiskRewardRatio();
bool isLong = IsLong(type);
for (int i = 0; i < r2r; i++)
{
//
double iValue =
isLong
? entry + risk + (i * risk)
: entry - risk - (i * risk);
//
Add(
iValue,
tps //
);
}
//
result = ArraySize(tps);
//
return result;
}
//
// Calculate Reached TP Levels ...
void CalculateReahedTP(
double &reachedLevel,
double &reachedPrice //
)
{
//
reachedLevel = -1;
reachedPrice = 0;
double tps[];
bool isLong = IsLong(type);
double exitPrice = GetExit();
int tpLevels = CalculateTPLevels(tps);
if (!IsValidSize(tpLevels) || exitPrice <= 0)
{
return;
}
//
for (int i = 0; i < tpLevels - 1; i++)
{
//
double cTP = tps[i];
double nTP = tps[i + 1];
//
bool isReached =
isLong
? exitPrice > cTP &&
exitPrice < nTP
: exitPrice < cTP &&
exitPrice > nTP;
if (isReached)
{
//
reachedLevel = i + 1;
reachedPrice = cTP;
}
}
}
// //
// Calculate Age ... // Calculate Age ...
int GetAge( int GetAge(
@@ -830,6 +915,25 @@ struct XSignal
int pushers; // Signal Pushers ... int pushers; // Signal Pushers ...
string conditions; // Signal Conditions ... string conditions; // Signal Conditions ...
//
// Additional ...
//
// TP ...
double fullTPLevel; // Full TP ...
double partialCloseMultiplier; // Amount of Partial Close ...
double partialCloseOnTPLevel; // Do Partial Close on TP Level ...
//
// RF ...
double tpLevelForBreakEven; // TP Level for Break Even ...
bool riskFreeOnBreakEven; // Risk Free Signal On Break Even ...
//
// SL Trail ...
bool trailSL; // Do SL Trail ...
double trailSLStartOnReachTPLevel; // Start SL Trail After Reached TP Level ...
// //
// Constructor ... // Constructor ...
XSignal() XSignal()
@@ -906,6 +1010,141 @@ struct XSignal
return result; return result;
} }
//
bool PrepareComplex(
string mSymbol, // Trading Symbol
string mProvider, // Signal Provider
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
ENUM_POSITION_TYPE mType, // Long (Buy) or Short (Sell)
ENUM_X_ORDER_MODES mMode, // Execution Mode
double mEntry, // Entry Price
double mVolume, // Volume
double mSL = 0, // Stop Loss
//
// TP ...
double mFullTPLevel = 0, // Full TP Level
double mPartialCloseOnTPLevel = 0, // Partial Close On TP Level
double mPartialCloseMultiplier = 0, // Partial Close Multiplier
//
// RF ...
bool mRiskFreeOnBreakEven = false, // Risk Free Signal On Break Even ...
double mTpLevelForBreakEven = 0, // TP Level for Break Even ...
//
// SL Trail ...
bool mTrailSL = false, // Trail SL
double mTrailSLStartOnReachTPLevel = 0 // Trail SL Starts after Reached TP Level
)
{
//
bool result = false;
//
// Validate Args ...
result =
//
// Common ...
mSL > 0 &&
mEntry > 0 &&
mVolume > 0 &&
IsValid(mSymbol) &&
IsValid(mPeriod) &&
IsValid(mProvider) &&
mMode != X_ORDER_MODE_NOTHING
//
&&
//
// TP ...
mFullTPLevel > 0
//
;
if (!result)
{
return result;
}
//
// Prepare Regular Signal Values ...
double _risk = MathAbs(mEntry - mSL);
double _reward = _risk * mFullTPLevel;
//
bool isLong = IsLong(mType);
//
sl = mSL;
type = mType;
mode = mMode;
entry = mEntry;
symbol = mSymbol;
period = mPeriod;
volume = mVolume;
provider = mProvider;
fullTPLevel = mFullTPLevel;
tp = isLong
? mEntry + _reward
: mEntry - _reward;
//
result = Normalize();
if (!result)
{
return result;
}
//
// Calculate Other Conditions ...
//
bool canPartialClose =
//
mPartialCloseOnTPLevel > 0 &&
mPartialCloseMultiplier > 0 &&
mPartialCloseOnTPLevel < mFullTPLevel
//
;
if (canPartialClose)
{
//
partialCloseOnTPLevel = mPartialCloseOnTPLevel;
partialCloseMultiplier = mPartialCloseMultiplier;
}
//
bool canRFOnBEP =
//
mRiskFreeOnBreakEven &&
mTpLevelForBreakEven > 0
//
;
if (canRFOnBEP)
{
//
riskFreeOnBreakEven = mRiskFreeOnBreakEven;
tpLevelForBreakEven = mTpLevelForBreakEven;
}
//
bool canTrailSL =
//
mTrailSL &&
mTrailSLStartOnReachTPLevel > 0 &&
mTrailSLStartOnReachTPLevel < mFullTPLevel
//
;
if (canTrailSL)
{
//
trailSL = mTrailSL;
trailSLStartOnReachTPLevel = mTrailSLStartOnReachTPLevel;
}
//
result = IsValid();
//
return result;
}
// //
bool PrepareLong( bool PrepareLong(
string mSymbol, // Trading Symbol string mSymbol, // Trading Symbol
@@ -1247,6 +1486,17 @@ struct XSignal
provider = NULL; provider = NULL;
conditions = NULL; conditions = NULL;
//
trailSL = false;
riskFreeOnBreakEven = false;
//
fullTPLevel = 0;
tpLevelForBreakEven = 0;
partialCloseOnTPLevel = 0;
partialCloseMultiplier = 0;
trailSLStartOnReachTPLevel = 0;
// //
Clean(supports); Clean(supports);
} }
@@ -1368,74 +1618,6 @@ struct XSignal
); );
} }
//
// Retrieve Entry Price ...
double GetEntry()
{
//
double result = 0;
//
if (!IsValid())
{
return result;
}
//
result = GetEntry(
symbol,
type
//
);
//
return result;
}
//
// Retrieve Exit ...
double GetExit()
{
//
double result = 0;
//
if (!IsValid())
{
return result;
}
//
result = GetExit(
symbol,
type
//
);
//
return result;
}
//
// Get Spread by Point ...
double GetSpread()
{
//
double result = 0;
//
if (!IsValid())
{
return result;
}
//
result = PriceToPoint(GetSpread(symbol));
//
return result;
}
// //
// Find Risk ... // Find Risk ...
double GetRisk() double GetRisk()
@@ -1496,6 +1678,61 @@ struct XSignal
return result; return result;
} }
//
// Check Can Partial Close on Specified TP Level ...
bool CanPartialClose()
{
//
bool result = false;
//
result =
IsValid() &&
fullTPLevel > 0 &&
partialCloseOnTPLevel > 0 &&
partialCloseMultiplier > 0 &&
partialCloseOnTPLevel < fullTPLevel;
//
return result;
}
//
// Check Can Risk Free On Break Even Point ...
bool CanRiskFreeOnBreakEvenPoint()
{
//
bool result = false;
//
result =
IsValid() &&
riskFreeOnBreakEven &&
tpLevelForBreakEven > 0;
//
return result;
}
//
// Check Can Trail SL ...
bool CanTrailSL()
{
//
bool result = false;
//
result =
IsValid() &&
trailSL &&
fullTPLevel > 0 &&
trailSLStartOnReachTPLevel > 0 &&
trailSLStartOnReachTPLevel < fullTPLevel;
//
return result;
}
// //
string GetTag() string GetTag()
{ {
@@ -3341,21 +3578,24 @@ struct XSymbolPositions
}; };
// //
struct XSymbolLastPosition { struct XSymbolLastPosition
{
// //
string symbol; string symbol;
string provider; string provider;
datetime time; datetime time;
// //
XSymbolLastPosition() { XSymbolLastPosition()
{
Clean(); Clean();
} }
// //
// Tools ... // Tools ...
void Clean() { void Clean()
{
// //
time = NULL; time = NULL;
symbol = NULL; symbol = NULL;
File diff suppressed because it is too large Load Diff
+49 -70
View File
@@ -47,6 +47,11 @@ class XC121SMCExpert : public XCBaseExpert
TOnModify OnPositionModifiedEventListener; TOnModify OnPositionModifiedEventListener;
TOnForceClose OnPositionForceCloseEventListener; TOnForceClose OnPositionForceCloseEventListener;
//
TOnDealsChanged OnDealsChangedEventListener;
TOnOrdersChanged OnOrdersChangedEventListener;
TOnPositionsChanged OnPositionsChangedEventListener;
// //
TOnX121SMCSignal OnSignalEventListener; TOnX121SMCSignal OnSignalEventListener;
@@ -293,7 +298,7 @@ class XC121SMCExpert : public XCBaseExpert
if (isFiltered) if (isFiltered)
{ {
// //
mTradeHandler.RemoveSignal(signal); mTradeHandler.Remove(signal);
return; return;
} }
@@ -313,34 +318,14 @@ 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 ... false // ignore Policies ...
//
// Force Protections ...
canTrail //
); );
//
if (isExecuted)
{
mLastSignalOn = currentTime;
}
} }
// //
@@ -541,7 +526,10 @@ class XC121SMCExpert : public XCBaseExpert
); );
mTrader.AddOnStopLossEventHandler(OnPositionSLEventListener); mTrader.AddOnStopLossEventHandler(OnPositionSLEventListener);
mTrader.AddOnTakeProfitEventHandler(OnPositionTPEventListener); mTrader.AddOnTakeProfitEventHandler(OnPositionTPEventListener);
mTrader.AddOnDealsChangedEventHandler(OnDealsChangedEventListener);
mTrader.AddOnOrdersChangedEventHandler(OnOrdersChangedEventListener);
mTrader.AddOnModifyPositionEventHandler(OnPositionModifiedEventListener); mTrader.AddOnModifyPositionEventHandler(OnPositionModifiedEventListener);
mTrader.AddOnPositionsChangedEventHandler(OnPositionsChangedEventListener);
mTrader.AddOnForceClosePositionEventHandler(OnPositionForceCloseEventListener); mTrader.AddOnForceClosePositionEventHandler(OnPositionForceCloseEventListener);
mTrader.AddOnPartialClosePositionEventHandler(OnPositionPartialCloseEventListener); mTrader.AddOnPartialClosePositionEventHandler(OnPositionPartialCloseEventListener);
@@ -578,51 +566,12 @@ class XC121SMCExpert : public XCBaseExpert
// //
// Configure Position Protector ... // Configure Position Protector ...
//
mTradeHandler.UseForceMomentumsInProtection(true);
// //
// Configure Hedging ... // Configure Hedging ...
mTradeHandler.AllowHedge(false); mTradeHandler.AllowHedge(false);
mTradeHandler.HedgeMinVolumeStep(0.01); mTradeHandler.HedgeMinVolumeStep(0.01);
mTradeHandler.MinimumOpenPositionsForHEHedge(2); mTradeHandler.MinimumOpenPositionsForHedge(2);
mTradeHandler.HedgeHEMinProfitPerVolumeStep(0.2); mTradeHandler.HedgeMinProfitPerVolumeStep(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(3);
//
// 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 ... // Parsers ...
@@ -743,7 +692,11 @@ class XC121SMCExpert : public XCBaseExpert
void HandleStrategiesOnTick() override void HandleStrategiesOnTick() override
{ {
// //
// Calling Protection Handler of TradeHandler ... // Update Positions Data ...
mTradeHandler.UpdateData();
//
// Protect Positions ...
mTradeHandler.HandleProtection(); mTradeHandler.HandleProtection();
// //
@@ -765,6 +718,38 @@ class XC121SMCExpert : public XCBaseExpert
// //
// Event Handlers ... // Event Handlers ...
/**
* Calls When a Deals Changed Triggered ...
*
* @param count: Integer, Number of Changes ...
*/
void HandleOnDealsChanged(int count) override
{
}
/**
* Calls When a Order Changed Triggered ...
*
* @param count: Integer, Number of Changes ...
*/
void HandleOnOrdersChanged(int count) override
{
}
/**
* Calls When a Positions Changed Triggered ...
*
* @param count: Integer, Number of Changes ...
*/
void HandleOnPositionsChanged(int count) override
{
//
if (IsValidSize(count))
{
mTradeHandler.HandleNewPosition();
}
}
/** /**
* Calls When a Position's SL Triggered ... * Calls When a Position's SL Triggered ...
* *
@@ -871,9 +856,6 @@ class XC121SMCExpert : public XCBaseExpert
// //
// Props ... // Props ...
//
datetime mLastSignalOn;
// //
XC121SMCTradeHandler *mTradeHandler; // Trade Handler ... XC121SMCTradeHandler *mTradeHandler; // Trade Handler ...
XCX121SMCBaseStrategy *mStrategies[]; // Registere Strategies in EA ... XCX121SMCBaseStrategy *mStrategies[]; // Registere Strategies in EA ...
@@ -963,9 +945,6 @@ class XC121SMCExpert : public XCBaseExpert
{ {
signal.volume = Volume(); signal.volume = Volume();
} }
//
mTradeHandler.UpdateSignal(signal);
} }
/** /**
-108
View File
@@ -2007,111 +2007,3 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
} }
// //
// Custom Providers Conditions ...
struct XSMCStrategySetupConditions
{
//
// Props ...
//
string symbol;
ENUM_TIMEFRAMES period;
//
double sl;
ENUM_X_DIRECTION dir;
ENUM_X_POSITION_TYPES type;
//
// Setup Props ...
//
datetime setupTime;
datetime triggerTime;
//
// Trigger Props ...
//
// Constructor ...
XSMCStrategySetupConditions()
{
Clean();
}
//
// Tools ...
/**
* Cleaning Up ...
*/
void Clean()
{
//
sl = 0;
//
dir = X_DIRECTION_NONE;
type = X_POSITION_TYPE_NONE;
//
symbol = NULL;
period = NULL;
setupTime = NULL;
triggerTime = NULL;
}
/**
* Check Condition is Setting Up ...
*
* @param dir: ENUM_X_DIRECTION member, Setting Up Direction ...
*
* @return ( bool )
*/
bool IsSetuped()
{
//
bool result = false;
//
result = IsValid(setupTime) &&
HasDirection(dir);
if (!result)
{
return result;
}
//
return result;
}
/**
* Detect How we Can Trigger Signal ...
*
* @return ( bool )
*/
bool CanTrigger()
{
//
bool result = false;
//
result =
//
sl > 0 &&
IsValid(symbol) &&
IsValid(period) &&
IsValid(triggerTime) &&
type != X_POSITION_TYPE_ALL &&
type != X_POSITION_TYPE_NONE
//
;
//
return result;
}
//
};
//
@@ -1591,7 +1591,8 @@ bool DetectX121SMCTestSiganlTrigger(
// //
// !isTriggerMarketBearish && // !isTriggerMarketBearish &&
// !isDecisionMarketBearish && // !isDecisionMarketBearish &&
!isAnalyseMarketBearish && // !isAnalyseMarketBearish &&
isTriggerMarketBullish &&
!isVerificationMarketBearish && !isVerificationMarketBearish &&
!isConsolidationMarketBearish !isConsolidationMarketBearish
// //
@@ -1602,7 +1603,8 @@ bool DetectX121SMCTestSiganlTrigger(
// //
// !isTriggerMarketBullish && // !isTriggerMarketBullish &&
// !isDecisionMarketBullish && // !isDecisionMarketBullish &&
!isAnalyseMarketBullish && // !isAnalyseMarketBullish &&
isTriggerMarketBearish &&
!isVerificationMarketBullish && !isVerificationMarketBullish &&
!isConsolidationMarketBullish !isConsolidationMarketBullish
// //
@@ -1616,7 +1618,7 @@ bool DetectX121SMCTestSiganlTrigger(
// isSameVale && // isSameVale &&
lookupLong && lookupLong &&
isValesInsideFVG && isValesInsideFVG &&
isMarketReadyForLong && // isMarketReadyForLong &&
isSarSwitchedToBullish && isSarSwitchedToBullish &&
triggerVale <= iFVG.Upper() && triggerVale <= iFVG.Upper() &&
triggerVale >= iFVG.Lower(); triggerVale >= iFVG.Lower();
@@ -1626,7 +1628,7 @@ bool DetectX121SMCTestSiganlTrigger(
// isSamePeak && // isSamePeak &&
lookupShort && lookupShort &&
isPeaksInsideFVG && isPeaksInsideFVG &&
isMarketReadyForShort && // isMarketReadyForShort &&
isSarSwitchedToBearish && isSarSwitchedToBearish &&
triggerPeak <= iFVG.Upper() && triggerPeak <= iFVG.Upper() &&
triggerPeak >= iFVG.Lower(); triggerPeak >= iFVG.Lower();
@@ -277,6 +277,26 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
signal.provider = provider; signal.provider = provider;
signal.time = TimeCurrent(); signal.time = TimeCurrent();
//
if (hasTestSignal)
{
//
// Add Aditionsal Info ...
//
signal.fullTPLevel = r2r;
signal.partialCloseOnTPLevel = 2;
signal.partialCloseMultiplier = 0.5;
//
signal.riskFreeOnBreakEven = true;
signal.tpLevelForBreakEven = 1;
//
signal.trailSL = true;
signal.trailSLStartOnReachTPLevel = 3;
}
// //
result = PrepareSignal(signal); result = PrepareSignal(signal);
if (result) if (result)
@@ -487,23 +507,6 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
} }
conditions.visionConditions.state = mVisionState; conditions.visionConditions.state = mVisionState;
// //
// XPVPivot triggerPivot;
// mTriggerCycleHelper.GetActivePivot(triggerPivot);
// result = triggerPivot.IsValid();
// if (!result)
// {
// return result;
// }
// //
// ClearDraws();
// DrawPivot(
// triggerPivot,
// true, // Draw State ...
// true // Filter By Price ...
// );
// //
return result; return result;
} }