//+------------------------------------------------------------------------------+ //| Gena.mq4 | //| Copyright © 2009 gorby777 | //| gorby_e-mail@rambler.ru | //|Особое СПАСИБО Киму Игорю В. (aka KimIV, http://www.kimiv.ru) за его функции | //+------------------------------------------------------------------------------+ #property copyright "Copyright © 2009 gorby777" #property link "gorby_e-mail@rambler.ru" extern int Hour_ = 0; // Час начала торговли extern int Delta = 20; // Уровень от базовой цены до цены открытия отложенника extern double xD = 1; // Коэфф. к Delta для трала extern int TakeProfit = 70; // И так понятно extern bool MM = true; // И так понятно extern string s0 = "---Trailing---"; extern bool Trailing = true; // И так понятно extern bool TrailProfitOnly = true; // Тралить только профит extern string s1 = "---Trading---"; extern bool StopTrading = false; // Приостановка торговли вручную static bool TradeAllowed = true; // Остановка торговли советником int TrailingStep = 1; // Шаг трала в пунктах double ContinuousLot = 0.1; // Размер постоянного лота при ММ=false int TStop.Buy = 0; // Размер трала в пунктах для покупок int TStop.Sell = 0; // Размер трала в пунктах для продаж double BuyStopPrice = 0.0; double SellStopPrice = 0.0; bool Check_5Digits = false; int modeSetOrders = 0; // 0 - по заданной цене // 1 - скорректировать цены // 2 - вход по текущим ценам static int LastHour; static int Magic, MagicOfName, MagicOfSymbol; int Slippage = 0; double Point_; string symbol, ExpertName, AccNumber; color clOpenBuy = LightBlue; // Цвет значка открытия покупки color clOpenSell = LightCoral; // Цвет значка открытия продажи color clCloseBuy = Blue; // Цвет значка закрытия покупки color clCloseSell = Red; // Цвет значка закрытия продажи color clModifyBuy = Aqua; // Цвет значка модификации покупки color clModifySell = Tomato; // Цвет значка модификации продажи bool MarketWatch = True; // Запросы под исполнение "Market Watch". static bool SetFlag = false; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int init(){ symbol = Symbol(); ExpertName = WindowExpertName(); AccNumber = DoubleToStr(AccountNumber(),0); MagicOfName = 0; for(int i=StringLen(ExpertName)-1;i>=0;i--) //Составной магик: MagicOfName=MagicOfName+StringGetChar(ExpertName,i)*(i+1); //учитывает имя эксперта и MagicOfSymbol=StringGetChar(symbol,0)*StringGetChar(symbol,5)+ //название торгуемой пары StringGetChar(symbol,1)*StringGetChar(symbol,4)+ StringGetChar(symbol,2)*StringGetChar(symbol,3); Magic=MagicOfSymbol+MagicOfName; if (!GlobalVariableCheck(symbol+"_Price")) GlobalVariableSet(symbol+"_Price",0); //На случай аварийного выхода if (!GlobalVariableCheck(symbol+"_Time")) GlobalVariableSet(symbol+"_Time",0); //организуем глобальные переменные if (!GlobalVariableCheck(symbol+"_Ticket")) GlobalVariableSet(symbol+"_Ticket",-1); //для сохранения критических данных if (!GlobalVariableCheck("Risk")) GlobalVariableSet("Risk",2); //Уровень риска для мультивалютной торговли Point_=Point; if(Check_5Digits == true && (Digits == 3 || Digits == 5)){ //Для корректной работы с 5-ю знаками Alert("Digits=", Digits, " Broker quotes given in 5-digit mode. \"Point\" will be multiplied by 10"); //в котировках Point_ = 10*Point; int ticket=GlobalVariableGet(symbol+"_Ticket"); Restart(ticket); //Если перезапуск терминала } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int deinit(){ } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int start(){ if(!TradeAllowed || StopTrading)return(0); //Торговать - не торговать /* if(LastHour!=Hour() && symbol=="GBPJPY"){ //Ежечасно робот шлет нам доклад double am=AccountMargin(); //о состоянии счета if(AccountMargin()==0)am=1; SendMail(DoubleToStr(AccountNumber(),0)+" "+symbol+" "+TimeToStr(TimeCurrent(),TIME_MINUTES), DoubleToStr(AccountEquity(),0)+", Level "+DoubleToStr(100*AccountEquity()/am,0)+"%"); LastHour=Hour(); }*/ int Minute5 = MathMod(Minute(),5); //Не суетимся, за рынком if(Minute5 == 0){ //присматриваем каждые 5 минут int spread = MarketInfo(symbol,MODE_SPREAD); static int ticket; int orders=0; for(int i=OrdersTotal()-1;i>=0;i--){ //Подсчет ордеров OrderSelect(i,SELECT_BY_POS); if(OrderMagicNumber()!=Magic) continue; orders++; } switch(orders){ case 0: InitPrice(); //Установка базовых цены и времени double base=GlobalVariableGet(symbol+"_Price"); //или (-1) обнуление, если ордера нет Comment("Robot is ready.", "\n", "Starting time ... ",TimeToStr(GlobalVariableGet(symbol+"_Time"),TIME_MINUTES),"\n", "Base price ... ", NormalizeDouble(base,Digits),"\n", "Delta ... ", NormalizeDouble(Delta,0)); if(base!=0){ datetime DateExp=GlobalVariableGet(symbol+"_Time")+86400; //Рестарт, если в течение суток if(TimeCurrent()>DateExp){ //ордер не установлен Restart(-1); return(0); } if(Ask >= base+Delta*Point_){ BuyStopPrice=base+(Delta+spread)*Point_; //Установка цены открытия байстоп ордера SellStopPrice=base-Delta*Point_; //Установка цены открытия селлстоп ордера ticket = OrderSend_(symbol, OP_SELLSTOP, Lot(), SellStopPrice, Slippage, base+spread*Point, //Установка отложенника SellStopPrice - TakeProfit*Point_, ExpertName, Magic,DateExp,Red); Restart(ticket); //Возврат в исходное состояние при return(0); //при установленном ордере } if(Bid<=base-Delta*Point_){ BuyStopPrice=base+Delta*Point_; SellStopPrice=base-Delta*Point_; ticket = OrderSend_(symbol, OP_BUYSTOP, Lot(), BuyStopPrice, Slippage, base, BuyStopPrice + TakeProfit*Point_, ExpertName, Magic,DateExp,Blue); Restart(ticket); return(0); } } return(0); case 1: Comment(""); //Удаление прежнего коммента ticket=GlobalVariableGet(symbol+"_Ticket"); //Получаем № тикета рабочего ордера if(ticket<=0)return(0); OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES); if(OrderType()==OP_SELLSTOP) if(Ask>=OrderStopLoss() + TakeProfit*Point_){ Restart(-1);return(0); //Рестарт, если цена пошла "не туда" } if(OrderType()==OP_BUYSTOP) if(Bid<=OrderStopLoss() - TakeProfit*Point_){ Restart(-1);return(0); } if(Trailing)Trailing(ticket,Magic,xD*Delta); //Трейлинг позиции return(0); default: ticket=GlobalVariableGet(symbol+"_Ticket"); //Получаем № тикета рабочего ордера OrderDelete_(-1,Magic,ticket,-1); //Удаляем "мусор" return(0); } } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ bool InitPrice(){ //Ф-ция установки базовых параметров if (Hour()==Hour_ && !SetFlag){ GlobalVariableSet(symbol+"_Price",iOpen(symbol,60,0)); //Сохраняет базовую цену GlobalVariableSet(symbol+"_Time",TimeCurrent()); //и время начала торговли SetFlag=true; } return(SetFlag); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ double Lot(){ if(!MM)return(ContinuousLot); double Risk=GlobalVariableGet("Risk"); double tick=MarketInfo(symbol,MODE_TICKVALUE); //Ф-ция рассчитывает лот таким образом, double lot= NormalizeDouble(AccountEquity()*Risk/(2*Delta*100*tick),2); //что лосс равен установленному if(lot<0.01){ //проценту от депозита TradeAllowed=false; Alert(symbol,". NO MONEY!"); lot=0; } return(lot); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ bool Restart(int ticket){ //Ф-ция возврата к исходному состоянию OrderDelete_(-1,Magic,ticket,-1); //Удаление ордеров, кроме ticket GlobalVariableSet(symbol+"_Price",0); //Обнуление базовой цены GlobalVariableSet(symbol+"_Ticket",ticket); //Сохранение тикета работающего ордера SetFlag=false; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Параметры: | //| op - операция (-1 - любой ордер) | //| mn - MagicNumber (-1 - любой магик) | //| tkt1,tkt2- пропустить (-1 - удалить все) | //+----------------------------------------------------------------------------+ bool OrderDelete_(int op=-1, int mn=-1, int tkt1=-1, int tkt2=-1) { bool res=true; int err, i, it, k=OrdersTotal(), ot; for (i=k-1; i>=0; i--){ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if(OrderTicket()==tkt1 || OrderTicket()==tkt2)continue; ot=OrderType(); if (ot>1 && ot<6){ if (op<0 || ot==op){ if (mn<0 || OrderMagicNumber()==mn){ for (it=1; it<=5; it++){ if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); res=OrderDelete(OrderTicket(), Yellow); if (res) break; else { err=GetLastError(); Print("Error(",err,"), failed delete order",", try ",it); Sleep(5000); } } } } } } } return(res); } //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента (NULL или "" - текущий символ) | //| op - операция | //| ll - лот | //| pp - цена | //| slip-слиппадж //| sl - уровень стоп | //| tp - уровень тейк | //| co - комментарий //| mn - Magic Number | //| ex - Срок истечения | //| | //+----------------------------------------------------------------------------+ int OrderSend_(string sy, int op, double ll, double pp,double Slippage, double sl=0, double tp=0, string co="",int mn=0, datetime ex=0, color cl=0) { cl=IIFc(op==OP_BUYLIMIT || op==OP_BUYSTOP, clOpenBuy, clOpenSell); datetime ot; double pa, pb, mp; int err, it, ticket, msl; msl=MarketInfo(sy, MODE_STOPLEVEL); if (ex>0 && ex0) { break; } else { err=GetLastError(); if (err==128 || err==142 || err==143) { Sleep(1000*66); if (OrderExist_(sy, op, mn, ot)) { break; } Print("Error(",err,") set order: ",", try ",it); continue; } mp=MarketInfo(sy, MODE_POINT); pa=MarketInfo(sy, MODE_ASK); pb=MarketInfo(sy, MODE_BID); Print("Error(",err,") set order: ",", try ",it); Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=", " pp=",pp," sl=",sl," tp=",tp," mn=",mn); // Неправильные стопы if (err==130) { // Корректировка ценовых уровней if (modeSetOrders==1) { Sleep(1000*5.3); switch (op) { case OP_BUYLIMIT: if (pp>pa-msl*mp) pp=pa-msl*mp; if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp; if (tp>0 && tppp-(msl+1)*mp) sl=pp-(msl+1)*mp; if (tp>0 && tp0 && slpp-(msl+1)*mp) tp=pp-(msl+1)*mp; break; case OP_SELLSTOP: if (pp>pb-msl*mp) pp=pb-msl*mp; if (sl>0 && slpp-(msl+1)*mp) tp=pp-(msl+1)*mp; break; } Print("SetOrder(): Скорректированы ценовые уровни"); continue; } // Вход по текущим ценам if (modeSetOrders==2) { Print("SetOrder(): Вход по текущим ценам"); if (op==OP_BUYLIMIT || op==OP_BUYSTOP) OpenPosition(sy, OP_BUY, ll, sl, tp, mn, co); if (op==OP_SELLLIMIT || op==OP_SELLSTOP) OpenPosition(sy, OP_SELL, ll, sl, tp, mn, co); break; } } // Блокировка работы советника if (err==2 || err==64 || err==65 || err==133) { TradeAllowed=false; break; } // Длительная пауза if (err==4 || err==131 || err==132) { Sleep(1000*300); break; } // Слишком частые запросы (8) или слишком много запросов (141) if (err==8 || err==141) Sleep(1000*100); if (err==139 || err==140 || err==148) break; // Ожидание освобождения подсистемы торговли if (err==146) while (IsTradeContextBusy()) Sleep(1000*11); // Обнуление даты истечения if (err==147) { ex=0; continue; } if (err!=135 && err!=138) Sleep(1000*7.7); } } return(ticket); } //+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любой ордер) | //| mn - MagicNumber (-1 - любой магик) | //| ot - время открытия ( 0 - любое время установки) | //+----------------------------------------------------------------------------+ bool OrderExist_(string sy="", int op=-1, int mn=-1, datetime ot=0) { int i, k=OrdersTotal(), ty; if (sy=="0") sy=Symbol(); for (i=0; i1 && ty<6) { if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) { if (mn<0 || OrderMagicNumber()==mn) { if (ot<=OrderOpenTime()) return(True); } } } } } return(False); } //| Описание : Возвращает одно из двух значений взависимости от условия. | //+----------------------------------------------------------------------------+ color IIFc(bool condition, color ifTrue, color ifFalse) { if (condition) return(ifTrue); else return(ifFalse); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 10.04.2008 | //| Описание : Открывает позицию по рыночной цене. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента (NULL или "" - текущий символ) | //| op - операция | //| ll - лот | //| sl - уровень стоп | //| tp - уровень тейк | //| mn - MagicNumber | //| co - комментарий | //+----------------------------------------------------------------------------+ void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0, string co="") { color clOpen; datetime ot; double pp, pa, pb; int dg, err, it, ticket=0; if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell; for (it=1; it<=5; 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, co, mn, 0, clOpen); else ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, co, mn, 0, clOpen); if (ticket>0) { break; } else { err=GetLastError(); // Вывод сообщения об ошибке Print("Error(",err,") opening position: ",", try ",it); Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=", " pp=",pp," sl=",sl," tp=",tp," mn=",mn); // Блокировка работы советника if (err==2 || err==64 || err==65 || err==133) { TradeAllowed=false; 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)) { 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)) OrderModify_(-1, sl, tp); } } //+----------------------------------------------------------------------------+ //| Версия : 06.03.2008 | //| Описание : Возвращает флаг существования позиций | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //| ot - время открытия ( 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){ TStop.Buy=NormalizeDouble(TStop,0); TStop.Sell=NormalizeDouble(TStop,0); } OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); if (mn<0 || OrderMagicNumber()==mn) { if (OrderType()==OP_BUY) { pp=MarketInfo(OrderSymbol(), MODE_BID); if (!TrailProfitOnly || pp-OrderOpenPrice()>TStop.Buy*Point_) { if (OrderStopLoss()TStop.Sell*Point_) { if (OrderStopLoss()>pp+(TStop.Sell+TrailingStep-1)*Point_ || OrderStopLoss()==0) { ModifyOrder(-1, pp+TStop.Sell*Point_, -1); } } } } } //+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. 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<=5; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl); if (fm) { break; } else { er=GetLastError(); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); Print("Error(",er,") modifying order, try ",it); Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(), " pp=",pp," sl=",sl," tp=",tp); Sleep(1000*10); } } } }