Erros, bugs, perguntas - página 1126

 

Estou a escrever um ToR para uma EA MT4 com prioridade no processamento acelerado de dados.

Por favor, informe se a sequência de cálculos ou amostragem (qual é o nome correcto - representativo?) é importante para acelerar o processo.

Estou a anexar duas variantes sob a forma de imagens mostrando diagramas de blocos.

Se puder, por favor escreva como deve ser o código se a execução selectiva dos blocos for - um layout puramente primitivo, e isto dará um aumento significativo de velocidade!

Arquivos anexados:
Logic_V_01.png  26 kb
Logic_V_02.png  30 kb
 
void OnStart()
{
        uchar max=0;
        for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
        for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает
        for(int t=0;t<ULONG_MAX;t++)  {max++;}    //так нет предупреждения и цикл не пашет
        Print("Done!");
}
 

Como é explicado este encerramento de uma posição no testador? É devido ao alargamento?

Capturas de ecrã da plataforma de negociação MetaTrader

EURUSD, M20, 2014.04.12

Alfa-Forex, MetaTrader 5, Real

temp_file_screenshot_63279.png

EURUSD, M20, 2014.04.12, Alfa-Forex, MetaTrader 5, Real


 
Crucian:

Como é explicado este encerramento de uma posição no testador? É o alargamento da propagação?

[img]https://charts.mql5.com/4/434/eurusd-m20-alfa-foreks-temp-file-screenshot-63279-png.png[/img]

Se o spread alargou (e a julgar pela imagem de ecrã - por 720 pontos! em cinco dígitos), então tudo está correcto.

A posição de venda fechou ao preço Ask. Isto se as paragens estivessem definidas.

A propósito, o seu corretorAlfa-Forexacaba de se espalhar gigantesco no final da semana e no início.

Provavelmente foram registados no histórico de cotações e o testador simulou a sua comercialização.

As paragens para o fim-de-semana são perigosas - de qualquer modo, não pouparão da diferença, e a propagação pode facilmente apanhá-lo.

 
Fleder:
for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает

Nenhum erro aqui porqueLONG_MAX+1< 0

for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
Aqui o aviso é válido (t<LONG_MAX sempre verdadeiro se t int ) loop infinito
 
void OnStart()
{
  uchar max=0;
  for(int t=0;t<ULONG_MAX-1 e0;t++)  {max++;}      //так цикл работает, предупреждения нет так как ULONG_MAX-1e0 имеет тип double
  for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
  Print("Done!");
}
 
Fleder:
for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
Não há aqui nenhum erro, porque ULONG_MAX-1< 0, ou seja, a operação de comparação é convertida em int ou longo - mais precisamente, há uma comparação bitwise
 
A100:
Não há erro porque ULONG_MAX-1< 0, porque a operação de comparação é reduzida a int

Então, como explicar isto:

void OnStart()
{
  long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
  Print(ULONG_MAX-1);      //18446744073709551614
  Print(ULONG_MAX);        //18446744073709551615
}
 
A100:
Não há aqui nenhum erro porque ULONG_MAX-1< 0, ou seja, a operação de comparação é fundida para int ou longa

Refere-se à comparação na expressão testada no laço?

Porque não parece ser assim numa simples comparação.

 
A100:

Basta trocá-los :)

O que faz este rearranjo? t foi inferior ao ULONG_MAX-1 e ainda é.

void OnStart()
{
  long t=0;
  Print( (t < ULONG_MAX-1) == (ULONG_MAX-1 < t)); //false
}
Razão: