Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2425

 

Здравствуйте. Хочу сделать советник. Он очень простой, но я нигде не нашел похожего. Я нашел 3 советника, каждый из которых удовлетворяет 1 условие и задача - их объеденить в один.

Для начала вот есть советник, который открывает отложки со стопами и траллом, но нужно, чтобы он запускался и закрывался по времени.


//--------------------------------------------------------------------
extern int     Stoploss             = 10,     //стоплосс, если 0 то не изменяется
               Takeprofit           = 50;     //тейкпрофит, если 0 то не изменяется
extern datetime Open_Time=D'13.07.2024 13:00'; //время открытия ордеров
datetime Close_Time=D'13.07.2024 23:00'; //время закрытия ордеров                      
extern int     TrailingStop         = 10;     //длинна тралла, если 0 то нет тралла
extern int     TrailingStart        = 0;      //когда включать тралл, например после достижения 40 п прибыл
extern int     StepTrall            = 2;      //шаг тралла - перемещать стоплосс не ближе чем StepTrall
extern int     NoLoss               = 0,      //перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
               MinProfitNoLoss      = 0;      //минимальная прибыль при переводе вбезубыток
extern int     Magic                = 77;     //магик
extern int     Step                 = 10;     //расстояние от цены
extern double  Lot                  = 0.1;
extern int     TimeModify           = 30;     //кол-во секунд раньше которого запрещено изменять ордер
extern int     slippage             = 30;     //Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
//--------------------------------------------------------------------
datetime  TimeBarB,TimeBarS;
//--------------------------------------------------------------------
int start()                                  
{
   double STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   double OSL=0,StLo=0,PriceB=0,PriceS=0,OOP=0,SL=0,TP=0;
   int b=0,s=0,TicketB=0,TicketS=0,OT;
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
         { 
            OT = OrderType(); 
            OSL = NormalizeDouble(OrderStopLoss(),Digits);
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            SL=OSL;
            if (OT==OP_BUY)             
            {  
               b++;
               if (OSL<OOP && NoLoss!=0)
               {
                  StLo = NormalizeDouble(OOP+MinProfitNoLoss*Point,Digits); 
                  if (StLo > OSL && StLo <= NormalizeDouble(Bid - STOPLEVEL * Point,Digits)) SL = StLo;
               }
               
               if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (Bid - OOP)/Point >= TrailingStart)
               {
                  StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits); 
                  if (StLo>=OOP && StLo > OSL+StepTrall*Point) SL = StLo;
               }
               
               if (SL > OSL)
               {  
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error ",GetLastError(),"   Order Modify Buy   SL ",OSL,"->",SL);
                  else Print("Order Buy Modify   SL ",OSL,"->",SL);
               }
            }                                         
            if (OT==OP_SELL)        
            {
               s++;
               if ((OSL>OOP || OSL==0) && NoLoss!=0)
               {
                  StLo = NormalizeDouble(OOP-MinProfitNoLoss*Point,Digits); 
                  if ((StLo < OSL || OSL==0) && StLo >= NormalizeDouble(Ask + STOPLEVEL * Point,Digits)) SL = StLo;
               }
               
               if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (OOP - Ask)/Point >= TrailingStart)
               {
                  StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits); 
                  if (StLo<=OOP && (StLo < OSL-StepTrall*Point || OSL==0)) SL = StLo;
               }
               
               if ((SL < OSL || OSL==0) && SL!=0)
               {  
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error ",GetLastError(),"   Order Modify Sell   SL ",OSL,"->",SL);
                  else Print("Order Sell Modify   SL ",OSL,"->",SL);
               }
            } 
            if (OT==OP_BUYSTOP)  {PriceB=OOP; TicketB=OrderTicket();}     
            if (OT==OP_SELLSTOP) {PriceS=OOP; TicketS=OrderTicket();}  
         }
      }
   }
   if (b+TicketB==0)
   {
      if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid - Stoploss * Point,Digits); else SL=0;
      if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask + Takeprofit * Point,Digits); else TP=0;
      if (OrderSend(Symbol(),OP_BUYSTOP,Lot,NormalizeDouble(Ask+Step * Point,Digits),slippage,SL,TP,"news",Magic,0,CLR_NONE)!=-1) TimeBarB=TimeCurrent();
   } 
   if (s+TicketS==0)
   {
      if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask + Stoploss * Point,Digits); else SL=0;
      if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid - Takeprofit * Point,Digits); else TP=0;
      if (OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - Step * Point,Digits),slippage,SL,TP,"news",Magic,0,CLR_NONE)!=-1) TimeBarS=TimeCurrent();
   } 
   if (TicketB!=0)
   {
      if (TimeBarB<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Ask + Step * Point,Digits)-PriceB)/Point>StepTrall)
      {
         if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid - Stoploss * Point,Digits); else SL=0;
         if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask + Takeprofit * Point,Digits); else TP=0;
         if (OrderModify(TicketB,NormalizeDouble(Ask + Step * Point,Digits),SL,TP,0,CLR_NONE)) TimeBarB=TimeCurrent();
      }
   } 
   if (TicketS!=0)
   {
      if (TimeBarS<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Bid - Step * Point,Digits)-PriceS)/Point>StepTrall)
      {
         if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask + Stoploss * Point,Digits); else SL=0;
         if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid - Takeprofit * Point,Digits); else TP=0;
         if (OrderModify(TicketS,NormalizeDouble(Bid - Step * Point,Digits),SL,TP,0,CLR_NONE)) TimeBarS=TimeCurrent();
      }
   } 
