Код 10015, неправильно указана цена, но цена верная, помогите

 

Уважаемые коллеги!

Постоянно высвечивается сообщение о коде возврата 10015 "Не правильно указана цена":

2017.06.02 09:06:00.851 2017.04.26 14:59:59   failed buy stop 1.00 @BR at 51.88 sl: 51.82 [Invalid price]
2017.06.02 09:06:00.851 2017.04.26 14:59:59   Alert: Запрос на установку ордера Buy не выполнен - код ошибки:4756
2017.06.02 09:06:00.851 2017.04.26 14:59:59   Alert: Код возврата:10015!!

Но цена правильная же - 51.88, два знака после запятой.

Вот код, помогите, пожалуйста, разобраться:

if(stm.day_of_week==DayOfWeek && stm.hour==OpenHour && stm.min==OpenMin && stm.sec>=OpenSec)
  { Alert("Сейчас: "+(string)tm, "время открывать ордер"); 
      mrequest.action = TRADE_ACTION_PENDING;                                  // отложенное исполнение
      mrequest.price=NormalizeDouble(latest_price.ask + Delta*point,digits);                      // нормализованная цена открытия 
      mrequest.sl = NormalizeDouble(latest_price.ask - StopLoss*_Point,_Digits); // Stop Loss
      mrequest.symbol = _Symbol;                                             // текущий инструмент
      mrequest.volume = Lot;                                                // количество лотов для торговли
      mrequest.magic = EA_Magic;                                            // Magic Number
      mrequest.type = ORDER_TYPE_BUY_STOP;                                // тип ордера
      mrequest.type_filling = ORDER_FILLING_FOK;                            // тип исполнения ордера - все или ничего
      //--- отсылаем ордер
      Alert("Цена покупки:",mrequest.price,"!!");
      OrderSend(mrequest,mresult);
      // анализируем код возврата торгового сервера
      if(mresult.retcode==10009 || mresult.retcode==10008) //запрос выполнен или ордер успешно помещен
        {  Alert("Ордер Buy успешно помещен, тикет ордера #:",mresult.order,"!!");  
           }
      else
        {  Alert("Запрос на установку ордера Buy не выполнен - код ошибки:",GetLastError());
         Alert("Код возврата:",mresult.retcode,"!!");
        return;
        }

        }

 
rusali:

Уважаемые коллеги!

Постоянно высвечивается сообщение о коде возврата 10015 "Не правильно указана цена":

2017.06.02 09:06:00.851 2017.04.26 14:59:59   failed buy stop 1.00 @BR at 51.88 sl: 51.82 [Invalid price]
2017.06.02 09:06:00.851 2017.04.26 14:59:59   Alert: Запрос на установку ордера Buy не выполнен - код ошибки:4756
2017.06.02 09:06:00.851 2017.04.26 14:59:59   Alert: Код возврата:10015!!

Но цена правильная же - 51.88, два знака после запятой.

Вот код, помогите, пожалуйста, разобраться:

if(stm.day_of_week==DayOfWeek && stm.hour==OpenHour && stm.min==OpenMin && stm.sec>=OpenSec)
  { Alert("Сейчас: "+(string)tm, "время открывать ордер"); 
      mrequest.action = TRADE_ACTION_PENDING;                                  // отложенное исполнение
      mrequest.price=NormalizeDouble(latest_price.ask + Delta*point,digits);                      // нормализованная цена открытия 
      mrequest.sl = NormalizeDouble(latest_price.ask - StopLoss*_Point,_Digits); // Stop Loss
      mrequest.symbol = _Symbol;                                             // текущий инструмент
      mrequest.volume = Lot;                                                // количество лотов для торговли
      mrequest.magic = EA_Magic;                                            // Magic Number
      mrequest.type = ORDER_TYPE_BUY_STOP;                                // тип ордера
      mrequest.type_filling = ORDER_FILLING_FOK;                            // тип исполнения ордера - все или ничего
      //--- отсылаем ордер
      Alert("Цена покупки:",mrequest.price,"!!");
      OrderSend(mrequest,mresult);
      // анализируем код возврата торгового сервера
      if(mresult.retcode==10009 || mresult.retcode==10008) //запрос выполнен или ордер успешно помещен
        {  Alert("Ордер Buy успешно помещен, тикет ордера #:",mresult.order,"!!");  
           }
      else
        {  Alert("Запрос на установку ордера Buy не выполнен - код ошибки:",GetLastError());
         Alert("Код возврата:",mresult.retcode,"!!");
        return;
        }

        }

