//+------------------------------------------------------------------+ //| ZigAndZag_trader.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #include //---- input parameters extern double Lots=0.1;//торгуемый лот extern int ZZbar=1;//баров назад с которого берем сигнал к торговле extern int Closebar=3;//баров назад с которого берем сигнал к закрытию extern int CloseBars=5;//запрет закрытия на кол-во баров с момента откр ордера extern int Maxord=10;//количество торгуемых ордеров(пока оставить 1)воможно будет мультиордерная система extern int Sl=0;//стоплос подбирается при оптимизации extern int Tp=0;//тейк подбирается при оптимизации extern int bu=0;// extern int Rew=0;//реверс позиций extern int ClosePos=1;//Разрешает закрытие позиций по сигналу индикатора extern bool Drive=false; extern bool _Bu=false; extern bool Autolot=true;//включение - отключение автолота extern int magic=78977;//магик //----------------------- static int prevtime = 0 ; bool buy,sell,close,NumberOfTry=3,UseSound=false; bool first=true,newday=true; double MinLot, MaxLot, MarginMinLot; int MinLotDgts,Slippage=3,period,GrossPeriod,GrossTrand=0; string NameFileSound = "expert.wav"; // Наименование звукового файла color clOpenBuy = Blue; // Цвет значка открытия Buy color clOpenSell = Red; // Цвет значка открытия Sell bool MarketWatch=false; bool gbDisabled = False; // Блокировка //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ void FirstCalc() { // // Предстартовый расчет. Выполняется один раз - при запуске // (и каждый раз после сбоя связи). // first=false; //+--- Минимальный и максимальный размеры лотов MinLot=MarketInfo(Symbol(),MODE_MINLOT); if(MinLot<0.1) MinLotDgts=2; // размерность минлота else { if(MinLot<1.0) MinLotDgts=1; else MinLotDgts=0; } MaxLot=MarketInfo(Symbol(),MODE_MAXLOT); //---- return; } //+------------------------------------------------------------------+ void init(){ if(Period()==5){period= 15;GrossPeriod=30;} if(Period()==15){period= 30;GrossPeriod=60;} if(Period()==30){period= 60;GrossPeriod=240;} if(Period()==60){period= 240;GrossPeriod=1440;} if(Period()==240){period= 1440;GrossPeriod=10080;} if(Period()==1440){period= 10080;GrossPeriod=43200;} if(Period()<5||Period()>10080){GrossPeriod=0;}return;} //------------------------------------------------------------------- int start() { if(NewDay()){newday=true;} if(GrossPeriod==0){Comment("Не правильный период, Рабoта остановленна!"); return(0);} if(first==true) FirstCalc(); // Ждем, когда сформируется новый бар if (Time[0] == prevtime) return(0); prevtime = Time[0]; buy=false;sell=false; close=false; //------------Перевод в безубыток------------------------------------+ if(OrdersTotal()>0&&_Bu){ for(int x=0;x0&&newday){ if(buy&&OrdersTotal()0){ if(((GetPosType()==0&&sell)||(GetPosType()==1&&buy))){ for(int i=0;i0){del(OrderTicket());close=false;}} if(ClosePos>0){del(OrderTicket());close=false;} }}}} //---- return(0); } //-------------------------------------------------------------------+ int GetPosType(){ for(int i=0;iMarketInfo(OrderSymbol(),MODE_ASK)+(MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Point)&&sl!=OrderStopLoss()){ err = OrderModify(ti,OrderOpenPrice(),sl,OrderTakeProfit(),0,White);}}} return(err); } //--------------------------------------------------------------------+ //-----------------------------------------------------------------------------+ //___________________КИМУ_______РЕСПЕКТ________И_____УВАЖУХА___________________| //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. 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=Red; 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); } } } } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 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) sl=MarketInfo(Symbol(),MODE_ASK)-Sl*Point; else sl=0; if (Tp>0) tp=MarketInfo(Symbol(),MODE_ASK)+Tp*Point; else tp=0; }else{ if (Sl>0) sl=MarketInfo(Symbol(),MODE_BID)+Sl*Point; else sl=0; if (Tp>0) tp=MarketInfo(Symbol(),MODE_BID)-Tp*Point; else tp=0; } if (sy=="" || sy=="0") sy=Symbol(); if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell; for (it=1; it<=NumberOfTry; it++) { if (!IsTesting() && 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); } } //+----------------------------------------------------------------------------+