опять эта ошибка 130 :(

 

Просьба, посмотрите свежим взглядом код. Не могу понять, почему Sell ордер открывается, а Buy выдаёт ошибку 130. Ведь условия аналогичные и код одинаковый.

 

Заранее благодарен за возможную помощь. 

 

      //Buy order

      if(Close[1]>My_100EMA)     

         {

               if(OrdersTotal()==0)

                  {

                     OP1=MathFloor(Close[0]*100)/100;

                     SL1=OP1-StopLoss/10000;

                     TP1=OP1+T_P/10000;

                     PendBuyTicket1 = OrderSend(Symbol(),OP_BUYSTOP,LotSize,OP1,UseSlippage,SL1,TP1,"Pending Buy Order 1",MagicNumber,0,Black);

                     Print("PendBuyTicket1 =",PendBuyTicket1);

                  }

          }        

          

          

      //Sell order

      else  

            {

               if(OrdersTotal()==0)

                  {

                     OP1=MathFloor(Close[0]*100)/100;

                     SL1=OP1+StopLoss/10000;

                     TP1=OP1-T_P/10000;

                     PendSellTicket1 = OrderSend(Symbol(),OP_SELLSTOP,LotSize,OP1,UseSlippage,SL1,TP1,"Pending Sell Order 1",MagicNumber,0,Black);

                     Print("PendSellTicket1 =",PendSellTicket1);

                  }

            }     

 
Нормализуй SL1, TP1, OP1
 
niko1312:
Нормализуй SL1, TP1, OP1

Я всё что можно уже нормализовал. Фокус в том, что при ОДИНАКОВОМ КОДЕ ордер на селл открывается, а на бай - выдаёт ошибку 130. Вот какая ерунда (
 
concord99:

Я всё что можно уже нормализовал. Фокус в том, что при ОДИНАКОВОМ КОДЕ ордер на селл открывается, а на бай - выдаёт ошибку 130. Вот какая ерунда (


Ещё раз глянь в "требования и  ограничения торговых операций". Не исключаю причину в этом. Код не смотрел.
 
concord99:

Я всё что можно уже нормализовал. Фокус в том, что при ОДИНАКОВОМ КОДЕ ордер на селл открывается, а на бай - выдаёт ошибку 130. Вот какая ерунда (

В коде нет никакой нормализации, но дело не только в этом. Делить на целое число а) не всегда безопасно; б) долго.

Предлагаю: а) заменить деление на 10**n умножением на 10**-n; б) нормализовать результат NormalizeDouble(x,Digits)

 

Элементарная ошибка, Close[0] используется терминалом для построения графика.

Для торговли применяйте
OP1 = MarketInfo(Symbol(), MODE_ASK); для покупок и
OP1 = MarketInfo(Symbol(), MODE_BID); для продаж

Для отложенных ордеров надо добавлять еще и STOPLEVEL.

 
Вот поправил только не проверял 130 ошибка не правильные стопы ...  Вероятно у вас слишком маленький стоп лосс
     if(Close[1]>My_100EMA)     
         {
               if(OrdersTotal()==0)
                  {
                    // OP1=MathFloor(Close[0]*100)/100;    // это что то новенькое  сначала разделить потом умножить (выражение не имеет смысла)
                     OP1 = NormalizeDouble(Ask,Digits);    // приемлемое значение цены
                     SL1=NormalizeDouble(OP1-StopLoss*Point,Digits); // Получаем цену стоп лосса
                     TP1=NormalizeDouble(OP1+T_P*Point,Digits);// Получаем цену тейк профита
                     PendBuyTicket1 = OrderSend(Symbol(),OP_BUYSTOP,LotSize,OP1,UseSlippage,SL1,TP1,"Pending Buy Order 1",MagicNumber,0,Black); // тут правильно
                     if (PendBuyTicket1>0)Print("PendBuyTicket1 =",PendBuyTicket1);else Print(GetLastError());

                  }
            }        
      else        //Sell order
            {
               if(OrdersTotal()==0)
                  {
                     OP1=NormalizeDouble(Bid,Digits);                  // приемлемое значение цены
                     SL1=NormalizeDouble(OP1+StopLoss*Point,Digits);   // Получаем цену стоп лосса
                     TP1=NormalizeDouble(OP1-T_P*Point,Digits);        // Получаем цену тейк профита
                     PendSellTicket1 = OrderSend(Symbol(),OP_SELLSTOP,LotSize,OP1,UseSlippage,SL1,TP1,"Pending Sell Order 1",MagicNumber,0,Black);
                     if (PendBuyTicket1>0)Print("PendBuyTicket1 =",PendBuyTicket1);else Print(GetLastError());
                  }
            }   
 
Думаю, дело вот в чём:
Отложенные ордера могут открываться только при определённом соотношении текущей и заявленной цены.
Специфичный (мягко говоря) способ определения заявленной цены делает её почти всегда ниже текущей. В этих условиях бай-стоп открыться не может.
 

Делюсь со всеми гарантированным средством от ошибки 130:


  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
  FreezeLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL)*Point;
  double dist = MathMax(MathMax(NormalizeDouble(Dist*Point,Digits),spread),MathMax(StopLevel,FreezeLevel));//для отложек
  double prev = MathMax(MathMax(NormalizeDouble(Prev*Point,Digits),spread),MathMax(StopLevel,FreezeLevel));//для модифи и другого
 
Всем спасибо!
 
VOLDEMAR:


Большое Вам спасибо! Именно Ваши корректировки изменили ситуацию в лучшую сторону!

Причина обращения: