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

 

Экспериментирую все с тем же кастомным символом за 2017. Теперь добавил в него тики.
Запускаю тестер не с начала года, а с 29 декабря.
Делаю запрос тиков с первого бара в истории. Бары в терминале есть с 3 янв 2017 года.

Даты запроса к CopyTicksRange    from 2017.01.03 01:06:00 to 2017.12.28 23:59:00 pos=6 copied=0

Скопировано 0 тиков.
Тестер еще печатает
 EURUSD_cme : real ticks begin from 2017.12.29 00:00:00

Следущие вызовы уже начинают копировать

 from 2017.12.28 23:59:00 to 2017.12.29 01:00:00 pos=345805 copied=2

В папке тестера файл с тиками только за декабрь и малого размера.

Попробовал запустить с 3 января, тики за весь год загрузились. При последующих вызовах с 29 декабря тестер их уже видит, т.к. файлы закачаны в папку тестера. Но если файлы удалить, и снова попробовть запуск с 29 декабря, то история опять будет только с 29 дек, а не запрошенная с 3 янв.


Так и должно быть? Есть способ заставить тестер подгрузить все запрошенные тики, бывшие до даты начала тестирования (без трюка с предварительным тестом с 1 янв)?
Что нибудь вроде #property tester_file , только надо тики символа.

 
elibrarius #:

Так и должно быть?

Тиковая история значительно больше по объему баровой. Тестер экономит ресурсы.

 

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

Уже неделю бьюсь, а понять где ошибка не могу. Нужна помощь.

Постарался сделать минимальный код воспроизводящий ошибку.

Итак, Мосбиржа, создаю пользовательский символ, копирую тики с флагом COPY_TICKS_ALL и сдвигаю их назад по времени, символ создаётся, но он не корректный если сравнивать с оригинальным. 

Бары строятся не по цене Last и реальные объёмы отличаются от оригинала.


Ну ладно, меняю флаг тиков при копировании на COPY_TICKS_TRADE.

График и объёмы получаются один в один с оригиналом. 

УРА!!! Праздник, счастье)))


Но счастье длилось не долго.

Запускаю советник в тестере на созданном символе, а там нет цен bid и ask, только цены last.

Проверяю, тестер с символом созданным с флагом COPY_TICKS_ALL bid, ask, last всё есть.

На символе созданном  с флагом  COPY_TICKS_TRADE,  last есть, bid, ask  нет.

При этом в терминале все тики есть, хоть с тем, хоть с другим флагом создан символ.


Распечатал по пять первых тиков

