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

 
jurijsk #:

Только в таком виде использую. Вроде правильное обращение к функции. Может еще от чего зависит?

Тогда ошибка в самой функции, раз пытается синхронизировать всю тиковую историю вместо свежего исторического тика.

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

В журнале тестера смотри соответствующие принты

2023.02.17 17:22:22.186 Core 1  TEST : 2022.02.01 00:00 - 2023.01.31 00:00  no real ticks, every tick generation used
 
Roman #:

В журнале тестера смотри соответствующие принты

Имею в виду, не я, а эксперт и индикатор в процессе выполнения.

Пока нашел отсев только по ценам открытия и по OHLC
При вызове CopyTicksRange в этих режимах появляется ошибка:

ERR_FUNCTION_NOT_ALLOWED

4014

Системная функция не разрешена для вызова


Но реальные тики от сгенерированных пока не могу отделить.
Свойств тестера на определение режима не нашел. Может не там искал?

 
Forester #:

Имею в виду, не я, а эксперт и индикатор в процессе выполнения.

За штатную программную идентификацию из кода, не знаю.
Не искал способ. Возможно его и нет.

Можно попробовать читать файл лога тестера, если система даст открыть его
тогда искать запись  

no real ticks, every tick generation used

но это так себе решение, как всегда костыль.

 
Roman #:

За штатную программную идентификацию из кода, не знаю.
Не искал способ. Возможно его и нет.

Можно попробовать читать файл лога тестера, если система даст открыть его
тогда искать запись  

но это так себе решение, как всегда костыль.

Через 4014 лучше. Хоть половину режимов отсею. Спасибо

 
Forester #:

Через 4014 лучше. Хоть половину режимов отсею. Спасибо

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

 
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 #:
Можно ли как-то узнать, что тестер работает в режиме по реальным тикам?

Можно.

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