Erros, bugs, perguntas - página 2243

 
Vitaly Murlenko:

O código no indicador mql4 deixou de funcionar. como posso corrigi-lo?

O editor diz 'ObjectSetInteger' - nenhuma das sobrecargas pode ser aplicada à chamada de função

Tem estado a funcionar há anos e depois parou subitamente. É uma pena, no entanto.


else{// Иначе стрелка создана. Задаём её свойства
 ObjectSetInteger(ChartID(),Open_name,OBJPROP_ARROWCODE,OpenArrowCode);//код стрелки 232 // или 0 вместо ChartID() для текущего графика 
 ObjectSet(Open_name,OBJPROP_COLOR,ObjColor);//цвет стрелки
}

Mas porque é que misturaram dois estilos? Se utilizar a primeira linha para especificar o código da seta, então utilize a segunda linha no mesmo estilo:

ObjectSetInteger(0,Open_name,OBJPROP_COLOR,ObjColor); //цвет стрелки
 

Tentei carregar uma nova versão do indicador para o mercado. O teste terminou com erros. Relatório de erro como na figura do apêndice com o seguinte conteúdo:

teste em EURUSD,H1 (netting) teste em XAUUSD,D1 (netting) teste em GBPUSD,M30 (netting) teste em EURUSD,M1 (netting) 2016.05.31 21:45:00 Violação de acesso em 0x00007FF7FD1CA04B ler a 0xFFFFFFFFFFFFFFFFFFFFFFFF 2016.05.31 21:45:00 00 00007FF7FD1CA010 4885D2 test rdx, rdx 2016.05.31 21:45:00 00 00 00007FF7FD1CA013 747B jz 0x7ff7fd1ca090 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00 00007FF7FD1CA015 53 push rbx 2016.05.31 21:45:00 00 00 00007FF7FD1CA016 4883EC20 sub rsp, 0x20 2016.05.31 21:45:00 00 00 00007FF7FD1CA01A 48897C2430 mov [rsp+0x30], rdi 2016.05.3131 21:45:00 00 00007FF7FD1CA01F 488BD9 mov rbx, rcx 2016.05.31 21:45:00 00 00007FF7FD1CA022 488B7AF8 mov rdi, [rdx-0x8] 2016.05.31 21:45:00 00 00 00007FF7FD1CA026 4881FF00004000 cmp rdi, 0x400000 2016.05.31 21:45:00 00 00 00007FF7FD1CA02D 730B jae 0x7ff7fd1ca03a 2016.05.31 21:45:00 00 00 00007FF7FD1CA02F 4883E980 sub rcx, 0x80 2016.05.31 21:45:00 00 00 00007FF7FD1CA033 E88852CAFF call 0x7ff7fce6f2c0 ; #2504 (metatester64.exe) 2016.05.31 21:45:00 00 00 00007FF7FD1CA038 EB37 jmp 0x7ff7fd1ca071 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00 00007FF7FD1CA03A 488D4AE8 lea rcx, [rdx-0x18] 2016.05.31 21:45:00 00 00 00007FF7FD1CA03E 488B52E8 mov rdx, [rdx-0x18] 2016.05.31 21:45:00 00 00 00007FF7FD1CA042 4885D2 test rdx, rdx 2016.05.3131 21:45:00 00 00007FF7FD1CA045 7408 jz 0x7ff7fd1ca04f 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00 00007FF7FD1CA047 488B4108 mov rax, [rcx+0x8]
Talvez o problema esteja no testador?
Arquivos anexados:
 
Artyom Trishkin:

Porque é que misturaram os dois estilos? Se usar a primeira linha para definir o código da seta, então use a segunda linha no mesmo estilo:

Obrigado, isso ajudou.

Dois estilos? Eu não conhecia os estilos. É que anteriormente só se podia fazer esta secção dessa forma. Houve uma mudança. Tenho programado em MQL4 há mais de 10 anos. E agora os programadores mudaram a linguagem e muitos dos meus códigos já não funcionam. Estou muito desiludido. As mudanças não foram para melhor. Isto significa que tenho de refazer uma enorme quantidade de códigos. Apesar de serem antigas, eram muito úteis.

 
Gennadiy Stanilevych:

Tentei carregar uma nova versão do indicador para o mercado. O teste terminou com erros. Relatório de erro como mostra a figura no apêndice com o seguinte conteúdo:

Talvez o problema esteja no testador?

Por favor, crie um pedido para o Servicedesk, nós resolvemos isso


UPD: Encontrei o seu pedido.
 
Artyom Trishkin:

Liberta o buffer de qualquer matriz dinâmica e define o tamanho da dimensão zero para 0.