Терминал: символ создан с флагом COPY_TICKS_ALL
tick[0].time = 1995.02.06 09:00:00; tick[0].ask = 71373.0; tick[0].bid = 71310.0; tick[0].last = 71340.0; 
tick[0].time = 1995.02.06 09:01:00; tick[0].ask = 71383.0; tick[0].bid = 71382.0; tick[0].last = 71383.0; 
tick[0].time = 1995.02.06 09:02:00; tick[0].ask = 71396.0; tick[0].bid = 71395.0; tick[0].last = 71396.0; 
tick[0].time = 1995.02.06 09:03:00; tick[0].ask = 71384.0; tick[0].bid = 71372.0; tick[0].last = 71377.0; 
tick[0].time = 1995.02.06 09:04:00; tick[0].ask = 71408.0; tick[0].bid = 71402.0; tick[0].last = 71408.0; 
//----------------------------------
Тестер: символ создан с флагом COPY_TICKS_ALL
tick[0].time = 1995.02.06 09:00:00; tick[0].ask = 71373.0; tick[0].bid = 71310.0; tick[0].last = 71340.0; 
tick[0].time = 1995.02.06 09:01:00; tick[0].ask = 71383.0; tick[0].bid = 71382.0; tick[0].last = 71383.0; 
tick[0].time = 1995.02.06 09:02:00; tick[0].ask = 71396.0; tick[0].bid = 71395.0; tick[0].last = 71396.0; 
tick[0].time = 1995.02.06 09:03:00; tick[0].ask = 71384.0; tick[0].bid = 71372.0; tick[0].last = 71377.0; 
tick[0].time = 1995.02.06 09:04:00; tick[0].ask = 71408.0; tick[0].bid = 71402.0; tick[0].last = 71408.0; 
//-------------------------------------
Терминал: символ создан с флагом COPY_TICKS_TRADE
tick[0].time = 1995.02.06 09:00:00; tick[0].ask = 71373.0; tick[0].bid = 71310.0; tick[0].last = 71340.0; 
tick[0].time = 1995.02.06 09:01:00; tick[0].ask = 71383.0; tick[0].bid = 71382.0; tick[0].last = 71383.0; 
tick[0].time = 1995.02.06 09:02:00; tick[0].ask = 71396.0; tick[0].bid = 71395.0; tick[0].last = 71396.0; 
tick[0].time = 1995.02.06 09:03:01; tick[0].ask = 71373.0; tick[0].bid = 71372.0; tick[0].last = 71372.0; 
tick[0].time = 1995.02.06 09:04:00; tick[0].ask = 71408.0; tick[0].bid = 71402.0; tick[0].last = 71402.0; 
//-------------------------------------
Тестер: символ создан с флагом COPY_TICKS_TRADE
tick[0].time = 1995.02.06 09:00:00; tick[0].ask = 0.0; tick[0].bid = 0.0; tick[0].last = 71340.0; 
tick[0].time = 1995.02.06 09:01:00; tick[0].ask = 0.0; tick[0].bid = 0.0; tick[0].last = 71383.0; 
tick[0].time = 1995.02.06 09:02:00; tick[0].ask = 0.0; tick[0].bid = 0.0; tick[0].last = 71396.0; 
tick[0].time = 1995.02.06 09:03:01; tick[0].ask = 0.0; tick[0].bid = 0.0; tick[0].last = 71372.0; 
tick[0].time = 1995.02.06 09:04:00; tick[0].ask = 0.0; tick[0].bid = 0.0; tick[0].last = 71402.0; 


Код которым создавал пользовательский символ.

#property script_show_inputs

enum flag
  {
   ALL = COPY_TICKS_ALL,
   TRADE = COPY_TICKS_TRADE
//INFO = COPY_TICKS_INFO
  };