я так понимаю открываете в Buy от цены 51.88 со стопом 51.82, может дело в близком стопе?
 
if(stm.day_of_week==DayOfWeek && stm.hour==OpenHour && stm.min==OpenMin && stm.sec>=OpenSec)
  {
   Alert("Сейчас: "+(string)tm,"время открывать ордер");
   mrequest.action=TRADE_ACTION_PENDING;                                  // отложенное исполнение
   mrequest.price=NormalizeDouble(latest_price.ask+Delta*point,digits);                      // нормализованная цена открытия 
   mrequest.sl = NormalizeDouble(latest_price.ask-StopLoss*_Point,_Digits); // Stop Loss

Вы, когда переменную mrequest.price нормализуете, digits откуда у Вас берется? Какое значение у него?

 
Vasiliy Pushkaryov:

Вы, когда переменную mrequest.price нормализуете, digits откуда у Вас берется? Какое значение у него?

цена у него нормализована до второго знака, иначе писалось бы другое значение в failed buy stop 1.00 @BR at 51.88 sl: 51.82 [Invalid price]

нужно попробовать открыться на этом инструменте руками в buy со стопом в -0.06 от цены открытия, скорее всего выдаст ту-же ошибку

 
Konstantin:

цена у него нормализована до второго знака, иначе писалось бы другое значение в failed buy stop 1.00 @BR at 51.88 sl: 51.82 [Invalid price]

По предоставленному коду не видно ни тип, ни значения digits. Вы нормализуете ведь, по одному символу, цену открытия - одной переменной, стопы - другой. Устанете так ошибки искать.

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

Выводите еще Bid/Ask цены, и проверяйте для отложенных ордеров уровни заморозки и стоплевел, может в этом причина.

 
rusali:



А если зайти в спецификацию символа, что будет в строке "Tick size":

Tick size

?

 
Vasiliy Pushkaryov:

По предоставленному коду не видно ни тип, ни значения digits. Вы нормализуете ведь, по одному символу, цену открытия - одной переменной, стопы - другой. Устанете так ошибки искать.

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

Выводите еще Bid/Ask цены, и проверяйте для отложенных ордеров уровни заморозки и стоплевел, может в этом причина.


Я уже разные способы нормализации цены пробовал. Ниже digits привел в соответствие, но результат тот же.

Самое интересное, что этот же код в другом советнике работает без ошибок, на том же самом инструменте, а здесь выдает ошибку 10015. Просто бред какой-то. Есть еще у кого -нибудь мысли по этому поводу?

Да, брокер БКС, может это с ним как-то связано?

2017.06.03 10:22:41.927 2017.03.22 14:59:59   Alert: Сейчас: 2017.03.22 14:59:59 время открывать ордер
2017.06.03 10:22:41.927 2017.03.22 14:59:59   Alert: Цена покупки:51.06!!
2017.06.03 10:22:41.927 2017.03.22 14:59:59   failed buy stop 1.00 @BR at 51.06 sl: 51.00 [Invalid price]
2017.06.03 10:22:41.927 2017.03.22 14:59:59   Alert: Запрос на установку ордера Buy не выполнен - код ошибки:4756

2017.06.03 10:22:41.927 2017.03.22 14:59:59   Alert: Код возврата:10015!!


double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);                 // размер пункта
int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);                 // кол-во знаков после запятой (точность)

if(stm.day_of_week==DayOfWeek && stm.hour==OpenHour && stm.min==OpenMin && stm.sec>=OpenSec)
  {         
            Alert("Сейчас: "+(string)tm, "время открывать ордер"); 
             mrequest.action = TRADE_ACTION_PENDING;                                   // отложенное исполнение
      mrequest.price=NormalizeDouble(latest_price.ask + Delta*point,digits);                      // нормализованная цена открытия 
      mrequest.sl = NormalizeDouble(latest_price.ask - StopLoss*point,digits); // Stop Loss
      mrequest.symbol = _Symbol;                                             // текущий инструмент
      mrequest.volume = Lot;                                                 // количество лотов для торговли
      mrequest.magic = EA_Magic;                                            // Magic Number
      mrequest.type = ORDER_TYPE_BUY_STOP;                                // тип ордера
      mrequest.type_filling = ORDER_FILLING_FOK;                             // тип исполнения ордера - все или ничего
      //--- отсылаем ордер
      Alert("Цена покупки:",mrequest.price,"!!");
      OrderSend(mrequest,mresult);
      // анализируем код возврата торгового сервера
      if(mresult.retcode==10009 || mresult.retcode==10008) //запрос выполнен или ордер успешно помещен
        {
          Alert("Ордер Buy успешно помещен, тикет ордера #:",mresult.order,"!!");  
         }
      else
        {
          Alert("Запрос на установку ордера Buy не выполнен - код ошибки:",GetLastError());
          Alert("Код возврата:",mresult.retcode,"!!");
          return;
        }

        }

}

 
rusali:


