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

 

Ошибка (b3510) в работе CustomTicksAdd - нарушена хронология в истории тиков.

// Проверка, что в истории тики располагаются хронологически.
void CheckTicks( const string Symb )
{
  MqlTick Ticks[];
  
  for (int i = CopyTicksRange(Symb, Ticks) - 1; i > 0; i--)
    if (Ticks[i].time_msc < Ticks[i - 1].time_msc)  
    {
      ArrayPrint(Ticks, _Digits, NULL, i - 1, 3);
      
      break;
    }  
}

void OnStart()
{
  MathSrand((int)TimeLocal());
  
  const string Name = "CUSTOM_BUG053_" + (string)MathRand();
  
  MqlTick Ticks[];
  
  if (CustomSymbolCreate(Name, NULL, _Symbol) && SymbolSelect(Name, true) &&
      (CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, 1e5) > 0))
  {    
    MqlTick FirstTick[1];
    
    FirstTick[0] = Ticks[0];
    FirstTick[0].time -= 30 * 24 * 3600;
    FirstTick[0].time_msc = FirstTick[0].time * 1000;    
    CustomTicksAdd(Name, FirstTick); // Добавили первый тик.
        
    CustomTicksAdd(Name, Ticks); // Поместили тики.
    
    CheckTicks(Name); // Проверяем хронологию.
  }        
}


Результат запуска на MQ-Demo.

2022.11.20 14:15:31.671 Test9 (EURUSD,H1)                        [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2022.11.20 14:15:31.671 Test9 (EURUSD,H1)       [0] 2022.11.18 23:53:01 1.03189 1.03195 0.0000        0 1668815581060       4       0.00000
2022.11.20 14:15:31.671 Test9 (EURUSD,H1)       [1] 2022.10.19 06:56:49 1.03641 1.03642 0.0000        0 1666162609000       6       0.00000
2022.11.20 14:15:31.671 Test9 (EURUSD,H1)       [2] 2022.11.18 23:53:03 1.03188 1.03195 0.0000        0 1668815583264       6       0.00000

Нарушена хронология!

Строка для поискаOshibka 053.

 

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

Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы

fxsaber, 2022.11.20 23:43

Тестер берет какие-то скрытые настройки из кастомного символа, которые недоступны через MQL-свойства и json-конфигурацию. Почему свойства кастомного символа не имеют полной прозрачности - отдельный (важный) вопрос.

Что хранится в свойствах кастомного символа - полностью пока неизвестно.

 

Подскажите знающие.

Вот тут столкнулся впервые с кастомными символами. Думал что может быть проще чем операции импорта/экспорта :)

Вообщем создал символ, загрузил историю по минуткам. Спред поставил везде 1, тиковый объём =10. реальный объём = 1. График символа отображается, всё норм. В архиве котировок, если посмотреть, всё норм, красных баров нету. Запускаю визуальный тестер - результата нет никакого. Он просто не запускается.
Что тут надо сделать такого очевидно-невероятного, чтобы всё заработало?

Если важно вот куски кода:
Данные идут из такого файла:

<TICKER>;<PER>;<DATE>;<TIME>;<OPEN>;<HIGH>;<LOW>;<CLOSE>

SPFB.RTS;60;030122;080000;159,950.0000000;160,960.0000000;159,200.0000000;159,540.0000000

SPFB.RTS;60;030122;090000;159,530.0000000;160,580.0000000;159,470.0000000;160,530.0000000

Всё это запиcываю в цикле в структуру MqlRates:

         int num = ArraySize(rt);
         ArrayResize(rt, num + 1);
         rt[num].open = open;
         rt[num].high = high;
         rt[num].low = low;
         rt[num].close = close;
         rt[num].real_volume = 1;
         rt[num].tick_volume = 10;
         rt[num].spread = 1;
         rt[num].time = 0;
Ну а далее делаю так:
   ENUM_TIMEFRAMES prd = PERIOD_M1;

   ArraySetAsSeries(rt, true);
   for(int i = 0; i < ArraySize(rt); i++)
      rt[i].time = iTime(_Symbol, prd, i);
   ArraySetAsSeries(rt, false);

   CustomRatesDelete(in_new_symbol_name, 0, TimeCurrent());
   CustomRatesUpdate(in_new_symbol_name, rt);

   ChartSetSymbolPeriod(0, in_new_symbol_name, prd);
