Andrey1989 0 Share Posted August 14, 2014 (edited) Добрый день! У меня есть простенький советник, он перестал работать после обновления.При попытке запуска в MT4 выдает ошибку инициализации.Пробовал пересобрать- не компилируется(EX4 Write Error).Прошу помочь! Код ниже: //------- Внешние параметры советника -----------------------------------------+extern string _P_Trade = "---------- Параметры торговли";extern string TimeTrade = "19:51"; // Время открытия позицииint Duration = 500; // Продолжительность в секундахextern bool Sell = False; // True-Sell, False-Buyextern double Lots = 0.1; // Размер лотаint StopLoss = 0; // Размер стопа в пунктахint TakeProfit = 0; // Размер тейка в пунктах extern string _P_Expert = "---------- Параметры советника";extern int MagicNumber = 0;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 <stdlib.mqh> // Стандартная библиотека МТ4 //+----------------------------------------------------------------------------+//| |//| ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ |//| |//+----------------------------------------------------------------------------+//| Функция инициализации |//+----------------------------------------------------------------------------+void init() { gbNoInit=False; if (!IsTradeAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить советнику торговать"); gbNoInit=True; return; } if (!IsLibrariesAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить импорт из внешних экспертов"); gbNoInit=True; return; } if (!IsTesting()) { if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком"); else Message("Отжата кнопка \"Разрешить запуск советников\""); }} //+----------------------------------------------------------------------------+//| Функция деинициализации |//+----------------------------------------------------------------------------+void deinit() { if (!IsTesting()) Comment(""); } //+----------------------------------------------------------------------------+//| expert start function |//+----------------------------------------------------------------------------+void start() { if (gbDisabled) { Message("Критическая ошибка! Советник ОСТАНОВЛЕН!"); return; } if (gbNoInit) { Message("Не удалось инициализировать советник!"); return; } if (!IsTesting()) { /*if (NumberAccount>0 && NumberAccount!=AccountNumber()) { Comment("Торговля на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!"); return; } else Comment("");*/ if (ShowComment) { string st="CurTime="+TimeToStr(TimeCurrent(), TIME_MINUTES) +" TimeTrade="+TimeTrade +" Позиция="+GetNameOP(Sell) +" Lots="+DoubleToStr(Lots, 1) +" StopLoss="+DoubleToStr(StopLoss, 0)+" п." +" TakeProfit="+DoubleToStr(TakeProfit, 0)+" п." +IIFs(MarketWatch, " MarketWatch", "") ; Comment(st); } else Comment(""); } if (TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTrade) && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTrade)+Duration) { if (!ExistPositions("", Sell, MagicNumber)) { double sl, tp; if (Sell) { if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0; if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0; } else { if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0; if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0; } OpenPosition("", Sell, Lots, sl, tp, MagicNumber); } }} 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; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (ot<=OrderOpenTime()) return(True); } } } } } } return(False);} string GetNameOP(int op) { switch (op) { case OP_BUY : return("Buy"); case OP_SELL : return("Sell"); case OP_BUYLIMIT : return("Buy Limit"); case OP_SELLLIMIT: return("Sell Limit"); case OP_BUYSTOP : return("Buy Stop"); case OP_SELLSTOP : return("Sell Stop"); default : return("Unknown Operation"); }} string GetNameTF(int TimeFrame=0) { if (TimeFrame==0) TimeFrame=Period(); switch (TimeFrame) { case PERIOD_M1: return("M1"); case PERIOD_M5: return("M5"); case PERIOD_M15: return("M15"); case PERIOD_M30: return("M30"); case PERIOD_H1: return("H1"); case PERIOD_H4: return("H4"); case PERIOD_D1: return("Daily"); case PERIOD_W1: return("Weekly"); case PERIOD_MN1: return("Monthly"); default: return("UnknownPeriod"); }} string IIFs(bool condition, string ifTrue, string ifFalse) { if (condition) return(ifTrue); else return(ifFalse);} void Message(string m) { Comment(m); if (StringLen(m)>0) Print(m);} void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) { bool fm; color cl; double op, pa, pb, os, ot; int dg=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 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=WindowExpertName()+" "+GetNameTF(Period()); 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=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); }}//+----------------------------------------------------------------------------+//------- Внешние параметры советника -----------------------------------------+extern string _P_Trade = "---------- Параметры торговли";extern string TimeTrade = "19:51"; // Время открытия позицииint Duration = 500; // Продолжительность в секундахextern bool Sell = False; // True-Sell, False-Buyextern double Lots = 0.1; // Размер лотаint StopLoss = 0; // Размер стопа в пунктахint TakeProfit = 0; // Размер тейка в пунктах extern string _P_Expert = "---------- Параметры советника";extern int MagicNumber = 0;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 <stdlib.mqh> // Стандартная библиотека МТ4 //+----------------------------------------------------------------------------+//| |//| ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ |//| |//+----------------------------------------------------------------------------+//| Функция инициализации |//+----------------------------------------------------------------------------+void init() { gbNoInit=False; if (!IsTradeAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить советнику торговать"); gbNoInit=True; return; } if (!IsLibrariesAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить импорт из внешних экспертов"); gbNoInit=True; return; } if (!IsTesting()) { if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком"); else Message("Отжата кнопка \"Разрешить запуск советников\""); }} //+----------------------------------------------------------------------------+//| Функция деинициализации |//+----------------------------------------------------------------------------+void deinit() { if (!IsTesting()) Comment(""); } //+----------------------------------------------------------------------------+//| expert start function |//+----------------------------------------------------------------------------+void start() { if (gbDisabled) { Message("Критическая ошибка! Советник ОСТАНОВЛЕН!"); return; } if (gbNoInit) { Message("Не удалось инициализировать советник!"); return; } if (!IsTesting()) { /*if (NumberAccount>0 && NumberAccount!=AccountNumber()) { Comment("Торговля на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!"); return; } else Comment("");*/ if (ShowComment) { string st="CurTime="+TimeToStr(TimeCurrent(), TIME_MINUTES) +" TimeTrade="+TimeTrade +" Позиция="+GetNameOP(Sell) +" Lots="+DoubleToStr(Lots, 1) +" StopLoss="+DoubleToStr(StopLoss, 0)+" п." +" TakeProfit="+DoubleToStr(TakeProfit, 0)+" п." +IIFs(MarketWatch, " MarketWatch", "") ; Comment(st); } else Comment(""); } if (TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTrade) && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTrade)+Duration) { if (!ExistPositions("", Sell, MagicNumber)) { double sl, tp; if (Sell) { if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0; if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0; } else { if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0; if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0; } OpenPosition("", Sell, Lots, sl, tp, MagicNumber); } }} 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; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (ot<=OrderOpenTime()) return(True); } } } } } } return(False);} string GetNameOP(int op) { switch (op) { case OP_BUY : return("Buy"); case OP_SELL : return("Sell"); case OP_BUYLIMIT : return("Buy Limit"); case OP_SELLLIMIT: return("Sell Limit"); case OP_BUYSTOP : return("Buy Stop"); case OP_SELLSTOP : return("Sell Stop"); default : return("Unknown Operation"); }} string GetNameTF(int TimeFrame=0) { if (TimeFrame==0) TimeFrame=Period(); switch (TimeFrame) { case PERIOD_M1: return("M1"); case PERIOD_M5: return("M5"); case PERIOD_M15: return("M15"); case PERIOD_M30: return("M30"); case PERIOD_H1: return("H1"); case PERIOD_H4: return("H4"); case PERIOD_D1: return("Daily"); case PERIOD_W1: return("Weekly"); case PERIOD_MN1: return("Monthly"); default: return("UnknownPeriod"); }} string IIFs(bool condition, string ifTrue, string ifFalse) { if (condition) return(ifTrue); else return(ifFalse);} void Message(string m) { Comment(m); if (StringLen(m)>0) Print(m);} void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) { bool fm; color cl; double op, pa, pb, os, ot; int dg=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 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=WindowExpertName()+" "+GetNameTF(Period()); 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=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); }}//+----------------------------------------------------------------------------+ Edited August 14, 2014 by AntFX Link to post Share on other sites
Vlad07 0 Share Posted August 17, 2014 Держите. Доброго дня. А что за советник? Какой принцип работы? Есть стейтменты? Если интересно - могу поставить на cent и дать инвестпароль. Link to post Share on other sites
Recommended Posts