Erros, bugs, perguntas - página 2823

 
Nikolai Semko:

decidiu verificar a versão de velocidade deambulação.
E o resultado foi surpreendente.
A comparação até do dobro pré-normalizado é ainda mais lenta em média do que se o dobro for comparado através do epsilon ou através da conversão para int

O resultado:

Não excluo que muitas coisas dependam da novidade e da arquitectura do processador e alguns programadores podem obter um resultado diferente.

Surpreendentemente, o arredondamento para a função número inteiro retorna um número real, não um número inteiro, e é preciso arredondar o tipo para um número inteiro também. Onde está a lógica da língua?
 
Nikolai Semko:

O desempenho da operação comparando duas duplas depende dos valores das próprias variáveis? Duvido.

Parece ser assim. É bastante estranho.
Se substituir a linha do exemplo acima

double test = 1.11;

para

double test = NormalizeDouble(1.11,2);

a simples comparação de duas duplas começa a funcionar mais rapidamente do que outras opções. Embora possa ser duplo ou duplo. Que diferença é que parece? Mas o desempenho resultante é duas vezes mais rápido. É como um milagre.

2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   простое сравнение предварительно нормализированых double 1 - 552 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   простое сравнение предварительно нормализированых double 2 - 954 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   сравнение double через эпсилон                             - 778 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   сравнение double через преобразование в int                - 854 микросекунд, всего совпадений = 507
Arquivos anexados:
 
Alexey Navoykov:

O teste está incorrecto. Porque se divide por 100000.0 apenas uma vez no final? Deve ser realizado em cada iteração e depois resumido. É uma comparação justa. Mas isto não é normalização de todo - acabou de optimizar o seu algoritmo de teste. É claro que será mais rápido e mais preciso (uma vez que o erro acumulado é reduzido).

Sim, tem razão. A precisão será a mesma que com a NormalizeDouble se a dividir em cada iteração. Mas a velocidade será ainda maior do que com o NormalizeDouble.

2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   простая сумма                            - 1394 микросекунд, сумма = -3604329.1567609389312565
2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   сумма с NormalizeDouble                  - 5861 микросекунд, сумма = -3604329.1543100476264954
2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   сумма, нормализированная через int       - 2179 микросекунд, сумма = -3604329.1543100476264954

Obrigado.

 

Geralmente, depois de arredondar para um número inteiro, devolver um número não inteiro não é bom. Anteriormente em impressoras vi números quase inteiros com zeros após o ponto decimal e um no final, ou com noves após o ponto decimal. Pensei que era um insecto. Acontece que a posição dos criadores é pouco clara. Bem, arredondando para o inteiro, deve remover o restante após o ponto decimal em forma binária mas aparentemente é difícil/impossível zerar a mantissa. Sobre a normalização é ainda mais complicado, mesmo que movamos uma vírgula para 5 dígitos e um número inteiro em binário, o arredondamento inverso para o dobro dará uma diferença com o tipo de número inteiro.

Lamentavelmente, é preciso fazer uma muleta em operações de comparação aparentemente simples.

Não python.))))

 
Valeriy Yastremskiy:

Geralmente, depois de arredondar para um número inteiro, devolver um número não inteiro não é bom. Anteriormente em impressoras vi números quase inteiros com zeros após o ponto decimal e um no final, ou com noves após o ponto decimal. Pensei que era um insecto. Acontece que a posição dos criadores é pouco clara. Bem, arredondando para o inteiro, deve remover o resto após o ponto decimal em forma binária mas aparentemente é difícil/impossível zerar a mantissa. Sobre a normalização é ainda mais complicado, mesmo que movamos uma vírgula para 5 dígitos e um número inteiro em binário, o arredondamento inverso para o dobro dará uma diferença com o tipo de número inteiro.

Lamentavelmente, temos de nos limitar a operações de comparação aparentemente simples.

Expressões após arredondamento podem conter algumas outras operações com dados resultantes, e não necessariamente números inteiros. Depois teremos de o converter de novo para o dobro da int, criando uma sobrecarga no local.

Ninguém o impede de criar as suas próprias funções RoundInt ou RoundLong, que lhe devolverão o tipo exigido.

 

