//+------------------------------------------------------------------+ //| ea_OSMA_system.mq4 | //| Yuriy Tokman (YTG) | //| http://ytg.com.ua/ | //+------------------------------------------------------------------+ #property copyright "Yuriy Tokman (YTG)" #property link "http://ytg.com.ua/" #property version "1.00" #property description "yuriytokman@gmail.com" #property description " " #property description "http://ytg.com.ua/" #property strict string e_mail = "yuriytokman@gmail.com"; extern double Lots = 0.1; // Размер лота extern int StopLoss = 30; // Размер стопа в пунктах extern int TakeProfit = 60; // Размер тейка в пунктах extern int Magic = 2808; // Идентификатор позиций extern bool TSProfitOnly = True; // Тралить только профит extern int TStop_Buy = 50; // Размер трала в пунктах для покупок extern int TStop_Sell = 35; // Размер трала в пунктах для продаж extern int TrailingStep = 3; // Шаг трала в пунктах extern int MagicNumber = 2808; //идентификатор ордеров советника extern int NumberAccount = 0; // Номер торгового счёта extern bool UseSound = True; // Использовать звуковой сигнал extern string NameFileSound = "expert.wav"; // Наименование звукового файла extern bool ShowComment = True; // Показывать комментарий extern bool MarketWatch = True; // Запросы под исполнение "Market Watch". extern int Slippage = 3; // Проскальзывание цены extern int NumberOfTry = 5; // Количество торговых попыток bool gbDisabled = False; // Флаг блокировки советника bool gbNoInit = False; // Флаг неудачной инициализации color clOpenBuy = LightBlue; // Цвет значка открытия покупки color clOpenSell = LightCoral; // Цвет значка открытия продажи #include // Стандартная библиотека МТ4 //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- gbNoInit=False; if (!IsTradeAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить советнику торговать"); gbNoInit=True; return(0); } if (!IsLibrariesAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить импорт из внешних экспертов"); gbNoInit=True; return(0); } if (!IsTesting()) { if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком"); else Message("Отжата кнопка \"Разрешить запуск советников\""); } //---- GetAv(); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ void deinit(){if(!IsTesting()) Comment("");} //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- if (gbDisabled) { Message("Критическая ошибка! Советник ОСТАНОВЛЕН!"); return(0); } if (gbNoInit) { Message("Не удалось инициализировать советник!"); return(0); } if (!IsTesting()) { if (NumberAccount>0 && NumberAccount!=AccountNumber()) { Comment("Торговля на счёте: "+DoubleToStr(AccountNumber(),0)+" ЗАПРЕЩЕНА!"); return(0); } else Comment(""); if (ShowComment) { string st="CurTime="+TimeToStr(TimeCurrent(), TIME_MINUTES) +" Lots="+DoubleToStr(Lots, 1) +" StopLoss="+DoubleToStr(StopLoss, 0)+" п." +" TakeProfit="+DoubleToStr(TakeProfit, 0)+" п." +IIFs(MarketWatch, " MarketWatch", "") +"\n" +"Magic="+IIFs(Magic<0, "Любой", DoubleToStr(Magic, 0))+" " +IIFs(TSProfitOnly, "TSProfitOnly ", "") +"TStop.Buy="+DoubleToStr(TStop_Buy, 0)+"п " +"TStop.Sell="+DoubleToStr(TStop_Sell, 0)+"п " +"TrailingStep="+DoubleToStr(TrailingStep, 0)+"п " ; Comment(st); } else Comment(""); } //---- if(!ExistPositions(Symbol(),-1,MagicNumber)) { if(SignalFun()>0) OpenPosition(Symbol(), OP_BUY, Lots, Ask-StopLoss*Point, Ask+TakeProfit*Point,MagicNumber); if(SignalFun()<0) OpenPosition(Symbol(), OP_SELL, Lots, Bid+StopLoss*Point, Bid-TakeProfit*Point,MagicNumber); } else SimpleTrailing(Symbol(), -1, MagicNumber); //---- return(0); } //+----------------------------------------------------------------------------+ // Сигнальная функция торговых действий. 1 - покупаем, -1 - продаем, 0 - ждем int SignalFun() { double osma_0 = iOsMA(NULL,0,12,26,9,PRICE_OPEN,0); double osma_1 = iOsMA(NULL,0,12,26,9,PRICE_OPEN,1); if(osma_1<0 && osma_0>0)return(1); if(osma_1>0 && osma_0<0)return(-1); return(0); } //---- //---- bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) { int i, k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (i=0; i0) Print(m); } //+----------------------------------------------------------------------------+ void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) { bool fm; color cl=clrAliceBlue; double op, pa, pb, os, ot; int dg=(int)MarketInfo(OrderSymbol(), MODE_DIGITS), er, it; if (pp<=0) pp=OrderOpenPrice(); if (sl<0 ) sl=OrderStopLoss(); if (tp<0 ) tp=OrderTakeProfit(); pp=NormalizeDouble(pp, dg); sl=NormalizeDouble(sl, dg); tp=NormalizeDouble(tp, dg); op=NormalizeDouble(OrderOpenPrice() , dg); os=NormalizeDouble(OrderStopLoss() , dg); ot=NormalizeDouble(OrderTakeProfit(), dg); if (pp!=op || sl!=os || tp!=ot) { for (it=1; it<=NumberOfTry; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl); if (fm) { if (UseSound) PlaySound(NameFileSound); break; } else { er=GetLastError(); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it); Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(), " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp); Sleep(1000*10); } } } } //+----------------------------------------------------------------------------+ void GetAv() { Label(e_mail+"label", "yuriytokman@gmail.com"); } //---- void Label(string name_label,string text_label,int corner = 2,int x = 3,int y = 15,int font_size = 10,string font_name = "Arial",color text_color = LimeGreen) { if (ObjectFind(name_label)!=-1) ObjectDelete(name_label); ObjectCreate(name_label,OBJ_LABEL,0,0,0,0,0); ObjectSet(name_label,OBJPROP_CORNER,corner); ObjectSet(name_label,OBJPROP_XDISTANCE,x); ObjectSet(name_label,OBJPROP_YDISTANCE,y); ObjectSetText(name_label,text_label,font_size,font_name,text_color); } //----+ void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) { color clOpen; datetime ot; double pp, pa, pb; int dg, err, it, ticket=0; string lsComm="yuriytokman@gmail.com"; if (sy=="" || sy=="0") sy=Symbol(); if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell; for (it=1; it<=NumberOfTry; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) { Print("OpenPosition(): Остановка работы функции"); break; } while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); dg=(int)MarketInfo(sy, MODE_DIGITS); pa=MarketInfo(sy, MODE_ASK); pb=MarketInfo(sy, MODE_BID); if (op==OP_BUY) pp=pa; else pp=pb; pp=NormalizeDouble(pp, dg); ot=TimeCurrent(); if (MarketWatch) ticket=OrderSend(sy, op, ll, pp, Slippage, 0, 0, lsComm, mn, 0, clOpen); else ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen); if (ticket>0) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy); // Вывод сообщения об ошибке Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it); Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op), " pp=",pp," sl=",sl," tp=",tp," mn=",mn); // Блокировка работы советника if (err==2 || err==64 || err==65 || err==133) { gbDisabled=True; break; } // Длительная пауза if (err==4 || err==131 || err==132) { Sleep(1000*300); break; } if (err==128 || err==142 || err==143) { Sleep(1000*66.666); if (ExistPositions(sy, op, mn, ot)) { if (UseSound) PlaySound(NameFileSound); break; } } if (err==140 || err==148 || err==4110 || err==4111) break; if (err==141) Sleep(1000*100); if (err==145) Sleep(1000*17); if (err==146) while (IsTradeContextBusy()) Sleep(1000*11); if (err!=135) Sleep(1000*7.7); } } if (MarketWatch && ticket>0 && (sl>0 || tp>0)) { if (OrderSelect(ticket, SELECT_BY_TICKET)) ModifyOrder(-1, sl, tp); } } //+----------------------------------------------------------------------------+ void SimpleTrailing(string sy="", int op=-1, int mn=-1) { double po, pp; int i, k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (i=0; iTStop_Buy*po) { if (OrderStopLoss()TStop_Sell*po) { if (OrderStopLoss()>pp+(TStop_Sell+TrailingStep-1)*po || OrderStopLoss()==0) { ModifyOrder(-1, pp+TStop_Sell*po, -1); } } } } } } } } //+----------------------------------------------------------------------------+