Скачать MetaTrader 5

Подскажите по советнику

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
serega20024
36
serega20024  

Такая ситуация. Написал советник(точнее собрал из разных, пробую первый раз, не судите строго)), при определенных условиях он закрывает старые ордера и открывает новый или выставляет отложенный ордер.

На тесте все работает отлично, но в реале он неоднократно просто закрывает ордера и не открывает новый(и отложенный не ставит).

Проверяю на тесте проблемный день, все отрабатывается прекрасно.

Подскажите в чем может быть проблема или может можно как то проверку на открытие ордера ставить? 

 

int start()
{
  
   oz_up=iCustom(Symbol(), 0, "OZ_M5", 3, 1);
   oz_dw=iCustom(Symbol(), 0, "OZ_M5", 2, 1);
   lag=iCustom(Symbol(), 0, "LAG_M5", 0, 1);
   
 
  
         if (Close[1]>oz_up && lag>0.5 && b==0) 
        {
         b=2;
         s=0;
         if ( oz_up + MAX*Point >= Close[1])
         {
         SendOrder(OP_BUY, Lot, "UP");
         OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),slippage,0,Ask+Takeprofit*Point,0,Magic,0,Blue);
         
        }
        else
        {
        OrderSend(Symbol(),OP_BUYLIMIT,Lot,NormalizeDouble(oz_up + OTS*Point ,Digits),slippage,0,Ask+Takeprofit*Point,0,Magic,0,Blue); 
        SendOrder(OP_BUY, Lot, "UP");
        }
        }
      
      else
      {
        
            if (Close[1]<oz_dw && lag<0.5 && s==0)
           {
            s=2;
            b=0; 
            if ( oz_dw - MAX*Point <= Close[1])
         {
         SendOrder(OP_SELL, Lot, "DW");
         OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,0,Bid-Takeprofit*Point,0,Magic,0,Red);
         
        }
        else
        {
        OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(oz_dw - OTS*Point ,Digits),slippage,0,Bid-Takeprofit*Point,0,Magic,0,Blue); 
        SendOrder(OP_SELL, Lot, "DW");
        }
            }
            
            }
         
        
      
   
  
   return(0);
}
//-------------------------------------------------------------------------
bool SendOrder(int tip, double lot, string com)
{
   for (int i=0; i<OrdersTotal(); i++) 
   {  
      if (OrderSelect(i, SELECT_BY_POS))
      {  
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
            if (OrderComment()==com) return(0);
         }
      }
   }
   int error,nn;
   while(true)
   {
      RefreshRates();
      
      
      
 //-------------------------------------------------------------------------     
      if (tip==OP_BUY)     
      {
    for(int n=0;n<OrdersTotal();n++)
  {
    if (!OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) continue;
    if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;

    if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow); n--; }
    if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow); n--; }
  }
       error = 1;      
      }
      
      
      
      
 //-------------------------------------------------------------------------     
      if (tip==OP_SELL)      
     {
      for(int p=0;p<OrdersTotal();p++)
  {
    if (!OrderSelect(p, SELECT_BY_POS, MODE_TRADES)) continue;
    if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;

    if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow); p--; }
    if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow); p--; }
  }
      error = 1;
      }
      
      
 //-------------------------------------------------------------------------     
      
      
      
      if (error==-1)
      {
         Print("OrderSend Error ",GetLastError()," Lot ",lot);
         Sleep(1000);
      }
      else return(1);
      nn++;
      if (nn>10) return(0);
   }
   return(1);
}
//-------------------------------------------------------------------
LRA
724
LRA  

Попробуй так:

int start()
{
  b=0;
   oz_up= .....................
serega20024
36
serega20024  

А чем поможет?

Просто перед стартом советника я выставлю значение для b и s, в зависимости от того в какую сторону нужно будет смотреть советнику после старта(покупка или продажа), а в дальнейшем он уже сам значения выставляет.

 Кстати может кто подскажет, как можно автоматизировать советник, чтоб после старта он сам выставлял значения для b и s?

Поясню суть:

Есть определенные условия при которых советник открывает ордера на покупку и продажу. (значеня для b и s, я ввел чтобы избежать повторного открытия ордера в одну сторону). Дак вот, советник должен открывать ордера только при появлении условий! А допустим при старте советника условия в любом случае будут(на покупку или продажу) но советник должен ждать появления условий в противоположную сторону, поставив какое либо значение(больше 0) для b или s. 

o_o
Модератор
24191
o_o  
LRA:

Попробуй так:

int start()
{
  b=0;
   oz_up= .....................
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий