233 lines
23 KiB
MQL5
233 lines
23 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| TradePanel_C#.mq4 |
|
|
//| IgorM |
|
|
//| https://www.mql5.com/ru/users/igorm |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "IgorM"
|
|
#property link "https://www.mql5.com/ru/users/igorm"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
#define REFRESH 500 // Время обмена данными, мс
|
|
#define REFRESHORDERTABLE 20; // коэффициент времени обновления Form2
|
|
|
|
#include <fxsaber\MT4Orders.mqh>
|
|
#include <IgorM\FormSharp.mqh>
|
|
#include <IgorM\PrintLastError.mqh>
|
|
|
|
#define CLOSEALL(void) { OrderClose_(MagicNumber); RefreshOrdersTable(); }
|
|
#define CLOSEPROFIT(void) { OrderClose_(MagicNumber,101); RefreshOrdersTable(); }
|
|
#define CLOSELOSS(void) { OrderClose_(MagicNumber,100); RefreshOrdersTable(); }
|
|
#define CLOSEBUY(void) { OrderClose_(MagicNumber,OP_BUY); RefreshOrdersTable(); }
|
|
#define CLOSESELL(void) { OrderClose_(MagicNumber,OP_SELL); RefreshOrdersTable(); }
|
|
#define CLOSEBYTICKET(ticket) { OrderCloseByTicket(MagicNumber,ticket); RefreshOrdersTable(); }
|
|
#define DELETELIMITS(void) { OrderClose_(MagicNumber,102); RefreshOrdersTable(); }
|
|
|
|
#ifdef __MQL5__
|
|
#define WindowExpertName(void) "TradePanel_C#"
|
|
#endif
|
|
|
|
|
|
input MAGIC_TYPE MagicNumber=31415926;
|
|
//+------------------------------------------------------------------+
|
|
//| Expert initialization function |
|
|
//+------------------------------------------------------------------+
|
|
int OnInit()
|
|
{
|
|
// добавим обработчики события клик по кнопке
|
|
WinSharp.AddEventButtonClick(button1_Click);
|
|
WinSharp.AddEventButtonClick(button2_Click);
|
|
WinSharp.AddEventButtonClick(button3_Click);
|
|
WinSharp.AddEventButtonClick(button4_Click);
|
|
WinSharp.AddEventButtonClick(button5_Click);
|
|
WinSharp.AddEventButtonClick(button6_Click);
|
|
WinSharp.AddEventButtonClick(button7_Click);
|
|
WinSharp.AddEventButtonClick(button8_Click);
|
|
WinSharp.AddEventButtonClick(button9_Click);
|
|
WinSharp.AddEventButtonClick(button10_Click);
|
|
WinSharp.AddEventButtonClick(button11_Click);
|
|
WinSharp.SetMagicNumber(MagicNumber);
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert deinitialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnDeinit(const int reason)
|
|
{
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert tick function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTick()
|
|
{
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Timer function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTimer()
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
void button1_Click()
|
|
{
|
|
TICKET_TYPE ticket;
|
|
int cmd=CheckMarketOrder ? OP_BUY :(CheckLimitOrder ? OP_BUYLIMIT :(CheckStopOrder ? OP_BUYSTOP : 999));
|
|
if(Checkinpips) ticket = OrderSend_(cmd,EditLot,EditPrice,MagicNumber,(int)Edit_i_StopLoss,(int)Edit_i_TakeProfit,WindowExpertName());
|
|
else ticket = OrderSend_(cmd,EditLot,EditPrice,MagicNumber,Edit_d_StopLoss,Edit_d_TakeProfit,WindowExpertName());
|
|
if(ticket>0) RefreshOrdersTable();
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
void button2_Click()
|
|
{
|
|
long ticket;
|
|
int cmd=CheckMarketOrder ? OP_SELL :(CheckLimitOrder ? OP_SELLLIMIT :(CheckStopOrder ? OP_SELLSTOP : 999));
|
|
if(Checkinpips) ticket = OrderSend_(cmd,EditLot,EditPrice,MagicNumber,(int)Edit_i_StopLoss,(int)Edit_i_TakeProfit,WindowExpertName());
|
|
else ticket = OrderSend_(cmd,EditLot,EditPrice,MagicNumber,Edit_d_StopLoss,Edit_d_TakeProfit,WindowExpertName());
|
|
if(ticket>0) RefreshOrdersTable();
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
void button3_Click() { CLOSEALL(); }
|
|
//+------------------------------------------------------------------+
|
|
void button4_Click() { CLOSEBUY(); }
|
|
//+------------------------------------------------------------------+
|
|
void button5_Click() { CLOSEPROFIT();}
|
|
//+------------------------------------------------------------------+
|
|
void button6_Click() { CLOSESELL(); }
|
|
//+------------------------------------------------------------------+
|
|
void button7_Click() { CLOSELOSS(); }
|
|
//+------------------------------------------------------------------+
|
|
void button8_Click() { DELETELIMITS();}
|
|
//+------------------------------------------------------------------+
|
|
void button9_Click() { CLOSEBYTICKET(ContexMenuTicket); }
|
|
//+------------------------------------------------------------------+
|
|
void button10_Click(){ Print(__FUNCTION__," , ContexMenuTicket = ",ContexMenuTicket," , trailing =",ContexMenuTrailing);}
|
|
//+------------------------------------------------------------------+
|
|
void button11_Click(){ Print(__FUNCTION__); }
|
|
//_______________________________________________________________________
|
|
void OrderCloseByTicket(MAGIC_TYPE magic_,TICKET_TYPE ticket_)
|
|
{
|
|
if(OrderSelect(ticket_,SELECT_BY_TICKET))
|
|
{
|
|
if(OrderMagicNumber()==magic_)
|
|
{
|
|
if(OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
|
|
else
|
|
{
|
|
if(!OrderDelete(ticket_,clrYellow)) PrintLastError();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//_______________________________________________________________________
|
|
void OrderClose_(MAGIC_TYPE magic_,int type=-1)
|
|
{
|
|
int i,ot,k=OrdersTotal()-1;
|
|
for(i=k; i>=0; i--)
|
|
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
|
|
if(OrderSymbol()==_Symbol && OrderMagicNumber()==magic_) switch(type)
|
|
{
|
|
case OP_BUY: case OP_SELL: if(OrderType()==type) ClosePosBySelect(); break;
|
|
case 100: if(OrderProfit()<0.0) ClosePosBySelect(); break; // Close AllLoss
|
|
case 101: if(OrderProfit()>=0.0)ClosePosBySelect(); break; // Close AllProfit
|
|
case 102: // Delete Limit
|
|
ot=OrderType();
|
|
if(ot==OP_BUYLIMIT || ot==OP_BUYSTOP || ot==OP_SELLLIMIT || ot==OP_SELLSTOP)
|
|
{
|
|
if(!OrderDelete(OrderTicket())) PrintLastError();
|
|
}
|
|
break;
|
|
default: if(OrderType()<2) ClosePosBySelect(); break; // Close ALL
|
|
}
|
|
else { Print(__FUNCTION__," ошибка"); PrintLastError(); }
|
|
}
|
|
//_______________________________________________________________________
|
|
void ClosePosBySelect(int attempt=10,int slippage_=30)
|
|
{
|
|
bool AllOK; double pr_; color clClose;
|
|
for(int i=0; i<attempt; i++)
|
|
{
|
|
while(ServerDisable()) Sleep(314);
|
|
if(OrderType()==OP_BUY){clClose=clrRed; pr_=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);}
|
|
else {clClose=clrGreen; pr_=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);}
|
|
AllOK=OrderClose(OrderTicket(),OrderLots(),pr_,slippage_,clClose);
|
|
if(AllOK) return; else { Print(__FUNCTION__," Ошибка при закрытии ордера № ",OrderTicket());PrintLastError(); Sleep(768); }
|
|
}
|
|
}
|
|
//_______________________________________________________________________
|
|
TICKET_TYPE OrderSend_(int cmd,double volume,double price=0.0,MAGIC_TYPE magic=0,double stopLoss=0.0,double takeProfit=0,string comment="",int slippage=30)
|
|
{
|
|
TICKET_TYPE ticket_=-1;
|
|
int not_trade=1;double sl_,tp_,pr_; color col;
|
|
while(ServerDisable() && (not_trade<10)){not_trade++; Sleep(314);}
|
|
if(not_trade>9){Print(__FUNCTION__," Ордер не выставлен, торговый сервер занят"); return(ticket_);}
|
|
if(cmd>1) pr_=NormalizeDouble(price,_Digits);
|
|
else pr_=cmd==OP_BUY ? NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits) : NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
|
|
sl_=stopLoss>0.0 ? stopLoss : 0.0;
|
|
tp_=takeProfit>0.0 ? takeProfit: 0.0;
|
|
col= cmd == OP_BUY|| cmd==OP_BUYLIMIT|| cmd==OP_BUYSTOP ? clrRed : clrGreen;
|
|
ticket_=OrderSend(_Symbol,cmd,NormalizeLot(volume),pr_,slippage,NormalizeDouble(sl_,_Digits),NormalizeDouble(tp_,_Digits),comment,magic,0,col);
|
|
if(ticket_==-1){Print(__FUNCTION__," Ошибка при открытии ордера");PrintLastError();}
|
|
return(ticket_);
|
|
}
|
|
//_______________________________________________________________________
|
|
TICKET_TYPE OrderSend_(int cmd,double volume,double price=0.0,MAGIC_TYPE magic=0,int stopLoss=0,int takeProfit=0,string comment="",int slippage=30)
|
|
{
|
|
TICKET_TYPE ticket_=-1;
|
|
int not_trade=1;double sl_,tp_,pr_; color col;
|
|
while(ServerDisable() && (not_trade<10)){not_trade++; Sleep(314);}
|
|
if(not_trade>9){Print(__FUNCTION__," Ордер не выставлен, торговый сервер занят"); return(ticket_);}
|
|
if(cmd>1) pr_=NormalizeDouble(price,_Digits);
|
|
else pr_=cmd==OP_BUY ? NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits) : NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
|
|
switch(cmd)
|
|
{
|
|
case OP_BUY: case OP_BUYLIMIT: case OP_BUYSTOP:
|
|
sl_= stopLoss > 0 ? pr_-stopLoss*_Point : 0.0;
|
|
tp_= takeProfit> 0 ? pr_+takeProfit*_Point: 0.0;
|
|
col= clrRed;
|
|
break;
|
|
case OP_SELL: case OP_SELLLIMIT: case OP_SELLSTOP:
|
|
sl_= stopLoss > 0 ? pr_+stopLoss*_Point : 0.0;
|
|
tp_= takeProfit> 0 ? pr_-takeProfit*_Point: 0.0;
|
|
col= clrGreen;
|
|
break;
|
|
default: return(ticket_);
|
|
}
|
|
ticket_=OrderSend(_Symbol,cmd,NormalizeLot(volume),pr_,slippage,NormalizeDouble(sl_,_Digits),NormalizeDouble(tp_,_Digits),comment,magic,0,col);
|
|
if(ticket_==-1){Print(__FUNCTION__," Ошибка при открытии ордера");PrintLastError();}
|
|
return(ticket_);
|
|
}
|
|
//_______________________________________________________________________
|
|
double NormalizeLot(double value,bool up=true)
|
|
{
|
|
double res,sizetable[8]={1.0,0.1,0.01,0.001,0.0001,0.00001,0.000001,0.0000001};
|
|
double lotStep=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
|
|
double val=NormalizeDouble(value,7);
|
|
int lotdigits;
|
|
for(lotdigits=7; lotdigits>=0; lotdigits--) { if(lotStep<=sizetable[lotdigits]) break; }
|
|
if(up) res=NormalizeDouble(MathCeil(MathMin(MathMax(val,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)),SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX))/lotStep)*lotStep,lotdigits);
|
|
else res=NormalizeDouble(MathFloor(MathMin(MathMax(val,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)),SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX))/lotStep)*lotStep,lotdigits);
|
|
return(res);
|
|
}
|
|
//_______________________________________________________________________
|
|
bool ServerDisable(int count=10)
|
|
{
|
|
if(MQLInfoInteger(MQL_TESTER)|| MQLInfoInteger(MQL_OPTIMIZATION))return(false);
|
|
for(int i=0;i<count;i++)
|
|
{
|
|
if(TerminalInfoInteger(TERMINAL_CONNECTED) && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
|
|
{
|
|
#ifdef __MQL4__
|
|
if(!IsTradeContextBusy())
|
|
#endif
|
|
return(false);
|
|
}
|
|
Sleep(157);
|
|
}
|
|
Print(__FUNCTION__," Торговый сервер не отвечает"); PrintLastError();
|
|
return(true);
|
|
}
|
|
//___________________________________________________________________________
|