//+------------------------------------------------------------------+ //| 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 #include #include #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; i9){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