Я сбросил время котировки из файла, и поставил минутное время начала баров с текущего символа.

Изначально тиковый объём был = 1, но тоже не заработало. Тут начитался на форуме что это может оказывается влиять, поэтому поставил 10 но результат тот же - нулевой.
Только что подумал что может быть незаполнил что то важное в описании символа. В итоге скопировал евробакс, снёс всё его историю и загрузил свою, но результат тот же - нулевой. 
Кто нить в тестер вообще смогу загрузить кастомный символ ? Поделитесь магией.
 
Alexey Oreshkin #:

Запускаю визуальный тестер - результата нет никакого.

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


Так сделал здесь. Посмотрите содержимое архива. Там только те файлы, что нужны для воспроизведения проблемы на любом билде Терминала. Вы можете поступить аналогично, тогда любой при желании сможет воспроизвести проблему меньше, чем за минуту. Удобный и универсальный способ. И безопасный, т.к. нет никаких exe-файлов.


Попробуйте разобраться один раз в архиве по ссылке. И по аналогии создайте zip-файл. Это максимальный перевод решения проблемы в конструктив. Наилучший способ разобраться в проблеме.

Alexey Oreshkin #:

Кто нить в тестер вообще смог загрузить кастомный символ ?

Продолжительное время работаю ТОЛЬКО с кастомными символами в Тестере и рекомендовал бы делать так любому разработчику.

Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы
Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы
  • 2022.11.11
  • www.mql5.com
В настоящий момент тестер стратегий MetaTrader 5 подвергается глубокой переработки командой MQ...
 

Сам использую только CustomRatesReplace. В любом случае при работе с Custom-функциями для разборов всегда нужно проверять возвращаемое значение и код ошибки.

 
fxsaber #:
Уверены?

Сам использую только CustomRatesReplace. В любом случае при работе с Custom-функциями для разборов всегда нужно проверять возвращаемое значение и код ошибки.

Я вначале обнуляю время, Мне оно из файла не важно ,а далее вот тут 

   ArraySetAsSeries(rt, true);
   for(int i = 0; i < ArraySize(rt); i++)
      rt[i].time = iTime(_Symbol, prd, i);
   ArraySetAsSeries(rt, false);

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

CustomRatesUpdate

то время уже есть. Да и в истории цены тоже есть

Сейчас проверю ссылку и архив выше. 

Но главное вот:  Продолжительное время работаю ТОЛЬКО с кастомными символами в Тестере - значит всё работает, осталось разобраться, жаль конечно что не всё так просто и очевидно, и приходиться тратить время на сопутствующие вещи а не на основные.
 
Вопрос закрыт. Всё оказалось гораздо проще. В новом символе были созданы только минутки, а тестер стоит по реальным тикам, которых естественно нету.
 
RusPro #:

CustomTicksReplace и CustomTicksAdd не сохраняют флаги TICK_FLAG_BUY и TICK_FLAG_SELL. Соответственно на пользовательском символе не будут работать индикаторы типа Дельты. Почему разработчики решили не  сохранять эти флаги?

CustomTicksReplace сохраняет вроде. Правда при этом зачем-то удаляет минутные бары. A CustomTicksAdd  выдает ошибку 5310, хотя входной массив упорядочен. Разработчики, поясните?
 

Ivan Titov #:
CustomTicksReplace сохраняет вроде. Правда при этом зачем-то удаляет минутные бары.

Бары автоматически перестраиваются согласно записанным тикам.

CustomTicksAdd  выдает ошибку 5310, хотя входной массив упорядочен.

Скрипт с воспроизведением - меньше гадать.

 
fxsaber #:

Бары автоматически перестраиваются согласно записанным тикам.

Скрипт с воспроизведением - меньше гадать.

Я добавляю тики только с флагами TICK_FLAG_BUY и  TICK_FLAG_SELL. Они разве имеют отношение к барам?

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