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

 
Andrey Khatimlianskii:

Производительность замеряли? Любопытно, насколько это замедлит работу. Особенно — в случае с кастомными индикаторами.

Не замерял, но, вроде, не должно быть медленнее, чем в MT4.

Замер
#define AMOUNT 1e7
void OnStart()
{  
  int handle = iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE);
  const ulong StartTime = GetMicrosecondCount();
  
  for (int i = 0; i < AMOUNT; i++)
    handle = iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE);

  Print((string)((GetMicrosecondCount() - StartTime) / AMOUNT) + " mcs per iMA");
  Print(handle);    
}


Результат

0.3383469 mcs per iMA


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

 
fxsaber:

Замер

Странно, что не сравнили создание хендла + получение значения в цикле с вашим изначальным вариантом, именно эта разница и интересна.

 
Andrey Khatimlianskii:

Странно, что не сравнили создание хендла + получение значения в цикле с вашим изначальным вариантом, именно эта разница и интересна.

Потому что значения берутся из одного и того же хендла. iMA  с одними и теми же параметрами всегда возвращает один и тот же хэндл.

 
fxsaber:
На MQL5 вполне допустимо писать так

Т.е. на каждом тике "создавать" хэндл. Новые индикаторные сущности создаваться не будут, время будет теряться только на сопоставление входные паратметров iMA с теми индикаторами, что были запущены на предыдущих тиках. Т.е. ровно то же, что делается в MT4.

Интересная конструкция.

Проверьте пожалуйста скорость с созданием хендла в OnInit, с таким подходом.

 
Vitaly Muzichenko:

Проверьте пожалуйста скорость с созданием хендла в OnInit, с таким подходом.

Это по сравнению с Вашим вариантом.

 

Чем можно заменить стандартные OrderCalcProfit() и OrderCalcMargin() так, чтобы функции были кроссплатформенными? Кажется, что уже где-то было, но не могу тут найти - может спросонья... Но за час поиска вродь проснуться должен был :)

 
Artyom Trishkin:

Чем можно заменить стандартные OrderCalcProfit() и OrderCalcMargin() так, чтобы функции были кроссплатформенными? Кажется, что уже где-то было, но не могу тут найти - может спросонья... Но за час поиска вродь проснуться должен был :)

https://www.mql5.com/ru/search#!keyword=myordercalcmargin&module=mql5_module_forum

MQL5.Community
MQL5.Community
  • www.mql5.com
Поиск выполняется с учетом морфологии и без учета регистра. Все буквы, независимо от того, как они введены, будут рассматриваться как строчные. По умолчанию наш поиск показывает страницы...
 
fxsaber:

https://www.mql5.com/ru/search#!keyword=myordercalcmargin&module=mql5_module_forum

:)

SymbolInfoMarginRate() нет в четвёрке. А вопрос звучал так:

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

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

Artyom Trishkin, 2017.10.06 06:36

Чем можно заменить стандартные OrderCalcProfit() и OrderCalcMargin() так, чтобы функции были кроссплатформенными? Кажется, что уже где-то было, но не могу тут найти - может спросонья... Но за час поиска вродь проснуться должен был :)

Да и нет ничего про OrderCalcProfit()
 

Прям подарок, а не возможность языка

struct MQLTICK : public MqlTick
{
  bool operator >( const MqlTick &Tick )
  {
    return(this.bid > Tick.bid);
  }

  bool operator <( const MqlTick &Tick )
  {
    return(this.ask < Tick.ask);
  }
};

void OnStart()
{  
  MQLTICK Ticks[];
  
  Print(CopyTicks(_Symbol, Ticks));
  
  Print(Ticks[0] < Ticks[1]);
}
 
fxsaber:

Прям подарок, а не возможность языка

 Подарок в виде трудноуловимой ошибки при выполнении

struct MqlTick1 : MqlTick {        };
struct MqlTick2 : MqlTick { int i; };
void Copyticks( MqlTick& []) {}
void OnStart()
{
        MqlTick1 ticks1[];
        MqlTick2 ticks2[];
        int i1 = ::CopyTicks( _Symbol, ticks1 ); //нормально ??????????????
                   Copyticks(          ticks1 ); //error: 'ticks1' - parameter conversion not allowed
        int i2 = ::CopyTicks( _Symbol, ticks2 ); //нормально ??????????????
        Print( "i2=", i2, ":", GetLastError()); //Результат: -1:4006
}

Чем ::CopyTicks лучше Copyticks ?

И почему результат всегда -1. О таких ошибках (4006) необходимо сообщать во время компиляции

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