Ошибки, баги, вопросы - страница 3289

 
Roman #:

Но на реальном тиковом режиме ведь не получиться определить, реальные тики используются или сгенерированные.
Задача ведь в этом была. И код 4014 не будет возращён как я понимаю.
Мне тоже стал интересен способ, как программно это определить.

Мне от любых надо отделить реальные тики. 2 режима уже отделил через 4014. Дальше не вижу идей. 

Можно попросить разработчиков сделать эту информацию доступной.

 
fxsaber #:
Там всего 140 онлайн-символов. Объем tkc-файлов - объем трафика по их передаче. Т.е. несколько раз в сутки выкачиваете с сервера огромные объемы данных! Похоже на неправильное формирование входных параметров CopyTicks-функций.

Сделал тестовый советник для проверки трафика, потребляемого функцией CopyTicks:

struct struct_sym
   {
   string   s_symbol;
   bool     s_book;
   int      s_ticks_0;
   int      s_ticks_1;
   datetime s_time;
   };
struct_sym sym[];
int err;
MqlTick b_tick;
//+------------------------------------------------------------------+




//+------------------------------------------------------------------+
int OnInit(){
   int Reason=UninitializeReason();
   if (Reason==REASON_CHARTCHANGE || Reason==REASON_TEMPLATE) return(INIT_SUCCEEDED);

   int y=0;
   ArrayResize(sym,0,100);
   for (int n=0; n<SymbolsTotal(true); n++)
      {
      if (SymbolName(n, true)==_Symbol) continue;
      ArrayResize(sym,y+1,100);
      sym[y].s_symbol=SymbolName(n, true);
      sym[y].s_ticks_0=0;
      sym[y].s_ticks_1=0;
      sym[y].s_time=0;
      sym[y].s_book=MarketBookAdd(sym[y].s_symbol);
      if (sym[y].s_book) Print(sym[y].s_symbol+": book subscription");
      else
         {
         err=GetLastError();
         Print(sym[y].s_symbol+": Can't set up book subscription: "+(string)err);
         }
      y++;
      }
return(INIT_SUCCEEDED);}
//-------------------------------------------------------------------------------------------------------------------+





void OnTick(){
   static datetime last_secons=0;
   if (last_secons==timeSeconds(TimeCurrent())) return;
   last_secons=timeSeconds(TimeCurrent());
   string comm="";
   for (int y=0;y<ArrayRange(sym,0);y++)
      {
      crSymbolInfoTick(sym[y].s_symbol,b_tick);
      comm+=sym[y].s_symbol+" -"+"\t"+
            " ticks "+(string)sym[y].s_ticks_1+"/"+(string)sym[y].s_ticks_0+"\t"+
            " bid "+DoubleToString(SymbolInfoDouble(sym[y].s_symbol,SYMBOL_BID), (int)SymbolInfoInteger(sym[y].s_symbol,SYMBOL_DIGITS))+"\t"+
            " time "+TimeToString(sym[y].s_time,TIME_DATE|TIME_SECONDS)+
            "\n"
            ;
      }
   Comment(comm);
}

MqlDateTime curtime;
int timeSeconds(datetime curTime){
   TimeToStruct(curTime, curtime);
return(curtime.sec);}
//+------------------------------------------------------------------+




void OnBookEvent(const string &b_symbol){ 
   for (int y=0;y<ArrayRange(sym,0);y++)
      {
      if (sym[y].s_symbol!=b_symbol) continue;
      sym[y].s_ticks_0++;
      if (!crSymbolInfoTick(sym[y].s_symbol,b_tick)) continue;
      sym[y].s_ticks_1++;
      sym[y].s_time=b_tick.time;
      OnTick();
      break;
      }
}
//+------------------------------------------------------------------+




void OnDeinit(const int reason){
   if (reason==REASON_CHARTCHANGE || reason==REASON_TEMPLATE) return;
   for (int y=0;y<ArrayRange(sym,0);y++) {if (sym[y].s_book) MarketBookRelease(sym[y].s_symbol);}
}
//+------------------------------------------------------------------+




bool crSymbolInfoTick(string symbol, MqlTick &tick){
   MqlTick ticks[1];
   int res=CopyTicks(symbol, ticks, COPY_TICKS_ALL, 0, 1);
   if (res<0) return(false);
   tick.time=ticks[0].time;
   tick.bid=ticks[0].bid;
   tick.ask=ticks[0].ask;
   tick.last=ticks[0].last;
   tick.volume=ticks[0].volume;
   tick.time_msc=ticks[0].time_msc;
   tick.flags=ticks[0].flags;
   tick.volume_real=ticks[0].volume_real;
return(true);}

Запустил его на 40 инструментах. Действительно за 10 часов набежало 600 МБ tks файлов. Причем, видимо сначала терминал хранит все в RAMM, потом пачками скидывает на винт.

Заменил я SymbolInfoTick на CopyTicks в свое время по причине того, что та функция выдавала ерунду при запросе к кастомным символам, в которые у меня "прокладка" записывала тики с крипто биржи. Впрочем, как и SymbolInfoDouble с параметрами SYMBOL_BID/SYMBOL_ASK (ее я тоже заменил на через CopyTicks)

Таким образом, что это означает? Неправильное использование функции или ошибка со стороны терминала?

PS: Прошло еще 12 часов и размер папки с тиками уже 6.5 GB

PPS: Кстати TimeCurrent() на кастомных символах, построенных на базе каcтомных тоже не работает...его делал я тоже через CopyTicks

 
Forester #:
Можно ли как-то узнать, что тестер работает в режиме по реальным тикам?

Можно.

 
fxsaber #:

Можно.

Интересный вариант. Спасибо!

 
jurijsk #:

Заменил я SymbolInfoTick на CopyTicks в свое время по причине того, что та функция выдавала ерунду при запросе к кастомным символам

SymbolInfoTick должен возвращать последний тик, записанный через CustomTicksAdd.

Впрочем, как и SymbolInfoDouble с параметрами SYMBOL_BID/SYMBOL_ASK (ее я тоже заменил на через CopyTicks)

Внутри этих функций прописан SymbolInfoTick.

Таким образом, что это означает? Неправильное использование функции или ошибка со стороны терминала?

Видимо, архитектурно так заложено: расчет на то, что раз идет работа с тиками - закачаем сразу для облегчения. Решение проблемы.

Ограничить количество тиковой истории
Ограничить количество тиковой истории
  • 2021.12.05
  • www.mql5.com
Арендую сторонний ВПС. Эксперт использует тиковые данные. Для старта советника Загружается тиковая история на 100000 тиков...
 
fxsaber #:

Можно.

В эксперте работает. В индикаторе при вызове из OnCalculate() первый вызов всегда возвращает true, последующие false. При любом режиме тестирования всегда так.

 
Forester #:

В эксперте работает. В индикаторе при вызове из OnCalculate() первый вызов всегда возвращает true, последующие false. При любом режиме тестирования всегда так.

Никогда индикаторы не запускал в Тестере. Некомпетентен в этом.

 
fxsaber #:

Никогда индикаторы не запускал в Тестере. Некомпетентен в этом.

Эксперт запрашивает значения индикатора при тесте.
Потому и проверяю как они себя там ведут.
Тогда свой метод через 4014 ошибку оставлю. Хотя бы O и OHLC определяет.

Хорошо бы разработчики сделали запрос метода тестирования.

 
Как внутри эксперта узнать на каком агенте (порядковый номер) он запущен в тестере? В справке не нашел информации об этом.
 
Andrey Dik #:
Как внутри эксперта узнать на каком агенте (порядковый номер) он запущен в тестере? В справке не нашел информации об этом.
      agent_dir="0000";//при запуске в терминале
      string p=MQLInfoString(MQL_PROGRAM_PATH);// C:\Users\0\AppData\Roaming\MetaQuotes\Tester\D0E8209F77C8CF37AD8BF550E51FF075\Agent-127.0.0.1-3000\MQL5\Experts\testEXE.ex5
      int agent_pos=StringFind(p,"Agent-");// при оптимизации запустится в папке с номером агента
      if(agent_pos!=-1){agent_pos=StringFind(p,"-",agent_pos+6);agent_dir = StringSubstr(p,agent_pos+1,4);}//выдаст 3001, 3002... по номеру папки в котором тестер запустился