Я уже разные способы нормализации цены пробовал. Ниже digits привел в соответствие, но результат тот же.

Самое интересное, что этот же код в другом советнике работает без ошибок, на том же самом инструменте, а здесь выдает ошибку 10015. Просто бред какой-то. Есть еще у кого -нибудь мысли по этому поводу?

Да, брокер БКС, может это с ним как-то связано?

2017.06.03 10:22:41.927 2017.03.22 14:59:59   Alert: Сейчас: 2017.03.22 14:59:59 время открывать ордер
2017.06.03 10:22:41.927 2017.03.22 14:59:59   Alert: Цена покупки:51.06!!
2017.06.03 10:22:41.927 2017.03.22 14:59:59   failed buy stop 1.00 @BR at 51.06 sl: 51.00 [Invalid price]
2017.06.03 10:22:41.927 2017.03.22 14:59:59   Alert: Запрос на установку ордера Buy не выполнен - код ошибки:4756

2017.06.03 10:22:41.927 2017.03.22 14:59:59   Alert: Код возврата:10015!!


double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);                 // размер пункта
int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);                 // кол-во знаков после запятой (точность)

if(stm.day_of_week==DayOfWeek && stm.hour==OpenHour && stm.min==OpenMin && stm.sec>=OpenSec)
  {         
            Alert("Сейчас: "+(string)tm, "время открывать ордер"); 
             mrequest.action = TRADE_ACTION_PENDING;                                   // отложенное исполнение
      mrequest.price=NormalizeDouble(latest_price.ask + Delta*point,digits);                      // нормализованная цена открытия 
      mrequest.sl = NormalizeDouble(latest_price.ask - StopLoss*point,digits); // Stop Loss
      mrequest.symbol = _Symbol;                                             // текущий инструмент
      mrequest.volume = Lot;                                                 // количество лотов для торговли
      mrequest.magic = EA_Magic;                                            // Magic Number
      mrequest.type = ORDER_TYPE_BUY_STOP;                                // тип ордера
      mrequest.type_filling = ORDER_FILLING_FOK;                             // тип исполнения ордера - все или ничего
      //--- отсылаем ордер
      Alert("Цена покупки:",mrequest.price,"!!");
      OrderSend(mrequest,mresult);
      // анализируем код возврата торгового сервера
      if(mresult.retcode==10009 || mresult.retcode==10008) //запрос выполнен или ордер успешно помещен
        {
          Alert("Ордер Buy успешно помещен, тикет ордера #:",mresult.order,"!!");  
         }
      else
        {
          Alert("Запрос на установку ордера Buy не выполнен - код ошибки:",GetLastError());
          Alert("Код возврата:",mresult.retcode,"!!");
          return;
        }

        }

}

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

- значение размера тика == 0.01

- вы отдаете в приказ значение х.хх111

в этом случае получите ту же ошибку, так же посмотрите на близкое расположение стопов и уровней заморозки ))

в любом случае проблема кроется тут 51.06 sl: 51.00 [Invalid price]

 
Konstantin:

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

- значение размера тика == 0.01

- вы отдаете в приказ значение х.хх111

в этом случае получите ту же ошибку, так же посмотрите на близкое расположение стопов и уровней заморозки ))

в любом случае проблема кроется тут 51.06 sl: 51.00 [Invalid price]


Да, действительно. Увеличил значение стопов и дельту к цене, и всё заработало.

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

Спасибо за помощь, буду приводить к оптимальным заключениям дельта и стопов.

 
Чтобы не было ошибки неправильная цена и неправильные стопы нужно использовать метод NormalizePrice класса CSymbolInfo. Этот метод учитывает размер тика.