//+----------------------------------------------------------------------------+ //| e-OpenByTime.mq4 | //| | //| Идея : Владимир, sibtrade@hotbox.ru | //| Реализация: Ким Игорь В. aka KimIV, http://www.kimiv.ru | //| | //| 2007.04.27 Открытие позиции в заданное время. | //+----------------------------------------------------------------------------+ #property copyright "Владимир & KimIV" #property link "http://www.kimiv.ru" //------- Внешние параметры советника ------------------------------------------ extern string _P_Trade = "---------- Параметры торговли"; extern string TimeTrade = "19:51"; // Время открытия позиции extern bool Sell = False; // True-Sell, False-Buy extern double Lots = 0.1; // Размер лота extern int StopLoss = 30; // Размер стопа в пунктах extern int TakeProfit = 60; // Размер тейка в пунктах 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 int Slippage = 3; // Проскальзывание цены extern int NumberOfTry = 5; // Количество торговых попыток extern int PauseAfterError = 75; // Пауза после ошибки в секундах //------- Глобальные переменные советника -------------------------------------- bool gbDisabled = False; // Флаг блокировки советника color clOpenBuy = LightBlue; // Цвет значка открытия покупки color clOpenSell = LightCoral; // Цвет значка открытия продажи //------- Подключение внешних модулей ------------------------------------------ #include // Стандартная библиотека МТ4 //+----------------------------------------------------------------------------+ //| | //| ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ | //| | //+----------------------------------------------------------------------------+ //| Функция инициализации | //+----------------------------------------------------------------------------+ void init() { gbDisabled = False; if (!IsTradeAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить советнику торговать"); gbDisabled=True; return; } if (!IsLibrariesAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить импорт из внешних экспертов"); gbDisabled=True; return; } if (!IsTesting()) { if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком"); else Message("Отжата кнопка \"Разрешить запуск советников\""); } } //+----------------------------------------------------------------------------+ //| Функция деинициализации | //+----------------------------------------------------------------------------+ void deinit() { if (!IsTesting()) Comment(""); } //+----------------------------------------------------------------------------+ //| expert start function | //+----------------------------------------------------------------------------+ void start() { if (gbDisabled) { Message("Не удалось инициализировать советник!"); return; } if(DayOfWeek()==0 || DayOfWeek()==6) return; if (AccountFreeMargin()<1000*Lots) { Print("Не хватает средств. Free Margin = ", AccountFreeMargin()); 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)+" п." ; Comment(st); } else Comment(""); } if (TimeCurrent()>StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTrade)) { 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, sl, tp, MagicNumber); } } } //+----------------------------------------------------------------------------+ //| | //| ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ | //| | //+----------------------------------------------------------------------------+ //| Возвращает флаг существования позиций | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ bool ExistPositions(string sym="", int op=-1, int mn=-1) { int i, k=OrdersTotal(); if (sym=="") sym=Symbol(); for (i=0; i0) Print(m); } //+----------------------------------------------------------------------------+ //| Открытие позиции | //| Параметры: | //| op - операция | //| sl - уровень стоп | //| tp - уровень тейк | //| mn - MagicNumber | //+----------------------------------------------------------------------------+ void OpenPosition(int op, double sl=0, double tp=0, int mn=0) { color clOpen; double ll, pp; int err, it, ticket; string lsComm=WindowExpertName()+" "+GetNameTF(Period()); if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell; ll=GetSizeLot(); for (it=1; it<=NumberOfTry; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); if (op==OP_BUY) pp=Ask; else pp=Bid; pp=NormalizeDouble(pp, Digits); ticket=OrderSend(Symbol(),op,ll,pp,Slippage,sl,tp,lsComm,mn,0,clOpen); if (ticket>0) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); if (err==128 || err==142 || err==143 || err==144) { Sleep(1000*PauseAfterError); if (ExistPositions(Symbol(), op, mn)) { if (UseSound) PlaySound(NameFileSound); break; } Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it); continue; } if (err==146) while (IsTradeContextBusy()) Sleep(1000*PauseAfterError); Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it); Print("Ask=",Ask," Bid=",Bid," ll=",ll," op=",GetNameOP(op), " pp=",pp," sl=",sl," tp=",tp," mn=",mn); if (err==2 || err==64 || err==65 || err==4110 || err==4111) break; Sleep(1000*PauseAfterError); } } } //+----------------------------------------------------------------------------+