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

 
Alexey Viktorov:
Porquê?
já o experimentou
 
Nikolai Semko:
já o experimentou

Mas aqui

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades de mql5, dicas e truques

Nikolai Semko, 2019.04.03 22:33

Sim, obrigado, Alexey. Tinha-me esquecido desta característica. Vi-o antes, mas nunca o utilizei.

Experimentei-o. Alguma coisa está a correr mal. Apaga depois apaga, mas depois de o apagar, tudo pára.

Simplesmente adicionei uma linha de código à função DrawSetup() antes do cálculo do indicador com os seguintes parâmetros.

IndicatorRelease(handle);
handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
for(int i=0;i<N;i++) handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);

O indicador deixa simplesmente de funcionar e ainda não consigo compreender a razão.

Estou absolutamente de acordo consigo. É apenas um brinquedo inútil.


Não é nada disso.
 
Alexey Viktorov:

Mas aqui


não é nada disso.
Já o tentei antes. Apaguei o código de mim próprio por não ter tido êxito.
 
Também se poderia tentar libertar todos os handels de uma corrente, começando pelos mais profundamente enterrados.
 
Andrey Khatimlianskii:
Pode também tentar soltar todas as pegas de uma corrente, a começar pela mais profundamente enterrada.

Bem, não está a funcionar. Ou, se funcionar, são aplicados alguns travões.

void BuildMaFromMa()
  {
   static int h[];
   for(int i=0;i<ArraySize(h);i++) IndicatorRelease(h[i]);
   handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
   ArrayResize(h,N);
   if (N>0) h[0]=handle; 
   for(int i=0;i<N;i++)
     {
      handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);
      h[i]=handle;
     }
  }

Se documentar a linha comIndicatorRelease, então tudo funciona bem, mas caso contrário alguns travões estão ligados e eu não compreendo o que está a acontecer.

Arquivos anexados:
 

Fórum sobre comércio, sistemas comerciais automatizados e teste de estratégias comerciais

Indicadores: MaFromMa

Nikolai Semko, 2019.04.04 01:00

Queria comparar o desempenho da recorrência e iteração.

Acontece que a recorrência é mais do dobro da velocidade.

Provavelmente porque a pilha é mais rápida...

É uma coisa espantosa. Esperava o efeito oposto. ))

#define  size 1000000
uint sum1=0,sum2=0;
int i;
int X[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   ArrayResize(X,size);
   for(i=0;i<size;i++) X[i]=rand();

   ulong t=GetMicrosecondCount();
   i=0;
   while(i<size) { sum1+=X[i]; i++;}
//Recursion();
   ulong t1=GetMicrosecondCount()-t;

   t=GetMicrosecondCount();
   i=0;
//while(i<size) { sum1+=X[i]; i++;}
   Recursion();
   ulong t2=GetMicrosecondCount()-t;
   Print("время выполнения цикла    = "+string(t1)+" , контрольная сумма = "+string(sum1));
   Print("время выполнения рекурсии = "+string(t2)+" , контрольная сумма = "+string(sum2));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Recursion()
  {
   sum2+=X[i];
   i++;
   if(i<size) Recursion();
  }
//+------------------------------------------------------------------+
2019.04.03 19:06:40.776 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1667 , контрольная сумма = 3510404212
2019.04.03 19:06:40.776 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 697 , контрольная сумма = 3510404212
2019.04.03 19:06:41.697 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1653 , контрольная сумма = 3492310620
2019.04.03 19:06:41.697 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 699 , контрольная сумма = 3492310620
2019.04.03 19:06:42.549 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1529 , контрольная сумма = 3510953577
2019.04.03 19:06:42.549 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 696 , контрольная сумма = 3510953577
2019.04.03 19:06:43.332 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1559 , контрольная сумма = 3512212419
2019.04.03 19:06:43.332 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 698 , контрольная сумма = 3512212419
2019.04.03 19:06:44.098 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1707 , контрольная сумма = 3497178596
2019.04.03 19:06:44.098 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 472 , контрольная сумма = 3497178596
2019.04.03 19:06:44.839 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 2088 , контрольная сумма = 3485051380
2019.04.03 19:06:44.839 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 482 , контрольная сумма = 3485051380
2019.04.03 19:06:45.538 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1612 , контрольная сумма = 3487817581
2019.04.03 19:06:45.538 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 448 , контрольная сумма = 3487817581
2019.04.03 19:06:46.397 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1742 , контрольная сумма = 3475121003
2019.04.03 19:06:46.397 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 497 , контрольная сумма = 3475121003
2019.04.03 19:06:47.262 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1701 , контрольная сумма = 3485556615
2019.04.03 19:06:47.262 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 701 , контрольная сумма = 3485556615

 

Vocês têm uma função de cálculo de lote comprovada e fiável para o MT5, sem uma paragem de perda?

Partilhar...

 
Durante a Optimização, poderá encontrar a seguinte mensagem no Diário do Testador
Tester  OnTesterInit failed. Optimization cannot be started.


É quase impossível compreender a causa desta mensagem, uma vez que não há qualquer referência ao diário de bordo do Terminal. É aí que se deve procurar a causa.


Aqui está um exemplo de uma tal EA

input int Range = 0; // 1..9

int Tmp = 1 / Range;

void OnTesterDeinit() {}

double OnTester()
{
  return(Tmp);
}


O Expert Advisor optimiza num intervalo em que o alcance não chega a zero. Mas, ao mesmo tempo, a optimização falha.

A razão é que o modo Frame dos Expert Advisors é sempre lançado com os parâmetros de entrada rigidamente prescritos no EX5. Neste caso, o modo Frame resulta numadivisão por zero.

Se OnTesterDeinit for removido do código fonte, a Optimização funcionará sem qualquer problema.


Seria bom se o TesterJournal em tais situações tivesse uma referência ao TerminalJournal. Caso contrário, nem sempre é possível compreender (o debug não está disponível durante a Optimização), o que se está a passar.

 

Pode encontrar uma situação em que as AA não começam num gráfico.

À esquerda está o cursor habitual quando se arrasta um EA para um gráfico. À direita está o nosso caso.


Não haverá entradas no diário de bordo. Em geral, o cursor de barramento é o único identificador visual de tais gráficos.


Se guardar o modelo tpl, estes gráficos serão distinguidos por uma única linha

tester=1

Esta é provavelmente a única opção programática para identificar o tipo de gráfico. É uma tabela de quadros.


Assim, se quiser proteger-se do comércio automático, só pode trabalhar com estes gráficos.

 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

Nikolai Semko:

A fórmula da ferramenta sintética dá erro "Unknown parsing error" se o nome do símbolo começar com (ou contiver) um ponto.

Slava, 2019.04.19 06:08

Se um nome de personagem contém uma paragem completa, um traço ou algo que não entende (que tal "RTS-12.19"?), então o nome deve ser rodeado de apóstrofos