Пользовательские символы , непонятное поведение.

 

Создал пользовательский символ из комбинации нескольких стандартных и своих тиковых данных (CustomTicksAdd).

Открыл график этого символа и оставил работать на пару дней, всё работает график рисуется.

Теперь если обновить этот график, то он кардинально меняется, кажется что пропадают какие то данные, на которых он считался.

Тиковые данные этого графика сохраняются после обновления?

 
Lyuk:

из комбинации нескольких стандартных и своих тиковых данных

Как это?

Тики добавляются только вами (CustomTicksAdd), или инструмент — формульный?

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

 

Порядок моих действий:

Вручную создал новый символ ХХХ путём копирования стандартного, переименовал, добавил в обзор рынка.

Аналогично создал новый символ YYY,  добавил в него формулу из стандартных символов и XXX.

Написал сервис где следующий код добавляет тики в терминал по 1 в цикле.

      int symb_digits = SymbolInfoInteger(symbol, SYMBOL_DIGITS);
      ticks[0].ask = NormalizeDouble(StringToDouble(msg_array[1]),symb_digits);
      ticks[0].bid = NormalizeDouble(StringToDouble(msg_array[2]),symb_digits);
      // Если время 0 и время миллисек 0 то терминал подставит время сервера
      ticks[0].time = 0;
      ticks[0].time_msc = 0;
      CustomTicksAdd(symbol, ticks); 

где symbol = "XXX"

Запустил сервис, всё работает, ошибок нет. Графики XXX и YYY рисуются.

Спустя пару дней ожидал что терминал сам сохранил историю XXX, нажал обновить график YYY, график отрисовался но сильно изменился (такого не должно быть - все входные данные не менялись уже)

Вообще ожидал что можно будет изменять формулу YYY , при этом терминал сам брал бы данные по XXX сохранённые на диске.

При компиляции эта строка выдаёт предупреждение о возможной потере данных при конверсии типов, как исправить не знаю (int в int ?)

int symb_digits = SymbolInfoInteger(symbol, SYMBOL_DIGITS);
 
Lyuk:

Аналогично создал новый символ YYY,  добавил в него формулу из стандартных символов и XXX.

Вот тут ответ.

Формульные символы строятся из тиков только онлайн, а история пересчитывается из OHLC.

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

 

Что бы создать YYY в своём коде, необходимо как то получать тики с других символов по их приходу, а как я понял из чтения форума простого и надёжного способа это сделать нет. Задание формулы казалось решало эту проблему, но видимо и тут проблемы всплыли (обновляется онлайн, но не понятно почему уже рассчитанные данные не сохраняются на диск.)

Возможно есть способ заставить терминал сохранить тиковые данные с графика онлайн?

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

 
Lyuk:

Что бы создать YYY в своём коде, необходимо как то получать тики с других символов по их приходу, а как я понял из чтения форума простого и надёжного способа это сделать нет. Задание формулы казалось решало эту проблему, но видимо и тут проблемы всплыли (обновляется онлайн, но не понятно почему уже рассчитанные данные не сохраняются на диск.)

Возможно есть способ заставить терминал сохранить тиковые данные с графика онлайн?

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

Формульный синтетик ничего волшебного не делает. Получает тики раз в 100 (!) мс и строит синтетик.

Вы можете, как минимум, сделать не хуже, просто засунув расчеты в таймер (или даже лучше, если сделаете более высокое разрешение — например, 16 мс).


Ну, а если нужна 100% точность, то есть индикаторы-шпионы (посмотрите одну из последних созданных мной тем) и CopyTicksRange (который, возможно, не даст супер-скорости онлайн, но идеально точно построит историю).

Так что ваша задача решаема. Но не с помощью полуфабриката формульных синтетиков.

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