b3567, столкнулся в последних билдах на некоторых торговых серверах, что первый вызов на символе CopyTicks вызывает реконнект к торговому серверу. Иногда тики прекращают закачиваться с нужной даты, хотя в bases все есть. Вылечивается только перезагрузкой терминала. В общем, что-то поменяли в CopyTicks и ощущение стабильности полностью испарилось.
На сервере ICMarketsSC-MT5-2 скриптом пытаюсь выкачать тики с символов из Обзора рынка.
Полно символов, где тиков просто нет. Возможно, это связано с запуском скрипта в выходные, т.к. закачка в будние дни работала.
В общем, какие-то неприятности с тиками сыпятся.
Еще и такое в Тестере происходит из-за проблем с тиками.
Core 1 GBPAUD,M1 (ICMarketsSC-MT5-2): generating based on real ticks
Core 1 GBPAUD,M1: testing of Experts\fxsaber\TesterTickCheck.ex5 from 2023.01.0100:00 to 2023.01.2900:00 started with inputs:
Core 1 BeginTime=1672531200
Core 1 EndTime=1673913600
Core 1 inFlags=false
Core 1 GBPAUD : 2023.01.0100:00 - 2023.01.2900:00no real ticks, every tick generation used
Запускаешь по реальным тикам, а получаешь проход по сгенерированным. При этом в кеш-файл пишется, что проход был по реальным тикам. Ошибка ведь.
Ренат, вы им так ответьте по поводу всех этих тиков) "Да не лезьте вы в эти тики - создавайте робастные системы")) - Это я помню лет 10-12 назад было))
Если CopyTicks подвисает на 60 секунд и возвращает ошибку 4403, попробуйте поменять точку доступа к серверу. Даже если до нее пинг менее выгодный.
В этом смысле опасен автоматический выбор точки доступа терминалом.
Нарвался.
FE 0 16:54:36.233 Network '': scanning network for access points
OR 0 16:55:13.205 Network '': scanning network finished
FJ 0 16:55:13.205 Network '': auto connecting to a better access point with 99 % quality (previous: 99 %)
После этого перестали поступать исторические тики. Целесообразно при ошибке 4403 делать реконнект к правильной точке через WinAPI.
#property copyright"Copyright 2000-2024, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"#property script_show_inputs//--- запрашиваем 100 миллионов тиков, чтобы гарантировать получение всей тиковой истории inputint getticks=100000000; // сколько тиков требуется //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart()
{
//--- int attempts=0; // счетчик попыток bool success=false; // флаг успешного выполнения копирования тиков MqlTick tick_array[]; // массив для приема тиков MqlTick lasttick; // для получения данных последнего тика SymbolInfoTick(_Symbol,lasttick);
//--- сделаем 3 попытки получить тики while(attempts<3)
{
//--- замерим время старта перед получением тиков uint start=GetTickCount();
//--- запросим тиковую историю с момента 1970.01.01 00:00.001 (параметр from=1 ms) int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks);
if(received!=-1)
{
//--- выведем информацию о количестве тиков и затраченном времени времени PrintFormat("%s: received %d ticks in %d ms",_Symbol,received,GetTickCount()-start);
//--- если тиковая история синхронизирована, то код ошибки равен нулю if(GetLastError()==0)
{
success=true;
break;
}
elsePrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
_Symbol,received,GetTickCount()-start,_LastError);
}
//--- считаем попытки
attempts++;
//--- пауза в 1 секунду в ожидании завершения синхронизации тиковой базы Sleep(1000);
}
//--- не удалось получить запрошенные тики от самого начала истории с трех попыток if(!success)
{
PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток",getticks,_Symbol);
return;
}
int ticks=ArraySize(tick_array);
//--- выведем время первого тика в массиве datetime firstticktime=tick_array[ticks-1].time;
PrintFormat("Last tick time = %s.%03I64u",
TimeToString(firstticktime,TIME_DATE|TIME_MINUTES|TIME_SECONDS),tick_array[ticks-1].time_msc%1000);
//--- выведем время последнего тика в массиве datetime lastticktime=tick_array[0].time;
PrintFormat("First tick time = %s.%03I64u",
TimeToString(lastticktime,TIME_DATE|TIME_MINUTES|TIME_SECONDS),tick_array[0].time_msc%1000);
//--- MqlDateTime today;
datetime current_time=TimeCurrent();
TimeToStruct(current_time,today);
PrintFormat("current_time=%s",TimeToString(current_time));
today.hour=0;
today.min=0;
today.sec=0;
datetime startday=StructToTime(today);
datetime endday=startday+24*60*60;
if((ticks=CopyTicksRange(_Symbol,tick_array,COPY_TICKS_ALL,startday*1000,endday*1000))==-1)
{
PrintFormat("CopyTicksRange(%s,tick_array,COPY_TICKS_ALL,%s,%s) failed, error %d",
_Symbol,TimeToString(startday),TimeToString(endday),GetLastError());
return;
}
ticks=MathMax(100,ticks);
//--- теперь выведем первые 100 тиков последнего дня int counter=0;
for(int i=0;i<ticks;i++)
{
datetime time=tick_array[i].time;
if((time>=startday) && (time<endday) && counter<100)
{
counter++;
PrintFormat("%d. %s",counter,GetTickDescription(tick_array[i]));
}
}
//--- выведем первые 100 сделок последнего дня
counter=0;
for(int i=0;i<ticks;i++)
{
datetime time=tick_array[i].time;
if((time>=startday) && (time<endday) && counter<100)
{
if(((tick_array[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) || ((tick_array[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL))
{
counter++;
PrintFormat("%d. %s",counter,GetTickDescription(tick_array[i]));
}
}
}
}
//+------------------------------------------------------------------+ //| возвращает строковое описание тика | //+------------------------------------------------------------------+ string GetTickDescription(MqlTick &tick)
{
string desc=StringFormat("%s.%03d ",
TimeToString(tick.time),tick.time_msc%1000);
//--- проверим флаги bool buy_tick=((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY);
bool sell_tick=((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL);
bool ask_tick=((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK);
bool bid_tick=((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID);
bool last_tick=((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST);
bool volume_tick=((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME);
//--- проверим сначала тик на торговые флаги if(buy_tick || sell_tick)
{
//--- сформируем вывод для торгового тика
desc=desc+(buy_tick?StringFormat("Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):"");
desc=desc+(sell_tick?StringFormat("Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):"");
desc=desc+(ask_tick?StringFormat("Ask=%G ",tick.ask):"");
desc=desc+(bid_tick?StringFormat("Bid=%G ",tick.ask):"");
desc=desc+"(Trade tick)";
}
else
{
//--- для инфо тика сформируем вывод немного иначе
desc=desc+(ask_tick?StringFormat("Ask=%G ",tick.ask):"");
desc=desc+(bid_tick?StringFormat("Bid=%G ",tick.ask):"");
desc=desc+(last_tick?StringFormat("Last=%G ",tick.last):"");
desc=desc+(volume_tick?StringFormat("Volume=%d ",tick.volume):"");
desc=desc+"(Info tick)";
}
//--- вернем описание тика return desc;
}
//+------------------------------------------------------------------+
Запускаю - всё висит. Иду в отладчик - на строке 24 ( int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks); ) отладчик надолго зависает. Можно только приостановить или завершить отладку...
Ну секунд через много отвисает, но тики не получены, и так все три попытки, которые в скрипте прописаны.
b3567, столкнулся в последних билдах на некоторых торговых серверах, что первый вызов на символе CopyTicks вызывает реконнект к торговому серверу. Иногда тики прекращают закачиваться с нужной даты, хотя в bases все есть. Вылечивается только перезагрузкой терминала. В общем, что-то поменяли в CopyTicks и ощущение стабильности полностью испарилось.
На сервере ICMarketsSC-MT5-2 скриптом пытаюсь выкачать тики с символов из Обзора рынка.
Результат.
Полно символов, где тиков просто нет. Возможно, это связано с запуском скрипта в выходные, т.к. закачка в будние дни работала.
В общем, какие-то неприятности с тиками сыпятся.
Еще и такое в Тестере происходит из-за проблем с тиками.
Запускаешь по реальным тикам, а получаешь проход по сгенерированным. При этом в кеш-файл пишется, что проход был по реальным тикам. Ошибка ведь.
Ренат, вы им так ответьте по поводу всех этих тиков) "Да не лезьте вы в эти тики - создавайте робастные системы")) - Это я помню лет 10-12 назад было))
P/S Шутка)
Полно символов, где тиков просто нет. Возможно, это связано с запуском скрипта в выходные, т.к. закачка в будние дни работала.
Все тики есть! Просьба починить работу CopyTicks в выходные. Все данные для воспроизведения в наличии.
Строка для поиска: Oshibka 062.
Что обозначает это значение?
Тики не закачиваются по определенному символу. Перезагрузка не помогает. Удаление tkc-файлов - аналогично.
Если ставить с нуля Терминал - закачиваются! Подскажите, куда копать, чтобы смогли разобраться и исправить?
Тики не закачиваются по определенному символу. Перезагрузка не помогает. Удаление tkc-файлов - аналогично.
Если ставить с нуля Терминал - закачиваются!
Воспроизведение (на всех машинах, что пробовал). b3577.
Будет такой результат. По другим символам - закачиваются тики.
Если не делать п.1., то и по этому символу будут закачиваться тики.
Строка для поиска: Oshibka 064.
Тики могут не записываться в базу Терминала.
Делал проверку через CopyTicksRange - в OnTick запросы с предыдущего Ticks[Size - 1].time_msc.
В итоге получил такой результат.
На параллельно запущенном терминале с такой же проверкой алерт не сработал. Поэтому сделал запрос тиков на каждом терминале через CTRL+U.
Так и есть, в одном терминале тик присутствует, в другом - нет!
Случается не только на экзотике.
Строка для поиска: Oshibka 074.
Если CopyTicks подвисает на 60 секунд и возвращает ошибку 4403, попробуйте поменять точку доступа к серверу. Даже если до нее пинг менее выгодный.
В этом смысле опасен автоматический выбор точки доступа терминалом.
Если CopyTicks подвисает на 60 секунд и возвращает ошибку 4403, попробуйте поменять точку доступа к серверу. Даже если до нее пинг менее выгодный.
В этом смысле опасен автоматический выбор точки доступа терминалом.
Сам сейчас этим занят, сколько подводных камней, оказывается...
Если CopyTicks подвисает на 60 секунд и возвращает ошибку 4403, попробуйте поменять точку доступа к серверу. Даже если до нее пинг менее выгодный.
В этом смысле опасен автоматический выбор точки доступа терминалом.
Нарвался.
FE 0 16:54:36.233 Network '': scanning network for access points OR 0 16:55:13.205 Network '': scanning network finished FJ 0 16:55:13.205 Network '': auto connecting to a better access point with 99 % quality (previous: 99 %)После этого перестали поступать исторические тики. Целесообразно при ошибке 4403 делать реконнект к правильной точке через WinAPI.
Работает ли у кого-либо этот скрипт из справки:
Запускаю - всё висит. Иду в отладчик - на строке 24 ( int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks); ) отладчик надолго зависает. Можно только приостановить или завершить отладку...
Ну секунд через много отвисает, но тики не получены, и так все три попытки, которые в скрипте прописаны.