Как получить параметры Open,Low,High,Close в МQL5? - страница 9

 
Renat Akhtyamov:

я привык к 4-рке, компактнее и более читаемы портянки

;)

на первой странице мой компактный пример.. в принципе с него все и началось )))

 
Igor Makanu:

хм, думаю у тебя биты в байты не хотят строиться...вариантов в принципе больше нет! ))))

если уж топик под пристальным оком модератора - значит нужно что то делать...разобрал макрос "на запчасти",

Артем, так хоть работает?

2019.07.30 19:42:16.639 tst_iXXX_Copy (EURUSD,H1) Start test № 1...

2019.07.30 19:42:40.199 tst_iXXX_Copy (EURUSD,H1) CopyClose : loops=500000000 , ms=23422

2019.07.30 19:42:40.199 tst_iXXX_Copy (EURUSD,H1) Start test № 2...

2019.07.30 19:43:26.953 tst_iXXX_Copy (EURUSD,H1) iClose : loops=500000000 , ms=46609

2019.07.30 19:43:26.953 tst_iXXX_Copy (EURUSD,H1) Start test № 3...

2019.07.30 19:44:12.274 tst_iXXX_Copy (EURUSD,H1) Close[i] : loops=500000000 , ms=45156

2019.07.30 19:44:12.274 tst_iXXX_Copy (EURUSD,H1) Start test № 4...

2019.07.30 19:44:42.080 tst_iXXX_Copy (EURUSD,H1) CopyRates : loops=500000000 , ms=29656

2019.07.30 19:44:42.080 tst_iXXX_Copy (EURUSD,H1) End script

Да, так работает:

2019.07.31 00:38:01.936 Start test № 1...
2019.07.31 00:38:31.097 CopyClose : loops=500000000 , ms=29015
2019.07.31 00:38:31.097 Start test № 2...
2019.07.31 00:41:25.095 iClose : loops=500000000 , ms=173875
2019.07.31 00:41:25.095 Start test № 3...
2019.07.31 00:44:29.777 Close[i] : loops=500000000 , ms=184547
2019.07.31 00:44:29.777 Start test № 4...
2019.07.31 00:45:01.074 CopyRates : loops=500000000 , ms=31172
2019.07.31 00:45:01.074 End script

В итоге:

  • 29 секунд CopyClose()
  • 173 секунды iClose()
  • 184 секунды Close[]
  • 31 секунда CopyRates()

Что не так? Почему у меня разница в шесть с лишним раз?

ЗЫ запускал на D1

 
Artyom Trishkin:

Что не так? Почему у меня разница в шесть с лишним раз?


Igor Makanu:

хм, думаю у тебя биты в байты не хотят строиться...вариантов в принципе больше нет! ))))

)))

 

Igor Makanu:

хм, думаю у тебя биты в байты не хотят строиться...вариантов в принципе больше нет! ))))

)))

Провёл тест на Н1, разницы ощутимой нет:

2019.07.31 00:55:30.290 Start test № 1...
2019.07.31 00:55:58.234 CopyClose : loops=500000000 , ms=27812
2019.07.31 00:55:58.234 Start test № 2...
2019.07.31 00:58:59.095 iClose : loops=500000000 , ms=180734
2019.07.31 00:58:59.095 Start test № 3...
2019.07.31 01:02:06.834 Close[i] : loops=500000000 , ms=187610
2019.07.31 01:02:06.834 Start test № 4...
2019.07.31 01:02:38.365 CopyRates : loops=500000000 , ms=31406
2019.07.31 01:02:38.365 End script

и биты с байтами тут каким боком?

 
Artyom Trishkin:

и биты с байтами тут каким боком?

ну не буду же я говорить, что наверное комп тупит у тебя?

я тестил несколько раз, Роман тестил - результаты соизмеримые

для этого теста скорость жесткого диска не должна быть критичной, остается не много: ОС, и железо = память + проц , где то что то подлагивает,

есть конечно вариант в неком "внутреннем мире" core i3 , у меня проц вроде Core™ i3-4170 

 
Igor Makanu:

ну не буду же я говорить, что наверное комп тупит у тебя?

