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 ...
*/
+11 -5
View File
@@ -1083,7 +1083,7 @@ class XCTrade : public XCBase
{
//
// Retrieve Signal Spread ...
double spread = mSignal.GetSpread();
double spread = GetSpread(mSignal.symbol);
result = spread <= mMaxAllowedSpread;
}
@@ -2145,8 +2145,11 @@ class XCTrade : public XCBase
)
{
//
return result
.ByIndex(index);
bool isInited = result
.ByIndex(index);
//
return isInited;
}
//
@@ -2157,8 +2160,11 @@ class XCTrade : public XCBase
)
{
//
return result
.ByTicket(ticket);
bool isInited = result
.ByTicket(ticket);
//
return isInited;
}
//
+34 -1
View File
@@ -44,7 +44,7 @@ input string eaSymbols = "EURUSDb,GBPUSDb,USDJPYb,USDCHFb"; // Trading Symbols
//
// Volume ...
input group "Volume";
input double eaR2R = 3.0; // Risk to Reward Ratio
input double eaR2R = 3.0; // Risk to Reward Ratio
input bool eaUseDynamicVolume = false; // Use Dynamic Volume
input double eaDynamicVolumeStep = 0.01; // Increase Volume Step
input double eaDynamicVolumeBalanceFactor = 200; // Balance Factor for Generate Dynamic Volume
@@ -109,8 +109,11 @@ int OnInit()
//
eaExpert.OnSignalEventListener = OnSignalRecieved;
eaExpert.OnDealsChangedEventListener = OnDealsChanged;
eaExpert.OnOrdersChangedEventListener = OnOrdersChanged;
eaExpert.OnPositionSLEventListener = OnStopLossTriggered;
eaExpert.OnPositionTPEventListener = OnTakeProfitTriggered;
eaExpert.OnPositionsChangedEventListener = OnPositionsChanged;
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 ...
+312 -72
View File
@@ -677,6 +677,91 @@ struct XPosition
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 ...
int GetAge(
@@ -830,6 +915,25 @@ struct XSignal
int pushers; // Signal Pushers ...
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 ...
XSignal()
@@ -906,6 +1010,141 @@ struct XSignal
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(
string mSymbol, // Trading Symbol
@@ -1247,6 +1486,17 @@ struct XSignal
provider = NULL;
conditions = NULL;
//
trailSL = false;
riskFreeOnBreakEven = false;
//
fullTPLevel = 0;
tpLevelForBreakEven = 0;
partialCloseOnTPLevel = 0;
partialCloseMultiplier = 0;
trailSLStartOnReachTPLevel = 0;
//
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 ...
double GetRisk()
@@ -1496,6 +1678,61 @@ struct XSignal
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()
{
@@ -3341,21 +3578,24 @@ struct XSymbolPositions
};
//
struct XSymbolLastPosition {
struct XSymbolLastPosition
{
//
string symbol;
string provider;
datetime time;
//
XSymbolLastPosition() {
XSymbolLastPosition()
{
Clean();
}
//
// Tools ...
void Clean() {
void Clean()
{
//
time = 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;
TOnForceClose OnPositionForceCloseEventListener;
//
TOnDealsChanged OnDealsChangedEventListener;
TOnOrdersChanged OnOrdersChangedEventListener;
TOnPositionsChanged OnPositionsChangedEventListener;
//
TOnX121SMCSignal OnSignalEventListener;
@@ -293,7 +298,7 @@ class XC121SMCExpert : public XCBaseExpert
if (isFiltered)
{
//
mTradeHandler.RemoveSignal(signal);
mTradeHandler.Remove(signal);
return;
}
@@ -313,34 +318,14 @@ class XC121SMCExpert : public XCBaseExpert
//
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 ...
ENUM_X_SIGNAL_EXECUTION_RESULT state;
bool isExecuted = mTradeHandler.ExecuteSignal(
signal,
state,
false, // ignore Policies ...
//
// Force Protections ...
canTrail //
false // ignore Policies ...
);
//
if (isExecuted)
{
mLastSignalOn = currentTime;
}
}
//
@@ -541,7 +526,10 @@ class XC121SMCExpert : public XCBaseExpert
);
mTrader.AddOnStopLossEventHandler(OnPositionSLEventListener);
mTrader.AddOnTakeProfitEventHandler(OnPositionTPEventListener);
mTrader.AddOnDealsChangedEventHandler(OnDealsChangedEventListener);
mTrader.AddOnOrdersChangedEventHandler(OnOrdersChangedEventListener);
mTrader.AddOnModifyPositionEventHandler(OnPositionModifiedEventListener);
mTrader.AddOnPositionsChangedEventHandler(OnPositionsChangedEventListener);
mTrader.AddOnForceClosePositionEventHandler(OnPositionForceCloseEventListener);
mTrader.AddOnPartialClosePositionEventHandler(OnPositionPartialCloseEventListener);
@@ -578,51 +566,12 @@ class XC121SMCExpert : public XCBaseExpert
//
// Configure Position Protector ...
//
mTradeHandler.UseForceMomentumsInProtection(true);
//
// 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(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);
mTradeHandler.MinimumOpenPositionsForHedge(2);
mTradeHandler.HedgeMinProfitPerVolumeStep(0.2);
//
// Parsers ...
@@ -743,7 +692,11 @@ class XC121SMCExpert : public XCBaseExpert
void HandleStrategiesOnTick() override
{
//
// Calling Protection Handler of TradeHandler ...
// Update Positions Data ...
mTradeHandler.UpdateData();
//
// Protect Positions ...
mTradeHandler.HandleProtection();
//
@@ -765,6 +718,38 @@ class XC121SMCExpert : public XCBaseExpert
//
// 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 ...
*
@@ -871,9 +856,6 @@ class XC121SMCExpert : public XCBaseExpert
//
// Props ...
//
datetime mLastSignalOn;
//
XC121SMCTradeHandler *mTradeHandler; // Trade Handler ...
XCX121SMCBaseStrategy *mStrategies[]; // Registere Strategies in EA ...
@@ -963,9 +945,6 @@ class XC121SMCExpert : public XCBaseExpert
{
signal.volume = Volume();
}
//
mTradeHandler.UpdateSignal(signal);
}
/**
-108
View File
@@ -2006,112 +2006,4 @@ ENUM_X_121_SMC_PROVIDERS ParseProvider(string value)
return result;
}
//
// 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,9 +1591,10 @@ bool DetectX121SMCTestSiganlTrigger(
//
// !isTriggerMarketBearish &&
// !isDecisionMarketBearish &&
!isAnalyseMarketBearish &&
// !isAnalyseMarketBearish &&
isTriggerMarketBullish &&
!isVerificationMarketBearish &&
!isConsolidationMarketBearish
!isConsolidationMarketBearish
//
;
@@ -1602,9 +1603,10 @@ bool DetectX121SMCTestSiganlTrigger(
//
// !isTriggerMarketBullish &&
// !isDecisionMarketBullish &&
!isAnalyseMarketBullish &&
// !isAnalyseMarketBullish &&
isTriggerMarketBearish &&
!isVerificationMarketBullish &&
!isConsolidationMarketBullish
!isConsolidationMarketBullish
//
;
@@ -1616,7 +1618,7 @@ bool DetectX121SMCTestSiganlTrigger(
// isSameVale &&
lookupLong &&
isValesInsideFVG &&
isMarketReadyForLong &&
// isMarketReadyForLong &&
isSarSwitchedToBullish &&
triggerVale <= iFVG.Upper() &&
triggerVale >= iFVG.Lower();
@@ -1626,7 +1628,7 @@ bool DetectX121SMCTestSiganlTrigger(
// isSamePeak &&
lookupShort &&
isPeaksInsideFVG &&
isMarketReadyForShort &&
// isMarketReadyForShort &&
isSarSwitchedToBearish &&
triggerPeak <= iFVG.Upper() &&
triggerPeak >= iFVG.Lower();
@@ -277,6 +277,26 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
signal.provider = provider;
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);
if (result)
@@ -487,23 +507,6 @@ class XCX121SMCTestStrategy : public XCX121SMCBaseStrategy
}
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;
}