Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
На MQL5.community есть возможность хранить исходные коды в MQL5 Storage. Попробуй сам!
Alexander Schastliviy
36
Alexander Schastliviy 2014.12.29 19:37 

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

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

Но вот на РТС пишет 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
18179
Andrei Fandeev 2014.12.29 22:01  

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

PPP2 = int( PPP1 );

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

Sergey Chalyshev
4513
Sergey Chalyshev 2014.12.29 22:04  
trade.price = MathCeil(price/ticksize)*ticksize;
Mikhail Filimonov
5931
Mikhail Filimonov 2014.12.29 22:33  
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 2014.12.29 22:54  

И ещё...

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

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

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

Alexey Viktorov
6908
Alexey Viktorov 2014.12.30 09:47  

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

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

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

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

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

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

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

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

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


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

Извиняюсь.

Mikhail Filimonov
5931
Mikhail Filimonov 2014.12.30 10:11  
AlexeyVik:

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

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


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

Извиняюсь.

В 5 нет MODE_LOTSTEP и MarketInfo

Mikhail Filimonov
5931
Mikhail Filimonov 2014.12.30 10:46  

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

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

Цена выставления ордера = текущая цена( или какая-то ) +(-) Цена( 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 2014.12.30 11:21  

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

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

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

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

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

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