input flag m_flag = ALL;
//+------------------------------------------------------------------+
void OnStart()
  {
   string c_Name = "c_" + _Symbol; // имя пользовательского символа

//--- Закрыли график (если он открыт) с именем создаваемого символа
   long chart_id = ChartFirst();
   do
     {
      if(c_Name == ChartSymbol(chart_id))
         if(ChartClose(chart_id))
            Sleep(100);
         else
           {
            Print("Не удалось удались график символа", c_Name, " chart_id ", chart_id);
            return;
           }
      chart_id = ChartNext(chart_id);
     }
   while(chart_id >= 0 && !IsStopped());

//--- убрали символ из обзора рынка и удалили его
   if(SymbolSelect(c_Name, false))
     {
      CustomSymbolDelete(c_Name);
      CustomRatesDelete(c_Name, 0, LONG_MAX);
      CustomTicksDelete(c_Name, 0, LONG_MAX);
     }

   MqlTick ticks[];
   datetime prev_time = TimeCurrent() - 24 * 13 * 60 * 60; // время 13 дней от времени последнего тика
   prev_time = prev_time / 60 * 60;
   long shiftTime = 883612800; // сдвиг времени на произвольное количество секунд (28 лет)

   if(prev_time > 0)
     {
      int result = CopyTicksRange(_Symbol, ticks, m_flag, prev_time * 1000);
      if(result > 0)
        {
         //GnomeSort(ticks); //--- всего один раз пригодилась сортировка и больше не сортированные тики я не встречал
         for(int i = 0; i < result && !IsStopped(); i++)
           {
            //--- можно было просто сдвинуть все тики на shiftTime назад, но у меня свои заморочки и мне надо было их проверить, поэтому код ниже такой.
            if(ticks[i].time >= prev_time)
              {
               while(prev_time <= ticks[i].time && !IsStopped())
                  prev_time += 60;

               ticks[i].time -= (datetime)shiftTime;
               ticks[i].time_msc -= shiftTime * 1000;
              }
            else
              {
               ticks[i].time -= (datetime)shiftTime;
               ticks[i].time_msc -= shiftTime * 1000;
              }
           }

         ResetLastError();
         if(CustomSymbolCreate(c_Name, "C", _Symbol))// создаём пользовательский символ
           {
            datetime from = D'1970.01.01 00:00:00';
            datetime to = D'1970.01.02 00:00:00';
            for(int i = 0; i < 7; i++)//установим торговую и котировочную сессию
              {
               CustomSymbolSetSessionQuote(c_Name, (ENUM_DAY_OF_WEEK)i, 0, from, to);
               CustomSymbolSetSessionTrade(c_Name, (ENUM_DAY_OF_WEEK)i, 0, from, to);
               CustomSymbolSetSessionQuote(c_Name, (ENUM_DAY_OF_WEEK)i, 1, 0, 0);
               CustomSymbolSetSessionTrade(c_Name, (ENUM_DAY_OF_WEEK)i, 1, 0, 0);
              }
            CustomSymbolSetInteger(c_Name, SYMBOL_CHART_MODE, SYMBOL_CHART_MODE_LAST); // явно задаю, что графики строятся по цене last.
            //Хотя нет вообще ни какой разницы, копируется CHART_MODE со свойств символа или задаётся здесь
            if(SymbolSelect(c_Name, true)) // добавляем символ в обзор рынка
              {
               ResetLastError();
               int count = CustomTicksReplace(c_Name, ticks[0].time_msc, ticks[result - 1].time_msc, ticks); // заменяем/вставляем тиковую историю в созданный символ
               if(count < result)
                  PrintFormat("CustomTicksReplace Записано тиков %d, скачано %d, Error %d", count, result, GetLastError());
               else
                 {
                  Sleep(100);
                  ChartOpen(c_Name, PERIOD_M1);
                  //ChartSetInteger(ChartOpen(c_Name, PERIOD_M1), CHART_SHOW_PERIOD_SEP, 0, false);// уберём линии периодов на открываемом графике
                 }
              }
           }
         else
            Print("CustomSymbolCreate Error ", GetLastError());
        }
     }

  }
//+------------------------------------------------------------------+
void GnomeSort(MqlTick & arr[])
  {
   int n = ArraySize(arr);
   int i = 0;

   while(i < n && !IsStopped())
     {
      if(i == 0 || (arr[i].time_msc >= arr[i - 1].time_msc))
         i++;
      else
        {
         MqlTick sw = arr[i - 1];
         Print(sw.time);
         arr[i - 1] = arr[i];
         arr[i] = sw;
         i--;
        }
     }
  }
//+------------------------------------------------------------------+


Код которым распечатывал тики в терминале и тестере

#property indicator_chart_window
#property indicator_plots 0
#define TOSTR(A) #A + " = " + (string)(A) + "; "
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   if(prev_calculated <= 0)
      for(int i = 0; i < 5 && !IsStopped(); i++)
        {
         MqlTick tick[1];
         CopyTicks(_Symbol, tick, COPY_TICKS_ALL, time[i] * 1000, 1);
         Print(TOSTR(tick[0].time), TOSTR(tick[0].ask), TOSTR(tick[0].bid), TOSTR(tick[0].last));
        }
   ChartIndicatorDelete(0, ChartWindowFind(0, MQLInfoString(MQL_PROGRAM_NAME)), MQLInfoString(MQL_PROGRAM_NAME));
   return(rates_total);
  }
//+------------------------------------------------------------------+


Файлы .tkc что в терминале, что в тестере одинаковые по размеру, а вот хэш у них  разный.


