last ...
This commit is contained in:
@@ -1861,9 +1861,9 @@ class XCSignalObject : public XCBaseObject
|
|||||||
targetName,
|
targetName,
|
||||||
window,
|
window,
|
||||||
time1,
|
time1,
|
||||||
signal.targets[i],
|
signal.targets[i].target,
|
||||||
time2,
|
time2,
|
||||||
signal.targets[i] //
|
signal.targets[i].target //
|
||||||
);
|
);
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1361,41 +1361,6 @@ class XCTrade : public XCBase
|
|||||||
//
|
//
|
||||||
// TODO: Implement this ...
|
// TODO: Implement this ...
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Handle Executing Support Signals ...
|
|
||||||
int supportsCount = ArraySize(mSignal.supports);
|
|
||||||
if (supportsCount > 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
int executed = 0;
|
|
||||||
for (int i = 0; i < supportsCount; i++)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
XSignal iSupport = mSignal.supports[i];
|
|
||||||
|
|
||||||
//
|
|
||||||
int supIndex = i + 1;
|
|
||||||
string iComment = GenerateSupportTag(ticket);
|
|
||||||
iSupport.comment = iComment;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isExecuted = ExecuteSignal(
|
|
||||||
iSupport,
|
|
||||||
state,
|
|
||||||
lifetime,
|
|
||||||
expiration
|
|
||||||
//
|
|
||||||
);
|
|
||||||
if (isExecuted)
|
|
||||||
{
|
|
||||||
executed++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result = executed == supportsCount;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -0,0 +1,137 @@
|
|||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| VPattern.mq5 |
|
||||||
|
//| Copyright 2023, MetaQuotes Software Corp. |
|
||||||
|
//| https://www.metaquotes.net/ |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
#property copyright "Copyright 2023, MetaQuotes Software Corp."
|
||||||
|
#property link "https://www.metaquotes.net/"
|
||||||
|
#property version "1.00"
|
||||||
|
#property indicator_chart_window
|
||||||
|
#property indicator_buffers 4
|
||||||
|
#property indicator_plots 2
|
||||||
|
#property indicator_label1 "V Pattern Top"
|
||||||
|
#property indicator_type1 DRAW_ARROW
|
||||||
|
#property indicator_color1 clrGreen
|
||||||
|
#property indicator_width1 2
|
||||||
|
#property indicator_label2 "V Pattern Bottom"
|
||||||
|
#property indicator_type2 DRAW_ARROW
|
||||||
|
#property indicator_color2 clrRed
|
||||||
|
#property indicator_width2 2
|
||||||
|
|
||||||
|
//--- Input parameters
|
||||||
|
input int LookbackPeriod=20; // Bars to analyze for pattern
|
||||||
|
input double MinDeclinePercent=2.0; // Minimum decline percentage
|
||||||
|
input double MinRisePercent=2.0; // Minimum rise percentage
|
||||||
|
input bool ShowAlerts=true; // Show alert messages
|
||||||
|
input color ArrowUpColor=clrGreen; // Up arrow color
|
||||||
|
input color ArrowDownColor=clrRed; // Down arrow color
|
||||||
|
|
||||||
|
//--- Indicator buffers
|
||||||
|
double VTopBuffer[];
|
||||||
|
double VBottomBuffer[];
|
||||||
|
double TempHighBuffer[];
|
||||||
|
double TempLowBuffer[];
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Custom indicator initialization function |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
int OnInit()
|
||||||
|
{
|
||||||
|
//--- indicator buffers mapping
|
||||||
|
SetIndexBuffer(0, VTopBuffer, INDICATOR_DATA);
|
||||||
|
SetIndexBuffer(1, VBottomBuffer, INDICATOR_DATA);
|
||||||
|
SetIndexBuffer(2, TempHighBuffer, INDICATOR_CALCULATIONS);
|
||||||
|
SetIndexBuffer(3, TempLowBuffer, INDICATOR_CALCULATIONS);
|
||||||
|
|
||||||
|
//--- setting arrow codes
|
||||||
|
PlotIndexSetInteger(0, PLOT_ARROW, 233); // Up arrow
|
||||||
|
PlotIndexSetInteger(1, PLOT_ARROW, 234); // Down arrow
|
||||||
|
|
||||||
|
//--- setting arrow colors
|
||||||
|
PlotIndexSetInteger(0, PLOT_LINE_COLOR, ArrowUpColor);
|
||||||
|
PlotIndexSetInteger(1, PLOT_LINE_COLOR, ArrowDownColor);
|
||||||
|
|
||||||
|
//--- setting buffer values as EMPTY_VALUE
|
||||||
|
ArrayInitialize(VTopBuffer, EMPTY_VALUE);
|
||||||
|
ArrayInitialize(VBottomBuffer, EMPTY_VALUE);
|
||||||
|
|
||||||
|
//--- name for DataWindow and indicator subwindow label
|
||||||
|
IndicatorSetString(INDICATOR_SHORTNAME, "V-Pattern Detector ("+string(LookbackPeriod)+")");
|
||||||
|
|
||||||
|
return(INIT_SUCCEEDED);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Custom indicator iteration function |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
int OnCalculate(const int rates_total,
|
||||||
|
const int prev_calculated,
|
||||||
|
const datetime &time[],
|
||||||
|
const double &open[],
|
||||||
|
const double &high[],
|
||||||
|
const double &low[],
|
||||||
|
const double &close[],
|
||||||
|
const long &tick_volume[],
|
||||||
|
const long &volume[],
|
||||||
|
const int &spread[])
|
||||||
|
{
|
||||||
|
//--- check for minimum bars required
|
||||||
|
if(rates_total < LookbackPeriod)
|
||||||
|
return(0);
|
||||||
|
|
||||||
|
//--- start calculation from bar determined by prev_calculated
|
||||||
|
int start;
|
||||||
|
if(prev_calculated == 0)
|
||||||
|
start = LookbackPeriod;
|
||||||
|
else
|
||||||
|
start = prev_calculated - 1;
|
||||||
|
|
||||||
|
//--- main calculation loop
|
||||||
|
for(int i=start; i<rates_total && !IsStopped(); i++)
|
||||||
|
{
|
||||||
|
// Reset buffers
|
||||||
|
VTopBuffer[i] = EMPTY_VALUE;
|
||||||
|
VBottomBuffer[i] = EMPTY_VALUE;
|
||||||
|
|
||||||
|
// Find the lowest low in the lookback period
|
||||||
|
int lowestBar = iLowest(NULL, 0, MODE_LOW, LookbackPeriod, i-LookbackPeriod+1);
|
||||||
|
double lowestLow = low[lowestBar];
|
||||||
|
|
||||||
|
// Find the highest high before the lowest low
|
||||||
|
int highBeforeLow = iHighest(NULL, 0, MODE_HIGH, lowestBar-(i-LookbackPeriod+1)+1, i-LookbackPeriod+1);
|
||||||
|
double highestBefore = high[highBeforeLow];
|
||||||
|
|
||||||
|
// Find the highest high after the lowest low
|
||||||
|
int highAfterLow = iHighest(NULL, 0, MODE_HIGH, i-lowestBar, lowestBar+1);
|
||||||
|
double highestAfter = high[highAfterLow];
|
||||||
|
|
||||||
|
// Calculate percentage moves
|
||||||
|
double declinePercent = (highestBefore - lowestLow) / highestBefore * 100;
|
||||||
|
double risePercent = (highestAfter - lowestLow) / lowestLow * 100;
|
||||||
|
|
||||||
|
// Check if we have a V pattern
|
||||||
|
if(declinePercent >= MinDeclinePercent && risePercent >= MinRisePercent)
|
||||||
|
{
|
||||||
|
// Check if the low is in the middle third of the lookback period
|
||||||
|
int lowPosition = lowestBar - (i-LookbackPeriod+1);
|
||||||
|
if(lowPosition > LookbackPeriod/3 && lowPosition < 2*LookbackPeriod/3)
|
||||||
|
{
|
||||||
|
// Mark the pattern on chart
|
||||||
|
VTopBuffer[highBeforeLow] = high[highBeforeLow];
|
||||||
|
VBottomBuffer[lowestBar] = low[lowestBar];
|
||||||
|
VTopBuffer[highAfterLow] = high[highAfterLow];
|
||||||
|
|
||||||
|
// Show alert if enabled
|
||||||
|
if(ShowAlerts && i == rates_total-1)
|
||||||
|
{
|
||||||
|
string alertText = StringFormat("V-Pattern detected! Decline: %.2f%%, Rise: %.2f%%",
|
||||||
|
declinePercent, risePercent);
|
||||||
|
Alert(alertText);
|
||||||
|
Comment(alertText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(rates_total);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
@@ -0,0 +1,620 @@
|
|||||||
|
//
|
||||||
|
bool Prepare(
|
||||||
|
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
|
||||||
|
double mTP = 0 // Take Profit
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
IsValid(mMode) &&
|
||||||
|
IsValid(mSymbol) &&
|
||||||
|
IsValid(mPeriod) &&
|
||||||
|
NotEmpty(mEntry) &&
|
||||||
|
NotEmpty(mVolume) &&
|
||||||
|
IsValid(mProvider)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (mTP < 0)
|
||||||
|
{
|
||||||
|
mTP = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (mSL < 0)
|
||||||
|
{
|
||||||
|
mSL = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
type = mType;
|
||||||
|
mode = mMode;
|
||||||
|
symbol = mSymbol;
|
||||||
|
period = mPeriod;
|
||||||
|
provider = mProvider;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalization Values ...
|
||||||
|
sl = NormalizePrice(mSL, mSymbol);
|
||||||
|
tp = NormalizePrice(mTP, mSymbol);
|
||||||
|
mEntry = NormalizePrice(mEntry, mSymbol);
|
||||||
|
mVolume = NormalizeVolume(mVolume, mSymbol);
|
||||||
|
|
||||||
|
//
|
||||||
|
entry = mEntry;
|
||||||
|
volume = mVolume;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = Normalize();
|
||||||
|
|
||||||
|
//
|
||||||
|
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
|
||||||
|
string mProvider, // Signal Provider
|
||||||
|
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||||
|
ENUM_X_ORDER_MODES mMode, // Execution Mode
|
||||||
|
double mEntry, // Entry Price
|
||||||
|
double mVolume, // Volume
|
||||||
|
double mSL = 0, // Stop Loss
|
||||||
|
double mTP = 0 // Take Profit
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
return Prepare(
|
||||||
|
mSymbol,
|
||||||
|
mProvider,
|
||||||
|
mPeriod,
|
||||||
|
POSITION_TYPE_BUY,
|
||||||
|
mMode,
|
||||||
|
mEntry,
|
||||||
|
mVolume,
|
||||||
|
mSL,
|
||||||
|
mTP
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool PrepareShort(
|
||||||
|
string mSymbol, // Trading Symbol
|
||||||
|
string mProvider, // Signal Provider
|
||||||
|
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||||
|
ENUM_X_ORDER_MODES mMode, // Execution Mode
|
||||||
|
double mEntry, // Entry Price
|
||||||
|
double mVolume, // Volume
|
||||||
|
double mSL = 0, // Stop Loss
|
||||||
|
double mTP = 0 // Take Profit
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
return Prepare(
|
||||||
|
mSymbol,
|
||||||
|
mProvider,
|
||||||
|
mPeriod,
|
||||||
|
POSITION_TYPE_SELL,
|
||||||
|
mMode,
|
||||||
|
mEntry,
|
||||||
|
mVolume,
|
||||||
|
mSL,
|
||||||
|
mTP
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Market Mode ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool PrepareMarketLong(
|
||||||
|
string mSymbol, // Trading Symbol
|
||||||
|
string mProvider, // Signal Provider
|
||||||
|
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||||
|
double mEntry, // Entry Price
|
||||||
|
double mVolume, // Volume
|
||||||
|
double mSL = 0, // Stop Loss
|
||||||
|
double mTP = 0 // Take Profit
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
return PrepareLong(
|
||||||
|
mSymbol,
|
||||||
|
mProvider,
|
||||||
|
mPeriod,
|
||||||
|
X_ORDER_MODE_MARKET,
|
||||||
|
mEntry,
|
||||||
|
mVolume,
|
||||||
|
mSL,
|
||||||
|
mTP
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool PrepareMarketShort(
|
||||||
|
string mSymbol, // Trading Symbol
|
||||||
|
string mProvider, // Signal Provider
|
||||||
|
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||||
|
double mEntry, // Entry Price
|
||||||
|
double mVolume, // Volume
|
||||||
|
double mSL = 0, // Stop Loss
|
||||||
|
double mTP = 0 // Take Profit
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
return PrepareShort(
|
||||||
|
mSymbol,
|
||||||
|
mProvider,
|
||||||
|
mPeriod,
|
||||||
|
X_ORDER_MODE_MARKET,
|
||||||
|
mEntry,
|
||||||
|
mVolume,
|
||||||
|
mSL,
|
||||||
|
mTP
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Stop Mode ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool PrepareStopLong(
|
||||||
|
string mSymbol, // Trading Symbol
|
||||||
|
string mProvider, // Signal Provider
|
||||||
|
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||||
|
double mEntry, // Entry Price
|
||||||
|
double mVolume, // Volume
|
||||||
|
double mSL = 0, // Stop Loss
|
||||||
|
double mTP = 0 // Take Profit
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
return PrepareLong(
|
||||||
|
mSymbol,
|
||||||
|
mProvider,
|
||||||
|
mPeriod,
|
||||||
|
X_ORDER_MODE_STOP,
|
||||||
|
mEntry,
|
||||||
|
mVolume,
|
||||||
|
mSL,
|
||||||
|
mTP
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool PrepareStopShort(
|
||||||
|
string mSymbol, // Trading Symbol
|
||||||
|
string mProvider, // Signal Provider
|
||||||
|
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||||
|
double mEntry, // Entry Price
|
||||||
|
double mVolume, // Volume
|
||||||
|
double mSL = 0, // Stop Loss
|
||||||
|
double mTP = 0 // Take Profit
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
return PrepareShort(
|
||||||
|
mSymbol,
|
||||||
|
mProvider,
|
||||||
|
mPeriod,
|
||||||
|
X_ORDER_MODE_STOP,
|
||||||
|
mEntry,
|
||||||
|
mVolume,
|
||||||
|
mSL,
|
||||||
|
mTP
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Limit Mode ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool PrepareLimitLong(
|
||||||
|
string mSymbol, // Trading Symbol
|
||||||
|
string mProvider, // Signal Provider
|
||||||
|
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||||
|
double mEntry, // Entry Price
|
||||||
|
double mVolume, // Volume
|
||||||
|
double mSL = 0, // Stop Loss
|
||||||
|
double mTP = 0 // Take Profit
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
return PrepareLong(
|
||||||
|
mSymbol,
|
||||||
|
mProvider,
|
||||||
|
mPeriod,
|
||||||
|
X_ORDER_MODE_LIMIT,
|
||||||
|
mEntry,
|
||||||
|
mVolume,
|
||||||
|
mSL,
|
||||||
|
mTP
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool PrepareLimitShort(
|
||||||
|
string mSymbol, // Trading Symbol
|
||||||
|
string mProvider, // Signal Provider
|
||||||
|
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||||
|
double mEntry, // Entry Price
|
||||||
|
double mVolume, // Volume
|
||||||
|
double mSL = 0, // Stop Loss
|
||||||
|
double mTP = 0 // Take Profit
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
return PrepareShort(
|
||||||
|
mSymbol,
|
||||||
|
mProvider,
|
||||||
|
mPeriod,
|
||||||
|
X_ORDER_MODE_LIMIT,
|
||||||
|
mEntry,
|
||||||
|
mVolume,
|
||||||
|
mSL,
|
||||||
|
mTP
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Generate Opposit Direction ...
|
||||||
|
bool GenerateOpposit(
|
||||||
|
XSignal &mSignal // Oppsoit Signal
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ENUM_POSITION_TYPE mType = Opposit(this.type);
|
||||||
|
double mEntry = GetExit(this.symbol, mType);
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isLong = IsLong(mType);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate Risk Reward Ratio ...
|
||||||
|
double risk = GetRisk();
|
||||||
|
double reward = GetReward();
|
||||||
|
|
||||||
|
//
|
||||||
|
double mSL = isLong
|
||||||
|
? mEntry - risk
|
||||||
|
: mEntry + risk;
|
||||||
|
|
||||||
|
//
|
||||||
|
double mTP = isLong
|
||||||
|
? mEntry + reward
|
||||||
|
: mEntry - reward;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = mSignal.Prepare(
|
||||||
|
this.symbol,
|
||||||
|
this.provider,
|
||||||
|
this.period,
|
||||||
|
mType,
|
||||||
|
this.mode,
|
||||||
|
mEntry,
|
||||||
|
this.volume,
|
||||||
|
mSL,
|
||||||
|
mTP //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prepare Opposit Signal based On a Position ...
|
||||||
|
bool PrepareOpposit(
|
||||||
|
XPosition &source // Source Data
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
ENUM_POSITION_TYPE mType = Opposit(source.type);
|
||||||
|
double mEntry = GetEntry(source.symbol, mType);
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isLong = IsLong(mType);
|
||||||
|
|
||||||
|
//
|
||||||
|
double risk = source.GetRisk();
|
||||||
|
double reward = source.GetReward();
|
||||||
|
|
||||||
|
//
|
||||||
|
double mSL = isLong
|
||||||
|
? mEntry - risk
|
||||||
|
: mEntry + risk;
|
||||||
|
|
||||||
|
//
|
||||||
|
double mTP = isLong
|
||||||
|
? mEntry + reward
|
||||||
|
: mEntry - reward;
|
||||||
|
|
||||||
|
//
|
||||||
|
return Prepare(
|
||||||
|
source.symbol,
|
||||||
|
source.provider,
|
||||||
|
source.period,
|
||||||
|
mType,
|
||||||
|
X_ORDER_MODE_MARKET,
|
||||||
|
mEntry,
|
||||||
|
source.volume,
|
||||||
|
mSL,
|
||||||
|
mTP //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
// Handle Executing Support Signals ...
|
||||||
|
int supportsCount = ArraySize(mSignal.supports);
|
||||||
|
if (supportsCount > 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int executed = 0;
|
||||||
|
for (int i = 0; i < supportsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XSignal iSupport = mSignal.supports[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
int supIndex = i + 1;
|
||||||
|
string iComment = GenerateSupportTag(ticket);
|
||||||
|
iSupport.comment = iComment;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isExecuted = ExecuteSignal(
|
||||||
|
iSupport,
|
||||||
|
state,
|
||||||
|
lifetime,
|
||||||
|
expiration
|
||||||
|
//
|
||||||
|
);
|
||||||
|
if (isExecuted)
|
||||||
|
{
|
||||||
|
executed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = executed == supportsCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
// Handle Partial Close on Specified Targets ...
|
||||||
|
has = !trades[idx].signal.isPartiallyClosed &&
|
||||||
|
trades[idx].signal.partialCloseOnTPLevel > 0 &&
|
||||||
|
trades[idx].signal.partialCloseMultiplier > 0;
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Check Reward Touched ...
|
||||||
|
double iCurrReward = iPosition.CalculateTouchedReward();
|
||||||
|
has = iCurrReward >= trades[idx].signal.partialCloseOnTPLevel;
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Check Volume Multiplier ...
|
||||||
|
double volumeMultiplier = trades[idx].signal.partialCloseMultiplier;
|
||||||
|
has = volumeMultiplier > 0 &&
|
||||||
|
volumeMultiplier <= 1;
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Do Partial Closing ...
|
||||||
|
double volume = iPosition.volume * volumeMultiplier;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalizing Volume ...
|
||||||
|
volume = NormalizeVolume(
|
||||||
|
volume,
|
||||||
|
iPosition.symbol //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
string comment = "PC On Target ...";
|
||||||
|
has = trader.ClosePartial(
|
||||||
|
iPosition.ticket,
|
||||||
|
volume,
|
||||||
|
comment //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Update Model ...
|
||||||
|
trades[idx].signal.isPartiallyClosed = true;
|
||||||
|
|
||||||
|
//
|
||||||
|
string message = prefix +
|
||||||
|
ToString(iPosition.type) +
|
||||||
|
" Position: " +
|
||||||
|
ToString(iPosition.ticket) +
|
||||||
|
" PC (" + ToString(volume) + ") On Traget: " + ToString(iCurrReward) +
|
||||||
|
" Successfully ...";
|
||||||
|
HandleReportProtector(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -394,14 +394,14 @@ void OnTick()
|
|||||||
eaSignal.time = eaConditions.time;
|
eaSignal.time = eaConditions.time;
|
||||||
eaSignal.symbol = eaConditions.symbol;
|
eaSignal.symbol = eaConditions.symbol;
|
||||||
eaSignal.period = eaConditions.period;
|
eaSignal.period = eaConditions.period;
|
||||||
eaSignal.partialCloseOnTPLevel = eaConditions.partialCloseOnTPLevel;
|
// eaSignal.partialCloseOnTPLevel = eaConditions.partialCloseOnTPLevel;
|
||||||
eaSignal.partialCloseMultiplier = eaConditions.partialCloseMultiplier;
|
// eaSignal.partialCloseMultiplier = eaConditions.partialCloseMultiplier;
|
||||||
|
|
||||||
//
|
//
|
||||||
Copy(
|
// Copy(
|
||||||
eaConditions.targets,
|
// eaConditions.targets,
|
||||||
eaSignal.targets //
|
// eaSignal.targets //
|
||||||
);
|
// );
|
||||||
|
|
||||||
//
|
//
|
||||||
// Validate Signal ...
|
// Validate Signal ...
|
||||||
|
|||||||
@@ -486,6 +486,49 @@ struct XRR
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Model a Target ...
|
||||||
|
struct XTarget
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
double target;
|
||||||
|
double volumeMultiplier;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constructor ...
|
||||||
|
XTarget()
|
||||||
|
{
|
||||||
|
Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tools ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup ...
|
||||||
|
void Clean()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
target = 0;
|
||||||
|
volumeMultiplier = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
bool IsValid()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = target > 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Model an Open Position ...
|
// Model an Open Position ...
|
||||||
struct XPosition
|
struct XPosition
|
||||||
@@ -1125,38 +1168,17 @@ struct XSignal
|
|||||||
ENUM_X_ORDER_MODES mode; // Execution Mode ...
|
ENUM_X_ORDER_MODES mode; // Execution Mode ...
|
||||||
|
|
||||||
//
|
//
|
||||||
XSignal supports[]; // a Collecion of Support Signals ...
|
|
||||||
|
|
||||||
//
|
|
||||||
int pushers; // Signal Pushers ...
|
|
||||||
string conditions; // Signal Conditions ...
|
string conditions; // Signal Conditions ...
|
||||||
|
|
||||||
//
|
//
|
||||||
// Additional ...
|
// Additional ...
|
||||||
|
|
||||||
//
|
|
||||||
// TP ...
|
|
||||||
double fullTPLevel; // Full TP ...
|
|
||||||
bool isPartiallyClosed; // Check Partially Closed Before or not ...
|
|
||||||
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 ...
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Traget ...
|
// Traget ...
|
||||||
double targets[]; // Force Risk Free On Targets ...
|
XTarget targets[]; // Provided Targets ...
|
||||||
bool isTargetApplied; // Target Applied ...
|
|
||||||
int appliedTargetIDX; // Last Applied Target Index ...
|
int appliedTargetIDX; // Last Applied Target Index ...
|
||||||
bool ignoreEAVolume; // Ignore EA Volume ...
|
bool ignoreEAVolume; // Ignore EA Volume ...
|
||||||
|
bool isTargetApplied; // Check if Target Applied or not ...
|
||||||
//
|
|
||||||
// SL Trail ...
|
|
||||||
bool trailSL; // Do SL Trail ...
|
|
||||||
double trailSLStartOnReachTPLevel; // Start SL Trail After Reached TP Level ...
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Constructor ...
|
// Constructor ...
|
||||||
@@ -1165,528 +1187,6 @@ struct XSignal
|
|||||||
Default();
|
Default();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
bool Prepare(
|
|
||||||
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
|
|
||||||
double mTP = 0 // Take Profit
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
//
|
|
||||||
IsValid(mMode) &&
|
|
||||||
IsValid(mSymbol) &&
|
|
||||||
IsValid(mPeriod) &&
|
|
||||||
NotEmpty(mEntry) &&
|
|
||||||
NotEmpty(mVolume) &&
|
|
||||||
IsValid(mProvider)
|
|
||||||
//
|
|
||||||
;
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (mTP < 0)
|
|
||||||
{
|
|
||||||
mTP = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (mSL < 0)
|
|
||||||
{
|
|
||||||
mSL = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
type = mType;
|
|
||||||
mode = mMode;
|
|
||||||
symbol = mSymbol;
|
|
||||||
period = mPeriod;
|
|
||||||
provider = mProvider;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Normalization Values ...
|
|
||||||
sl = NormalizePrice(mSL, mSymbol);
|
|
||||||
tp = NormalizePrice(mTP, mSymbol);
|
|
||||||
mEntry = NormalizePrice(mEntry, mSymbol);
|
|
||||||
mVolume = NormalizeVolume(mVolume, mSymbol);
|
|
||||||
|
|
||||||
//
|
|
||||||
entry = mEntry;
|
|
||||||
volume = mVolume;
|
|
||||||
|
|
||||||
//
|
|
||||||
result = Normalize();
|
|
||||||
|
|
||||||
//
|
|
||||||
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
|
|
||||||
string mProvider, // Signal Provider
|
|
||||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
|
||||||
ENUM_X_ORDER_MODES mMode, // Execution Mode
|
|
||||||
double mEntry, // Entry Price
|
|
||||||
double mVolume, // Volume
|
|
||||||
double mSL = 0, // Stop Loss
|
|
||||||
double mTP = 0 // Take Profit
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
return Prepare(
|
|
||||||
mSymbol,
|
|
||||||
mProvider,
|
|
||||||
mPeriod,
|
|
||||||
POSITION_TYPE_BUY,
|
|
||||||
mMode,
|
|
||||||
mEntry,
|
|
||||||
mVolume,
|
|
||||||
mSL,
|
|
||||||
mTP
|
|
||||||
//
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool PrepareShort(
|
|
||||||
string mSymbol, // Trading Symbol
|
|
||||||
string mProvider, // Signal Provider
|
|
||||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
|
||||||
ENUM_X_ORDER_MODES mMode, // Execution Mode
|
|
||||||
double mEntry, // Entry Price
|
|
||||||
double mVolume, // Volume
|
|
||||||
double mSL = 0, // Stop Loss
|
|
||||||
double mTP = 0 // Take Profit
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
return Prepare(
|
|
||||||
mSymbol,
|
|
||||||
mProvider,
|
|
||||||
mPeriod,
|
|
||||||
POSITION_TYPE_SELL,
|
|
||||||
mMode,
|
|
||||||
mEntry,
|
|
||||||
mVolume,
|
|
||||||
mSL,
|
|
||||||
mTP
|
|
||||||
//
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Market Mode ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool PrepareMarketLong(
|
|
||||||
string mSymbol, // Trading Symbol
|
|
||||||
string mProvider, // Signal Provider
|
|
||||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
|
||||||
double mEntry, // Entry Price
|
|
||||||
double mVolume, // Volume
|
|
||||||
double mSL = 0, // Stop Loss
|
|
||||||
double mTP = 0 // Take Profit
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
return PrepareLong(
|
|
||||||
mSymbol,
|
|
||||||
mProvider,
|
|
||||||
mPeriod,
|
|
||||||
X_ORDER_MODE_MARKET,
|
|
||||||
mEntry,
|
|
||||||
mVolume,
|
|
||||||
mSL,
|
|
||||||
mTP
|
|
||||||
//
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool PrepareMarketShort(
|
|
||||||
string mSymbol, // Trading Symbol
|
|
||||||
string mProvider, // Signal Provider
|
|
||||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
|
||||||
double mEntry, // Entry Price
|
|
||||||
double mVolume, // Volume
|
|
||||||
double mSL = 0, // Stop Loss
|
|
||||||
double mTP = 0 // Take Profit
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
return PrepareShort(
|
|
||||||
mSymbol,
|
|
||||||
mProvider,
|
|
||||||
mPeriod,
|
|
||||||
X_ORDER_MODE_MARKET,
|
|
||||||
mEntry,
|
|
||||||
mVolume,
|
|
||||||
mSL,
|
|
||||||
mTP
|
|
||||||
//
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Stop Mode ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool PrepareStopLong(
|
|
||||||
string mSymbol, // Trading Symbol
|
|
||||||
string mProvider, // Signal Provider
|
|
||||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
|
||||||
double mEntry, // Entry Price
|
|
||||||
double mVolume, // Volume
|
|
||||||
double mSL = 0, // Stop Loss
|
|
||||||
double mTP = 0 // Take Profit
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
return PrepareLong(
|
|
||||||
mSymbol,
|
|
||||||
mProvider,
|
|
||||||
mPeriod,
|
|
||||||
X_ORDER_MODE_STOP,
|
|
||||||
mEntry,
|
|
||||||
mVolume,
|
|
||||||
mSL,
|
|
||||||
mTP
|
|
||||||
//
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool PrepareStopShort(
|
|
||||||
string mSymbol, // Trading Symbol
|
|
||||||
string mProvider, // Signal Provider
|
|
||||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
|
||||||
double mEntry, // Entry Price
|
|
||||||
double mVolume, // Volume
|
|
||||||
double mSL = 0, // Stop Loss
|
|
||||||
double mTP = 0 // Take Profit
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
return PrepareShort(
|
|
||||||
mSymbol,
|
|
||||||
mProvider,
|
|
||||||
mPeriod,
|
|
||||||
X_ORDER_MODE_STOP,
|
|
||||||
mEntry,
|
|
||||||
mVolume,
|
|
||||||
mSL,
|
|
||||||
mTP
|
|
||||||
//
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Limit Mode ...
|
|
||||||
|
|
||||||
//
|
|
||||||
bool PrepareLimitLong(
|
|
||||||
string mSymbol, // Trading Symbol
|
|
||||||
string mProvider, // Signal Provider
|
|
||||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
|
||||||
double mEntry, // Entry Price
|
|
||||||
double mVolume, // Volume
|
|
||||||
double mSL = 0, // Stop Loss
|
|
||||||
double mTP = 0 // Take Profit
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
return PrepareLong(
|
|
||||||
mSymbol,
|
|
||||||
mProvider,
|
|
||||||
mPeriod,
|
|
||||||
X_ORDER_MODE_LIMIT,
|
|
||||||
mEntry,
|
|
||||||
mVolume,
|
|
||||||
mSL,
|
|
||||||
mTP
|
|
||||||
//
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool PrepareLimitShort(
|
|
||||||
string mSymbol, // Trading Symbol
|
|
||||||
string mProvider, // Signal Provider
|
|
||||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
|
||||||
double mEntry, // Entry Price
|
|
||||||
double mVolume, // Volume
|
|
||||||
double mSL = 0, // Stop Loss
|
|
||||||
double mTP = 0 // Take Profit
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
return PrepareShort(
|
|
||||||
mSymbol,
|
|
||||||
mProvider,
|
|
||||||
mPeriod,
|
|
||||||
X_ORDER_MODE_LIMIT,
|
|
||||||
mEntry,
|
|
||||||
mVolume,
|
|
||||||
mSL,
|
|
||||||
mTP
|
|
||||||
//
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Generate Opposit Direction ...
|
|
||||||
bool GenerateOpposit(
|
|
||||||
XSignal &mSignal // Oppsoit Signal
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result = IsValid();
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
ENUM_POSITION_TYPE mType = Opposit(this.type);
|
|
||||||
double mEntry = GetExit(this.symbol, mType);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isLong = IsLong(mType);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate Risk Reward Ratio ...
|
|
||||||
double risk = GetRisk();
|
|
||||||
double reward = GetReward();
|
|
||||||
|
|
||||||
//
|
|
||||||
double mSL = isLong
|
|
||||||
? mEntry - risk
|
|
||||||
: mEntry + risk;
|
|
||||||
|
|
||||||
//
|
|
||||||
double mTP = isLong
|
|
||||||
? mEntry + reward
|
|
||||||
: mEntry - reward;
|
|
||||||
|
|
||||||
//
|
|
||||||
result = mSignal.Prepare(
|
|
||||||
this.symbol,
|
|
||||||
this.provider,
|
|
||||||
this.period,
|
|
||||||
mType,
|
|
||||||
this.mode,
|
|
||||||
mEntry,
|
|
||||||
this.volume,
|
|
||||||
mSL,
|
|
||||||
mTP //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Prepare Opposit Signal based On a Position ...
|
|
||||||
bool PrepareOpposit(
|
|
||||||
XPosition &source // Source Data
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
ENUM_POSITION_TYPE mType = Opposit(source.type);
|
|
||||||
double mEntry = GetEntry(source.symbol, mType);
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isLong = IsLong(mType);
|
|
||||||
|
|
||||||
//
|
|
||||||
double risk = source.GetRisk();
|
|
||||||
double reward = source.GetReward();
|
|
||||||
|
|
||||||
//
|
|
||||||
double mSL = isLong
|
|
||||||
? mEntry - risk
|
|
||||||
: mEntry + risk;
|
|
||||||
|
|
||||||
//
|
|
||||||
double mTP = isLong
|
|
||||||
? mEntry + reward
|
|
||||||
: mEntry - reward;
|
|
||||||
|
|
||||||
//
|
|
||||||
return Prepare(
|
|
||||||
source.symbol,
|
|
||||||
source.provider,
|
|
||||||
source.period,
|
|
||||||
mType,
|
|
||||||
X_ORDER_MODE_MARKET,
|
|
||||||
mEntry,
|
|
||||||
source.volume,
|
|
||||||
mSL,
|
|
||||||
mTP //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
result = IsValid();
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Tools ...
|
// Tools ...
|
||||||
|
|
||||||
@@ -1697,7 +1197,6 @@ struct XSignal
|
|||||||
//
|
//
|
||||||
entry = 0;
|
entry = 0;
|
||||||
volume = 0;
|
volume = 0;
|
||||||
pushers = 0;
|
|
||||||
positionId = 0;
|
positionId = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1716,21 +1215,6 @@ struct XSignal
|
|||||||
ignoreEAVolume = false;
|
ignoreEAVolume = false;
|
||||||
isTargetApplied = false;
|
isTargetApplied = false;
|
||||||
|
|
||||||
//
|
|
||||||
trailSL = false;
|
|
||||||
riskFreeOnBreakEven = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
fullTPLevel = 0;
|
|
||||||
tpLevelForBreakEven = 0;
|
|
||||||
partialCloseOnTPLevel = 0;
|
|
||||||
isPartiallyClosed = false;
|
|
||||||
partialCloseMultiplier = 0;
|
|
||||||
trailSLStartOnReachTPLevel = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
Clean(supports);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
ZeroMemory(this);
|
ZeroMemory(this);
|
||||||
}
|
}
|
||||||
@@ -1742,7 +1226,6 @@ struct XSignal
|
|||||||
//
|
//
|
||||||
entry = 0;
|
entry = 0;
|
||||||
volume = 0;
|
volume = 0;
|
||||||
pushers = 0;
|
|
||||||
positionId = 0;
|
positionId = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1760,21 +1243,6 @@ struct XSignal
|
|||||||
appliedTargetIDX = -1;
|
appliedTargetIDX = -1;
|
||||||
ignoreEAVolume = false;
|
ignoreEAVolume = false;
|
||||||
isTargetApplied = false;
|
isTargetApplied = false;
|
||||||
|
|
||||||
//
|
|
||||||
trailSL = false;
|
|
||||||
riskFreeOnBreakEven = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
fullTPLevel = 0;
|
|
||||||
tpLevelForBreakEven = 0;
|
|
||||||
isPartiallyClosed = false;
|
|
||||||
partialCloseOnTPLevel = 0;
|
|
||||||
partialCloseMultiplier = 0;
|
|
||||||
trailSLStartOnReachTPLevel = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
Clean(supports);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1954,61 +1422,6 @@ 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()
|
||||||
{
|
{
|
||||||
@@ -4016,7 +3429,6 @@ struct XTradeData
|
|||||||
symbol = _signal.symbol;
|
symbol = _signal.symbol;
|
||||||
volume = _signal.volume;
|
volume = _signal.volume;
|
||||||
period = _signal.period;
|
period = _signal.period;
|
||||||
pushers = _signal.pushers;
|
|
||||||
provider = _signal.provider;
|
provider = _signal.provider;
|
||||||
conditions = _signal.conditions;
|
conditions = _signal.conditions;
|
||||||
type = ToPositionType(_signal.type);
|
type = ToPositionType(_signal.type);
|
||||||
|
|||||||
@@ -1018,7 +1018,7 @@ class XCXCAEATradeManager : public XCBaseAlert
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Handle Risk Free On Targets ...
|
// Handle Risk Free On Targets ...
|
||||||
double targets[];
|
XTarget targets[];
|
||||||
Copy(
|
Copy(
|
||||||
trades[idx].signal.targets,
|
trades[idx].signal.targets,
|
||||||
targets //
|
targets //
|
||||||
@@ -1031,7 +1031,7 @@ class XCXCAEATradeManager : public XCBaseAlert
|
|||||||
for (int j = 0; j < targetsCount; j++)
|
for (int j = 0; j < targetsCount; j++)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
double jTarget = targets[j];
|
XTarget jTarget = targets[j];
|
||||||
|
|
||||||
//
|
//
|
||||||
int appliedTargetIDX = -1;
|
int appliedTargetIDX = -1;
|
||||||
@@ -1053,8 +1053,8 @@ class XCXCAEATradeManager : public XCBaseAlert
|
|||||||
iPosition.sl == 0
|
iPosition.sl == 0
|
||||||
? true
|
? true
|
||||||
: isLong
|
: isLong
|
||||||
? iPosition.sl < jTarget
|
? iPosition.sl < jTarget.target
|
||||||
: iPosition.sl > jTarget;
|
: iPosition.sl > jTarget.target;
|
||||||
if (!has)
|
if (!has)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
@@ -1062,23 +1062,23 @@ class XCXCAEATradeManager : public XCBaseAlert
|
|||||||
|
|
||||||
//
|
//
|
||||||
double targetDelta = isLong
|
double targetDelta = isLong
|
||||||
? jTarget + (targetDistance * points)
|
? jTarget.target + (targetDistance * points)
|
||||||
: jTarget - (targetDistance * points);
|
: jTarget.target - (targetDistance * points);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Can Risk Free ...
|
// Can Risk Free ...
|
||||||
bool canRF = jTarget > 0 &&
|
bool canRF = jTarget.target > 0 &&
|
||||||
(isLong
|
(isLong
|
||||||
? jTarget > iPosition.entry
|
? jTarget.target > iPosition.entry
|
||||||
: jTarget < iPosition.entry) &&
|
: jTarget.target < iPosition.entry) &&
|
||||||
(isLong
|
(isLong
|
||||||
? iPosition.price > targetDelta
|
? iPosition.price > targetDelta
|
||||||
: iPosition.price < targetDelta);
|
: iPosition.price < targetDelta);
|
||||||
if (canRF)
|
if (canRF)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
double sl = jTarget;
|
|
||||||
double tp = iPosition.tp;
|
double tp = iPosition.tp;
|
||||||
|
double sl = jTarget.target;
|
||||||
string comment = "RF On Target ...";
|
string comment = "RF On Target ...";
|
||||||
bool isModified = trader.Modify(
|
bool isModified = trader.Modify(
|
||||||
iPosition.ticket,
|
iPosition.ticket,
|
||||||
@@ -1097,64 +1097,7 @@ class XCXCAEATradeManager : public XCBaseAlert
|
|||||||
ToString(iPosition.type) +
|
ToString(iPosition.type) +
|
||||||
" Position: " +
|
" Position: " +
|
||||||
ToString(iPosition.ticket) +
|
ToString(iPosition.ticket) +
|
||||||
" RF On Traget: " + ToString(jTarget) +
|
" RF On Traget: " + ToString(jTarget.target) +
|
||||||
" Successfully ...";
|
|
||||||
HandleReportProtector(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Handle Partial Close on Specified Targets ...
|
|
||||||
has = !trades[idx].signal.isPartiallyClosed &&
|
|
||||||
trades[idx].signal.partialCloseOnTPLevel > 0 &&
|
|
||||||
trades[idx].signal.partialCloseMultiplier > 0;
|
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Check Reward Touched ...
|
|
||||||
double iCurrReward = iPosition.CalculateTouchedReward();
|
|
||||||
has = iCurrReward >= trades[idx].signal.partialCloseOnTPLevel;
|
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Check Volume Multiplier ...
|
|
||||||
double volumeMultiplier = trades[idx].signal.partialCloseMultiplier;
|
|
||||||
has = volumeMultiplier > 0 &&
|
|
||||||
volumeMultiplier <= 1;
|
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Do Partial Closing ...
|
|
||||||
double volume = iPosition.volume * volumeMultiplier;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Normalizing Volume ...
|
|
||||||
volume = NormalizeVolume(
|
|
||||||
volume,
|
|
||||||
iPosition.symbol //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
string comment = "PC On Target ...";
|
|
||||||
has = trader.ClosePartial(
|
|
||||||
iPosition.ticket,
|
|
||||||
volume,
|
|
||||||
comment //
|
|
||||||
);
|
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Update Model ...
|
|
||||||
trades[idx].signal.isPartiallyClosed = true;
|
|
||||||
|
|
||||||
//
|
|
||||||
string message = prefix +
|
|
||||||
ToString(iPosition.type) +
|
|
||||||
" Position: " +
|
|
||||||
ToString(iPosition.ticket) +
|
|
||||||
" PC (" + ToString(volume) + ") On Traget: " + ToString(iCurrReward) +
|
|
||||||
" Successfully ...";
|
" Successfully ...";
|
||||||
HandleReportProtector(message);
|
HandleReportProtector(message);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1226,17 +1226,6 @@ bool DetectDecisionZone(
|
|||||||
dir = X_DIRECTION_NONE;
|
dir = X_DIRECTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Check Box Size ...
|
|
||||||
double range = box.GetRange();
|
|
||||||
double maxAllowedBoxRange = 400;
|
|
||||||
double ponts = GetPoints(box.symbol);
|
|
||||||
bool isTooLarget = range > (maxAllowedBoxRange * points);
|
|
||||||
if (isTooLarget)
|
|
||||||
{
|
|
||||||
Print("Too Large ...");
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check Box is Prepared or Not ...
|
// Check Box is Prepared or Not ...
|
||||||
result = box.IsValid();
|
result = box.IsValid();
|
||||||
@@ -1897,6 +1886,14 @@ bool CanTriggerCond2(
|
|||||||
// Since Here TP Must Calculated
|
// Since Here TP Must Calculated
|
||||||
// Using R2R we Ignore Target ...
|
// Using R2R we Ignore Target ...
|
||||||
tp = 0;
|
tp = 0;
|
||||||
|
// if (isBullish && zBar.close < decisionZone.upper)
|
||||||
|
// {
|
||||||
|
// tp = decisionZone.upper;
|
||||||
|
// }
|
||||||
|
// else if (isBearish && zBar.close > decisionZone.lower)
|
||||||
|
// {
|
||||||
|
// tp = decisionZone.lower;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -261,6 +261,12 @@ class XCXCAEASignaller : XCBase
|
|||||||
loopback //
|
loopback //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Here we Can Validate Decision Zone ...
|
||||||
|
if (hasDecisionZone)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make Signal Box UnAvailable ...
|
// Make Signal Box UnAvailable ...
|
||||||
if (hasDecisionZone)
|
if (hasDecisionZone)
|
||||||
@@ -409,6 +415,13 @@ class XCXCAEASignaller : XCBase
|
|||||||
int toIDX = conditions.decisionZone.ToIndex();
|
int toIDX = conditions.decisionZone.ToIndex();
|
||||||
int fromIDX = conditions.decisionZone.FromIndex();
|
int fromIDX = conditions.decisionZone.FromIndex();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Box Size ...
|
||||||
|
double maxAllowedBoxRange = 400;
|
||||||
|
double range = conditions.decisionZone.GetRange();
|
||||||
|
bool isTooLarge = range > (maxAllowedBoxRange * points);
|
||||||
|
double decisionMiddlePrice = conditions.decisionZone.GetMid();
|
||||||
|
|
||||||
//
|
//
|
||||||
XBoxZone decisionOBs[];
|
XBoxZone decisionOBs[];
|
||||||
ENUM_XCA_PIVOTS allowedTypes[];
|
ENUM_XCA_PIVOTS allowedTypes[];
|
||||||
@@ -455,27 +468,37 @@ class XCXCAEASignaller : XCBase
|
|||||||
//
|
//
|
||||||
// Checking Trigger Cond 1 ...
|
// Checking Trigger Cond 1 ...
|
||||||
bool canTriggerCond1 = false;
|
bool canTriggerCond1 = false;
|
||||||
// CanTriggerCond1(
|
if (isTooLarge)
|
||||||
// helper,
|
{
|
||||||
// conditions.decisionZone,
|
//
|
||||||
// triggerDir,
|
canTriggerCond1 = CanTriggerCond1(
|
||||||
// sl,
|
helper,
|
||||||
// tp,
|
conditions.decisionZone,
|
||||||
// barIndex //
|
triggerDir,
|
||||||
// );
|
sl,
|
||||||
|
tp,
|
||||||
|
iObjects,
|
||||||
|
barIndex //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Checking Trigger Cond 2 ...
|
// Checking Trigger Cond 2 ...
|
||||||
bool canTriggerCond2 = CanTriggerCond2(
|
bool canTriggerCond2 = false;
|
||||||
helper,
|
if (!isTooLarge)
|
||||||
conditions.decisionZone,
|
{
|
||||||
decisionOBs,
|
//
|
||||||
triggerDir,
|
canTriggerCond2 = CanTriggerCond2(
|
||||||
sl,
|
helper,
|
||||||
tp,
|
conditions.decisionZone,
|
||||||
iObjects,
|
decisionOBs,
|
||||||
barIndex //
|
triggerDir,
|
||||||
);
|
sl,
|
||||||
|
tp,
|
||||||
|
iObjects,
|
||||||
|
barIndex //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Checking Trigger Cond 3 ...
|
// Checking Trigger Cond 3 ...
|
||||||
@@ -490,63 +513,21 @@ class XCXCAEASignaller : XCBase
|
|||||||
// barIndex //
|
// barIndex //
|
||||||
// );
|
// );
|
||||||
|
|
||||||
//
|
|
||||||
// Update Signal Box To ...
|
|
||||||
conditions.decisionZone.to = cTime;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Draw Decision Zone ...
|
// Draw Decision Zone ...
|
||||||
XCBoxObject *iDecisionObj;
|
drawer.DrawBox(
|
||||||
has = helper.poiDrawer.DrawBox(
|
|
||||||
conditions.decisionZone,
|
conditions.decisionZone,
|
||||||
iDecisionObj //
|
cTime,
|
||||||
|
true, // Draw Middle Line ...
|
||||||
|
true // Ignore Type ...
|
||||||
);
|
);
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
mObjects.Add(iDecisionObj);
|
|
||||||
}
|
|
||||||
ZeroMemory(iDecisionObj);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Drw Box Range Middle ...
|
|
||||||
double decisionMiddlePrice = conditions.decisionZone.GetMid();
|
|
||||||
string iDecisionMiddleName = conditions.decisionZone.GetMiddleTag();
|
|
||||||
CChartObjectTrend *iDecisionMiddleObj;
|
|
||||||
iDecisionMiddleObj = new CChartObjectTrend();
|
|
||||||
has = iDecisionMiddleObj.Create(
|
|
||||||
0,
|
|
||||||
iDecisionMiddleName,
|
|
||||||
0,
|
|
||||||
conditions.decisionZone.from,
|
|
||||||
decisionMiddlePrice,
|
|
||||||
conditions.decisionZone.to,
|
|
||||||
decisionMiddlePrice //
|
|
||||||
);
|
|
||||||
if (has)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
iDecisionMiddleObj.Width(2);
|
|
||||||
iDecisionMiddleObj.Style(STYLE_DASH);
|
|
||||||
|
|
||||||
//
|
|
||||||
color iColor =
|
|
||||||
conditions.decisionZone.IsBullish()
|
|
||||||
? clrAqua
|
|
||||||
: clrMagenta;
|
|
||||||
iDecisionMiddleObj.Color(iColor);
|
|
||||||
|
|
||||||
//
|
|
||||||
mObjects.Add(iDecisionMiddleObj);
|
|
||||||
}
|
|
||||||
ZeroMemory(iDecisionMiddleObj);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
|
// Adding Drawn Objects to Drawn Stores ...
|
||||||
for (int i = 0; i < iObjects.Total(); i++)
|
for (int i = 0; i < iObjects.Total(); i++)
|
||||||
{
|
{
|
||||||
mObjects.Add(iObjects.At(i));
|
mObjects.Add(iObjects.At(i));
|
||||||
}
|
}
|
||||||
// iObjects.Clear();
|
|
||||||
// ZeroMemory(iObjects);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Summarizing Result ...
|
// Summarizing Result ...
|
||||||
|
|||||||
Reference in New Issue
Block a user