return(0);
}
//--------------------------------------------------------------------


Я выставил переменные открытия и закрытия ордеров, а вот дальше никак не могу разобраться как вставить таймер в код.

Помогите разобраться.

 
mihmihail #:
Я нашел 3 советника

где вы все ЭТО находите ? на каких, извините, помойках 

оно ужас какое старое...10-15 лет. и с тьмой очевидных ошибок. То есть даже тогда оно не работало

тут ничем не помочь, тут просто переписать заново

 

Но всё работает как нужно. Просто возможно код корявый. У меня есть еще один советник:

#property copyright "Qstr © 2018"
#property link      "http://qstr.ru/"
#property strict
extern string vline_name="time";
extern double Lots=0.1; //рабочий лот
extern int TP=500; //тейк профит
extern int SL=200; //стоп лосс
extern datetime Open_Time=D'01.09.2018 13:00'; //время открытия ордеров
datetime Close_Time=D'01.09.2018 13:00'; //время закрытия ордеров
extern int time_op = 11; // Время жизни неоткрытого ордера
extern int slippage =2;  //уровень допустимого реквота
extern int MagicNumber=5345; //магическое число ордеров
extern bool Open_Sell_Stop=True; //включение/выключение работы с sell stop-ордерами
extern bool Open_Buy_Stop=True;  //включение/выключение работы с buy stop-ордерами
extern bool Open_Sell=false; //включение/выключение работы с sell-ордерами
extern bool Open_Buy=false;  //включение/выключение работы с buy-ордерами
extern bool Open_Sell_Limit=false; //включение/выключение работы с sell limit-ордерами
extern bool Open_Buy_Limit=false;  //включение/выключение работы с buy limit-ордерами
extern int  Open_Level=300; //уровень отдаления от цены, на котором ставим отложенный ордер

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
  
  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----


//+----------------------------------------------------------------------------------------------+
//|                              поиск открытых ордеров по паре                                  |
    bool pos_sell=false;
  for (int i_op_sell=OrdersTotal()-1; i_op_sell>=0; i_op_sell--)
  {
   if (!OrderSelect(i_op_sell,SELECT_BY_POS,MODE_TRADES)) break;
   if (Symbol()==OrderSymbol()
   &&(OrderType()==OP_SELL||OrderType()==OP_SELLSTOP||OrderType()==OP_SELLLIMIT)
   &&(OrderMagicNumber()==MagicNumber)
   &&MathFloor(OrderOpenTime()/60)==TimeCurrent()/60)
   {
    pos_sell=true; break;  
   }
  }
    
    bool pos_buy=false;
  for (int i_op_buy=OrdersTotal()-1; i_op_buy>=0; i_op_buy--)
  {
   if (!OrderSelect(i_op_buy,SELECT_BY_POS,MODE_TRADES)) break;
   if (Symbol()==OrderSymbol()
   &&(OrderType()==OP_BUY||OrderType()==OP_BUYSTOP||OrderType()==OP_BUYLIMIT)
   &&(OrderMagicNumber()==MagicNumber)
    &&MathFloor(OrderOpenTime()/60)==TimeCurrent()/60)
   {
    pos_buy=true; break;  
   }
  }    
