last works on XBackTester ...

This commit is contained in:
2025-09-14 19:19:15 +03:30
parent c2dcbf3f32
commit 76030e2cfa
5 changed files with 1738 additions and 22 deletions
+646
View File
@@ -0,0 +1,646 @@
void UpdateMainPanel()
{
//
// Validate ...
if (mChartHelper == NULL ||
mainPanel == NULL)
{
return;
}
//
bool has = false;
//
// Update Main Panel Position ...
XObjPosition mainPanelPosition;
CalculateMainPanelPosition(mainPanelPosition);
if (mainPanelPosition.IsValidForRectangle())
{
//
has = mainPanel.ShiftPoint(1, mainPanelPosition.fromTime, mainPanelPosition.fromPrice);
if (has)
{
has = mainPanel.ShiftPoint(2, mainPanelPosition.toTime, mainPanelPosition.toPrice);
}
}
}
/**
* Calculate Main Window Position ...
*
* @param position: XObjPosition
*/
void CalculateMainPanelPosition(XObjPosition &position)
{
//
position.Clean();
//
// Reading Chart Helper Requirements ...
//
string mChartSymbol = mChartHelper.Symbol();
double mPoint = GetPoints(mChartSymbol);
//
ENUM_TIMEFRAMES mChartPeriod = mChartHelper.Period();
int mChartPeriodSeconds = PeriodSeconds(mChartPeriod);
//
double mChartMinPrice = mChartHelper.PriceMin();
double mChartMaxPrice = mChartHelper.PriceMax();
int mChartVisibleBarsCount = mChartHelper.VisibleBars();
int mChartFirstBarIndex = mChartHelper.FirstVisibleBar();
//
datetime mChartFirstBarTime = GetBarTime(
mChartSymbol,
mChartPeriod,
mChartFirstBarIndex //
);
//
position.fromTime = mChartFirstBarTime + (mChartPeriodSeconds);
position.fromPrice = mChartMaxPrice - (10 * mPoint);
//
position.toTime = position.fromTime + (40 * mChartPeriodSeconds);
position.toPrice = position.fromPrice - (20 * mPoint);
//
Print(" ");
//
Print("From Time: ", position.fromTime);
Print("To Time: ", position.toTime);
//
Print(" ");
//
Print("From Price: ", position.fromPrice);
Print("To Price: ", position.toPrice);
}
///////////////////////////////////////////////////////
//
// SaherElm IT Center XTest MQL5 Expert Advisor
// -------------------------------------------------
// Name: XBackTester
// Description: a Backtest Tools Strategy Tester
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////x
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XBackTester"
#property strict
//
#define ShortName "XBackTester"
//
// Imports ...
#include "../Classes/x-saherelm.x-alert.class.mq5"
#include "../Classes/x-saherelm.x-chart.helper.class.mq5"
#include "../Classes/x-saherelm.x-trade.class.mq5"
//
// Import Chart Objects ...
#include <ChartObjects/ChartObject.mqh>
#include <ChartObjects/ChartObjectsArrows.mqh>
#include <ChartObjects/ChartObjectsFibo.mqh>
#include <ChartObjects/ChartObjectsLines.mqh>
#include <ChartObjects/ChartObjectsShapes.mqh>
#include <ChartObjects/ChartObjectsTxtControls.mqh>
#include <Charts/Chart.mqh>
//
// Definitions ...
struct XObjPosition
{
//
// Props ...
datetime fromTime;
double fromPrice;
datetime toTime;
double toPrice;
//
// Constructor ...
XObjPosition()
{
Clean();
}
//
// Tools ...
//
// Cleanup ...
void Clean()
{
//
toPrice = 0;
fromPrice = 0;
//
toTime = NULL;
fromTime = NULL;
}
//
// Validate XWindowPosition for Rectangle ...
bool IsValidForRectangle()
{
//
bool result =
//
toPrice > 0 &&
fromPrice > 0 &&
IsSpecifiedValid(toTime) &&
IsSpecifiedValid(fromTime) &&
fromTime < toTime
//
;
//
return result;
}
};
//
// Inputs ...
//
// Common ...
input group "Common";
input long eaMagicNumber = 78692110; // Magic Number
input int eaSlippage = 10; // Slippgae
input string eaLogSuffix = ""; // Log Suffix
//
// Alert ...
// Here we Provider All Requirements for
// Configuring Alert Provider ...
input group "Alert";
input bool eAEnableAlerts = true; // Enable Alerts
input bool eALogAlerts = true; // Log Alerts
input bool eAMailAlerts = false; // Mail Alerts
input bool eAPushAlerts = false; // Push Alerts
input bool eATerminalAlerts = false; // Terminal Alerts
//
// Define Local Variables ...
//
string eaLogTag; // EA Log Prefix ...
XCAlert *eaAlert; // Alert Provider for Expert Adviser ...
XCTrade *eaTrader; // Trader of Expert Adviser ...
//
// Chart Objects and Properties ...
XCChartHelper *mChartHelper;
//
// Chart Object Class ...
//
string objSuffix;
//
// Main Panel ...
string mainPanelName;
CChartObjectRectLabel *mainPanel; // Main Panel ...
string buyButtonName;
CChartObjectButton *buyButton; // Buy Button ...
string sellButtonName;
CChartObjectButton *sellButton; // Sell Button ...
//
// Event Handlers ...
//
// Initialization ...
int OnInit()
{
//
// Validate Inputs and Required Parameters
// for EA to Works fine ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Initialize Timer ...
if (!InitTimer())
{
return INIT_FAILED;
}
//
// Initialize all Requirements ...
if (!InitEA())
{
return INIT_FAILED;
}
//
// Initialize all GUI Objects and Classes ...
if (!InitGUI())
{
return INIT_FAILED;
}
//
// Alert Initialization ...
string msg = "Initialized Successfully ...";
eaAlert.SendAlert(msg);
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
//
// Destroy Timer ...
DestroyTimer();
//
// Destroy all GUI Requirements ...
DestroyGUI();
//
// Alert De Initialization Succeeded ...
string msg = "De Initialized Successfully ...";
eaAlert.SendAlert(msg);
//
// Destroy all EA Requirements ...
DestroyEA();
}
//
// On Tick Handler ...
void OnTick()
{
//
UpdateGUI();
}
//
// Handle On Trade Event ...
void OnTrade()
{
eaTrader.HandleOnTrade();
}
//
// On Timer ...
void OnTimer()
{
//
// TODO: Implement Time Based Functionalities ...
}
//
// Chart Event Handler ...
void OnChartEvent(
const int id,
const long &lparam,
const double &dparam,
const string &sparam //
)
{
//
// Apply Chart Event on Main Window ...
if (id == CHARTEVENT_OBJECT_CLICK)
{
//
if (mainPanel != NULL && sparam == mainPanelName)
{
//
Print("Main Panel Clicked ...");
}
}
}
//
// Custom Functions ...
/**
* Validate all Inputs of Expert Adviser ...
*
* @return ( bool )
*/
bool ValidateInputs()
{
//
bool result = false;
//
string errMessage = "";
//
bool isCommonValid = (
//
eaSlippage > 0 &&
eaMagicNumber > 0
//
);
if (!isCommonValid)
{
//
errMessage += "common configurations error;" + "\n";
}
//
result =
//
// Common ...
isCommonValid &&
//
// Otere ...
true
//
;
//
if (!result)
{
//
// Since here Logger not Initiallized, we Use Raw Print Command ...
Print(ShortName + " Errors: \n", errMessage);
}
//
return result;
}
/**
* Initialize Timer ...
*
* @return ( bool )
*/
bool InitTimer()
{
//
bool result = false;
//
// TODO: Initialize Timer if necessary ...
// result = EventSetTimer(1);
// result = EventSetMillisecondTimer(100);
result = true;
//
return result;
}
/**
* Destroy Timer ...
*/
void DestroyTimer()
{
//
// TODO: Use This ...
// EventKillTimer();
}
/**
* Initialize all Requirements for Working Fine ...
*
* @return ( bool )
*/
bool InitEA()
{
//
bool result = false;
//
// Locally Apply Changes on Prefix ...
eaLogTag = ShortName + ">" + eaLogSuffix;
//
// Create Instance of Alert Class and Configure it ...
eaAlert = new XCAlert();
eaAlert.SetPrefix(eaLogTag);
eaAlert.SetLogAlerts(eALogAlerts);
eaAlert.SetMailAlerts(eAMailAlerts);
eaAlert.SetPushAlerts(eAPushAlerts);
eaAlert.SetEnableAlerts(eAEnableAlerts);
eaAlert.SetTerminalAlerts(eATerminalAlerts);
//
// Create Trader Instance and Configure it ...
eaTrader = new XCTrade(
eaSlippage,
eaMagicNumber //
);
//
// TODO: Fix This ...
result = true;
//
return result;
}
/**
* Destroy all Initialized EA Requirements ...
*/
void DestroyEA()
{
//
delete eaAlert;
}
//
// GUI Events ...
/**
* Initialize all GUI Requirements for EA ...
*
* @return ( bool )
*/
bool InitGUI()
{
//
bool result = false;
//
int subWindow = 0;
ulong chartId = ChartID();
objSuffix = ShortName + "_";
//
// Initial Chart Class Instance ...
mChartHelper = new XCChartHelper(chartId);
//
// Create Main Panel ...
result = CreateMainPanel();
//
//
return result;
}
/**
* Update GUI based on Each Ticks ...
*/
void UpdateGUI()
{
//
// UpdateMainPanel();
}
/**
* Destroy all Initialized GUi Requirements ...
*/
void DestroyGUI()
{
//
delete mChartHelper;
ZeroMemory(mChartHelper);
//
delete mainPanel;
ZeroMemory(mainPanel);
}
//
// Custom Helper Functions ...
bool CreateMainPanel()
{
//
bool result = false;
//
if (mChartHelper == NULL)
{
return result;
}
//
int subWindow = 0;
//
mainPanelName = objSuffix + "Main_Panel";
mainPanel = new CChartObjectRectLabel();
result = mainPanel.Create(
mChartHelper.ChartId(),
mainPanelName,
subWindow,
10,
25,
400,
200 //
);
if (!result)
{
return result;
}
//
// Styling Main Panel ...
mainPanel.BackColor(clrDarkGray);
mainPanel.Tooltip(mainPanelName);
//
// Create Buttons ...
buyButtonName = objSuffix + "BTN_BUY";
buyButton = new CChartObjectButton();
result = buyButton.Create(
mChartHelper.ChartId(),
buyButtonName,
subWindow,
10,
25,
200,
100 //
);
if (!result)
{
return result;
}
//
// Apply Style of Buy Button ...
if (result)
{
}
//
return result;
}
//////////////////////////////////////////////////
//
// class XCEdit : public CEdit {
// //
// public:
// //
// string mValue;
// //
// bool OnSetText() {
// //
// Print("Object Edit End ...");
// return true;
// }
// };
// CEdit edtPositionId;
// //
// // EDIT Position ID ...
// int edtPositionIdStartX = btnSellStartX;
// int edtPositionIdSizeX = edtPositionIdStartX + 100;
// int edtPositionIdStartY = btnSellSizeY + 5;
// int edtPositionIdSizeY = edtPositionIdStartY + 50;
// string edtPositionIdName = objSuffix + "EDT_POS_ID";
// result = edtPositionId.Create(
// chartId,
// edtPositionIdName,
// subWindow,
// edtPositionIdStartX,
// edtPositionIdStartY,
// edtPositionIdSizeX,
// edtPositionIdSizeY //
// );
// if (result)
// {
// //
// // Apply Edit Position ID Style ...
// edtPositionId.Text(ToXString(selectedPositionID));
// edtPositionId.TextAlign(ALIGN_LEFT);
// }