Как превратить цену из double в int для торговли РТС?

 

Здравствуйте!

Пишу робота, все нормально на нефти отрабатывается.

Но вот на РТС пишет ivalid price , 10015 ошибка.

Создаю лимитку, цену указываю так:

trade.price = NormalizeDouble(price_to_sell,_Digits);     // цена 

Но ордер Sell Stop не открывается.

Вот дамп

  1. SellStop не выполнен - код ошибки:4756
  2. retcode - 10015
  3. Digits-0
  4. Bid- 105080.0
  5. pr-104983.0
  6. sl-105132.0
  7. tp-104498.0

 

Цель: сделать советника работоспособным под разные инструменты.

Прошу помощи.

 

Не знаю как там в 5ке, но в 4ке типы преобразую так.

PPP2 = int( PPP1 );

Не уверен что с ценой так можно поступать. Может не в типе дело, а в значении price_to_sell ? Выведите её в Журнал перед отправкой запроса. Проверьте что отправляете

 
trade.price = MathCeil(price/ticksize)*ticksize;
 
id9999i:

Здравствуйте!

Пишу робота, все нормально на нефти отрабатывается.

Но вот на РТС пишет ivalid price , 10015 ошибка.

Создаю лимитку, цену указываю так:

trade.price = NormalizeDouble(price_to_sell,_Digits);     // цена 

Но ордер Sell Stop не открывается.

Вот дамп

  1. SellStop не выполнен - код ошибки:4756
  2. retcode - 10015
  3. Digits-0
  4. Bid- 105080.0
  5. pr-104983.0
  6. sl-105132.0
  7. tp-104498.0

 

Цель: сделать советника работоспособным под разные инструменты.

Прошу помощи.

Добрый день!

ВСЕ ЦЕНЫ, включая RTS, имеют тип double

Класс CTrade не имеет поля "price"

Чтобы внятно ответить на Ваш вопрос, нужен код,

без него, будут не правильные рекомендации и советы.

   bool              BuyLimit(const double volume,const double price,const string symbol=NULL,const double sl=0.0,const double tp=0.0,
                              const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment="");
   bool              SellLimit(const double volume,const double price,const string symbol=NULL,const double sl=0.0,const double tp=0.0,
                               const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment="");
Если Вы используете приведённый выше код класса CTrade
BuyLimit и SellLimit, то видно, что price имеет тип double, равно как и другие команды
 

И ещё...

Для торговли на ФОРТС, я не рекомендую Вам использовать торговый

класс CTrade используйте OrderSend или OrderSendAsync

Или напишите свой класс с использованием этих функций. 

 

Я использую такой вариант

LOTSTEP = (int)MathAbs(MathLog10(MarketInfo(_Symbol, MODE_LOTSTEP)));

и потом нормализую лот в соответствии с этим.

lot = NormalizeDouble(lots,  LOTSTEP);
 
AlexeyVik:

Я использую такой вариант

и потом нормализую лот в соответствии с этим.

Не вводите человека в заблуждение (он пишет на MQL5)
 
Mikalas:
Не вводите человека в заблуждение (он пишет на MQL5)

И какие отличия mql4 от mql5 в этом варианте?

В mql5 нет десятичного логарифма? или нет MarketInfo()


А вот что не понял, так это разговор о цене, а не о размере лота.

Извиняюсь.

 
AlexeyVik:

И какие отличия mql4 от mql5 в этом варианте?

В mql5 нет десятичного логарифма? или нет MarketInfo()


А вот что не понял, так это разговор о цене, а не о размере лота.

Извиняюсь.

В 5 нет MODE_LOTSTEP и MarketInfo

 

Решается это просто и работает на ВСЕХ инструментах!

Цена выставления ордера рассчитывается так:

Цена выставления ордера = текущая цена( или какая-то ) +(-) Цена( N пунктов)

Тогда:

double order_price;
double current_price;
double delta_price;

order_price = current_price + delta_price;

//delta_price может быть отрицательной
//Допустим, Вы хотите выставить ордер на 5 пунктов меньше текущей цены,
//тогда:
delta_price = PointsToPrice (-5);
//Если увеличить на 10 пунктов, то
delta_price = PointsToPrice (10);

//--- Размер тика  
double  step_size = SymbolInfoDouble( _Symbol, SYMBOL_TRADE_TICK_SIZE );

//+------------------------------------------------------------------+
//| Expert Points to price function                                  |
//+------------------------------------------------------------------+
double PointsToPrice( const long a_points )
{
  double a_price = ( double( a_points ) * _Point ) / step_size;
  
  if ( a_points < 0 )
  {
    a_price = MathFloor( a_price ) * step_size;
  }
  else
  {
    a_price = MathCeil( a_price ) * step_size;
  }
  
  return( NormalizeDouble( a_price, _Digits ) );
}
 

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

Ошибка оказалась в том, что я не учитывал размер тика.

 Последний выше пример достаточно универсален, спасибо!

Пока искал решение, пришел к классу https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice

Меньше кода задействовано будет;) 

Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
  • www.mql5.com
Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5