UTE/Strategy/TradeControl.mqh

150 lines
16 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:34:43 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| TradeControl.mqh |
//| Copyright 2016, Vasiliy Sokolov, St-Petersburg, Russia |
//| https://www.mql5.com/ru/users/c-4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link "https://www.mql5.com/ru/users/c-4"
#include <Object.mqh>
#include "Dictionary.mqh"
#include "TradeCustom.mqh"
#include "Message.mqh"
#include "Logs.mqh"
/*
0==K9 :;0AA 8=B53@8@C5B 4>?>;=8B5;L=K9 <>4C;L :>=B@>;O 2 AB0=40@B=K9 B>@3>2K9 <>4C;L CTradeCustom. >?>;=5=8O:
1.A;8 >1@0I5=85 : >4=><C 87 B>@3>2KE <5B>4>2 ?@>8AE>48B @0=LH5, G5< G5@57 >?@545;5=>5 :>;8G5AB2>
<8;;8A5:C=4, CAB0=>2;5==>5 <5B>4>< TradeDelayMsc, 2K2>48BAO ?@54C?@5640NI55 A>>1I5=85,
> B><, GB> B>@3>2K5 459AB28O ?@>8AE>4OB A;8H:>< G0AB> 8 B>@3>2>5 459AB285 =5 A>25@H05BAO.
2. A;8 ?@8 ?>:C?:5 8;8 ?@>4065 70?@0H8205<>3> >1J5<0 >1J5< A>2>:C?=>9 =5BB>-?>78F88
?@52KA8B ?@545;L=> 4>?CAB8<K9, CAB0=02;8205<K9 <5B>4>< AddLimit, >1J5< 1C45B A:>@@5:B8@>20=
=0 =>2K9 ;81> B>@3>2>5 459AB285 1C45B >B:;>=5=> 2>2A5.
*/
//+------------------------------------------------------------------+
//| ">@3>2K9 :;0AA, >A=>20==K9 =0 CTradeCustom 8 2:;NG0NI89 2 A51O |
//| 4>?>;=8B5;L=K5 <>4C;8 :>=B@>;O @8A:0. |
//+------------------------------------------------------------------+
class CTradeControl : public CTradeCustom
{
private:
uint m_last_trade_action; // @5<O ?>A;54=53> A>25@H5==>3> B>@3>2>3> 459AB28O.
uint m_trade_delay; // @5<O 7045@6:8 2 <A5:, @0=LH5 :>B>@>3> =5 <>65B ?>ABC?8BL ?>2B>@=K9 ?@8:07 =0 A>25@H5=85 A45;:8.
CLog* Log; // >38@>20=85
public:
CTradeCustom Trade; // 07>2K9 B>@3>2K9 <>4C;L. 5=5A5= 2 ?01;8: 4;O 4>ABC?0 : 8=D>@<0F88 > AB0BCA5 A45;:8.
CTradeControl(void);
/* >=D83C@8@>20=85 A2>9AB2 CTradeCustom */
void TradeDelayMsc(uint msec);
void AsynchMode(bool asynch);
/* 5@5>?@545;5==K5 B>@3>2K5 <5B>4K CTradeCustom */
virtual bool Buy(const double volume,const string symbol,const string comment="");
virtual bool Sell(const double volume,const string symbol,const string comment="");
virtual bool BuyLimit(const double volume,const double price,const string symbol,
const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment="");
virtual bool BuyStop(const double volume,const double price,const string symbol,
const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment="");
virtual bool SellLimit(const double volume,const double price,const string symbol,
const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment="");
virtual bool SellStop(const double volume,const double price,const string symbol,
const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment="");
};
//+------------------------------------------------------------------+
//| >=AB@C:B>@. |
//+------------------------------------------------------------------+
CTradeControl::CTradeControl(void) : m_trade_delay(0),
m_last_trade_action(0)
{
Log=CLog::GetLog();
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B D;03 8A?>;=5=8O ?@8:070 2 0A8=E@>==>< @568<5. |
//+------------------------------------------------------------------+
void CTradeControl::AsynchMode(bool asynch)
{
Trade.SetAsyncMode(asynch);
}
//+------------------------------------------------------------------+
//| >:C?05< ?> @K=:C. |
//+------------------------------------------------------------------+
bool CTradeControl::Buy(const double volume,const string symbol,const string comment="")
{
bool res=CTradeCustom::Buy(volume,symbol,comment);
if(res)
m_last_trade_action=GetTickCount();
return res;
}
//+------------------------------------------------------------------+
//| >:C?05< ?> @K=:C. |
//+------------------------------------------------------------------+
bool CTradeControl::Sell(const double volume,const string symbol,const string comment="")
{
bool res=CTradeCustom::Sell(volume,symbol,comment);
if(res)
m_last_trade_action=GetTickCount();
return res;
}
//+------------------------------------------------------------------+
//| KAB02;O5< buy-stop. |
//+------------------------------------------------------------------+
bool CTradeControl::BuyStop(const double volume,
const double price,
const string symbol,
const ENUM_ORDER_TYPE_TIME type_time=0,
const datetime expiration=0,
const string comment="")
{
bool res=CTradeCustom::BuyStop(volume,price,symbol,type_time,expiration,comment);
if(res)
m_last_trade_action=GetTickCount();
return res;
}
//+------------------------------------------------------------------+
//| KAB02;O5< sell stop >@45@. |
//+------------------------------------------------------------------+
bool CTradeControl::SellStop(const double volume,
const double price,
const string symbol,
const ENUM_ORDER_TYPE_TIME type_time=0,
const datetime expiration=0,
const string comment="")
{
bool res=CTradeCustom::SellStop(volume,price,symbol,type_time,expiration,comment);
if(res)
m_last_trade_action=GetTickCount();
return res;
}
//+------------------------------------------------------------------+
//| KAB02;O5< buy limit >@45@. |
//+------------------------------------------------------------------+
bool CTradeControl::BuyLimit(const double volume,
const double price,
const string symbol,
const ENUM_ORDER_TYPE_TIME type_time=0,
const datetime expiration=0,
const string comment="")
{
bool res=CTradeCustom::BuyLimit(volume,price,symbol,type_time,expiration,comment);
if(res)
m_last_trade_action=GetTickCount();
return res;
}
//+------------------------------------------------------------------+
//| KAB02;O5< buy limit >@45@. |
//+------------------------------------------------------------------+
bool CTradeControl::SellLimit(const double volume,
const double price,
const string symbol,
const ENUM_ORDER_TYPE_TIME type_time=0,
const datetime expiration=0,
const string comment="")
{
bool res=CTradeCustom::SellLimit(volume,price,symbol,type_time,expiration,comment);
if(res)
m_last_trade_action=GetTickCount();
return res;
}
//+------------------------------------------------------------------+