MQL4. Открытие и закрытие сделки с первого бара.

 
Здравствуйте. Подскажите, пожалуйста, как в советнике прописать открытие и закрытие сделки с первого бара. У меня советник открывает сделки с четвертого.
 
а поподробнее? может код советника приложите? ))
 

Нужны подробности: что за советник (прикрепите весь файл mq4 или приведите участок кода), что подразумевается под "открывает сделки с четвертого"?

Пока представляется такая картина: при запуске советник ждет 4 бара, а только потом, если есть сигнал, открывает сделку. До этого наличие сигнала не приводит к открытию сделки.

 
Anna_89:
Здравствуйте. Подскажите, пожалуйста, как в советнике прописать открытие и закрытие сделки с первого бара. У меня советник открывает сделки с четвертого.
Здравствуйте. Открывать и закрывать сделки можно только по  ценам текущего-нулевого бара. Бары считаются справа налево 1,2,3,4 бары -это уже история и по ним сделок не откроишь. Если нужно открыть сделку по будущему бару, то в алгоритме нужно время нулевого бара принять за точку отсчета глобальная переменная кода long T0=Time[0] и если при следующем открытии нового бара T0<Time[0] то обращатся к торговым функциям.
long T0;
void OnInit(){T0=(long)Time[0];} 
void OnTick(){
if (T0<Time[0]){T0=(long)Time[0];// обращение к торговым функциям
}
}
 
 
Yuri Evseenkov:
Здравствуйте. Открывать и закрывать сделки можно только по  ценам текущего-нулевого бара.
тут непросвещенному человеку может показаться, что открывать можно по любой цене из всего диапазона нулевого бара... на самом деле открыться ты можешь по текущим наилучшим ценам Bid либо Ask. Бары это уже формальность ))
 

Прикрепляю код.

int start()
  {
   int cnt,tiket,total;

   total=OrdersTotal();
   if(total<1)
     {
      if(GetSignal()==1 && Time[0]!=LastTime)
        {
         tiket=OrderSend(Symbol(),OP_BUY,Lot,Ask,30,0,0,"",Magic,0,clrGreen);
         if(tiket>0)LastTime=Time[0];
         return(0);
        }
      if(GetSignal()==-1 && Time[0]!=LastTime)
        {
         tiket=OrderSend(Symbol(),OP_SELL,Lot,Bid,30,0,0,"",Magic,0,clrRed);
         if(tiket>0)LastTime=Time[0];
         return(0);
        }
      return(0);
     }
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY)
           {
            if(GetSignal()==-1)
              {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
               return(0);
              }
           }
         else
           {
            if(GetSignal()==1)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0);
              }
           }
        }
     }

   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetSignal()
  {
   double Buf0=iCustom(Symbol(),0,"MARSI",ARSI_Period,AMA_Period,0,0);
   double Buf1=iCustom(Symbol(),0,"MARSI",ARSI_Period,AMA_Period,0,1);
   double Buf2=iCustom(Symbol(),0,"MARSI",ARSI_Period,AMA_Period,0,2);
   double Buf3=iCustom(Symbol(),0,"MARSI",ARSI_Period,AMA_Period,0,3);
   double Val0=iCustom(Symbol(),0,"MACD AlertArrow",Fast_MA_Period,Slow_MA_Period,Signal_MA_Period,0,0);

   int vSig=0;
   if(Buf2<50 && Buf0<50 && Val0>0.0)vSig=1;
   else
      if(Buf1>50 && Buf3>50 && Val0<0.0)vSig=-1;
   return(vSig);
  }  
 

Еще потребуются коды индикаторов MARSI и MACD AlertArrow.

Хотя уже есть некоторая догадка: сигналы от индикатора MARSI для открытия сделки берутся по данным последних четырех баров. В итоге сигнал открытия запаздывает. Но это, к сожалению, суть всех индикаторов: они все запаздывают, т. к. рассчитываются по уже имеющимся данным. Они не могут использовать данные, которые только будут в будущем. ))