P.S. Чтоб повторить ошибку фалы истории надо удалить из папки тестера. Так как они не перезаписываются, а только могут дописать что то новое.

Папка тестера C:\Users\Iskander\AppData\Roaming\MetaQuotes\Tester\FEFCD69D9E8B36076FA9ACD98A167923\bases\Open-Broker\ticks\c_Si-3.23

P.P.S Только сейчас понял, что чтоб не удалять файлы истории из тестера надо было пользовательские символы создавать с разными именами.

Файлы:
 
Aleksandr Slavskii #:

Уже неделю бьюсь, а понять где ошибка не могу. Нужна помощь.

Постарался сделать минимальный код воспроизводящий ошибку.

Наверное, нужен инвест-доступ (в ЛС) к счету.
 
Aleksandr Slavskii #:

Возможно с флагами проблема. Если их не ставить, то терминал сам ставит. У меня таким образом в одном из баров не было бид цен, а только аски. В итоге бара вообще не было в истории, бары то бидам формируются. Стал сам назначать нужные флаги например Ticks[n].flags=TICK_FLAG_BID|TICK_FLAG_VOLUME; даже если цена бид=0 (т.е. не изменилась). После этого цены бид стали равными последнему известному биду != 0; и бар стали формироваться.
Это пример, может у вас тоже с флагами что-то...

 
fxsaber #:
Наверное, нужен инвест-доступ (в ЛС) к счету.

В телеге написал.

 
Forester #:

Возможно с флагами проблема. Если их не ставить, то терминал сам ставит. У меня таким образом в одном из баров не было бид цен, а только аски. В итоге бара вообще не было в истории, бары то бидам формируются. Стал сам назначать нужные флаги например Ticks[n].flags=TICK_FLAG_BID|TICK_FLAG_VOLUME; даже если цена бид=0 (т.е. не изменилась). После этого цены бид стали равными последнему известному биду != 0; и бар стали формироваться.
Это пример, может у вас тоже с флагами что-то...

Эта проблема у вас проявлялась только в тестере или в терминале?

У меня проблема только с тестером, в терминале всё красиво. А тестер берёт историю тиков из терминала, соответственно я даже представить не могу, на какие флаги менять флаги, если в терминале всё правильно.

 
Aleksandr Slavskii #:

Эта проблема у вас проявлялась только в тестере или в терминале?

Уже не помню, везде наверное. Рассматривал тики того бара в терминале и понял, что ни одного бид тика не было. Добавил флаги и они появились.

 
Aleksandr Slavskii #:

Эта проблема у вас проявлялась только в тестере или в терминале?

У меня проблема только с тестером, в терминале всё красиво. А тестер берёт историю тиков из терминала, соответственно я даже представить не могу, на какие флаги менять флаги, если в терминале всё правильно.

Еще момент, если только в тесетре проблема..

Тиковые файлы в папке тестера могут лежать со времени ваших первых тестов. Они не перезаписываются, а дописываются, если есть новые данные (вроде так, но не уверен на 100%). Удалите файлы и они снова закачаются уже в новой версии.

 
Forester #:

Возможно с флагами проблема. Если их не ставить, то терминал сам ставит. У меня таким образом в одном из баров не было бид цен, а только аски. В итоге бара вообще не было в истории, бары то бидам формируются. Стал сам назначать нужные флаги например Ticks[n].flags=TICK_FLAG_BID|TICK_FLAG_VOLUME; даже если цена бид=0 (т.е. не изменилась). После этого цены бид стали равными последнему известному биду != 0; и бар стали формироваться.
Это пример, может у вас тоже с флагами что-то...

О как, сработало!!! 

Я в в шоке. столько времени убил. Флаги тоже пробовал менять, но согда копировал тики  COPY_TICKS_ALL, так как там были лишние.

Сейчас при копировании тиков  COPY_TICKS_TRAD, сделал флаги равными нулю и всё заработало!!!


Ну спасибо за наводку. Просто огромное, преогромное спасибо!!!

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