ExpertReceiver

Author: Copyright � Evgeniy Trofimov, 2009
Profit factor:
0.00
Orders Execution
Checks for the total of open ordersChecks for the total of closed ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
Miscellaneous
Uses files from the file systemIt reads information from a file
1 Views
0 Downloads
0 Favorites
ExpertReceiver
//Ýêñïåðò óñòàíàâëèâàåòñÿ íà ëþáóþ ïàðó â òåðìèíàëå ñî ñ÷¸òîì, íà êîòîðûé òðåáóåòñÿ ïåðåíîñèòü ñäåëêè.
//Ïðè ýòîì â îêíå "Îáçîð ðûíêà" äîëæíû áûòü îòîáðàæåíû âñå íåîáõîäèìûå èíñòðóìåíòû!!!
#property copyright "Copyright © Evgeniy Trofimov, 2009"
#property link      "http://www.mql4.com/ru/users/EvgeTrofi"
#property show_inputs
//---------------------------------------------------------------------------
extern string FileName = "Orders.txt"; //- Èìÿ ôàéëà â êàòàëîãå TerminalPath()+"\experts\files",
                                       //  ñ êîòîðîãî áóäóò ñ÷èòûâàòüñÿ äàííûå î èçìåíåíèÿõ â îðäåðàõ.
