Почему режется ноль в котировках билд 2470

 

Столкнулся с проблемой

Есть робот, который делал расчет расстояния от цены последней сделки, до предпоследней.

Цену нахожу данным методом


//+------------------------------------------------------------------+
//| Возвращает цену последней сделки текущей позиции                 |
//+------------------------------------------------------------------+
double CurrentPositionLastDealPrice()
  {
   int    total       =0;   // Всего сделок в списке выбранной истории
   string deal_symbol ="";  // Символ сделки 
   double deal_price  =0.0; // Цена
//--- Если история позиции получена
   if(HistorySelect(pos.time,TimeCurrent()))
     {
      //--- Получим количество сделок в полученном списке
      total=HistoryDealsTotal();
      //--- Пройдем по всем сделкам в полученном списке от последней сделки в списке к первой
      for(int i=total-1; i>=0; i--)
        {
         //--- Получим цену сделки
         deal_price=HistoryDealGetDouble(HistoryDealGetTicket(i),DEAL_PRICE);
         //--- Получим символ сделки
         deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL);
         //--- Если символ сделки и текущий символ равны, остановим цикл
         if(deal_symbol==_Symbol)
            break;
        }
     }
//---
   return(deal_price);
  }


Далее берем и выводим это обычным комментом в трех вариациях на чарт.

pos.last_deal_price      =CurrentPositionLastDealPrice(); 
Comment(pos.last_deal_price,"   ", NormalizeDouble(pos.last_deal_price,_Digits),"   ",DoubleToString(pos.last_deal_price,_Digits));

Запускаем визуальное тестирование и видим следующую картину


Ждем открытия позиции

В журнале все четко, 1.12070

Но в первых двух случаях ноль обрезался цена 1.1207

В третьем через

DoubleToString()

Тоже все четко отображается с нулем

Такое происходит только когда цена попадает на целочисленный уровень, ноль обрезается.


Это баг терминала или я что то не так делаю ??????????

 
Konstantin Seredkin:

Столкнулся с проблемой

Есть робот, который делал расчет расстояния от цены последней сделки, до предпоследней.

Цену нахожу данным методом



Далее берем и выводим это обычным комментом в трех вариациях на чарт.

Запускаем визуальное тестирование и видим следующую картину


Ждем открытия позиции

В журнале все четко, 1.12070

Но в первых двух случаях ноль обрезался цена 1.1207

В третьем через

Тоже все четко отображается с нулем

Такое происходит только когда цена попадает на целочисленный уровень, ноль обрезается.


Это баг терминала или я что то не так делаю ??????????

А чем отличается 1.1 от 1.10 ?

Или используйте

DoubleToString(pos.last_deal_price,Digits())
 
Сергей Таболин:

А чем отличается 1.1 от 1.10 ?

Или используйте

Встречный вопрос, как мне вычислить расстояние между ценами открытия ордеров

1-я цена по аналогии выше  1.12070

2-я цена 1.12055

1.12070 - 1.12055 = получаем 15п между ценами


А теперь посчитайте получу ли я правильное значение, если мне функция вместо 1.12070  выдает 1.1207

1.1207  - 1.12055  = я получаю иное значение если точно то - 0,0048, которое рушит всю логику работы программы.


просто есть советник, который усредняет позицию к примеру первые 3 ордера он это делает через 100п, далее условия что бы следующие 3 ордера он усреднил через 100, но при открытии каждого добавлял по 50

150  200 250

дак вот, после этого мне нужно узнать, что между последними 2-мя ордерами расстояние 250п

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

с обрезанием у котировки нуля, последний этап отваливается.

Может вы знаете иной способ вычислить кол-во пунктов между ценами открытия 2-х ордеров подскажите

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
Konstantin Seredkin:

Столкнулся с проблемой

Есть робот, который делал расчет расстояния от цены последней сделки, до предпоследней.

Цену нахожу данным методом



Далее берем и выводим это обычным комментом в трех вариациях на чарт.

Запускаем визуальное тестирование и видим следующую картину


Ждем открытия позиции

В журнале все четко, 1.12070

Но в первых двух случаях ноль обрезался цена 1.1207

В третьем через

Тоже все четко отображается с нулем

Такое происходит только когда цена попадает на целочисленный уровень, ноль обрезается.


Это баг терминала или я что то не так делаю ??????????

Попробуйте так получать цену позиции

