Новая версия платформы MetaTrader 5 build 4260: общие улучшения - страница 16

 
fxsaber #:

Использую универсальное решение. Без этого ничего не смог бы делать в боевой торговле.

Спасибо - сходу принцип не уловил - как выстраивается последовательность?

Я тут подумал, что можно привязаться к id чарта , и сделать задержку в зависимости от номера.

 
Aleksey Vyazmikin #:

Спасибо - сходу принцип не уловил - как выстраивается последовательность?

Через синхронизированный надежный функционал глобальных переменных. Нужно было сделать его удобным для применения, чтобы было совсем просто и надежно. Поэтому придумал библиотеку, где не надо задумываться, как работает.
Учебник по MQL5: Общеупотребительные функции / Глобальные переменные терминала / Синхронизация программ с помощью глобальных переменных
Учебник по MQL5: Общеупотребительные функции / Глобальные переменные терминала / Синхронизация программ с помощью глобальных переменных
  • www.mql5.com
Поскольку глобальные переменные существуют вне MQL-программ, их удобно применять для организации внешних флагов, управляющих несколькими копиями...
 

Ранее сообщил о проблеме подвисания ПК, занимающегося раздачей заданий агентам. После поочерёдной раздачи заданий оптимизации циклично пошла проходить, поэтому не отслеживал, но проснулся от холода - компьютеры не работали над заданиями...

Сейчас просмотрел логи, выяснилось, что этот процесс не вечен - ориентировочно с 8:58 по 9:33, включая саму оптимизацию, которая до и после примерно занимала 3 минуты. Таким образом подвисание было на 30 минут!

Лог из секции  Инструменты - вкладка  - Журнал:

OM      0       08:57:44.797    Tester  register MQL5.community account and use MQL5 Cloud Network to speed up optimizations
HR      0       08:57:45.219    Experts optimization frame expert Kamikadze_MA_V_04_43_Fibo_06_Regressor_T_K (EURUSD,M15) loaded successfully
JO      0       08:58:44.664    Experts optimization frame expert Kamikadze_MA_V_04_43_Fibo_06_Regressor_T_K (EURUSD,M15) removed
QQ      0       08:58:50.218    Tester  register MQL5.community account and use MQL5 Cloud Network to speed up optimizations
EO      0       08:58:50.642    Experts optimization frame expert Kamikadze_MA_V_04_43_Fibo_06_Regressor_T_K (EURUSD,M15) loaded successfully
IS      0       09:33:23.376    Experts optimization frame expert Kamikadze_MA_V_04_43_Fibo_06_Regressor_T_K (EURUSD,M15) removed
OR      0       09:33:28.884    Tester  register MQL5.community account and use MQL5 Cloud Network to speed up optimizations
LH      0       09:33:29.298    Experts optimization frame expert Kamikadze_MA_V_04_43_Fibo_06_Regressor_T_K (EURUSD,M15) loaded successfully
ID      0       09:36:25.069    Experts optimization frame expert Kamikadze_MA_V_04_43_Fibo_06_Regressor_T_K (EURUSD,M15) removed

Лог из секции  Тестер стратегий - вкладка  - Журнал:

FL	0	08:58:50.214	Tester	"Kamikadze_ver\Kamikadze_MA_V_04_43_Fibo_06_Regressor_T_K.ex5" 64 bit
KF	0	08:58:50.218	Tester	register MQL5.community account and use MQL5 Cloud Network to speed up optimizations
LJ	0	08:58:50.692	Experts	optimization frame expert Kamikadze_MA_V_04_43_Fibo_06_Regressor_T_K (EURUSD,M15) processing started
EE	0	08:58:50.815	Tester	Experts\Kamikadze_Ver\Kamikadze_MA_V_04_43_Fibo_06_Regressor_T_K.ex5 on EURUSD,M15 from 2008.01.01 00:00 to 2023.01.01 00:00
NH	0	08:58:50.815	Tester	complete optimization started
QQ	0	08:58:50.815	Tester	tester_no_cache property used
...
FO      0       08:58:50.881    E5-2680v3:2020  connecting to 192.168.123.7:2020
IO      0       08:58:52.130    E5-2680v3:2020  connected
QO      0       08:59:17.579    E5-2680v3:2020  authorized (agent build 4289)
FJ      0       08:59:17.579    E5-2680v3:2020  pass 74 started
JF      0       09:19:02.959    E5-2680v3:2020  common synchronization completed
OL      0       09:29:20.731    E5-2680v3:2020  pass 74 returned result 1531.200000 in 0:00:18.693
PS      0       09:29:20.740    E5-2680v3:2020  pass 135 started
OH      0       09:30:58.885    E5-2680v3:2020  pass 135 returned result 16285.130000 in 0:00:17.871
RR      0       09:30:58.894    E5-2680v3:2020  pass 208 started
HP      0       09:32:46.521    E5-2680v3:2020  pass 208 returned result 21.440000 in 0:00:17.904
IQ      0       09:33:17.950    E5-2680v3:2020  connection closed