Quando os scripts e indicadores são escritos, a necessidade de utilizar a função ArrayFree() pode ocorrer raramente, uma vez que toda a memória utilizada é imediatamente libertada, e nos indicadores personalizados o trabalho principal com arrays é representado pelo acesso a buffers indicadores, cujas dimensões são automaticamente geridas pelo subsistema executivo do terminal.

Se precisar de gerir a memória por si próprio em condições dinâmicas complexas, a função ArrayFree() permitir-lhe-á libertar explícita e imediatamente a memória ocupada por uma matriz dinâmica que não necessita.

Está a ver? Desnecessário.

Naturalmente, uma vez libertada a memória, e depois atribuir-lhe novamente um tamanho à matriz, ninguém pode garantir o seu conteúdo.

Inicialização da matriz de uso: ArrayInitialize()

Como assim, ninguém garante o conteúdo? Se a memória foi libertada, desapareceu, por isso como é que se lhe mete lixo dentro? Ou será que limpar a memória implica dar permissão para que essa memória seja utilizada por outra parte do programa, não a limpando de todo?

 
Aleksey Vyazmikin:

O que quer dizer com "ninguém garante o conteúdo"? Se a memória foi apagada, já não está lá, então como é que se mete lixo nela? Ou será que limpar a memória implica dar permissão para que essa memória seja utilizada por outra parte do programa, não a limpando de todo?

ArrayResize não limpa a memória, e é por isso que contém lixo do "consumidor" anterior.

Isto é feito por velocidade, porque depois de a memória ser atribuída a uma matriz, em 99,99(9)% dos casos, o utilizador irá "preenchê-la" com os seus dados.


 
Vitaly Murlenko:

Obrigado, isso ajudou.

Dois estilos? Eu não conhecia os estilos. É que anteriormente só se podia fazer esta secção dessa forma. Houve uma mudança. Tenho programado em MQL4 há mais de 10 anos. E agora os programadores mudaram a linguagem e muitos dos meus códigos já não funcionam. Estou muito desiludido. As mudanças não foram para melhor. Isto significa que tenho de refazer uma enorme quantidade de códigos. Podem ser antigos, mas eram um carro inteiro mais útil.

Não é assim que o código da seta foi definido antes da introdução das funções mql4 ObjectSetXXX?

ObjectSet(Open_name,OBJPROP_ARROWCODE,OpenArrowCode);

Também escrevo em mql há cerca de 10 anos (talvez mais - como o tempo voa...) - começo a esquecer estritamente as funções quaternárias - escrevo código multiplataforma sempre que possível.

 
Ilyas:

ArrayResize não limpa a memória, é por isso que contém lixo do "consumidor" anterior.

Isto é feito por velocidade, porque após alocação de memória a uma matriz, em 99,99(9)% dos casos, o utilizador irá "preenchê-la" com os seus dados.


Então porque é que os valores numéricos são constantes "lixo", mesmo depois de reiniciar o terminal?

Pessoalmente, fiquei preso com a simples soma do conteúdo das células de outra matriz, e há muito tempo que me interrogo sobre o problema.

      for(int i=1;i<StrokTotal; i++)
        {
         for(int s=3;s<56+1; s++)
           {               
            SummArrA[s]=SummArrA[s]+ArrTest[i,s];
           }
        }     
 
Aleksey Vyazmikin:

Então porque é que os valores numéricos são constantes "lixo", mesmo depois de reiniciar o terminal?

Pessoalmente, queimei-me com uma simples soma do conteúdo das células de outra matriz, e perguntei-me durante muito tempo qual era o problema

Não importa que tipo de dados estejam contidos na matriz não-inicializada, a qualquer momento, os dados podem mudar, ninguém garante o seu valor.
É por isso que a utilização de variáveis não inicializadas (ler memória) leva por vezes a situações em que é preciso muito tempo para encontrar a causa:

  1. Funciona num computador, não no outro
  2. Trabalha no terminal, não no testador
  3. Terminal/CA actualizado e programa comporta-se de forma diferente
  4. Acrescentada A impressão deixou de funcionar.
  5. etc.

Só posso dar alguns conselhos.
Deve adquirir o hábito de inicializar sempre os dados, para que no futuro não perca muito tempo na procura de erros relacionados com a falta de inicialização.

Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему отключить нельзя. Порядок обновления При подключении к торговому серверу происходит проверка наличия обновлений платформы. Если найдено обновление какого-либо из компонентов торговой платформы...
 
Aleksey Vyazmikin:

O que quer dizer com "ninguém garante o conteúdo"? Se a memória foi apagada, já não está lá, então como é que se mete lixo nela? Ou será que limpar a memória implica dar permissão para que essa memória seja utilizada por outra parte do programa, não a limpando de todo?

O que quer dizer com "não"? Não se remove o cartão de memória da ranhura da placa-mãe. E se a memória estiver presente e for libertada (não inicializada com um valor, mas libertada), então começa a ser utilizada para outras necessidades do programa.

Razão: