мой первый советник пару вопросов

 

Привет всем еще раз, после ваших настовлений решил в плотную взятся программированием, написал советника по индикатору как хотел, внутренность взял из стандартного маджика,

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

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

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       https://www.metaquotes.net/ |
//+------------------------------------------------------------------+

extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern int    risk   = 10;
double  LOT;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double UP,LOW,Z, Z1, S, S1;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
// to simplify the coding and speed up access
// data are put into internal variables

UP=iCustom(Symbol(),0,"Neuro Z-Z",2, 3, 0, 0, 4,0);
LOW=iCustom(Symbol(),0,"Neuro Z-Z",2, 3, 0, 0, 5,0);

   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(10*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(LOW>UP)
        {LOT = LOT(risk,1);
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // check for short position (SELL) possibility
      if(UP>LOW )
        {LOT = LOT(risk,1);
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(UP>LOW)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(LOW>UP)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.

double LOT(int risk,int ord)
{
   double MINLOT = MarketInfo(Symbol(),MODE_MINLOT);
   LOT = AccountFreeMargin()*risk/100/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/ord;
   if (LOT>MarketInfo(Symbol(),MODE_MAXLOT)) LOT = MarketInfo(Symbol(),MODE_MAXLOT);
   if (LOT<MINLOT) LOT = MINLOT;
   if (MINLOT<0.1) LOT = NormalizeDouble(LOT,2); else LOT = NormalizeDouble(LOT,1);
   return(LOT);
}
 

а можно кусок кода хотябы привести в пример? так то на словах я понимаю где бы можно было это посмотреть или выдрать откуда )

 
DIMA2010:

а можно кусок кода хотябы привести в пример? так то на словах я понимаю где бы можно было это посмотреть или выдрать откуда )

Может проще разрешить советнику торговать только в начале бара, т.е. на его открытии?

Проблема в целом не проблема :)

 
storm:

Может проще разрешить советнику торговать только в начале бара?

А так проблема решаема

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

 
int vxod;
int prevtime;
start(){
   if (Time[0] != prevtime){
      prevtime = Time[0];
      vxod--
      if(vxod==0)OrderSend...
   }
   //Если поступил сигнал на вход, но вам 
   //то нужно чтобы через Х баров произошло открытие, то vxod=Х
   vxod=1;
}
 
DIMA2010:

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


Если вы хотите чтобы советник торговал только по сформировавшимся сигналам индюка, то необходимо добавить в код условие торговли по открытию бара.

int prevtime;
start(){
   if (Time[0] != prevtime){
      prevtime = Time[0];
      ,,,,,,,,,,,,,,,,,,,,,,,,
      БЛА БЛА БЛА Т.Е. ВАШ КОД
   }
}
 
DIMA2010:


UP=iCustom(Symbol(),0,"Neuro Z-Z",2, 3, 0, 0, 4,0);
LOW=iCustom(Symbol(),0,"Neuro Z-Z",2, 3, 0, 0, 5,0);
вместо того как у Вас попробуйте так :
UP=iCustom(Symbol(),0,"Neuro Z-Z",2, 3, 0, 0, 4,1);
LOW=iCustom(Symbol(),0,"Neuro Z-Z",2, 3, 0, 0, 5,1);

то есть, считывать значения не с нулевого, а с первого бара. И сделайте торговлю один раз на бар.

Удачи.

 
VladislavVG: 

то есть, считывать значения не с нулевого, а с первого бара.

Или так ;)
 
спасибо большое за ответы сейчас буду пробывать ))))
 
ага все поучилось и так как посоветовал storm и так как посоветовал VladislavVG и так и так работает благодарю большое спасибо очень помогли ) и преподали урок )
Причина обращения: