Пользовательские символы. Ошибки, баги, вопросы, предложения. - страница 23

 
Slava :

На данный момент нельзя формировать бары пользовательских инструментов тиками несегодняшнего (вчерашнего, позавчерашнего, прошлогоднего etc) дня.

Но. Мы сделали поправку.

При использовании CustomTicksReplace (не CustomTicksAdd! не надо использовать CustomTicksAdd для массового добавления тиков) последний день добавленных тиков становится "текущим", если до этого не было тиков за сегодняшний день.

Ждите следующего билда. Потом продолжим эксперименты и обсуждения

Я использую Build 2177. Я думаю, что это последний.

Но я не могу работать с CUSTOMSYMBOL. Можете ли вы сказать мне, когда я могу ожидать сборку, которая мне поможет?

Где я могу увидеть изменения в сборке?

 

Приложенный индикатор работает в текущем билде 2177

Это - Ваш индикатор. Отредактированный, но алгоритм остался прежний. Файл Symbol.mqh я поместил в MQL5\Include\Includes

Поменяйте строчку

#include  <Includes\Symbol.mqh>

таким образом, чтобы использовался Ваш Symbol.mqh

Бары формируются. Тики правильно применяются к истории, а не только в MarketWatch


Файлы:
 
Slava :

Приложенный индикатор работает в текущем билде 2177

Это - Ваш индикатор. Отредактированный, но алгоритм остался прежний. Файл Symbol.mqh я поместил в MQL5\Include\Includes

Поменяйте строчку

таким образом, чтобы использовался Ваш Symbol.mqh

Бары формируются. Тики правильно применяются к истории, а не только в MarketWatch


Я проверю. Может быть, некоторые проблемы в моем коде. Но код выглядит хорошо.

 

Баг 25.

При записи тиков в кастомный символ происходит их разнормализация!

sinput datetime inDateFrom = D'2019.12.01';

// Проверка нормализации числа.
bool IsNorm( const double Price )
{
  return(NormalizeDouble(Price, _Digits) == Price);
}

#define TOSTRING(A) #A + " = " + DoubleToString(A, 16) + " "
#define PRINT(A) Print(TOSTRING(A) + TOSTRING(NormalizeDouble(A, _Digits)))
#define ISNORM(A) if (!IsNorm(A)) { PRINT(A); Count++; };

// Распечатка ненормализованных цен тиков.
void CheckNorm( const MqlTick &Ticks[], const int MaxAmount = 10 )
{  
  const int Size = ArraySize(Ticks);
  
  for (int i = 0, Count  = 0; (i < Size) && (Count < MaxAmount); i++)
  {
    ISNORM(Ticks[i].bid)
    ISNORM(Ticks[i].ask)
    ISNORM(Ticks[i].last)
  }
}

// Нормализация цен тика.
void Normalize( MqlTick &Tick, const int digits )
{
  Tick.bid = ::NormalizeDouble(Tick.bid, digits);
  Tick.ask = ::NormalizeDouble(Tick.ask,  digits);
  Tick.last = ::NormalizeDouble(Tick.last, digits);
}

// Нормализация цен тиков.
void Normalize( MqlTick &Ticks[], const int digits )
{
  for (int i = ArraySize(Ticks) - 1; i >= 0; i--)
    Normalize(Ticks[i], digits);
}

void OnStart()
{
  const string Name = "TEMP12345";                                                           // Имя кастомного символа
  const string SymbOrig = "EURUSD";                                                          // Имя оригинального символа

  MqlTick Ticks[];
  
  const int Size = CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)inDateFrom * 1000); // Считали EURUSD-тики.
    
  if ((Size > 0) && CustomSymbolCreate(Name, NULL, SymbOrig) && SymbolSelect(Name, true))    // Создали символ на основе EURUSD.
  {
    const int digits = (int)SymbolInfoInteger(Name, SYMBOL_DIGITS);
    
    Normalize(Ticks, digits);                                                                // Нормализовали цены тиков.
    
    Print("Check1");
    CheckNorm(Ticks);                                                                        // Проверили, что цены тиков нормализованы.
    
    CustomTicksReplace(Name, 0, LONG_MAX, Ticks);                                            // Поместили в него историю EURUSD.        

    MqlTick NewTicks[];
    
    CopyTicksRange(Name, NewTicks, COPY_TICKS_ALL, (long)inDateFrom * 1000);                 // Считали тики из кастомного символа
    
    Print("Check2");
    CheckNorm(NewTicks);                                                                     // Проверили, что цены тиков нормализованы.
  }
}


Результат

Check1
Check2
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 


Похоже, внутри Терминала есть какая-то своя NormalizeDouble, отличная от штатной. Этот баг может незаметно сказываться на работе многих алгоритмов.


Просьба починить. Естесственная необходимость записи нормализованных цен не может быть осуществлена.

 
fxsaber:

Баг 25.

При записи тиков в кастомный символ происходит их разнормализация!

Результат

Похоже, внутри Терминала есть какая-то своя NormalizeDouble, отличная от штатной. Этот баг может незаметно сказываться на работе многих алгоритмов.

Просьба починить. Естесственная необходимость записи нормализованных цен не может быть осуществлена.

У тебя перегруженная функция Normalize
Попробуй изменить имя функций.
Может из за этого слетает корректная нормализация.

 
fxsaber:

Баг 25.

При записи тиков в кастомный символ происходит их разнормализация!


Результат


Похоже, внутри Терминала есть какая-то своя NormalizeDouble, отличная от штатной. Этот баг может незаметно сказываться на работе многих алгоритмов.


Просьба починить. Естесственная необходимость записи нормализованных цен не может быть осуществлена.

Оба случая являются результатами нормализации по количеству знаков после запятой.

Вы до сих пор сравниваете вещественные числа на абсолютное равенство?

Какой сервер является источником исходных тиков?

 
Roman:

У тебя перегруженная функция Normalize
Попробуй изменить имя функций.
Может из за этого слетает корректная нормализация.

В коде есть тест на корректность нормализации. До записи тиков в кастомный символ, этот тест успешно проходит. Код проверял.

 
Slava:

Оба случая являются результатами нормализации по количеству знаков после запятой.

Вы до сих пор сравниваете вещественные числа на абсолютное равенство?

Какой сервер является источником исходных тиков?

Сервер MQ-Beta. Но в данной ситуации сервер не при чем совсем. Что делаю.

  1. Нормализую массив тиков и проверяю, что это так.
  2. Записываю его в кастомный символ.
  3. Считываю из кастомного символа записанные тики.
  4. Проверяю их на нормализацию - они не нормализованы.
Т.е. на запись отправил одни тики, а записались совсем другие.
 
Наверное, из-за аварийных закрытий Терминала остаются хвосты в папке bases\Custom.
 
fxsaber:

Баг 25.

2280 - починили, Спасибо.

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