Скачать MetaTrader 5

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

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

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

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

Но вот на РТС пишет 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

 

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

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

Andrei Fandeev
24937
Andrei Fandeev  

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

PPP2 = int( PPP1 );

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

Sergey Chalyshev
5352
Sergey Chalyshev  
trade.price = MathCeil(price/ticksize)*ticksize;
Mikhail Filimonov
5931
Mikhail Filimonov  
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, равно как и другие команды
Mikhail Filimonov
5931
Mikhail Filimonov  

И ещё...

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

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

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

Alexey Viktorov
15369
Alexey Viktorov  

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

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

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

lot = NormalizeDouble(lots,  LOTSTEP);
Mikhail Filimonov
5931
Mikhail Filimonov  
AlexeyVik:

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

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

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

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

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


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

Извиняюсь.

Mikhail Filimonov
5931
Mikhail Filimonov  
AlexeyVik:

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

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


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

Извиняюсь.

В 5 нет MODE_LOTSTEP и MarketInfo

Mikhail Filimonov
5931
Mikhail Filimonov  

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

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

Цена выставления ордера = текущая цена( или какая-то ) +(-) Цена( 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 ) );
}
Alexander Schastliviy
36
Alexander Schastliviy  

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

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

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

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

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

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