complete break even risk free ...
This commit is contained in:
@@ -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 ...
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ input string eaSymbols = "EURUSDb,GBPUSDb,USDJPYb,USDCHFb"; // Trading Symbols
|
|||||||
//
|
//
|
||||||
// Volume ...
|
// Volume ...
|
||||||
input group "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 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
|
||||||
@@ -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 ...
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user