TradePanel_C/TradePanel_C.mq5
super.admin d2858edfc6 convert
2025-05-30 16:32:34 +02:00

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);
}
//___________________________________________________________________________