//|                              поиск открытых ордеров по паре                                  |
//+----------------------------------------------------------------------------------------------+
//+--------------------------------------------+
//|               расчёт TP и SL               |    
  double sl_buy, sl_sell, tp_buy, tp_sell
  
         ,sl_buy_stop, sl_sell_stop,
         tp_buy_stop, tp_sell_stop
        
         ,sl_buy_limit, sl_sell_limit,
         tp_buy_limit, tp_sell_limit;
  if(!SL)
  {
   sl_buy=0;
   sl_sell=0;
  
   sl_buy_stop=0;
   sl_sell_stop=0;
  
   sl_buy_limit=0;
   sl_sell_limit=0;        
  }
  else
  {
   sl_buy=Bid-SL*Point;
   sl_sell=Ask+SL*Point;
  
   sl_buy_stop=Bid+Open_Level*Point-SL*Point;
   sl_sell_stop=Ask-Open_Level*Point+SL*Point;  
  
   sl_buy_limit=Bid-Open_Level*Point-SL*Point;
   sl_sell_limit=Ask+Open_Level*Point+SL*Point;    
  }

  if(!TP)
  {
   tp_buy=0;
   tp_sell=0;
  
   tp_buy_stop=0;
   tp_sell_stop=0;  
  
   tp_buy_limit=0;
   tp_sell_limit=0;    
  }
  else
  {
   tp_buy=Bid+TP*Point;
   tp_sell=Ask-TP*Point;
  
   tp_buy_stop=Bid+Open_Level*Point+TP*Point;
   tp_sell_stop=Ask-Open_Level*Point-TP*Point;    
  
   tp_buy_limit=Bid-Open_Level*Point+TP*Point;
   tp_sell_limit=Ask+Open_Level*Point-TP*Point;    
  }  
//|               расчёт TP и SL               |    
//+--------------------------------------------+


//+-----------------------------------------------------------------------------------------------------------+
//|                                                открытие ордеров                                           |
 
// Закоментировано выставление времени вертикальной линией. Линию назвать time
 
 //  if(ObjectFind(vline_name)==-1)return(0);  
 //  datetime t=ObjectGet(vline_name,OBJPROP_TIME1);
//   if(t/60==TimeCurrent()/60 ) 
  
   if((Open_Time)/60 == TimeCurrent()/60 )     
        
  
{
 // Alert("Время выставления ордеров -" ) ;
  if(!pos_buy)
  {
   if(Open_Buy)
   {
    OrderSend(Symbol(), OP_BUY, Lots, Ask, slippage, sl_buy,tp_buy, "time_open", MagicNumber, 0, NULL);  
   }
   if(Open_Buy_Stop)
   {
   Close_Time = Open_Time + 60*time_op;
    OrderSend(Symbol(), OP_BUYSTOP, Lots, Ask+Open_Level*Point, slippage, sl_buy_stop,tp_buy_stop,
    "time_open", MagicNumber, Close_Time, NULL);      
   }
  
   if(Open_Buy_Limit)
   {
    OrderSend(Symbol(), OP_BUYLIMIT, Lots, Ask-Open_Level*Point, slippage, sl_buy_limit,tp_buy_limit,
    "time_open", MagicNumber, 0, NULL);      
   }  
  }
  
  if(!pos_sell)
  {
   if(Open_Sell)
   {
    OrderSend(Symbol(), OP_SELL, Lots, Bid, slippage, sl_sell, tp_sell, "time_open", MagicNumber, 0, NULL);
   }
  
   if(Open_Sell_Stop)
   {
    OrderSend(Symbol(), OP_SELLSTOP, Lots, Bid-Open_Level*Point,slippage, sl_sell_stop, tp_sell_stop,
    "time_open", MagicNumber, Close_Time, NULL);  
   }
  
   if(Open_Sell_Limit)
   {  
    OrderSend(Symbol(), OP_SELLLIMIT, Lots, Bid+Open_Level*Point,slippage, sl_sell_limit, tp_sell_limit,
    "time_open", MagicNumber, 0, NULL);    
   }    
  }  
}
int close_sellstop,close_buystop,cnt,total=OrdersTotal();
    for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderType()==OP_BUY)
           {
            if(OrderOpenPrice()>0)
                {
                 Print("buy opened");
                 yDeleteOrder(5);
                 
                }
           }
         if(OrderType()==OP_SELL) 
           {
            if(OrderOpenPrice()>0)
                {
                 Print("Sell opened");
                 yDeleteOrder(4);
                }
           }
        }
     }

//|                                                открытие ордеров                                           |
//+-----------------------------------------------------------------------------------------------------------+


//----
   return(0);
  }
//+------------------------------------------------------------------+
int yDeleteOrder(int type)
{
   for( int i=1; i<OrdersTotal(); i++)          
      {
         if(OrderSelect(i-1,SELECT_BY_POS)) 
            {                                       
               if(OrderType()==type && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                     OrderDelete(OrderTicket()); 
                  }//if
  
           }//if
      }
   return(0);
}