Я для примера тут показываю ситуацию с одним агентом, которая уже в его логе выглядит следующим образом

CS      0       08:58:50.914    192.168.123.1   login (build 4260)
CS      0       08:59:34.680    192.168.123.1   shutdown finished
CS      0       08:59:53.590    192.168.123.1   login (build 4260)
CS      0       09:00:41.848    192.168.123.1   shutdown finished
CS      0       09:01:00.562    192.168.123.1   login (build 4260)
CS      0       09:01:48.646    192.168.123.1   shutdown finished
CS      0       09:02:10.187    192.168.123.1   login (build 4260)
CS      0       09:02:54.976    192.168.123.1   shutdown finished
CS      0       09:03:15.129    192.168.123.1   login (build 4260)
CS      0       09:04:00.457    192.168.123.1   shutdown finished
CS      0       09:04:25.392    192.168.123.1   login (build 4260)
CS      0       09:04:38.604    Tester  account info found with currency USD
CS      0       09:24:23.969    Network 1478 bytes of tester parameters loaded
CS      0       09:24:23.969    Network 306884 bytes of input parameters loaded
CS      0       09:24:23.970    Network 190 bytes of symbols list loaded (31 symbols)
CS      0       09:24:23.971    Tester  expert file added: Experts\Kamikadze_Ver\Kamikadze_MA_V_04_43_Fibo_06_Regressor_T_K.ex5. 1715690 bytes loaded
CS      0       09:24:23.972    Network 415440 bytes of optimized inputs info loaded
CS      0       09:24:23.976    Tester  successfully initialized
CS      0       09:24:23.976    Network 1689 Kb of total initialization data received
CS      0       09:24:23.976    Tester  Intel Xeon  E5-2680 v3 @ 2.50GHz, 65410 MB
CS      0       09:24:23.982    Tester  optimization pass 74 started
CS      0       09:24:24.010    Symbols EURUSD: symbol to be synchronized
CS      0       09:24:24.013    Symbols EURUSD: symbol synchronized, 3800 bytes of symbol info received
CS      0       09:24:24.057    History EURUSD: load 27 bytes of history data to synchronize in 0:00:00.041
CS      0       09:24:24.057    History EURUSD: history synchronized from 2007.01.01 to 2024.01.26
CS      0       09:24:24.173    History EURUSD,M15: history cache allocated for 400759 bars and contains 25056 bars from 2007.01.01 00:00 to 2007.12.31 23:45
CS      0       09:24:24.173    History EURUSD,M15: history begins from 2007.01.01 00:00
CS      0       09:24:27.017    History EURUSD,Daily: history cache allocated for 4227 bars and contains 313 bars from 2007.01.01 00:00 to 2007.12.31 00:00
CS      0       09:24:27.017    History EURUSD,Daily: history begins from 2007.01.01 00:00
CS      0       09:24:42.722    Tester  74 OnTester result 1531.2 : passed in 0:00:18.693
CS      0       09:24:42.727    Tester  optimization finished
CS      0       09:34:41.819    Tester  optimization pass 135 started
CS      0       09:34:59.708    Tester  135 OnTester result 16285.13 : passed in 0:00:17.871
CS      0       09:34:59.713    Tester  optimization finished

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

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

Уважаемые разработчики, я вижу необходимым сделать настраиваемыми параметры:

1. Время передачи данных от Принципала (или как его тут назвать?) Агенту для синхронизации.

2. Внедрить возможность последовательно проводить синхронизацию с учётом скорости передачи данных, или хотя бы с возможностью указать число агентов, с которыми за раз проводится синхронизация.А в идеале передавать для агентов из локальной сети один пакет с данными, который будет делится между всеми агентами на ПК.

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

Надеюсь на действенную реакцию, так как такие тормоза возникают периодически, и ранее в 2023 году их не наблюдалось.

Логи прикладываю.

Файлы:
 

b4292, показывается разное количество доступных облачных Агентов.

Наверное, правильно показывать одинаковые (правильные) значения.

Строка для поиска: Uluchshenie 091.
 