Há um problema com o testador no mercado.

Se eu testar um EA multi-divisas, o testador fica pendurado.

A razão: durante a análise do instrumento financeiro, o Consultor especializado tropeça nos instrumentos sem história ou o instrumento não é devidamente concebido.

No terminal padrão fica pendurado durante 29 segundos, isso é certo e é verificado.

O testador no Mercado relata testes demasiado longos.

Presumo que o Conselheiro Especialista se depara com vários desses instrumentos financeiros quebrados.

Este problema já foi escrito várias vezes e há um ano, mas ainda lá está....

 
Vladimir Pastushak:

Este problema já foi escrito várias vezes e há um ano, mas ainda lá está....

Não está a funcionar para mim. Por favor, anexe o seu código fonte.

 

Pode comentar a razão pela qual a função não funciona? Não muda para o gráfico 0.

ChartSetInteger(0,CHART_BRING_TO_TOP,0,true);

A segunda e posterior aplicação do padrão duplica as janelas

ChartApplyTemplate(0,"Template.tpl");

Estas funções funcionavam antes da actualização.

 
fxsaber:

Não está a tocar para mim. Anexe o seu código fonte.

Teste em servidores de Metakvotes Demo

void OnStart()
  {
   int m_all_symbols = SymbolsTotal(false);
   string m_sym_name = "";
   for(int i = 0; i < m_all_symbols; i++)
     {
      // ======================================================================
      // === Получили имя символа
      if((m_sym_name = SymbolName(i, false)) != NULL)
        {
         // ======================================================================
         // === Если символ не выбран в окне маркет ватч
         if(!SymbolInfoInteger(m_sym_name, SYMBOL_SELECT))
            if(!SymbolSelect(m_sym_name, true))
               Print(" SymbolSelect " + m_sym_name);
         ulong get = GetMicrosecondCount();
         MqlRates rateM1[1440];
         if(CopyRates(m_sym_name, PERIOD_M1, 0, 1440, rateM1) > 0)
           {
            Print(m_sym_name, "  ", (GetMicrosecondCount() - get));
           }
         else
            Print("Error  ",m_sym_name, "  ", (GetMicrosecondCount() - get));
        }
     }
  }


2020.08.11 20:20:55.657 teste (EURUSD,M15) MXNJPY 1998

2020.08.11 20:20:55.659 teste (EURUSD,M15) NZDMXN 1979

2020.08.11 20:20:55.661 teste (EURUSD,M15) USDCOP 1973

2020.08.11 20:20:55.663 teste (EURUSD,M15) USDARS 2093

2020.08.11 20:20:55.665 teste (EURUSD,M15) USDCLP 1929

2020.08.11 20:21:25.259 teste (EURUSD,M15) Erro AUS200 29593673

2020.08.11 20:21:54.837 teste (EURUSD,M15) Erro FCHI40 29578404

2020.08.11 20:22:24.336 teste (EURUSD,M15) Erro GDAXIm 29498485

2020.08.11 20:22:53.949 teste (EURUSD,M15) Erro HSI50 29612968

2020.08.11 20:23:23.458 teste (EURUSD,M15) Erro Jap225 29509059

2020.08.11 20:23:52.919 teste (EURUSD,M15) Erro ND100m 29461316

2020.08.11 20:24:22.425 teste (EURUSD,M15) Erro SP500m 29505571

2020.08.11 20:24:51.860 teste (EURUSD,M15) Erro SPN35 29435460

2020.08.11 20:25:21.273 teste (EURUSD,M15) Erro STOX50 29412578

2020.08.11 20:25:50.663 teste (EURUSD,M15) Erro UK100 29389644

2020.08.11 20:26:20.205 teste (EURUSD,M15) Erro Brent 29542597

2020.08.11 20:26:49.667 teste (EURUSD,M15) Erro Bruto 29462066

2020.08.11 20:27:19.194 teste (EURUSD,M15) Erro NatGas 29526780




 
Vladimir Pastushak:

Testes em servidores Demo Metacvots

Desculpe-me, está a desligar agora....

Este guião não fez com que o Terminal ficasse pendurado na minha máquina.