//+----------------------------------------------------------------------------+ //| e-Trailing2.mq4 | //| | //| Ким Игорь В. aka KimIV | //| http://www.kimiv.ru | //| | //+----------------------------------------------------------------------------+ #property copyright "Ким Игорь В. aka KimIV" #property link "http://www.kimiv.ru" //------- Внешние параметры советника -----------------------------------------+ extern string _P_Expert="---------- Параметры советника"; extern bool AllSymbols = True; // Следить за позициями всех символов extern int Magic = -1; // Идентификатор позиций extern int TrailingStart = 3; // Начальный уровень трала extern int TStop_Buy = 50; // Размер трала в пунктах для покупок extern int TStop_Sell = 35; // Размер трала в пунктах для продаж extern int TrailingStep = 3; // Шаг трала в пунктах extern bool ShowComment = True; // Показывать комментарий //------- Параметры исполнения торговых приказов ------------------------------+ extern string _P_Performance="---------- Параметры исполнения"; extern bool UseSound = True; // Использовать звуковой сигнал extern string SoundSuccess = "expert.wav"; // Звук успеха extern string SoundError = "timeout.wav"; // Звук ошибки extern int NumberOfTry = 2; // Количество торговых попыток //------- Глобальные переменные советника -------------------------------------+ bool gbDisabled = False; // Флаг блокировки советника bool gbNoInit = False; // Флаг неудачной инициализации color clModifyBuy = Aqua; // Цвет значка модификации покупки color clModifySell = Tomato; // Цвет значка модификации продажи //------- Подключение внешних модулей -----------------------------------------+ #include //+----------------------------------------------------------------------------+ //| | //| ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ | //| | //+----------------------------------------------------------------------------+ //| expert initialization function | //+----------------------------------------------------------------------------+ 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("Отжата кнопка \"Разрешить запуск советников\""); } start(); } //+----------------------------------------------------------------------------+ //| expert deinitialization function | //+----------------------------------------------------------------------------+ void deinit() { if(!IsTesting()) Comment(""); } //+----------------------------------------------------------------------------+ //| expert start function | //+----------------------------------------------------------------------------+ void start() { if(gbDisabled) { Message("Критическая ошибка! Советник ОСТАНОВЛЕН!"); return; } if(gbNoInit) { Message("Не удалось инициализировать советник!"); return; } if(ShowComment) { Comment(IIFs(AllSymbols,"AllSymbols ","") ,"Magic=",IIFs(Magic<0,"Любой",DoubleToStr(Magic,0))," " ,"TrailingStart=",DoubleToStr(TrailingStart,0)," п. " ,"TStop_Buy=",DoubleToStr(TStop_Buy,0)," п. " ,"TStop_Sell=",DoubleToStr(TStop_Sell,0)," п. " ,"TrailingStep=",DoubleToStr(TrailingStep,0)," п. " ); } else Comment(""); string sy=IIFs(AllSymbols,"",NULL); SimpleTrailing(sy,-1,Magic); } //+----------------------------------------------------------------------------+ //| | //| ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ | //| | //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 01.09.2005 | //| Описание : Возвращает наименование торговой операции | //+----------------------------------------------------------------------------+ //| Параметры: | //| op - идентификатор торговой операции | //+----------------------------------------------------------------------------+ string GetNameOP(int op) { switch(op) { case OP_BUY : return("Buy"); case OP_SELL : return("Sell"); case OP_BUYLIMIT : return("BuyLimit"); case OP_SELLLIMIT: return("SellLimit"); case OP_BUYSTOP : return("BuyStop"); case OP_SELLSTOP : return("SellStop"); default : return("Unknown Operation"); } } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 18.07.2008 | //| Описание : Возвращает одно из двух значений взависимости от условия. | //+----------------------------------------------------------------------------+ color IIFc(bool condition,color ifTrue,color ifFalse) { if(condition) return(ifTrue); else return(ifFalse); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 01.02.2008 | //| Описание : Возвращает одно из двух значений взависимости от условия. | //+----------------------------------------------------------------------------+ string IIFs(bool condition,string ifTrue,string ifFalse) { if(condition) return(ifTrue); else return(ifFalse); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 01.09.2005 | //| Описание : Вывод сообщения в коммент и в журнал | //+----------------------------------------------------------------------------+ //| Параметры: | //| m - текст сообщения | //+----------------------------------------------------------------------------+ void Message(string m) { Comment(m); if(StringLen(m)>0) Print(m); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 28.11.2006 | //| Описание : Модификация одного предварительно выбранного ордера. | //+----------------------------------------------------------------------------+ //| Параметры: | //| pp - цена установки ордера | //| sl - ценовой уровень стопа | //| tp - ценовой уровень тейка | //| ex - дата истечения | //+----------------------------------------------------------------------------+ void ModifyOrder(double pp=-1,double sl=0,double tp=0,datetime ex=0) { bool fm; color cl=IIFc(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell); 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(SoundSuccess); break; } else { er=GetLastError(); if(UseSound) PlaySound(SoundError); 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); } } } } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 11.09.2008 | //| Описание : Сопровождение позиций простым тралом | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ( "" - любой символ, | //| NULL - текущий символ) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ void SimpleTrailing(string sy="",int op=-1,int mn=-1) { double po,pp; int i,k=OrdersTotal(); if(sy==NULL) sy=Symbol(); for(i=0; i=TrailingStart*po) { if(OrderStopLoss()=TrailingStart*po) { if(OrderStopLoss()>pp+(TStop_Sell+TrailingStep-1)*po || OrderStopLoss()==0) { ModifyOrder(-1,pp+TStop_Sell*po,-1); } } } } } } } } //+----------------------------------------------------------------------------+