Отложенный ордер не отрывается по цене 101.69 но при этом - отрывается по цене 101.70 или 101.68 ( в цем прикол волшебной цифры 101.69)

 

2019.11.13 09:46:07.987   OpenLimit  (AFLT,M5)     AFLT Ask Last -104.340000 O-101.690000 TP-105.440000
2019.11.13 09:46:07.987   OpenLimit  (AFLT,M5)    CTrade::OrderSend: buy limit 5.00 AFLT at 101.69 tp: 105.44 [invalid price]


при этом пробую открыть отложку BUY LIMIT руками ,  отрывает но по цене 101.70 или 101.68  т е терминал по цене 101.69 отказывается принимать отложенный ордер

но я вычисляю уровень внутри алгоритма ( как положено нормализую) - каким образом вычисленный уровень привести к цене 101.70 или 101.68  ?

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


т е это не 

SYMBOL_TRADE_STOPS_LEVEL

Минимальный отступ в пунктах от текущей цены закрытия для установки Stop ордеров

int

SYMBOL_TRADE_FREEZE_LEVEL

Дистанция заморозки торговых операций (в пунктах)

int


т  к  отрывать   BUY LIMIT  дает по 101.70 и по101.68 но при этом не дает по  101.69   - текущая цена   акции 104.34

SYMBOL_LAST

 

2019.11.13 10:10:07.995    OpenLimit (AFLT,M30)     AFLT Ask Last -   104.500000   OpenPrice  - 101.850000 TP - 105.600000
2019.11.13 10:10:07.995    OpenLimit (AFLT,M30)    CTrade::OrderSend: buy limit 5.00 AFLT at 101.85 tp: 105.60 [invalid price]

тоже не дает

 
А что показывает SYMBOL_TRADE_TICK_SIZE? Не 2 случайно?
 
Может это ENUM_SYMBOL_INFO_DOUBLE SYMBOL_TRADE_TICK_SIZE  - Минимальное изменение цены 
 

Случайно 0,02

 
prostotrader:

Случайно 0,02

Ну вот и докопались до истины ))

 

На будущее.

Функция переводит пункты в цену инструмента с учетом шага цены

//+------------------------------------------------------------------+
//| Expert Points to price function                                  |
//+------------------------------------------------------------------+
double PointsToPrice(const long a_points)
{
  step_price = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
  double a_price = (double(a_points) * Point() ) / step_price;
  if(a_points < 0)
  {
    a_price = MathFloor(a_price) * step_price;
  }
  else
  {
    a_price = MathCeil(a_price) * step_price;
  }
  return(NormalizeDouble(a_price, Digits()));
}

Добавлено

В этом разделе есть топик "В помощь начинающим", Вам, Юрий, очень рекомендую с ним ознакомится...

 
Vitalii Ananev:
Может это ENUM_SYMBOL_INFO_DOUBLE SYMBOL_TRADE_TICK_SIZE  - Минимальное изменение цены 
похоже да!
Ihor Herasko:
А что показывает SYMBOL_TRADE_TICK_SIZE? Не 2 случайно?

2019.11.13 16:56:55.309    OpenLimit (AFLT,M15)    CTrade::OrderSend: buy limit 5.00 AFLT at 101.35 tp: 105.10 [invalid price]
2019.11.13 16:56:55.309    OpenLimit (AFLT,M15)     AFLT Ask Last -104.000000 O-101.350000 TP-105.100000  0.020000

 
prostotrader:

На будущее.

Функция переводит пункты в цену инструмента с учетом шага цены

Добавлено

В этом разделе есть топик "В помощь начинающим", Вам, Юрий, очень рекомендую с ним ознакомится...


Спасибо большое!  помогли.

Мне удобней передавать цену открытия

double CorrectPrice( const string Symb, const double Price )
{
  const double TickSize = MathMax(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE), SymbolInfoDouble(Symb, SYMBOL_POINT));
  
  return(NormalizeDouble(((int)(Price / TickSize + 0.1)) * TickSize, (int)SymbolInfoInteger(Symb, SYMBOL_DIGITS)));
}

Теперь все ок.

 
Yuriy Zaytsev:

Спасибо большое!  помогли.

Мне удобней передавать цену открытия

Теперь все ок.

При чем тут цена открытия?

Суммировать константу - просто сиюминутная подгонка

out_price = Цена открытия +(-) PointsToPrice(Пункты, на сколько Вы хотите увеличить или уменьшить цену)

Добавлено

Фнкцию PointsToPrice() можно использовать где угодно и когда угодно....

Т.е В любых советниках!

Добавлено

Еще одно важное замечание

Оперировать в советнике нужно не ценами, а пунктами, потому как

восприятие цены может быть ошибочно, (большие цифры до и после запятой)

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

(не нужно каждый раз компелить советник под новый инструмент)

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