Но на реальном тиковом режиме ведь не получиться определить, реальные тики используются или сгенерированные. Задача ведь в этом была. И код 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;
//+------------------------------------------------------------------+//+------------------------------------------------------------------+intOnInit(){
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);}
//-------------------------------------------------------------------------------------------------------------------+voidOnTick(){
staticdatetime 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);}
//+------------------------------------------------------------------+voidOnBookEvent(conststring &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;
}
}
//+------------------------------------------------------------------+voidOnDeinit(constint 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
В эксперте работает. В индикаторе при вызове из OnCalculate() первый вызов всегда возвращает true, последующие false. При любом режиме тестирования всегда так.
В эксперте работает. В индикаторе при вызове из OnCalculate() первый вызов всегда возвращает true, последующие false. При любом режиме тестирования всегда так.
Никогда индикаторы не запускал в Тестере. Некомпетентен в этом.
Никогда индикаторы не запускал в Тестере. Некомпетентен в этом.
Эксперт запрашивает значения индикатора при тесте. Потому и проверяю как они себя там ведут. Тогда свой метод через 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.ex5int 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... по номеру папки в котором тестер запустился
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Но на реальном тиковом режиме ведь не получиться определить, реальные тики используются или сгенерированные.
Задача ведь в этом была. И код 4014 не будет возращён как я понимаю.
Мне тоже стал интересен способ, как программно это определить.
Мне от любых надо отделить реальные тики. 2 режима уже отделил через 4014. Дальше не вижу идей.
Можно попросить разработчиков сделать эту информацию доступной.
Там всего 140 онлайн-символов. Объем tkc-файлов - объем трафика по их передаче. Т.е. несколько раз в сутки выкачиваете с сервера огромные объемы данных! Похоже на неправильное формирование входных параметров CopyTicks-функций.
Сделал тестовый советник для проверки трафика, потребляемого функцией CopyTicks:
Запустил его на 40 инструментах. Действительно за 10 часов набежало 600 МБ tks файлов. Причем, видимо сначала терминал хранит все в RAMM, потом пачками скидывает на винт.
Заменил я SymbolInfoTick на CopyTicks в свое время по причине того, что та функция выдавала ерунду при запросе к кастомным символам, в которые у меня "прокладка" записывала тики с крипто биржи. Впрочем, как и SymbolInfoDouble с параметрами SYMBOL_BID/SYMBOL_ASK (ее я тоже заменил на через CopyTicks)
Таким образом, что это означает? Неправильное использование функции или ошибка со стороны терминала?
PS: Прошло еще 12 часов и размер папки с тиками уже 6.5 GB
PPS: Кстати TimeCurrent() на кастомных символах, построенных на базе каcтомных тоже не работает...его делал я тоже через CopyTicks
Можно ли как-то узнать, что тестер работает в режиме по реальным тикам?
Можно.
Можно.
Интересный вариант. Спасибо!
Заменил я SymbolInfoTick на CopyTicks в свое время по причине того, что та функция выдавала ерунду при запросе к кастомным символам
SymbolInfoTick должен возвращать последний тик, записанный через CustomTicksAdd.
Впрочем, как и SymbolInfoDouble с параметрами SYMBOL_BID/SYMBOL_ASK (ее я тоже заменил на через CopyTicks)
Внутри этих функций прописан SymbolInfoTick.
Таким образом, что это означает? Неправильное использование функции или ошибка со стороны терминала?
Видимо, архитектурно так заложено: расчет на то, что раз идет работа с тиками - закачаем сразу для облегчения. Решение проблемы.
Можно.
В эксперте работает. В индикаторе при вызове из OnCalculate() первый вызов всегда возвращает true, последующие false. При любом режиме тестирования всегда так.
В эксперте работает. В индикаторе при вызове из OnCalculate() первый вызов всегда возвращает true, последующие false. При любом режиме тестирования всегда так.
Никогда индикаторы не запускал в Тестере. Некомпетентен в этом.
Никогда индикаторы не запускал в Тестере. Некомпетентен в этом.
Эксперт запрашивает значения индикатора при тесте.
Потому и проверяю как они себя там ведут.
Тогда свой метод через 4014 ошибку оставлю. Хотя бы O и OHLC определяет.
Хорошо бы разработчики сделали запрос метода тестирования.
Как внутри эксперта узнать на каком агенте (порядковый номер) он запущен в тестере? В справке не нашел информации об этом.