В этом советнике ордера открываются по времени, но нет траллинг стопа и у него нет сопровождения цены, путём перемещения стопов вслед за ценой, как в первом советнике. Вот в чём проблема. Это наверное сделать трудней, чем в первый вставить таймер. 

 
mihmihail #:

Но всё работает как нужно. Просто возможно код корявый. У меня есть еще один советник:

В этом советнике ордера открываются по времени, но нет траллинг стопа и у него нет сопровождения цены, путём перемещения стопов вслед за ценой, как в первом советнике. Вот в чём проблема. Это наверное сделать трудней, чем в первый вставить таймер. 

сейчас вы будете уверять что и второй советник тоже "работает как нужно" ? :-)

на сайте есть учебник, какой-никакой, но есть : 

не поленитесь, полистайте

есть справка, в редакторе по F1. Тоже крайне рекомендуется к прочтению

.
Приведённый код старый-старый. Не рабочий. Написан явно не вами.

И ваших попыток с ним разобраться и его обновить/исправить тоже не видно. 

Чем тут помочь ? сами-то не пытаетесь делать

 
Ну, в обще-то и второй работает нормально. Подскажите, а где по вашему находятся ошибки у первого советника? Он корректно работает.
 
mihmihail #:
Ну, в обще-то и второй работает нормально. Подскажите, а где по вашему находятся ошибки у первого советника? Он корректно работает.

во первых метода int start() нет давным-давно, int deinit() тоже, extern тоже устарели.. 

во вторых при OrderSelect()=false, что не такая уж редкость, он откроет лишнюю позицию.

исправляйте

PS/ второй ордера будет закрывать через раз

не рабочие ни тот ни другой..

 

Ясно. Давайте я просто расскажу, что нужно от советника, а вы может быть подскажете какой-нибудь. Наверняка такой есть.

В определенное время советник запускается. Выставляются два отложенных ордера By stop и Sell stop на определенном расстоянии от цены со стоплоссами и передвигаются за ценой с определённым интервалом времени, как в первом советнике, который я выкладывал. Если один из них срабатывает, то второй удаляется и срабатывает тралл. Дальше, если цена идет в этом направлении, то на определенном уровне открываются ордера с множителем (0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 2 3 4 5 6 7 8 9 10) и у всех идет траллинг стоп. Как только общий стоп сработал, то всё закрывается и опять выставляются два отложенных ордера By stop и Sell stop на определенном расстоянии от цены со стоплоссами и передвигаются за ценой с определённым интервалом времени.

И в определённое время советник закрывается.

 
mihmihail #:

Ясно. Давайте я просто расскажу, что нужно от советника, а вы может быть подскажете какой-нибудь. Наверняка такой есть.

В определенное время советник запускается. Выставляются два отложенных ордера By stop и Sell stop на определенном расстоянии от цены со стоплоссами и передвигаются за ценой с определённым интервалом времени, как в первом советнике, который я выкладывал. Если один из них срабатывает, то второй удаляется и срабатывает тралл. Дальше, если цена идет в этом направлении, то на определенном уровне открываются ордера с множителем (0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 2 3 4 5 6 7 8 9 10) и у всех идет траллинг стоп. Как только общий стоп сработал, то всё закрывается и опять выставляются два отложенных ордера By stop и Sell stop на определенном расстоянии от цены со стоплоссами и передвигаются за ценой с определённым интервалом времени.

И в определённое время советник закрывается.

Гляньте в личку

 
mihmihail #:

Здравствуйте. Хочу сделать советник. Он очень простой, но я нигде не нашел похожего. Я нашел 3 советника, каждый из которых удовлетворяет 1 условие и задача - их объеденить в один.

Для начала вот есть советник, который открывает отложки со стопами и траллом, но нужно, чтобы он запускался и закрывался по времени.



Я выставил переменные открытия и закрытия ордеров, а вот дальше никак не могу разобраться как вставить таймер в код.

Помогите разобраться.

На сайте куча роботов - где во внешних переменных и в коде есть ограничение работы по времени. Берите и правьте.
 

Всем привет. Подскажите, как можно сделать дисконнект в тестере? есть эксперт по сетке и при дисконнекте на реальной торговле он перезапускается и начинает все с нуля, вижу как вариант каждое открытие новой сделки сохранять в блокноте и при дисконнекте и повтором подключении читать блокнот на наличии инфы, чет нигде не нашел как можно сделать дисконнект на тестере, либо можно просто в коде написать отключение и подключение например через 10 баров.. как-нибудь так?

Чтобы протестить естественно)