Всем здравствуйте. Перестал корректно работать такой код, раньше работало, код то не менял. Если стратегия задумана работать только по ценам открытия то она у меня стала работать первый бар тестирования не работает(ну то есть как и нужно), со второго и далее отрабатывает каждый тик то есть функция не работает (выяснил в визуальном режиме). Подскажите с чем может быть связано, не с тем ли что использую win 7 очень не нра. десятка. Или какие то изменения произошли, к сожалению нет времени следить за всеми изменениями(( Хорошо что по стечению обстоятельств не ведется торговля на реальных деньгах, а то могли быть большие убытки.

bool NewBar(ENUM_TIMEFRAMES TimeF)

  {

static datetime last_time=0;

datetime lastbar_time = (datetime)SeriesInfoInteger(NULL,TimeF,SERIES_LASTBAR_DATE);

if(last_time==0)

     {

last_time=lastbar_time;

return(false);

     }

if(last_time!=lastbar_time)

     {

last_time=lastbar_time;

return(true);

     }

return(false);

  }



void OnTick()

  {

if(!NewBar(PERIOD_M1))  return;



   }
Файлы:
1.png  11 kb
 
freelancerAntonyan #:

Всем здравствуйте. Перестал корректно работать такой код, раньше работало, код то не менял. Если стратегия задумана работать только по ценам открытия то она у меня стала работать первый бар тестирования не работает(ну то есть как и нужно), со второго и далее отрабатывает каждый тик то есть функция не работает (выяснил в визуальном режиме). Подскажите с чем может быть связано, не с тем ли что использую win 7 очень не нра. десятка. Или какие то изменения произошли, к сожалению нет времени следить за всеми изменениями(( Хорошо что по стечению обстоятельств не ведется торговля на реальных деньгах, а то могли быть большие убытки.

Да вроде как ничего не менялось... у меня как то так реализовано

//---Операции выполняются только при появлении следующего бара
   if(!isNewBar()) return;
...
//+-----------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+-----------------------------------------------------------------+
bool isNewBar()
{
   datetime tm[];
   static datetime prevBarTime=0;

   if(CopyTime(Symbol(),Signal_MA_TF,0,1,tm)<0)
   {
      Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
   }
   else
   {
      if(prevBarTime!=tm[0])
      {
         prevBarTime=tm[0];
         return true;
      }
      return false;
   }
   return true;
}
 
Aleksey Vyazmikin #:

Да вроде как ничего не менялось... у меня как то так реализовано

//+-----------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+-----------------------------------------------------------------+
bool isNewBar()
{
   datetime tm[];
   static datetime prevBarTime=0;

   if(CopyTime(Symbol(),Signal_MA_TF,0,1,tm)<0)
   {
      Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
   }
   else
   {
      if(prevBarTime!=tm[0])
      {
         prevBarTime=tm[0];
         return true;
      }
      return false;
   }
   return true;
}

Т.е. если блок выполнится и не произойдёт копирования, то функция вернёт тру? Ну-ну.

 
Denis Kirichenko #:
prevBarTime

Да, это защищает от сбоев :)

 

Доброго времени суток. Перестала работать функциия подсчета ордеров. Считала все корректно, а сейчас перестала. Что не так? И как это сделать, чтобы стала работать опять как надо?

void CountOrders()
  {
   NmbBuy=0;
   NmbSell=0;
   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
     {
      ulong tick_select=PositionGetTicket(i); // значение tick_select равно 14 (как нужно)
      if(PositionSelectByTicket(tick_select))
         tick_select=PositionGetInteger(POSITION_TICKET); // значение переменной tick_select равно 14 (как нужно)
      if(PositionGetInteger(POSITION_MAGIC)==Magic)
         tick_select=PositionGetInteger(POSITION_TICKET);// Тикет сохраняется
      if(PositionGetSymbol(POSITION_SYMBOL)==Symbol())
        {
         string select_symbol=PositionGetSymbol(POSITION_SYMBOL);
         tick_select=PositionGetInteger(POSITION_TICKET); // значение переменной tick_select изменилось на 2 (ошибка!!!)
         // далее он работает с не той позицеей и считает ордера неправильно.
         ENUM_POSITION_TYPE type_select=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
         if(type_select==POSITION_TYPE_BUY) // PositionGetInteger(POSITION_TYPE)
            NmbBuy++;
         if(type_select==POSITION_TYPE_SELL) // PositionGetInteger(POSITION_TYPE)
            NmbSell++;
        }
     }
  }
 
Robert Sadamon #:

Доброго времени суток. Перестала работать функциия подсчета ордеров. Считала все корректно, а сейчас перестала. Что не так? И как это сделать, чтобы стала работать опять как надо?

Много ненужных действий в коде, которые дублируют друг друга. Скорее всего, раньше (когда "работало") использовался счет типа Netting, а теперь перешли на Hedge. 

Делайте следующим образом:

   for (int i = PositionsTotal() - 1; i >= 0; --i)
   {
      ulong ulTicket = PositionGetTicket(i);
      if (ulTicket == 0)
         continue;
         
      if (PositionGetString(POSITION_SYMBOL) != Symbol())
         continue;

      if (PositionGetInteger(POSITION_MAGIC) != Magic)
         continue;

      if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) 
          NmbBuy++;
      else
          NmbSell++;
   }

Проблемой в Вашем коде является строка:

string select_symbol=PositionGetSymbol(POSITION_SYMBOL);

Эта функция не только получает имя символа, но и выбирает новую позицию. В случае с Hedge-счетом будет выбрана вовсе не та позиция, на которую Вы рассчитываете.

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