я тестил несколько раз, Роман тестил - результаты соизмеримые

для этого теста скорость жесткого диска не должна быть критичной, остается не много: ОС, и железо = память + проц , где то что то подлагивает,

есть конечно вариант в неком "внутреннем мире" core i3 , у меня проц вроде Core™ i3-4170 

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

 
Artyom Trishkin:

Провёл тест на Н1, разницы ощутимой нет:

Разработчики как-то говорили, что новые iXXX функции в пятерке - это просто обертка для CopyXXX функций.

Поэтому разницы при одиночных запросах не стоит ожидать.

 
Renat Akhtyamov:
Какой вердикт по скорости функций - какая быстрее?
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int Count=5000000; // кол-во проходов
//---
void OnStart(void)
  {
   Print("Bench_1: ",Bench_1(Count)," msc");
   Print("Bench_2: ",Bench_2(Count)," msc");
  }
//+------------------------------------------------------------------+
//| Bench_1                                                                 |
//+------------------------------------------------------------------+
ulong Bench_1(const int _count)
  {
   const ulong  StartTime=GetMicrosecondCount();
//---
   for(int i=0; i<Count;i++)
     {
      datetime time  = iTime(Symbol(),Period(),0);
      double   open  = iOpen(Symbol(),Period(),0);
      double   high  = iHigh(Symbol(),Period(),0);
      double   low   = iLow(Symbol(),Period(),0);
      double   close = iClose(NULL,PERIOD_CURRENT,0);
      long     volume= iVolume(Symbol(),0,0);
     }
//---
   return(GetMicrosecondCount() - StartTime);
  }
//+------------------------------------------------------------------+
//| Bench_2                                                                 |
//+------------------------------------------------------------------+
ulong Bench_2(const int _count)
  {
   datetime  time[];
   double    open[];   // Open (цены открытия бара)
   double    high[];   // High (цены максимума бара)
   double    low[];    // Open (цены минимума бара)
   double    close[];    // Open (цены минимума бара)
   long      volume[]; // Close (цены закрытия бара)

   const ulong  StartTime=GetMicrosecondCount();
//---
   for(int i=0; i<Count;i++)
     {
      CopyTime(Symbol(),Period(),1,1,time);
      CopyOpen(Symbol(),Period(),1,1,open);
      CopyHigh(Symbol(),Period(),1,1,high);
      CopyLow(Symbol(),Period(),1,1,low);
      CopyClose(Symbol(),Period(),1,1,close);
      CopyTickVolume(Symbol(),Period(),1,1,volume);
//---
      datetime _time  = time[0];
      double   _open  = open[0];
      double   _high  = high[0];
      double   _low   = low[0];
      double   _close = close[0];
      long     _volume= volume[0];
     
}
//---
   return(GetMicrosecondCount() - StartTime);
  }
//+------------------------------------------------------------------+
автор скрипта не помню кто
 
Igor Makanu:

да одинаково они работают, имхо эксперименты для экспериментов... вот последний тест вызов на пол миллиарда раз, ну да видна разница, осталось прикинуть сколько тиков в минуте (~60), сколько в тиков в часу (~3600) и сколько в сутках (~86400) и сколько вот эти 23 секунды набегут на пол миллиарда вызовов ...

5 787 дней = 23 секунды профита?  если используем самую быструю функцию на каждом тике!  )))))

имхо, юзай, что удобно и никого не слушай

Про тестирование и оптимизацию забыл, Игорь. Скорость нужна именно там.

 
Andrey Khatimlianskii:

Про тестирование и оптимизацию забыл, Игорь. Скорость нужна именно там.

ну да... тут просто коллектив не серьезный в обсуждении этого топика собрался, вот и совсем вылетело из головы зачем все это )))

Вы правы! - но нужно удобное использование функций CopyOpen()... делать, и вероятно, что если обернуть вызов CopyOpen() в дополнительную функцию, то выигрыш в производительности будет утерян\

ЗЫ: имхо, в общем это, всё как и везде - пишешь на ассемблере, получаешь длительную разработку и не факт, что конечная производительность будет выше использования С++, который написал за 15 минут - проверять нужно