last works on XBackTester ...
This commit is contained in:
@@ -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);
|
||||
// }
|
||||
Reference in New Issue
Block a user