extern int MagicStart = 50000000;      //- Ýêñïåðò óäàëÿåò òîëüêî îðäåðà, ìàãèêè êîòîðûõ
extern int MagicEnd   = 99999999;      //  âõîäÿò â óêàçàííûé çäåñü èíòåðâàë
extern int Sensitivity  = 100;         //- ×óâñòâèòåëüíîñòü ñèãíàëà â ïóíêòàõ.
extern double NewRisk   = 1.0;         //- Êîýôôèöèåíò èçìåíåíèÿ ðèñêà
extern bool LittleLots  = true;        //- Åñëè true, òî ïðè ëîòå ìåíüøå ìèíèìàëüíîäîïóñòèìîãî íà ýòîì ñ÷¸òå, áóäåò îòêðûò ìèíèìàëüíûé ëîò
extern int SP = 30;                    //- SleepPage - ïðåäåëüíîå îòêëîíåíèå îò öåíû
//---------------------------------------------------------------------------
int    OCount;
int    OTicket[1000];
string OSymbol[1000];
int    OType[1000];
double ORisk[1000];
double OOP[1000];
double OSL[1000];
double OTP[1000];
//---------------------------------------------------------------------------
int start() {
   int ticket;
   double risk;
   bool ALLRIGHT=true;
   if(!FileExist(FileName)) return(0);
   FileLoad(FileName);
   //Óäàëÿåì îòñóòñòâóþùèå
   if(CloseAllBeingAbsentPozitions()<0) return(0);
   //Êîððåêòèðóåì ñóùåñòâóþùèå
   for(int i=0; i<OCount; i++) {
      ticket=OrderExist("", OTicket[i]);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET)) {
            if(OrderType()<2) {
               if(Modify(OSymbol[i], ticket, OSL[i], OTP[i])<0) ALLRIGHT=false;
            } else {
               ModifySleep(OSymbol[i], ticket, OOP[i], OSL[i], OTP[i]);
            }
         }
      } else { //Îòêðûâàåì íîâûå ïîçèöèè è ñîçäà¸ì îòëîæåííûå îðäåðà
         if(OrderInHistory(OSymbol[i], OTicket[i])==-1) {
            if(OType[i]==OP_BUY) {
               if(MathAbs(MarketInfo(OSymbol[i],MODE_ASK)-OOP[i])<Sensitivity*MarketInfo(OSymbol[i],MODE_POINT)) {
                  if(BUY(OSymbol[i],Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
               }
            } else if(OType[i]==OP_SELL) {
               if(MathAbs(MarketInfo(OSymbol[i],MODE_BID)-OOP[i])<Sensitivity*MarketInfo(OSymbol[i],MODE_POINT)) {
                  if(SELL(OSymbol[i],Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
               }
            } else if(OType[i]==OP_BUYSTOP) {
               if(BUYSleep(OSymbol[i], OOP[i], Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
            } else if(OType[i]==OP_SELLSTOP) {
               if(SELLSleep(OSymbol[i], OOP[i], Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
            } else if(OType[i]==OP_BUYLIMIT) {
               if(BUYRecoil(OSymbol[i], OOP[i], Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
            } else if(OType[i]==OP_SELLLIMIT) {
               if(SELLRecoil(OSymbol[i], OOP[i], Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
            }
         }
      }
   }//Next i
   if(ALLRIGHT) {
      FileDelete(FileName);
   }
   return(0);
} //start()
//---------------------------------------------------------------------------
double Lot(string mySymbol="", double Risk=1.0) {
   double lot;
   //risk = 100*OrderLots()*MarketInfo(OrderSymbol(), MODE_MARGINREQUIRED)/AccountEquity();
   if(mySymbol=="") mySymbol=Symbol();
   lot = (Risk*AccountEquity())/(100*MarketInfo(mySymbol, MODE_MARGINREQUIRED));
   double steplot=MarketInfo(mySymbol, MODE_LOTSTEP);
   int LotsDigits = MathCeil(MathAbs(MathLog(steplot)/MathLog(10)));
   lot=NormalizeDouble(lot*NewRisk, LotsDigits);
   if(lot<MarketInfo(mySymbol, MODE_MINLOT) && LittleLots) lot=MarketInfo(mySymbol, MODE_MINLOT);
   return(lot);
}//Lot()
//---------------------------------------------------------------------------
bool FileExist(string file) {
   int handle=FileOpen(file,FILE_BIN);
   if(handle<0) {
      return(false);
   } else {
      FileClose(handle);
      return(true);
   }
}//FileExist()
//---------------------------------------------------------------------------
int FileLoad(string file) {
   int i, j, k;
   string buffer[1000];
   int handle=FileOpen(file,FILE_BIN);
   if(handle<0) {
      return(-1);
   } else {
      k=FileReadArray(handle,buffer,0,1000);
      FileClose(handle);
      //OCount=0;
      //while(!StringTrimRight(StringTrimLeft(buffer[OCount]))=="") {
      for(OCount=0; OCount<k; OCount++) {
         i = StringFind(buffer[OCount]," ",0);
         ORisk[OCount]=StrToDouble(StringSubstr(buffer[OCount], 0,i));
         j=i+1;
         i = StringFind(buffer[OCount]," ",j);
         OTicket[OCount]=StrToDouble(StringSubstr(buffer[OCount], j,i-j));
         j=i+1;
         i = StringFind(buffer[OCount]," ",j);
         OSymbol[OCount]=StringSubstr(buffer[OCount], j,i-j);
         j=i+1;
         i = StringFind(buffer[OCount]," ",j);
         OType[OCount]=StrToDouble(StringSubstr(buffer[OCount], j,i-j));
         j=i+1;
         i = StringFind(buffer[OCount]," ",j);
         OOP[OCount]=StrToDouble(StringSubstr(buffer[OCount], j,i-j));
         j=i+1;
         i = StringFind(buffer[OCount]," ",j);
         OSL[OCount]=StrToDouble(StringSubstr(buffer[OCount], j,i-j));
         j=i+1;
         OTP[OCount]=StrToDouble(StringSubstr(buffer[OCount], j,0));
         //OCount++;
      }//Next OCount
   }
}//FileLoad()
//+------------------------------------------------------------------+
int OrderExist(string fSymbol="", int fMagic=0, int fType=-1) {
   int  total = OrdersTotal();
   for (int i = total-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==fSymbol || fSymbol=="") {
         if(OrderMagicNumber()==fMagic || fMagic==0) {
            if(OrderType()==fType||fType==-1) {
               return(OrderTicket());
            }
         }
      } // Åñëè ñâîé
   } // Next i
   return(-1);
}//OrderExist()
//+------------------------------------------------------------------+
int OrderInHistory(string fSymbol="", int fMagic=0, int fType=-1) {
   int  total = OrdersHistoryTotal();
   for (int i = total-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
      if(OrderSymbol()==fSymbol || fSymbol=="") {
         if(OrderMagicNumber()==fMagic || fMagic==0) {
            if(OrderType()==fType||fType==-1) {
               return(OrderTicket());
            }
         }
      } // Åñëè ñâîé
   } // Next i
   return(-1);
}//OrderExist()
//+------------------------------------------------------------------+
int CloseAllBeingAbsentPozitions() {
   int LE;
   double PriceClose;
   bool Del;
   int  total = OrdersTotal();
   for (int i = total-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if(OrderMagicNumber()<MagicStart||OrderMagicNumber()>MagicEnd) continue;
         Del=true;
         for(int j=0; j<OCount; j++) {
            
            if(OrderMagicNumber()==OTicket[j]) {
               Del=false;
               break;
            }
         }
         if(Del) {
            if(OrderType()>1&&OrderType()<6) {
               OrderDelete(OrderTicket());
            } else {
               LE=135;
               while(LE>134 && LE<139) {
                  if(OrderType()==OP_BUY) {
                     PriceClose=MarketInfo(OrderSymbol(),MODE_BID);
                  } else if(OrderType()==OP_SELL) {
                     PriceClose=MarketInfo(OrderSymbol(),MODE_ASK);
                  }
                  OrderClose(OrderTicket(),OrderLots(),PriceClose,SP);
                  LE = GetLastError();
                  if(LE>0) Print("ÑòàÔÔêà íå çàêðûâàåòñÿ ïî ïðè÷èíå àøèïêè ¹ ",LE);
               }
               if(LE>0) return(-1);
            }
         }
      }
   } // Next i
   return(0);
}//CloseAllPozitions()
//+------------------------------------------------------------------+
int Modify(string mySymbol, int ticket, double sl = 0, double tp = 0) {
   double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
   if(OrderSelect(ticket, SELECT_BY_TICKET)) {
      sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
      tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
      if(OrderType()==OP_BUY) {
         if(sl>0) {
            if(MarketInfo(mySymbol,MODE_BID)-sl<stoplimit) {
               Print("Ñëèøêîì áëèçêèé ñòîï (",(MarketInfo(mySymbol,MODE_BID)-sl)/MarketInfo(mySymbol,MODE_POINT)," ïóíêòîâ). Òðåáóåòñÿ íå ìåíåå: ", stoplimit/MarketInfo(mySymbol,MODE_POINT));
               return(-1);
            }
         }
         if(tp>0) {
            if(tp-MarketInfo(mySymbol,MODE_ASK)<stoplimit) {
               Print("Ñëèøêîì áëèçêèé ïðîôèò (",(tp-MarketInfo(mySymbol,MODE_ASK))/MarketInfo(mySymbol,MODE_POINT)," ïóíêòîâ). Òðåáóåòñÿ íå ìåíåå: ", stoplimit/MarketInfo(mySymbol,MODE_POINT));
               return(-1);
            }
         }
      } else if(OrderType()==OP_SELL) {
         if(sl>0) {
            if(sl-MarketInfo(mySymbol,MODE_ASK)<stoplimit) {
               Print("Ñëèøêîì áëèçêèé ñòîï (",(sl-MarketInfo(mySymbol,MODE_ASK))/MarketInfo(mySymbol,MODE_POINT)," ïóíêòîâ). Òðåáóåòñÿ íå ìåíåå: ", stoplimit/MarketInfo(mySymbol,MODE_POINT));
               return(-1);
            }
         }
         if(tp>0) {
            if(MarketInfo(mySymbol,MODE_BID)-tp<stoplimit) {
               Print("Ñëèøêîì áëèçêèé ïðîôèò (",(MarketInfo(mySymbol,MODE_BID)-tp)/MarketInfo(mySymbol,MODE_POINT)," ïóíêòîâ). Òðåáóåòñÿ íå ìåíåå: ", stoplimit/MarketInfo(mySymbol,MODE_POINT));
               return(-1);
            }
         }
      }
      if(DoubleToStr(OrderStopLoss(),MarketInfo(mySymbol,MODE_DIGITS))==DoubleToStr(sl,MarketInfo(mySymbol,MODE_DIGITS)) &&
      DoubleToStr(OrderTakeProfit(),MarketInfo(mySymbol,MODE_DIGITS))==DoubleToStr(tp,MarketInfo(mySymbol,MODE_DIGITS))) return(0);
      if(OrderModify(ticket,OrderOpenPrice(), sl, tp, 0)==FALSE) {
         Print("Îøèáêà OrderModify(): ",GetLastError());
         return(-1);
      }
   }
   return(0);
}//Modify()
//+------------------------------------------------------------------+
int ModifySleep(string mySymbol, int ticket, double price = 0.0, double sl = 0.0, double tp = 0.0) {
// Ìîäèôèêàöèÿ îòëîæåííûõ îðäåðîâ
   double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
   double spread=MarketInfo(mySymbol, MODE_SPREAD)*MarketInfo(mySymbol,MODE_POINT);
   int LE;
   if(OrderSelect(ticket, SELECT_BY_TICKET)) {
      price=NormalizeDouble(price,MarketInfo(mySymbol,MODE_DIGITS));
      sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
      tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
      if(OrderOpenPrice()==price && OrderStopLoss()==sl && OrderTakeProfit()==tp) return(0);
      if(OrderType()==OP_BUYSTOP) {
         if(price-MarketInfo(mySymbol,MODE_ASK)<stoplimit) return(0);
         if(sl>0) if(price-spread-sl<stoplimit) return(0);
         if(tp>0) if(tp-price<stoplimit) return(0);
      } else if(OrderType()==OP_SELLSTOP) {
         if(MarketInfo(mySymbol,MODE_BID)-price<stoplimit) return(0);
         if(sl>0) if(sl-price-spread<stoplimit) return(0);
         if(tp>0) if(price-tp<stoplimit) return(0);
      }
      if(OrderModify(ticket, price, sl, tp, 0)==FALSE) {
         LE=GetLastError();
         if(LE>1) Print("Îøèáêà OrderModify(): ",LE);
      }
   }   
   return(0);
}//ModifySleep()
//+------------------------------------------------------------------+
int BUY(string mySymbol="", double lt=0, double sl=0, double tp=0, int mn=0) {
   if(mySymbol=="") mySymbol=Symbol();
   double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
   int ticket = -1; //ïîêóïàåì ïî öåíå Ask
   int LE=135;
   
   if(lt<MarketInfo(mySymbol, MODE_MINLOT)) return(0);
   if(lt>MarketInfo(mySymbol, MODE_MAXLOT)) lt=MarketInfo(mySymbol, MODE_MAXLOT);
   if(lt>AccountFreeMargin()*0.90/MarketInfo(mySymbol,MODE_MARGINREQUIRED)) lt=AccountFreeMargin()*0.90/MarketInfo(mySymbol,MODE_MARGINREQUIRED);
   lt = NormalizeDouble(lt, MathAbs(MathLog(MarketInfo(mySymbol, MODE_LOTSTEP))/MathLog(10.0))+0.5);
   if(sl>0) {
      sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
      if(MarketInfo(mySymbol,MODE_BID)-sl<stoplimit) sl=MarketInfo(mySymbol,MODE_BID)-stoplimit;
   }
   if(tp>0) {
      tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
      if(tp-MarketInfo(mySymbol,MODE_ASK)<stoplimit) tp=MarketInfo(mySymbol,MODE_ASK)+stoplimit;
   }
   while(LE>134 && LE<139) {
      ticket = OrderSend(mySymbol, OP_BUY, lt, MarketInfo(mySymbol,MODE_ASK), SP, sl, tp, WindowExpertName(), mn, 0, Blue); 
      LE = GetLastError();
      Sleep(2000);
      RefreshRates();
   }
   if (ticket > 0) Sleep(10000);
   return(ticket);
}//BUY()
//+------------------------------------------------------------------+
int SELL(string mySymbol="", double lt=0, double sl=0, double tp=0, int mn=0) {
   if(mySymbol=="") mySymbol=Symbol();
   double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
   int ticket = -1; //ïðîäà¸ì ïî öåíå Bid
   int LE=135;
   if(lt<MarketInfo(mySymbol, MODE_MINLOT)) return(0);
   if(lt>MarketInfo(mySymbol, MODE_MAXLOT)) lt=MarketInfo(mySymbol, MODE_MAXLOT);
   if(lt>AccountFreeMargin()*0.90/MarketInfo(mySymbol,MODE_MARGINREQUIRED)) lt=AccountFreeMargin()*0.90/MarketInfo(mySymbol,MODE_MARGINREQUIRED);
   lt = NormalizeDouble(lt, MathAbs(MathLog(MarketInfo(mySymbol, MODE_LOTSTEP))/MathLog(10.0))+0.5);
   if(sl>0) {
      sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
      if(sl-MarketInfo(mySymbol,MODE_ASK)<stoplimit) sl=MarketInfo(mySymbol,MODE_ASK)+stoplimit;
   }
   if(tp>0) {
      tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
      if(MarketInfo(mySymbol,MODE_BID)-tp<stoplimit) tp=MarketInfo(mySymbol,MODE_BID)-stoplimit;
   }
   while(LE>134 && LE<139) {
      ticket = OrderSend(mySymbol, OP_SELL, lt, MarketInfo(mySymbol,MODE_BID), SP, sl, tp, WindowExpertName(), mn, 0, Red); 
      LE = GetLastError();
      Sleep(2000);
      RefreshRates();
   }
   if (ticket > 0) Sleep(10000);
   return(ticket);
}//SELL()
//+------------------------------------------------------------------+
int BUYSleep(string mySymbol="", double price=0, double lt=0, double sl=0, double tp=0, int mn=0) {
// Ñîçäàíèå îòëîæåííûõ îðäåðîâ íà ïîêóïêó (òåêóùàÿ öåíà íèæå price)
   if(mySymbol=="") mySymbol=Symbol();
   double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
   double spread=MarketInfo(mySymbol, MODE_SPREAD)*MarketInfo(mySymbol,MODE_POINT);
   int ticket = -1; //ïîêóïàåì ïî öåíå Ask
   Print("Ïîïûòêà ñîçäàòü îòëîæåííûé îðäåð íà ïîêóïêó "+mySymbol+" ïî öåíå "+DoubleToStr(price,MarketInfo(mySymbol,MODE_DIGITS))+
   ", sl="+DoubleToStr(sl,MarketInfo(mySymbol,MODE_DIGITS))+
   ", tp="+DoubleToStr(tp,MarketInfo(mySymbol,MODE_DIGITS))+
   ", Ask="+DoubleToStr(MarketInfo(mySymbol,MODE_ASK),MarketInfo(mySymbol,MODE_DIGITS))+
   ", Bid="+DoubleToStr(MarketInfo(mySymbol,MODE_BID),MarketInfo(mySymbol,MODE_DIGITS)));
   price=NormalizeDouble(price,MarketInfo(mySymbol,MODE_DIGITS));
   if(price-MarketInfo(mySymbol,MODE_ASK)<stoplimit) {
      Print("Ïðåâûøåíà ìèíèìàëüíàÿ ãðàíèöà âûñòàâëåíèÿ îòëîæåííîãî îðäåðà íà ïîêóïêó ïî öåíå îòêðûòèÿ");
      Print("Ìèíèìàëüíàÿ ãðàíèöà ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ");
      return(-1);
   }
   if(sl>0) {
      sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
      if(price-spread-sl<stoplimit) {
         Print("BUYSleep: Íåïðàâèëüíàÿ ãðàíèöà StopLoss. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Bid");
         return(-1);
      }
   }
   if(tp>0) {
      tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
      if(tp-price<stoplimit) {
         Print("BUYSleep: Íåïðàâèëüíàÿ ãðàíèöà TakeProfit. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Ask");
         return(-1);
      }
   }
   ticket = OrderSend(mySymbol, OP_BUYSTOP, lt, price, SP, sl, tp, WindowExpertName(), mn, 0, Blue); 
   if (ticket > 0) Sleep(2000);
   return(ticket);
}//BUYSleep()
//+------------------------------------------------------------------+
int SELLSleep(string mySymbol="", double price=0, double lt=0, double sl=0, double tp=0, int mn=0) {
// Ñîçäàíèå îòëîæåííûõ îðäåðîâ íà ïðîäàæó (òåêóùàÿ öåíà âûøå price)
   if(mySymbol=="") mySymbol=Symbol();
   double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
   double spread=MarketInfo(mySymbol, MODE_SPREAD)*MarketInfo(mySymbol,MODE_POINT);
   int ticket = -1; //ïðîäà¸ì ïî öåíå Bid
   Print("Ïîïûòêà ñîçäàòü îòëîæåííûé îðäåð íà ïðîäàæó "+mySymbol+" ïî öåíå "+DoubleToStr(price,MarketInfo(mySymbol,MODE_DIGITS))+
   ", sl="+DoubleToStr(sl,MarketInfo(mySymbol,MODE_DIGITS))+
   ", tp="+DoubleToStr(tp,MarketInfo(mySymbol,MODE_DIGITS))+
   ", Ask="+DoubleToStr(MarketInfo(mySymbol,MODE_ASK),MarketInfo(mySymbol,MODE_DIGITS))+
   ", Bid="+DoubleToStr(MarketInfo(mySymbol,MODE_BID),MarketInfo(mySymbol,MODE_DIGITS)));
   price=NormalizeDouble(price,MarketInfo(mySymbol,MODE_DIGITS));
   if(MarketInfo(mySymbol,MODE_BID)-price<stoplimit) {
      Print("Ïðåâûøåíà ìèíèìàëüíàÿ ãðàíèöà âûñòàâëåíèÿ îòëîæåííîãî îðäåðà íà ïðîäàæó ïî öåíå îòêðûòèÿ");
      Print("Ìèíèìàëüíàÿ ãðàíèöà ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ");
      return(-1);
   }
   if(sl>0) {
      sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
      if(sl-price-spread<stoplimit) {
         Print("SELLSleep: Íåïðàâèëüíàÿ ãðàíèöà StopLoss. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Bid");
         return(-1);
      }
   }
   if(tp>0) {
      tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
      if(price-tp<stoplimit) {
         Print("SELLSleep: Íåïðàâèëüíàÿ ãðàíèöà TakeProfit. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Ask");
         return(-1);
      }
   }
   ticket = OrderSend(mySymbol, OP_SELLSTOP, lt, price, SP, sl, tp, WindowExpertName(), mn, 0, Red); 
   if (ticket > 0) Sleep(2000);
   return(ticket);
}//SELLSleep()
//+------------------------------------------------------------------+
int BUYRecoil(string mySymbol="", double price=0, double lt=0, double sl=0, double tp=0, int mn=0) { //Òîðãîâëÿ íà îòñêîê
// Ñîçäàíèå îòëîæåííûõ îðäåðîâ íà ïîêóïêó (òåêóùàÿ öåíà âûøå price)
   if(mySymbol=="") mySymbol=Symbol();
   double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
   double spread=MarketInfo(mySymbol, MODE_SPREAD)*MarketInfo(mySymbol,MODE_POINT);
   int ticket = -1; //ïîêóïàåì ïî öåíå Ask
   Print("Ïîïûòêà ñîçäàòü îòëîæåííûé îðäåð íà ïîêóïêó "+mySymbol+" ïî öåíå "+DoubleToStr(price,MarketInfo(mySymbol,MODE_DIGITS))+
   ", sl="+DoubleToStr(sl,MarketInfo(mySymbol,MODE_DIGITS))+
   ", tp="+DoubleToStr(tp,MarketInfo(mySymbol,MODE_DIGITS))+
   ", Ask="+DoubleToStr(MarketInfo(mySymbol,MODE_ASK),MarketInfo(mySymbol,MODE_DIGITS))+
   ", Bid="+DoubleToStr(MarketInfo(mySymbol,MODE_BID),MarketInfo(mySymbol,MODE_DIGITS)));
   price=NormalizeDouble(price,MarketInfo(mySymbol,MODE_DIGITS));
   sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
   tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
   if(MarketInfo(mySymbol,MODE_BID)-price<stoplimit) {
      Print("Ïðåâûøåíà ìèíèìàëüíàÿ ãðàíèöà âûñòàâëåíèÿ îòëîæåííîãî îðäåðà íà ïîêóïêó ïî öåíå îòêðûòèÿ");
      Print("BUYRecoil: Ìèíèìàëüíàÿ ãðàíèöà ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ");
      return(-1);
   }
   if(sl>0) {
      if(price-spread-sl<stoplimit) {
         Print("BUYRecoil: Íåïðàâèëüíàÿ ãðàíèöà StopLoss. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Bid");
         return(-1);
      }
   }
   if(tp>0) {
      if(tp-price<stoplimit) {
         Print("BUYRecoil: Íåïðàâèëüíàÿ ãðàíèöà TakeProfit. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Ask");
         return(-1);
      }
   }
   ticket = OrderSend(mySymbol, OP_BUYLIMIT, lt, price, SP, sl, tp, WindowExpertName(), mn, 0, Blue); 
   if (ticket > 0) 
      Sleep(2000);
   else
      Print("Îøèáêà:",GetLastError());
   return(ticket);
}//BUYRecoil()
//+------------------------------------------------------------------+
int SELLRecoil(string mySymbol="", double price=0, double lt=0, double sl=0, double tp=0, int mn=0) { //Òîðãîâëÿ íà îòñêîê
// Ñîçäàíèå îòëîæåííûõ îðäåðîâ íà ïðîäàæó (òåêóùàÿ öåíà íèæå price)
   if(mySymbol=="") mySymbol=Symbol();
   double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
   double spread=MarketInfo(mySymbol, MODE_SPREAD)*MarketInfo(mySymbol,MODE_POINT);
   int ticket = -1; //ïðîäà¸ì ïî öåíå Bid
   Print("Ïîïûòêà ñîçäàòü îòëîæåííûé îðäåð íà ïðîäàæó "+mySymbol+" ïî öåíå "+DoubleToStr(price,MarketInfo(mySymbol,MODE_DIGITS))+
   ", sl="+DoubleToStr(sl,MarketInfo(mySymbol,MODE_DIGITS))+
   ", tp="+DoubleToStr(tp,MarketInfo(mySymbol,MODE_DIGITS))+
   ", Ask="+DoubleToStr(MarketInfo(mySymbol,MODE_ASK),MarketInfo(mySymbol,MODE_DIGITS))+
   ", Bid="+DoubleToStr(MarketInfo(mySymbol,MODE_BID),MarketInfo(mySymbol,MODE_DIGITS)));
   price=NormalizeDouble(price,MarketInfo(mySymbol,MODE_DIGITS));
   if(price-MarketInfo(mySymbol,MODE_ASK)<stoplimit) {
      Print("Ïðåâûøåíà ìèíèìàëüíàÿ ãðàíèöà âûñòàâëåíèÿ îòëîæåííîãî îðäåðà íà ïðîäàæó ïî öåíå îòêðûòèÿ");
      Print("SELLRecoil: Ìèíèìàëüíàÿ ãðàíèöà ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ");
      return(-1);
   }
   if(sl>0) {
      sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
      if(sl-price-spread<stoplimit) {
         Print("SELLRecoil: Íåïðàâèëüíàÿ ãðàíèöà StopLoss. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Bid");
         return(-1);
      }
   }
   if(tp>0) {
      tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
      if(price-tp<stoplimit) {
         Print("SELLRecoil: Íåïðàâèëüíàÿ ãðàíèöà TakeProfit. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Ask");
         return(-1);
      }
   }
   ticket = OrderSend(mySymbol, OP_SELLLIMIT, lt, price, SP, sl, tp, WindowExpertName(), mn, 0, Red); 
   if (ticket > 0) 
      Sleep(2000);
   else
      Print("Îøèáêà:",GetLastError());
   return(ticket);
}//SELLRecoil()
//+------------------------------------------------------------------+

Comments