Особенности языка mql5, тонкости и приёмы работы - страница 247

 
Nikolai Semko #:
Мышки там нет.

... клавиатуры нет, монитора тоже нет.. Всё происходит усилием мысли 😁

 
Maxim Kuznetsov #:

double-click выделяет слово, tripple-click логическое выражение. тройной клик не у всех всегда получается...

но можете потренировать прямо на этом тексте. 

Не плохо было бы читать до конца весь текст

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

Alexey Viktorov, 2024.02.18 14:49

Уже не первый раз замечаю, что по «многочисленным» просьбам пользователей что-то делают и тут-же что-то ломают. Всегда было CTRL+клик выделяло слово. Для меня это легче чем двойной клик, потому, что нагрузка на указательный палец и без двойных кликов достаточно велика. Иногда вечером даже болит. Теперь работает то так, то как сделали по новому. И нихрена не поймёшь когда что должно сработать.


 
Nikolai Semko #:
А Vim-ом пользовались?

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

 
Определение настройки оптимизации компилятора.
// true - оптимизация компилятора включена, false - выключена.
bool IsOptimizationCompiler( void )
{
  static ulong PrevValue = INT_MAX;

  if (PrevValue == INT_MAX)
  {
    const ulong StartTime = GetMicrosecondCount();
    
    for (int i = 0; i < 1e5; i++)
      const double j = MathSin(0);
      
    PrevValue = GetMicrosecondCount() - StartTime;
  }
  
  return(PrevValue < 5);  
}
 
fxsaber параметров оптимизации компилятора.

для чего?!

 
amrali #:

для чего?!

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2024.03.05 16:01

Советник выводит стат. данные скорости тяжелых расчетов. Иногда вижу, что они идут медленно. Не сразу соображаю, что EX5 без включенной оптимизации. Хотелось бы иметь возможность принтовать этот флаг компилятора, как это делается с _RELEASE и __CPU_ARCHITECTURE__.

Calculate Time (2024.02.27 00:00:00 - 2024.03.05 17:23:48, 122017 ticks) = 21 ms. (5810333 ticks/sec) X64 Regular Release, Optimization compiler = true
Calculate Time (2024.02.27 00:00:00 - 2024.03.05 17:24:26, 122043 ticks) = 46 ms. (2653108 ticks/sec) X64 Regular Release, Optimization compiler = false
 

В моносимвольных советниках очевидно, что для производительности в Тестере нужно отказываться от использования PositionGetString и OrderGetString.

В мультивалютных советниках это тоже можно сделать. Например, через Magic. Тогда можно получить заметный эффект.

 
fxsaber #:
Вот такой неожиданный результат цикла for.

Почему-то классика быстрее.

Демонстрация огромной разницы в производительности двух видов цикла for.

input datetime inFrom = D'2023.01.01';

class TICKS_ARRAY
{
public:
  MqlTick Ticks[];
};

template <typename T>
long GetSum( const T &TicksArray[] )
{
  const int Amount = ::ArraySize(TicksArray);

  int Count = 0;
  
  int Size[];
  bool Res[];
  int Pos[];

  ::ArrayResize(Pos, Amount);
  ::ArrayInitialize(Pos, 0);

  long Tmp = 0;
      
  for (uint i = ::ArrayResize(Res, ::ArrayResize(Size, Amount)); (bool)i--;)
  {
    Size[i] = ::ArraySize(TicksArray[i].Ticks);
    
    if (Res[i] = Size[i])
      Count++;
  }
 
  while (Count)
  {
    MqlTick MinTick = {0, 0, 0, 0, 0, LONG_MAX};
    uint Index;
      
    // https://www.mql5.com/ru/forum/462835/page24#comment_52772777
    for (uint i = Amount; (bool)i--;)
//    for (int i = 0; i < Amount; i++)
      if (Res[i])
      {
        // Количество вызовов в ~(1+Amount)/2 раз больше общего числа элементов.
        const MqlTick Tick = TicksArray[i].Ticks[Pos[i]];
        
        if (Tick.time_msc < MinTick.time_msc)
        {
          MinTick = Tick;
          
          Index = i;
        }
      }
      
    if (!(Res[Index] = (++Pos[Index] != Size[Index])))
      Count--;
      
    Tmp += MinTick.time_msc;
  }
    
  return(Tmp);
}

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnStart()
{
  const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD"};
  
  TICKS_ARRAY TicksArray[];
  
  const int Size = ::ArrayResize(TicksArray, ::ArraySize(Symbols));

  for (int i = 0; i < Size; i++)
    Print(CopyTicksRange(Symbols[i], TicksArray[i].Ticks, COPY_TICKS_ALL, inFrom * 1000));    

  _B(GetSum(TicksArray), 1);
  _B(GetSum(TicksArray), 1); // Замедляет выполнение предыдущей строки!
}


В коде выделены два вида циклов. Замените один другим, чтобы увидеть эффект.


for (int i = 0; i < Amount; i++)

20114034
23551872
23095650
Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 76 in OnStart: GetSum(TicksArray)] = 1137474 mcs.
Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 77 in OnStart: GetSum(TicksArray)] = 1141950 mcs.


for (uint i = Amount; (bool)i--;)

20114088
23551872
23095650
Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 76 in OnStart: GetSum(TicksArray)] = 1672893 mcs.
Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 77 in OnStart: GetSum(TicksArray)] = 1684673 mcs.


Разница почти в 1.5 раза!


Причина.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 4230: больше встроенных приложений и расширение поддержки ONNX

Renat Fatkhullin, 2024.03.20 02:21

Не надо использовать хакерские методы в циклах for - так вы портите компилятору шаблон оптимизации циклов/векторизации и в рабочих условиях получаете код хуже. При этом надо учитывать, что есть немалый шанс самообмана на усеченной синтетике бенчмарков, где некоторые хакерские методы могут показать фейковое улучшение.


ЗЫ

for (int i = Amount - 1; i >= 0; i--)

20114356
23553353
23096711
Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 77 in OnStart: GetSum(TicksArray)] = 1144988 mcs.
Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 78 in OnStart: GetSum(TicksArray)] = 1150288 mcs.

Такой вариант, похоже, тоже является классикой - не замедляет.

 
fxsaber #

А такой вариант?

for (uint i = Amount; i-- >= 0;)
Причина обращения: