last works on XBackTester and Complete it ...

This commit is contained in:
2025-09-16 00:44:27 +03:30
parent 53898b2e4e
commit 011a82bf1e
5 changed files with 882 additions and 37 deletions
+701 -35
View File
@@ -71,11 +71,27 @@ class XCBackTesterEA : public XCBase
bool eaPushAlerts; // Push Alerts bool eaPushAlerts; // Push Alerts
bool eaTerminalAlerts; // Terminal Alerts bool eaTerminalAlerts; // Terminal Alerts
//
// SL/TP Manipulation Props ...
double allowedTPSLStep; // Value for Change TP/SL in Each Step ...
double minAllowedRiskInPoint; // Min Allowed Risk in Point ...
double riskInPoint; // Risk in Point per Trades ...
double riskToRewardRatio; // Risk To Reward per Trades ...
double volume; // Default volume Per Trade ...
// //
// Constructor ... // Constructor ...
XCBackTesterEA() XCBackTesterEA()
{ {
//
selectedPositionID = 0; selectedPositionID = 0;
//
volume = 0.01;
riskInPoint = 50;
allowedTPSLStep = 5;
riskToRewardRatio = 2;
minAllowedRiskInPoint = 10;
} }
// //
@@ -260,6 +276,10 @@ class XCBackTesterEA : public XCBase
return result; return result;
} }
//
// Normalize Requirements ...
NormalizeProps();
// //
return result; return result;
} }
@@ -668,21 +688,23 @@ class XCBackTesterEA : public XCBase
CButton btnCloseAll; CButton btnCloseAll;
CEdit lblPositionId; CEdit lblPositionId;
//
CButton lblTP;
CButton lblSL;
CButton btnSLPlus;
CButton btnTPPlus;
CButton btnSLMinus;
CButton btnTPMinus;
CButton btnSLPlusPlus;
CButton btnTPPlusPlus;
CButton btnSLMinusMinus;
CButton btnTPMinusMinus;
// //
CArrayObj posArray; CArrayObj posArray;
CButton *btnSelectedPosInfo; CButton *btnSelectedPosInfo;
CArrayObj selectedPosInfoArr; CArrayObj selectedPosInfoArr;
//
int btnCloseSizeX;
int btnCloseSizeY;
int btnCloseStartX;
int btnCloseStartY;
int lblPositionIdSizeX;
int lblPositionIdSizeY;
int lblPositionIdStartX;
int lblPositionIdStartY;
// //
ulong selectedPositionID; ulong selectedPositionID;
bool showSelectedPositionInfo; bool showSelectedPositionInfo;
@@ -774,10 +796,10 @@ class XCBackTesterEA : public XCBase
// //
// LABEL Position ID ... // LABEL Position ID ...
lblPositionIdStartX = btnBuyStartX; int lblPositionIdStartX = btnBuyStartX;
lblPositionIdSizeX = lblPositionIdStartX + defaultWidth; int lblPositionIdSizeX = lblPositionIdStartX + defaultWidth;
lblPositionIdStartY = btnSellSizeY + defaultGap; int lblPositionIdStartY = btnSellSizeY + defaultGap;
lblPositionIdSizeY = lblPositionIdStartY + defaultHeight; int lblPositionIdSizeY = lblPositionIdStartY + defaultHeight;
string lblPositionIdName = objSuffix + "LBL_POS_ID"; string lblPositionIdName = objSuffix + "LBL_POS_ID";
result = lblPositionId.Create( result = lblPositionId.Create(
chartId, chartId,
@@ -800,10 +822,10 @@ class XCBackTesterEA : public XCBase
// //
// Close ... // Close ...
btnCloseStartX = startX; int btnCloseStartX = startX;
btnCloseSizeX = btnCloseStartX + defaultWidth; int btnCloseSizeX = btnCloseStartX + defaultWidth;
btnCloseStartY = lblPositionIdSizeY + defaultGap; int btnCloseStartY = lblPositionIdSizeY + defaultGap;
btnCloseSizeY = lblPositionIdSizeY + defaultHeight; int btnCloseSizeY = lblPositionIdSizeY + defaultHeight;
string btnCloseName = objSuffix + "BTN_CLOSE"; string btnCloseName = objSuffix + "BTN_CLOSE";
result = btnClose.Create( result = btnClose.Create(
chartId, chartId,
@@ -852,6 +874,261 @@ class XCBackTesterEA : public XCBase
btnCloseAll.ColorBackground(clrDarkRed); btnCloseAll.ColorBackground(clrDarkRed);
} }
//
int minusPlusWidth = 20;
//
// TP Label ...
int lblTPX1 = btnCloseStartX;
int lblTPX2 = lblTPX1 + defaultWidth;
int lblTPY1 = btnCloseSizeY + defaultGap;
int lblTPY2 = lblTPY1 + defaultHeight;
string lblTPName = objSuffix + "LBL_TP";
result = lblTP.Create(
chartId,
lblTPName,
subWindow,
lblTPX1,
lblTPY1,
lblTPX2,
lblTPY2 //
);
if (result)
{
//
// Apply Style ...
lblTP.Disable();
lblTP.Text("TP");
lblTP.Color(clrWhite);
lblTP.ColorBackground(clrGreen);
}
//
// TP Plus ...
int btnTPPlusX1 = lblTPX1;
int btnTPPlusX2 = btnTPPlusX1 + minusPlusWidth;
int btnTPPlusY1 = lblTPY2 + defaultGap;
int btnTPPlusY2 = btnTPPlusY1 + defaultHeight;
string btnTPPlusName = objSuffix + "BTN_TP_PLUS";
result = btnTPPlus.Create(
chartId,
btnTPPlusName,
subWindow,
btnTPPlusX1,
btnTPPlusY1,
btnTPPlusX2,
btnTPPlusY2 //
);
if (result)
{
//
// Apply Style ...
btnTPPlus.Text("+");
btnTPPlus.Color(clrYellow);
btnTPPlus.ColorBackground(clrGreen);
}
//
// TP Plus Plus ...
int btnTPPlusPlusX1 = btnTPPlusX2 + defaultGap;
int btnTPPlusPlusX2 = btnTPPlusPlusX1 + minusPlusWidth;
int btnTPPlusPlusY1 = lblTPY2 + defaultGap;
int btnTPPlusPlusY2 = btnTPPlusPlusY1 + defaultHeight;
string btnTPPlusPlusName = objSuffix + "BTN_TP_PLUSPLUS";
result = btnTPPlusPlus.Create(
chartId,
btnTPPlusPlusName,
subWindow,
btnTPPlusPlusX1,
btnTPPlusPlusY1,
btnTPPlusPlusX2,
btnTPPlusPlusY2 //
);
if (result)
{
//
// Apply Style ...
btnTPPlusPlus.Text("++");
btnTPPlusPlus.Color(clrYellow);
btnTPPlusPlus.ColorBackground(clrGreen);
}
//
// TP Minus ...
int btnTPMinusX1 = lblTPX2 - minusPlusWidth;
int btnTPMinusX2 = btnTPMinusX1 + minusPlusWidth;
int btnTPMinusY1 = lblTPY2 + defaultGap;
int btnTPMinusY2 = btnTPMinusY1 + defaultHeight;
string btnTPMinusName = objSuffix + "BTN_TP_MINUS";
result = btnTPMinus.Create(
chartId,
btnTPMinusName,
subWindow,
btnTPMinusX1,
btnTPMinusY1,
btnTPMinusX2,
btnTPMinusY2 //
);
if (result)
{
//
// Apply Style ...
btnTPMinus.Text("-");
btnTPMinus.Color(clrYellow);
btnTPMinus.ColorBackground(clrDarkRed);
}
//
// TP Minus Minus ...
int btnTPMinusMinusX1 = btnTPMinusX1 - minusPlusWidth - defaultGap;
int btnTPMinusMinusX2 = btnTPMinusMinusX1 + minusPlusWidth;
int btnTPMinusMinusY1 = lblTPY2 + defaultGap;
int btnTPMinusMinusY2 = btnTPMinusY1 + defaultHeight;
string btnTPMinusMinusName = objSuffix + "BTN_TP_MINUSMINUS";
result = btnTPMinusMinus.Create(
chartId,
btnTPMinusMinusName,
subWindow,
btnTPMinusMinusX1,
btnTPMinusMinusY1,
btnTPMinusMinusX2,
btnTPMinusMinusY2 //
);
if (result)
{
//
// Apply Style ...
btnTPMinusMinus.Text("--");
btnTPMinusMinus.Color(clrYellow);
btnTPMinusMinus.ColorBackground(clrDarkRed);
}
//
// SL Label ...
int lblSLX1 = btnCloseAllStartX;
int lblSLX2 = lblSLX1 + defaultWidth;
int lblSLY1 = btnCloseAllSizeY + defaultGap;
int lblSLY2 = lblTPY1 + defaultHeight;
string lblSLName = objSuffix + "LBL_SL";
result = lblSL.Create(
chartId,
lblSLName,
subWindow,
lblSLX1,
lblSLY1,
lblSLX2,
lblSLY2 //
);
if (result)
{
//
// Apply Style ...
lblSL.Disable();
lblSL.Text("SL");
lblSL.Color(clrWhite);
lblSL.ColorBackground(clrDarkRed);
}
//
// SL Plus ...
int btnSLPlusX1 = lblSLX1;
int btnSLPlusX2 = btnSLPlusX1 + minusPlusWidth;
int btnSLPlusY1 = lblSLY2 + defaultGap;
int btnSLPlusY2 = btnSLPlusY1 + defaultHeight;
string btnSLPlusName = objSuffix + "BTN_SL_PLUS";
result = btnSLPlus.Create(
chartId,
btnSLPlusName,
subWindow,
btnSLPlusX1,
btnSLPlusY1,
btnSLPlusX2,
btnSLPlusY2 //
);
if (result)
{
//
// Apply Style ...
btnSLPlus.Text("+");
btnSLPlus.Color(clrYellow);
btnSLPlus.ColorBackground(clrGreen);
}
//
// SL Plus Plus ...
int btnSLPlusPlusX1 = btnSLPlusX2 + defaultGap;
int btnSLPlusPlusX2 = btnSLPlusPlusX1 + minusPlusWidth;
int btnSLPlusPlusY1 = lblSLY2 + defaultGap;
int btnSLPlusPlusY2 = btnSLPlusPlusY1 + defaultHeight;
string btnSLPlusPlusName = objSuffix + "BTN_SL_PLUSPLUS";
result = btnSLPlusPlus.Create(
chartId,
btnSLPlusPlusName,
subWindow,
btnSLPlusPlusX1,
btnSLPlusPlusY1,
btnSLPlusPlusX2,
btnSLPlusPlusY2 //
);
if (result)
{
//
// Apply Style ...
btnSLPlusPlus.Text("++");
btnSLPlusPlus.Color(clrYellow);
btnSLPlusPlus.ColorBackground(clrGreen);
}
//
// SL Minus ...
int btnSLMinusX1 = lblSLX2 - minusPlusWidth;
int btnSLMinusX2 = btnSLMinusX1 + minusPlusWidth;
int btnSLMinusY1 = lblSLY2 + defaultGap;
int btnSLMinusY2 = btnSLMinusY1 + defaultHeight;
string btnSLMinusName = objSuffix + "BTN_SL_MINUS";
result = btnSLMinus.Create(
chartId,
btnSLMinusName,
subWindow,
btnSLMinusX1,
btnSLMinusY1,
btnSLMinusX2,
btnSLMinusY2 //
);
if (result)
{
//
// Apply Style ...
btnSLMinus.Text("-");
btnSLMinus.Color(clrYellow);
btnSLMinus.ColorBackground(clrDarkRed);
}
//
// SL Minus Minus ...
int btnSLMinusMinusX1 = btnSLMinusX1 - minusPlusWidth - defaultGap;
int btnSLMinusMinusX2 = btnSLMinusMinusX1 + minusPlusWidth;
int btnSLMinusMinusY1 = lblSLY2 + defaultGap;
int btnSLMinusMinusY2 = btnSLMinusY1 + defaultHeight;
string btnSLMinusMinusName = objSuffix + "BTN_SL_MINUSMINUS";
result = btnSLMinusMinus.Create(
chartId,
btnSLMinusMinusName,
subWindow,
btnSLMinusMinusX1,
btnSLMinusMinusY1,
btnSLMinusMinusX2,
btnSLMinusMinusY2 //
);
if (result)
{
//
// Apply Style ...
btnSLMinusMinus.Text("--");
btnSLMinusMinus.Color(clrYellow);
btnSLMinusMinus.ColorBackground(clrDarkRed);
}
// //
UpdateGUIState(); UpdateGUIState();
@@ -971,6 +1248,124 @@ class XCBackTesterEA : public XCBase
} }
} }
//
// TP Managing ...
//
// TP Plus ...
if (btnTPPlus.Pressed())
{
//
if (btnTPPlus.IsEnabled())
{
HandleTPChange(X_DIRECTION_BULLISH);
}
//
btnTPPlus.Pressed(false);
}
//
// TP Plus Plus ...
if (btnTPPlusPlus.Pressed())
{
//
if (btnTPPlusPlus.IsEnabled())
{
HandleTPChange(X_DIRECTION_BULLISH, 2);
}
//
btnTPPlusPlus.Pressed(false);
}
//
// TP Minus ...
if (btnTPMinus.Pressed())
{
//
if (btnTPMinus.IsEnabled())
{
HandleTPChange(X_DIRECTION_BEARISH);
}
//
btnTPMinus.Pressed(false);
}
//
// TP Minus Minus ...
if (btnTPMinusMinus.Pressed())
{
//
if (btnTPMinusMinus.IsEnabled())
{
HandleTPChange(X_DIRECTION_BEARISH, 2);
}
//
btnTPMinusMinus.Pressed(false);
}
//
// SL Managing ...
//
// SL Plus ...
if (btnSLPlus.Pressed())
{
//
if (btnSLPlus.IsEnabled())
{
HandleSLChange(X_DIRECTION_BULLISH);
}
//
btnSLPlus.Pressed(false);
}
//
// SL Plus Plus ...
if (btnSLPlusPlus.Pressed())
{
//
if (btnSLPlusPlus.IsEnabled())
{
HandleSLChange(X_DIRECTION_BULLISH, 2);
}
//
btnSLPlusPlus.Pressed(false);
}
//
// SL Minus ...
if (btnSLMinus.Pressed())
{
//
if (btnSLMinus.IsEnabled())
{
HandleSLChange(X_DIRECTION_BEARISH);
}
//
btnSLMinus.Pressed(false);
}
//
// SL Minus Minus ...
if (btnSLMinusMinus.Pressed())
{
//
if (btnSLMinusMinus.IsEnabled())
{
HandleSLChange(X_DIRECTION_BEARISH, 2);
}
//
btnSLMinusMinus.Pressed(false);
}
// //
// Check Positions Buttons ... // Check Positions Buttons ...
int posCount = posArray.Total(); int posCount = posArray.Total();
@@ -1224,22 +1619,25 @@ class XCBackTesterEA : public XCBase
string name = objSuffix + "BTN_TOOGLE_SPOS_INFO"; string name = objSuffix + "BTN_TOOGLE_SPOS_INFO";
// //
int btnStartX = btnCloseStartX; CRect iRect = btnTPPlus.Rect();
int btnSizeX = btnStartX + 200 + 5;
// //
int btnStartY = btnCloseSizeY + 5; int x1 = iRect.left;
int btnSizeY = btnStartY + 25; int x2 = x1 + 200 + 5;
//
int y1 = iRect.bottom + 5;
int y2 = y1 + iRect.Height();
// //
bool isCreated = btnSelectedPosInfo.Create( bool isCreated = btnSelectedPosInfo.Create(
chartId, chartId,
name, name,
subWindow, subWindow,
btnStartX, x1,
btnStartY, y1,
btnSizeX, x2,
btnSizeY // y2 //
); );
if (!isCreated) if (!isCreated)
{ {
@@ -1416,12 +1814,92 @@ class XCBackTesterEA : public XCBase
// //
btnClose.Disable(); btnClose.Disable();
btnClose.ColorBackground(clrDarkGray); btnClose.ColorBackground(clrDarkGray);
//
lblTP.Disable();
lblTP.ColorBackground(clrDarkGray);
//
btnTPPlus.Disable();
btnTPPlus.ColorBackground(clrDarkGray);
//
btnTPPlusPlus.Disable();
btnTPPlusPlus.ColorBackground(clrDarkGray);
//
btnTPMinus.Disable();
btnTPMinus.ColorBackground(clrDarkGray);
//
btnTPMinusMinus.Disable();
btnTPMinusMinus.ColorBackground(clrDarkGray);
//
lblSL.Disable();
lblSL.ColorBackground(clrDarkGray);
//
btnSLPlus.Disable();
btnSLPlus.ColorBackground(clrDarkGray);
//
btnSLPlusPlus.Disable();
btnSLPlusPlus.ColorBackground(clrDarkGray);
//
btnSLMinus.Disable();
btnSLMinus.ColorBackground(clrDarkGray);
//
btnSLMinusMinus.Disable();
btnSLMinusMinus.ColorBackground(clrDarkGray);
} }
else else
{ {
// //
btnClose.Enable(); btnClose.Enable();
btnClose.ColorBackground(clrDarkOrange); btnClose.ColorBackground(clrDarkOrange);
//
lblTP.Enable();
lblTP.ColorBackground(clrGreen);
//
btnTPPlus.Enable();
btnTPPlus.ColorBackground(clrGreen);
//
btnTPPlusPlus.Enable();
btnTPPlusPlus.ColorBackground(clrGreen);
//
btnTPMinus.Enable();
btnTPMinus.ColorBackground(clrDarkRed);
//
btnTPMinusMinus.Enable();
btnTPMinusMinus.ColorBackground(clrDarkRed);
//
lblSL.Enable();
lblSL.ColorBackground(clrDarkRed);
//
btnSLPlus.Enable();
btnSLPlus.ColorBackground(clrGreen);
//
btnSLPlusPlus.Enable();
btnSLPlusPlus.ColorBackground(clrGreen);
//
btnSLMinus.Enable();
btnSLMinus.ColorBackground(clrDarkRed);
//
btnSLMinusMinus.Enable();
btnSLMinusMinus.ColorBackground(clrDarkRed);
} }
} }
@@ -1490,14 +1968,18 @@ class XCBackTesterEA : public XCBase
// //
int btnWidth = 25; int btnWidth = 25;
int btnHeight = 25;
// //
int lastX = lblPositionIdSizeX + 5; CRect iRect = lblPositionId.Rect();
//
int lastX = iRect.left + iRect.Width() + 5;
int lastSizeX = lastX + btnWidth; int lastSizeX = lastX + btnWidth;
// //
int lastY = lblPositionIdStartY; int lastY = iRect.top;
int lastSizeY = lblPositionIdSizeY; int lastSizeY = lastY + iRect.Height();
// //
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
@@ -1588,18 +2070,21 @@ class XCBackTesterEA : public XCBase
return; return;
} }
//
NormalizeProps();
// //
bool isBullish = IsSpecifiedBullish(dir); bool isBullish = IsSpecifiedBullish(dir);
// //
double r2r = 1.5; double r2r = riskToRewardRatio;
double volume = 0.01; double _volume = volume;
double riskInPoints = 100; double _riskInPoints = riskInPoint;
double point = GetPoints(symbol); double point = GetPoints(symbol);
double entry = GetEntry(symbol, dir); double entry = GetEntry(symbol, dir);
// //
double risk = riskInPoints * point; double risk = _riskInPoints * point;
double reward = risk * r2r; double reward = risk * r2r;
// //
@@ -1620,7 +2105,7 @@ class XCBackTesterEA : public XCBase
eaTrader.Buy( eaTrader.Buy(
symbol, symbol,
period, period,
volume, _volume,
entry, entry,
sl, sl,
tp, tp,
@@ -1633,7 +2118,7 @@ class XCBackTesterEA : public XCBase
eaTrader.Sell( eaTrader.Sell(
symbol, symbol,
period, period,
volume, _volume,
entry, entry,
sl, sl,
tp, tp,
@@ -1677,9 +2162,190 @@ class XCBackTesterEA : public XCBase
} }
} }
//
void HandleTPChange(
ENUM_X_DIRECTION dir,
int multiplier = 1 //
)
{
//
// Validate ...
if (selectedPositionID == 0 || !HasDirection(dir))
{
return;
}
//
NormalizeProps();
//
// Normalize Multiplier ...
multiplier = NormalizeInt(multiplier, 1, 2);
//
// Select Position ...
XPosition position;
bool has = eaTrader.GetPosition(
selectedPositionID,
position //
);
if (!has)
{
//
position.Clean();
return;
}
//
bool isLong = IsLong(position.type);
bool isBullish = IsSpecifiedBullish(dir);
//
double point = GetPoints(position.symbol);
double stepValue = multiplier * (point * allowedTPSLStep);
//
bool mustIncrease =
isBullish
? isLong
: !isLong;
//
double tp = position.tp;
tp =
mustIncrease
? tp + stepValue
: tp - stepValue;
bool isModified = eaTrader.Modify(
position.ticket,
position.sl,
tp,
objSuffix + "Change TP" //
);
if (isModified)
{
UpdateGUIState();
}
//
position.Clean();
}
//
void HandleSLChange(
ENUM_X_DIRECTION dir,
int multiplier = 1 //
)
{
//
// Validate ...
if (selectedPositionID == 0 || !HasDirection(dir))
{
return;
}
//
NormalizeProps();
//
// Normalize Multiplier ...
multiplier = NormalizeInt(multiplier, 1, 2);
//
// Select Position ...
XPosition position;
bool has = eaTrader.GetPosition(
selectedPositionID,
position //
);
if (!has)
{
//
position.Clean();
return;
}
//
bool isLong = IsLong(position.type);
bool isBullish = IsSpecifiedBullish(dir);
//
double point = GetPoints(position.symbol);
double stepValue = multiplier * (point * allowedTPSLStep);
//
bool mustIncrease =
isBullish
? !isLong
: isLong;
//
double risk = position.GetRiskInPoint();
if (risk <= minAllowedRiskInPoint)
{
//
position.Clean();
return;
}
//
double sl = position.sl;
sl =
mustIncrease
? sl + stepValue
: sl - stepValue;
bool isModified = eaTrader.Modify(
position.ticket,
sl,
position.tp,
objSuffix + "Change SL" //
);
if (isModified)
{
UpdateGUIState();
}
//
position.Clean();
}
// //
// Custom Tools ... // Custom Tools ...
//
void NormalizeProps()
{
//
if (volume < 0.01)
{
volume = 0.01;
}
//
if (riskInPoint < 0)
{
riskInPoint = 50;
}
//
if (allowedTPSLStep < 5)
{
allowedTPSLStep = 5;
}
//
if (riskToRewardRatio < 0.5)
{
riskToRewardRatio = 2;
}
//
if (minAllowedRiskInPoint < 10)
{
minAllowedRiskInPoint = 10;
}
}
// //
ulong ExtractPositionIDFromButtonName(string name) ulong ExtractPositionIDFromButtonName(string name)
{ {
+8
View File
@@ -121,6 +121,14 @@ int OnInit()
eaExpert.AddOnForceClosePositionEventHandler(OnPositionForceClosed); eaExpert.AddOnForceClosePositionEventHandler(OnPositionForceClosed);
eaExpert.AddOnPartialClosePositionEventHandler(OnPositionPartialClosed); eaExpert.AddOnPartialClosePositionEventHandler(OnPositionPartialClosed);
//
// Configure Other Requirements ...
// eaExpert.volume = 0;
// eaExpert.riskInPoint = 0;
// eaExpert.allowedTPSLStep = 0;
// eaExpert.riskToRewardRatio = 0;
// eaExpert.minAllowedRiskInPoint = 0;
// //
// Try to Initialize eaExpert ... // Try to Initialize eaExpert ...
bool isInited = eaExpert.HandleOnInit(); bool isInited = eaExpert.HandleOnInit();
+137 -1
View File
@@ -50,6 +50,64 @@ input bool eaMailAlerts = false; // Mail Alerts
input bool eaPushAlerts = false; // Push Alerts input bool eaPushAlerts = false; // Push Alerts
input bool eaTerminalAlerts = false; // Terminal Alerts input bool eaTerminalAlerts = false; // Terminal Alerts
//
// Indicator Inputs ...
//
input group "Calculation";
//
// Short ...
input ENUM_X_PERIOD_METHOD scMethod = X_PERIOD_AUTO; // How to Find Short Period
input ENUM_TIMEFRAMES scPeriod = NULL; // Short Period
//
// Medium ...
input ENUM_X_PERIOD_METHOD mcMethod = X_PERIOD_AUTO; // How to Find Medium Period
input ENUM_TIMEFRAMES mcPeriod = NULL; // Medium Period
//
// Long ...
input ENUM_X_PERIOD_METHOD lcMethod = X_PERIOD_AUTO; // How to Find Long Period
input ENUM_TIMEFRAMES lcPeriod = NULL; // Long Period
//
// Hind ...
input ENUM_X_PERIOD_METHOD hcMethod = X_PERIOD_AUTO; // How to Find Hind Period
input ENUM_TIMEFRAMES hcPeriod = NULL; // Hind Period
//
// PV ...
input ENUM_SERIESMODE upperMode = MODE_HIGH; // Peak Method
input ENUM_SERIESMODE lowerMode = MODE_LOW; // Vale Method
//
// Others ...
input ENUM_X_FIBO_LEVELS upperZoneLevel = X_FIBO_LEVEL_618; // Upper Zone Level
input ENUM_X_FIBO_LEVELS lowerZoneLevel = X_FIBO_LEVEL_382; // Lower Zone Level
input double sarStep = 0.02; // SAR Step
input double sarMax = 0.2; // SAR Maximum
input ENUM_MA_METHOD maMethod = MODE_EMA; // MA Method
input ENUM_APPLIED_PRICE maAppliedTo = PRICE_CLOSE; // MA Applied To
input int maFastLength = 7; // Fast MA Length
input int maSlowLength = 20; // Slow MA Length
//
// Presentation ...
input group "Presentation";
input bool showPV = true; // Show PV
input bool showSAR = true; // Show Sar
input bool showMAFast = true; // Show MA Fast
input bool showMASlow = true; // Show MA Slow
input bool showFiboZone = false; // Show Fibo Zone
//
input int startCalculationForLastBars = 1500; // Calculate Last n Bars
//
input int sarArrowCode = 159; // Parabolic Sar Arrow Code
input int peakArrowCode = 159; // Peaks Arrow Code
input int valeArrowCode = 159; // Vales Arrow Code
// //
// Define Local Variables ... // Define Local Variables ...
@@ -57,6 +115,9 @@ input bool eaTerminalAlerts = false; // Terminal Alerts
string eaLogTag; // EA Log Prefix ... string eaLogTag; // EA Log Prefix ...
XCBackTesterEA *eaExpert; // EA Expert ... XCBackTesterEA *eaExpert; // EA Expert ...
//
int eaHandler = INVALID_HANDLE; // Indicator Handler ...
// //
// Define Indicators Here ... // Define Indicators Here ...
@@ -125,6 +186,14 @@ int OnInit()
eaExpert.AddOnForceClosePositionEventHandler(OnPositionForceClosed); eaExpert.AddOnForceClosePositionEventHandler(OnPositionForceClosed);
eaExpert.AddOnPartialClosePositionEventHandler(OnPositionPartialClosed); eaExpert.AddOnPartialClosePositionEventHandler(OnPositionPartialClosed);
//
// Configure Other Requirements ...
eaExpert.volume = 0.01;
eaExpert.riskInPoint = 200;
eaExpert.allowedTPSLStep = 10;
eaExpert.riskToRewardRatio = 2;
eaExpert.minAllowedRiskInPoint = 20;
// //
// Try to Initialize eaExpert ... // Try to Initialize eaExpert ...
bool isInited = eaExpert.HandleOnInit(); bool isInited = eaExpert.HandleOnInit();
@@ -135,6 +204,51 @@ int OnInit()
return INIT_FAILED; return INIT_FAILED;
} }
//
// Initial Indicator Handler ...
eaHandler = iCustom(
_Symbol,
_Period,
"x-saherelm.xom1",
"", // Calculation ...
scMethod,
scPeriod,
mcMethod,
mcPeriod,
lcMethod,
lcPeriod,
hcMethod,
hcPeriod,
upperMode,
lowerMode,
upperZoneLevel,
lowerZoneLevel,
sarStep,
sarMax,
maMethod,
maAppliedTo,
maFastLength,
maSlowLength,
"", // Presentation ...
showPV,
showSAR,
showMAFast,
showMASlow,
showFiboZone,
startCalculationForLastBars,
sarArrowCode,
peakArrowCode,
valeArrowCode
//
);
isInited = eaHandler != INVALID_HANDLE;
if (!isInited)
{
//
Print(ShortName, ": Initialization Failed ...");
return INIT_FAILED;
}
// //
Print(ShortName, ": Initialized Successfully ..."); Print(ShortName, ": Initialized Successfully ...");
return INIT_SUCCEEDED; return INIT_SUCCEEDED;
@@ -160,6 +274,10 @@ void OnDeinit(const int reason)
// Destroy Timer ... // Destroy Timer ...
eaExpert.HandleOnDeInit(); eaExpert.HandleOnDeInit();
//
// De Init Indicator ...
IndicatorRelease(eaHandler);
// //
delete eaExpert; delete eaExpert;
ZeroMemory(eaExpert); ZeroMemory(eaExpert);
@@ -218,7 +336,25 @@ bool ValidateInputs()
bool isCommonValid = ( bool isCommonValid = (
// //
eaSlippage > 0 && eaSlippage > 0 &&
eaMagicNumber > 0 eaMagicNumber > 0 &&
//
// Indicator Inputs ...
//
// MA ...
maFastLength >= 2 &&
maSlowLength >= 2 &&
maSlowLength > maFastLength &&
//
// SAR ...
sarMax > 0 &&
sarStep > 0 &&
sarMax > sarStep &&
//
// CYCLES ...
(IsValid(scMethod, scPeriod) &&
IsValid(mcMethod, mcPeriod) &&
IsValid(lcMethod, lcPeriod) &&
IsValid(hcMethod, hcPeriod))
// //
); );
if (!isCommonValid) if (!isCommonValid)
+23 -1
View File
@@ -860,6 +860,27 @@ double GetXSpread(
return GetSpread(mSymbol); return GetSpread(mSymbol);
} }
/**
* Get SPecified Symbols Volume Step ...
*
* @param mSymbol: string ...
*
* @return ( double )
*/
double GetVolumeStep(
string mSymbol = NULL //
)
{
//
mSymbol = NormalizeSymbol(mSymbol);
//
double result = SymbolInfoDouble(mSymbol, SYMBOL_VOLUME_STEP);
//
return result;
}
/** /**
* Get Point Price ... * Get Point Price ...
* *
@@ -3904,7 +3925,8 @@ template <typename T>
void Clean(T &buffer[]) void Clean(T &buffer[])
{ {
// //
if (!HasChild(buffer)) { if (!HasChild(buffer))
{
return; return;
} }
+13
View File
@@ -1224,6 +1224,19 @@ struct XPosition
return result; return result;
} }
//
double GetRiskInPoint()
{
//
double result = 0;
//
result = GetRisk() / GetPoints();
//
return result;
}
// //
// Find Reward ... // Find Reward ...
double GetReward() double GetReward()