//+------------------------------------------------------------------+
//| Expert Get position price function                               |
//+------------------------------------------------------------------+
double GetPositionPrice(const string aSymbol)
{
  double price_in = 0;
  double volume_in = 0;
  if(PositionSelect(aSymbol))
  {
    ulong pos_id = ulong(PositionGetInteger(POSITION_IDENTIFIER));
    if(pos_id > 0)
    {
      if(HistorySelectByPosition(pos_id))
      {
        int deals = HistoryDealsTotal();
        for(int i = 0; i < deals; i++)
        {
          ulong deal_ticket = HistoryDealGetTicket(i);
          ulong order_ticket = ulong(HistoryDealGetInteger(deal_ticket, DEAL_ORDER));
          if(order_ticket > 0)
          {
            ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY(HistoryDealGetInteger(deal_ticket, DEAL_ENTRY));
            if(deal_entry == DEAL_ENTRY_IN)
            {
              double price = HistoryDealGetDouble(deal_ticket, DEAL_PRICE);
              double volume = HistoryDealGetDouble(deal_ticket, DEAL_VOLUME);
              price_in += price * volume;
              volume_in += volume;  
            }
          }
        }
        if(volume_in > 0)
        {
          //int digits=int(SymbolInfoInteger(aSymbol, SYMBOL_DIGITS ));
          return(NormalizeDouble(price_in/volume_in, Digits()));
        }  
      }
      else
      {
        Print(__FUNCTION__, ": Невозможно получить историю позиции по символу ", aSymbol);
      }
    }
    else
    {
      Print(__FUNCTION__, ": Невозможно определить идентификатор позиции по символу ", aSymbol);
    }
  }
  return(0);
}
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Почему режется ноль в котировках билд 2470

Konstantin Seredkin, 2020.06.01 11:29

//+------------------------------------------------------------------+
//| Возвращает цену последней сделки текущей позиции                 |
//+------------------------------------------------------------------+
double CurrentPositionLastDealPrice()
  {
   int    total       =0;   // Всего сделок в списке выбранной истории
   string deal_symbol ="";  // Символ сделки 
   double deal_price  =0.0; // Цена
//--- Если история позиции получена
   if(HistorySelect(pos.time,TimeCurrent()))

При таком вызове запросто может не попасть последняя сделка. Если поставить INT_MAX - будет нормально.

 
Konstantin Seredkin:

..........

А теперь посчитайте получу ли я правильное значение, если мне функция вместо 1.12070  выдает 1.1207

1.1207  - 1.12055  = я получаю иное значение если точно то - 0,0048, которое рушит всю логику работы программы.


.........

У кого-то лыжи не едут....


 

Konstantin Seredkin:

с обрезанием у котировки нуля, последний этап отваливается.

Может вы знаете иной способ вычислить кол-во пунктов между ценами открытия 2-х ордеров подскажите

void OnStart()
  {
//---
     // _Point = 0.00001
     Print(int((1.1125-1.11145)/_Point));  // 104
     Print(int((1.11250-1.11145)/_Point)); // 104
  }
В чем разница не понятно. Есть, или нет последний ноль.
 
Konstantin Seredkin:

Встречный вопрос, как мне вычислить расстояние между ценами открытия ордеров

1-я цена по аналогии выше  1.12070

2-я цена 1.12055

1.12070 - 1.12055 = получаем 15п между ценами


А теперь посчитайте получу ли я правильное значение, если мне функция вместо 1.12070  выдает 1.1207

1.1207  - 1.12055  = я получаю иное значение если точно то - 0,0048, которое рушит всю логику работы программы.


просто есть советник, который усредняет позицию к примеру первые 3 ордера он это делает через 100п, далее условия что бы следующие 3 ордера он усреднил через 100, но при открытии каждого добавлял по 50

150  200 250

дак вот, после этого мне нужно узнать, что между последними 2-мя ордерами расстояние 250п

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

с обрезанием у котировки нуля, последний этап отваливается.

Может вы знаете иной способ вычислить кол-во пунктов между ценами открытия 2-х ордеров подскажите

а что, с двумя классами образования тоже учат программированию советников?)

 

У меня хоть с нулем, хоть без, считает правильно.

Вот это вообще аут

 1.1207  - 1.12055  = я получаю иное значение если точно то - 0,0048.

Автор что, в столбик считал?

 
Evgeniy Zhdan:

У меня хоть с нулем, хоть без, считает правильно.

Вот это вообще аут

 1.1207  - 1.12055  = я получаю иное значение если точно то - 0,0048.

Автор что, в столбик считал?

Не наезжайте на чела. Он "в столбик" ещё не умеет! Иначе он такого результата уж точно не получил бы )))

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