Adwizard/Virtual/VirtualChartOrder.mqh

146 lines
11 KiB
MQL5
Raw Permalink Normal View History

2025-04-11 13:28:40 +03:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| VirtualChartOrder.mqh |
//| Copyright 2022-2025, Yuriy Bykov |
//| https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022-2025, Yuriy Bykov"
#property link "https://www.mql5.com/ru/users/antekov"
#property version "1.01"
#include <Charts\Chart.mqh>
#include <ChartObjects\ChartObjectsLines.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
#include "VirtualOrder.mqh"
//+------------------------------------------------------------------+
//| ;0AA 3@0D8G5A:>9 28@BC0;L=>9 ?>78F88 |
//+------------------------------------------------------------------+
class CVirtualChartOrder : public CInterface {
CVirtualOrder* m_order; // !2O70==0O 28@BC0;L=0O ?>78F8O (>@45@)
CChart m_chart; // 1J5:B 3@0D8:0 4;O >B>1@065=8O
// 1J5:BK =0 3@0D8:5 4;O >B>1@065=8O 28@BC0;L=>9 ?>78F88
CChartObjectHLine m_openLine; // 8=8O F5=K >B:@KB8O
long FindChart(); // >8A:/>B:@KB85 =C6=>3> 3@0D8:0
public:
CVirtualChartOrder(CVirtualOrder* p_order); // >=AB@C:B>@
~CVirtualChartOrder(); // 5AB@C:B>@
bool operator==(const ulong id) { // ?5@0B>@ A@02=5=8O ?> Id
return m_order.Id() == id;
}
void Show(); // >:07 28@BC0;L=>9 ?>78F88 (>@45@0)
void Hide(); // !:@KB85 28@BC0;L=>9 ?>78F88 (>@45@0)
virtual void Redraw() override; // 5@5@8A>2:0 28@BC0;L=>9 ?>78F88 (>@45@0)
};
//+------------------------------------------------------------------+
//| >=AB@C:B>@ |
//+------------------------------------------------------------------+
CVirtualChartOrder::CVirtualChartOrder(CVirtualOrder* p_order) :
m_order(p_order) {}
//+------------------------------------------------------------------+
//| 5AB@C:B>@ |
//+------------------------------------------------------------------+
CVirtualChartOrder::~CVirtualChartOrder() {
Hide();
}
//+------------------------------------------------------------------+
//| >8A: 3@0D8:0 4;O >B>1@065=8O |
//+------------------------------------------------------------------+
long CVirtualChartOrder::FindChart() {
if(m_chart.ChartId() == -1 || m_chart.Symbol() != m_order.Symbol()) {
long currChart, prevChart = ChartFirst();
int i = 0, limit = 1000;
currChart = prevChart;
while(i < limit) { // C =0A =025@=O:0 =5 1>;LH5 1000 >B:@KBKE 3@0D8:>2
if(ChartSymbol(currChart) == m_order.Symbol()) {
return currChart;
}
currChart = ChartNext(prevChart); // =0 >A=>20=88 ?@54K4CI53> ?>;CG8< =>2K9 3@0D8:
if(currChart < 0)
break; // 4>AB83;8 :>=F0 A?8A:0 3@0D8:>2
prevChart = currChart; // 70?><=8< 845=B8D8:0B>@ B5:CI53> 3@0D8:0 4;O ChartNext()
i++;
}
// A;8 ?>4E>4OI89 3@0D8: =5 =0945=, B> >B:@>5< =>2K9
if(currChart == -1) {
m_chart.Open(m_order.Symbol(), PERIOD_CURRENT);
}
}
return m_chart.ChartId();
}
//+------------------------------------------------------------------+
//| >:07 28@BC0;L=>9 ?>78F88 (>@45@0) |
//+------------------------------------------------------------------+
void CVirtualChartOrder::Show() {
string name = StringFormat("%d #%d: %s %s %.2f",
s_magic,
m_order.Id(),
m_order.TypeName(),
m_order.Symbol(), m_order.Volume());
long chartId = FindChart();
if(!m_openLine.Create(chartId, name, 0, m_order.OpenPrice())) {
PrintFormat(__FUNCTION__" | ERROR Creating line", 0);
return;
}
if(m_order.IsPendingOrder()) {
if(m_order.IsStopOrder()) {
m_openLine.Style(STYLE_DASH);
}
if(m_order.IsLimitOrder()) {
m_openLine.Style(STYLE_DOT);
}
if(m_order.IsBuyOrder()) {
m_openLine.Color(clrLightSkyBlue);
}
if(m_order.IsSellOrder()) {
m_openLine.Color(clrLightSalmon);
}
} else {
m_openLine.Style(STYLE_SOLID);
if(m_order.IsBuyOrder()) {
m_openLine.Color(clrBlue);
}
if(m_order.IsSellOrder()) {
m_openLine.Color(clrRed);
}
}
}
//+------------------------------------------------------------------+
//| !:@KB85 28@BC0;L=>9 ?>78F88 (>@45@0) |
//+------------------------------------------------------------------+
void CVirtualChartOrder::Hide() {
m_openLine.Delete();
}
//+------------------------------------------------------------------+
//| 5@5@8A>2:0 28@BC0;L=>9 ?>78F88 (>@45@0) |
//+------------------------------------------------------------------+
void CVirtualChartOrder::Redraw() {
if(m_isChanged) {
Hide();
if(m_order.IsOpen()) {
Show();
}
m_isChanged = false;
}
}
//+------------------------------------------------------------------+