Características da linguagem mql5, subtilezas e técnicas - página 56

 
Andrey Khatimlianskii:

Já mediste o desempenho? Estou curioso para saber o quanto mais lento será. Especialmente com indicadores personalizados.

Não medido, mas não deve ser mais lento do que no MT4.

Medição
#define  AMOUNT 1 e7
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);    
}


O resultado é

0.3383469 mcs per iMA


Um terço de um microssegundo para testar. Isto significa que uma única corrida para cada 10 milhões de ticks irá abrandar em três segundos.

 
fxsaber:

Medição

Estranho que você não comparou a criação do cabo + obter o valor no loop com a sua versão original, essa é a diferença que é interessante.

 
Andrey Khatimlianskii:

Estranho que você não comparou a criação de um cabo + a recuperação de um valor em um loop com sua versão original, que é a diferença que é interessante.

Porque os valores são retirados do mesmo cabo. O iMA devolve sempre o mesmo cabo com os mesmos parâmetros.

 
fxsaber:
Na MQL5 é bastante aceitável escrevê-lo desta forma

Isto é, "criar" um cabo em cada carrapato. Novas entidades indicadoras não serão criadas, o tempo será desperdiçado apenas na comparação dos parâmetros de entrada do iMA com aqueles indicadores que foram iniciados nos ticks anteriores. Isto é, exactamente a mesma coisa que é feita no MT4.

Desenho interessante.

Por favor, verifique a velocidade com a criação de um punho no OnInit, com esta abordagem.

 
Vitaly Muzichenko:

Por favor, verifique a velocidade com a criação do cabo OnInit, com esta abordagem.

Fórum sobre negociação, sistemas de negociação automatizados e testes estratégicos

Características da linguagem mql5, subtilezas e truques

fxsaber, 2017.10.05 09:09

Uma única corrida para cada 10 milhões de ticks vai abrandar em três segundos.

Isso é comparado com a sua opção.

 

Como posso substituir OrderCalcProfit() e OrderCalcMargin() standard para que as funções sejam multi-plataforma? Parece já ter estado aqui algures, mas não consigo encontrá-lo aqui - talvez estivesse com sono... Mas eu devo ter acordado dentro de uma hora após a busca :)

 
Artyom Trishkin:

Como posso substituir as funções OrderCalcProfit() e OrderCalcMargin() standard para as tornar multi-plataforma? Parece já ter sido colocado em algum lugar, mas não consigo encontrá-lo aqui - talvez eu estivesse com sono... Mas eu devo ter acordado durante uma hora de busca :)

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() não está presente em 4. A questão foi colocada da seguinte forma:

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Peculiaridades da linguagem mql5, dicas e truques

Artyom Trishkin, 2017.10.06 06:36

O que pode substituir OrderCalcProfit() e OrderCalcMargin() standard para que as funções sejam multi-plataforma? Parece que já estava em algum lugar, mas não consigo encontrá-lo aqui - talvez eu esteja com muito sono... Mas eu deveria ter acordado durante uma hora de busca :)

E não há nada sobre OrderCalcProfit()
 

Um presente, não uma oportunidade linguística

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:

Um presente, não uma oportunidade linguística

Um presente sob a forma de um erro de tempo de execução elusivo

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
}

Como é ::CopyTicks melhor do que Copyticks ?

E porque é que o resultado é sempre -1. Tais erros (4006) devem ser reportados no momento da compilação.