//+------------------------------------------------------------------+ //| Followme.mq4 | //| Roger | //| http://www.rogersignals.com | //+------------------------------------------------------------------+ #property copyright "Roger" #property link "http://www.rogersignals.com" //Советник для ручного тестирования стратегий. Запустите тестер, выберите нужный //таймфрейм, пару валют, качество тестирования, даты начала и конца и режим //Визуализация. Сразу после старта нажмите Паузу. В открывшемся графике увидите //две линии, голубую - для ордеров на покупку, желтую - для ордеров на продажу. //Пока Вы не трогаете эти линии, ничего не произойдет. //Вы можете бросить на график любые индикаторы. Манипулируя кнопкой Пуск/Пауза, //Вы можете останавливать ход процесса в любой момент. //Если Вам необходимо открыть ордер на покупку, выделите голубую линию и потяните //ее на место предполагаемого открытия. Уберите Паузу, сразу же откроется ордер. //Если расстояние между Бидом и линией было меньше допустимого уровня стопа, откроется //покупка. Если линия была выше - откроется стоповый ордер, ниже - лимитный. //Чтобы закрыть ордер, достаточно потянуть любую линию, но откроется другой ордер. //Если параметр NoStops поставить в false, появятся линии стопов и тейков, т.е. //Вы сразу сможете установить необходимые стопы и тейки в новом ордере. //Если Вам какая-нибудь линия не нужна, выделите ее и удалите, но помните, при //удалении удалятся все выделенные линии, т.е., если Вы забыли, что что-то еще //выделили, то оно все равно удалится. //---- input parameters extern double Lots=0.1; extern bool NoStops=true; double prbuy,prbuyt,prbuys,prsell,prsellt,prsells; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- drawline();//рисуем линии //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- ObjectDelete("BUY"); //подчищаем хвосты ObjectDelete("SELL"); ObjectDelete("BUYT"); ObjectDelete("SELLT"); ObjectDelete("BUYS"); ObjectDelete("SELLS"); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- double nprbuy,nprbuyt,nprbuys,nprsell,nprsellt,nprsells,stl,tpr; int stlev=MarketInfo(Symbol(),MODE_STOPLEVEL);//уровень стоплевел int ticket; if(ObjectFind("BUY")==-1&&ObjectFind("SELL")==-1)drawline();//если линии стерлись от наложения шаблона nprbuy=NormalizeDouble(ObjectGet("BUY",OBJPROP_PRICE1),Digits); if(ObjectFind("BUYT")!=-1)nprbuyt=NormalizeDouble(ObjectGet("BUYT",OBJPROP_PRICE1),Digits); if(ObjectFind("BUYS")!=-1)nprbuys=NormalizeDouble(ObjectGet("BUYS",OBJPROP_PRICE1),Digits); nprsell=NormalizeDouble(ObjectGet("SELL",OBJPROP_PRICE1),Digits); if(ObjectFind("SELLT")!=-1)nprsellt=NormalizeDouble(ObjectGet("SELLT",OBJPROP_PRICE1),Digits); if(ObjectFind("SELLS")!=-1)nprsells=NormalizeDouble(ObjectGet("SELLS",OBJPROP_PRICE1),Digits); if(nprbuy==prbuy&&nprbuyt==prbuyt&&nprbuys==prbuys&&nprsell==prsell&&nprsellt==prsellt&&nprsells==prsells)return(0);//если все как было, уходим if(nprbuy!=prbuy||nprsell!=prsell)//если двигали линии купли или продажи { if(OrdersTotal()>0)closeord();//сначала удалим все открытые ордера if(nprbuy!=prbuy)//для ордеров покупки { if(nprbuyt-nprbuy<=stlev*Point||nprbuyt==0)tpr=0; else tpr=nprbuyt; if(nprbuy-nprbuys<=stlev*Point||nprbuys==0)stl=0; else stl=nprbuys; if(MathAbs(Bid-nprbuy)<=stlev*Point) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,stl,tpr); if(ticket==-1) Print("ErrorBuy - ",GetLastError()); else { Print("PriceBuy - ",Ask," Stop - ",stl," Take - ",tpr); equal(nprbuy,nprbuyt,nprbuys,nprsell,nprsellt,nprsells); } } else if(Bid>nprbuy) { ticket=OrderSend(Symbol(),OP_BUYLIMIT,Lots,nprbuy,3,stl,tpr); if(ticket==-1) Print("ErrorBuyLimit - ",GetLastError()); else { Print("PriceBuyLimit - ",nprbuy," Stop - ",stl," Take - ",tpr); equal(nprbuy,nprbuyt,nprbuys,nprsell,nprsellt,nprsells); } } else { ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,nprbuy,3,stl,tpr); if(ticket==-1) Print("ErrorBuySell - ",GetLastError()); else { Print("PriceBuyStop - ",nprbuy," Stop - ",stl," Take - ",tpr); equal(nprbuy,nprbuyt,nprbuys,nprsell,nprsellt,nprsells); } } } else//для ордеров продажи { if(nprsell-nprsellt<=stlev*Point||nprsellt==0)tpr=0; else tpr=nprsellt; if(nprsells-nprsell<=stlev*Point||nprsells==0)stl=0; else stl=nprsells; if(MathAbs(Bid-nprsell)<=stlev*Point) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,stl,tpr); if(ticket==-1) Print("ErrorSell - ",GetLastError()); else { Print("PriceSell - ",Bid," Stop - ",stl," Take - ",tpr); equal(nprbuy,nprbuyt,nprbuys,nprsell,nprsellt,nprsells); } } else if(Bid