//+------------------------------------------------------------------+ //| UP_bot_1.mq4 | //| Copyright © 2014, sova75 | //+------------------------------------------------------------------+ #property copyright "sova75" #property link "html://www.mql4.com" #property version "1.00" #property description "торговля от уровней - вход на втором баре" //--- объявление констант #define BUY 0 // создадим предопределенню переменную со значением 0 #define SEL 1 // создадим предопределенню переменную со значением 1 //--- input parameters extern string separator1 ="------ start trade settings ------"; extern int TakeProfit =30; // уровень TakeProfit extern int StopLoss =0; // уровень StopLoss (if 0 then auto) extern double HLdivergence =0.1; // миним. отклонение двух соседних баров для входа extern double SpanPrice =6; // отступ от стартового уровня для открытия ордера extern double Lots =0.01; // размер ставки extern int MaxTrades =1; // макс. кол-во одновременно открытых ордеров extern int Slippage =5; // проскальзывание extern int MagicNumber =140804; // номер советника extern string separator2 ="------ output settings ------"; extern bool TrailingStop =false; // трал стопов открытых ордеров extern int TrailStopLoss =20; // уровень трала StopLoss extern bool ZeroTrailingStop =false; // трал стопов до уровня БУ extern double StepTrailing =0.5; // шаг трала стопов extern bool OutputAtLower =false; // выход при снижении ниже предыдущего бара extern bool OutputAtRevers =false; // выход при перевороте тренда extern double SpanToRevers =3; // отступ от реверсивного уровня для закрытия ордера //--- глобальные переменные int expertBars; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- проверяем разрядность if(Digits==3 || Digits==5) { TakeProfit *=10; StopLoss *=10; Slippage *=10; SpanPrice *=10; HLdivergence *=10; TrailStopLoss *=10; StepTrailing *=10;} //--- переводим значение переменной HLdivergence в ценовую форму // if(Digits==2 || Digits==3) {HLdivergence/=1000; SpanPrice/=1000;} // else {HLdivergence/=100000; SpanPrice/=100000;} //--- проверяем разрешенные уровни TakeProfit, StopLoss if (TakeProfit= "+DoubleToStr(MarketInfo(_Symbol,MODE_STOPLEVEL),0));} if (StopLoss= "+DoubleToStr(MarketInfo(_Symbol,MODE_STOPLEVEL),0));} //--- return;} //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { return;} //+------------------------------------------------------------------+ //| expert ontick function | //+------------------------------------------------------------------+ void OnTick() { //--- если ордеров нет, проверяем условия для входа if(CountOrders()=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;}} return(count);} //+------------------------------------------------------------------+ //| проверяем бар последнего открытого ордера | //+------------------------------------------------------------------+ bool NextTrade() {int count=0; if(OrdersTotal()==0) return true; for(int i=OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderMagicNumber()==MagicNumber) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(OrderOpenTime()Point*SpanPrice && Bid-Low[0]Point*SpanPrice && High[0]-Bid0) SL=NormalizeDouble(Bid-Point*StopLoss,Digits); else SL=NormalizeDouble(Low[0]-Point*HLdivergence,Digits); TP=NormalizeDouble(Ask+Point*TakeProfit,Digits);} if(typ==SEL) { // если мы хотим открыть ордер на покупку price=NormalizeDouble(Bid,Digits); // запросим цену для его открытия и сразу же ее нормализуем под 4 или 5 знаков автоматически spread=MarketInfo(_Symbol,MODE_SPREAD); if (StopLoss>0) SL=NormalizeDouble(Ask+Point*StopLoss,Digits); else SL=NormalizeDouble(High[0]+Point*HLdivergence+Point*spread,Digits); TP=NormalizeDouble(Bid-Point*TakeProfit,Digits);} if(IsTradeAllowed()) // проверим, свободен ли поток котировок и можем ли мы открыть ордер while(p<5) { // запустим цикл попыток открытия ордера на 5 попыток ticket=OrderSend(Symbol(),typ,Lots,price,Slippage,SL,TP,WindowExpertName()+" "+(string)MagicNumber,MagicNumber,0,clrBlack); if(ticket>=0) // если наш ордер одобрили, запомним его тикет в переменную ticket return true; // выйдем из функции с успехом else { // если сервер не принял наш ордер p++; // увеличим счетчик на 1 Print("OrderSend завершилась с ошибкой #",GetLastError()); // выведем в журнал имя функции и номер ошибки Sleep(500); RefreshRates();}} // подождем полсекунды и обновим данные return false;} // в случае если за 5 попыток ордер не открылся, выйдем из функции с неудачей //+------------------------------------------------------------------+ //| тралим стопы рыночных ордеров | //+------------------------------------------------------------------+ void Trailing() { for(int i=0; i0) SL=NormalizeDouble(Bid-Point*StopLoss,Digits); else SL=NormalizeDouble(Bid-Point*(SpanPrice+HLdivergence),Digits); if(OrderStopLoss()Point*StepTrailing) { if(!OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,clrBlue)) Print("Ошибка модификации ZeroTrailing. Код ошибки=",GetLastError());}}} else { if(OrderStopLoss()>OrderOpenPrice()) { if (StopLoss>0) SL=NormalizeDouble(Ask+Point*StopLoss,Digits); else SL=NormalizeDouble(Ask+Point*(SpanPrice+HLdivergence),Digits); if(OrderStopLoss()>SL && OrderStopLoss()-SL>Point*StepTrailing) { if(!OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,clrRed)) Print("Ошибка модификации ZeroTrailing. Код ошибки=",GetLastError());}}}} else Print("OrderSelect() вернул ошибку - ",GetLastError());}} return;} //+------------------------------------------------------------------+ //| выходим при снижении ниже предыдущего бара | //+------------------------------------------------------------------+ void OutputAL() { for(int i=0; iPoint*SpanToRevers && High[0]-Bid