Erros, bugs, perguntas - página 2297

 
Nikolai Semko:

Obrigado, mas não vi aí nenhuma resposta às minhas perguntas.
Não compreendo porque é que o destruidor não é chamado quandoA *a= novo A;

https://www.mql5.com/ru/docs/basis/variables/object_live

Todos os objectos criados pela expressão pointer_object=novo nome_da_classe devem ser destruídos posteriormente pelo operador delete(pointer_object). Se, por alguma razão, esta variável não tiver sido destruídapelo operador de eliminação, a mensagem sobre ela aparecerá na revista "Experts". É possível declarar várias variáveis e atribuí-las todas ao mesmo ponteiro de objectos.

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 

Peço à MQL para verificar a função OnTimer().

Por alguma razão não funciona no teste de estratégia para MT4 (não há erros, apenas nada dentro desta função é executado), enquanto que online está OK.

Para MT5, a função funciona tanto no testador como online.

Obrigado!

 
Muito tempo é gasto em Incorrecto-Init
Core 1  pass 114 tested with error "incorrect input parameters" in 0:00:00.218

No OnInit apenas dois números são comparados, e é preciso mais tempo para um passe incorrecto do que para um passe completo! Como assim?


Vamos gerir este Expert Advisor na optimização total

input int Range = 0; // задать Оптимизацию 1 .. 10000

int OnInit() { return(INIT_PARAMETERS_INCORRECT); }


Obtemos o resultado do trabalho de 8 agentes

Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 24 seconds


Eis agora o nosso Conselheiro Especialista

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() {}
Tester  optimization finished, total passes 10000
Statistics      optimization done in 0 minutes 31 seconds


Finalmente, como este

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() { ExpertRemove(); }
Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 19 seconds


Duas saídas

  1. Incorrectos-Init e ExpertRemove são os mesmos em termos de velocidade.
  2. Uma corrida em vazio é ~5 vezes mais rápida do que uma saída do OnInit.


Quanto ao segundo ponto, há claramente algum tipo de erro. É mais benéfico em termos de tempo realizar uma corrida vazia, em vez de saltar do OnInit. Por favor, corrijam-no porque as vantagens de Incorrect-Init e ExpertRemove serão quase completamente perdidas.

 

O separador de favoritos com EAs/indicadores/scripts e contas só é lembrado após a saída do terminal. Devido a isto, uma saída anormal (power out) reinicia este separador. É possível salvá-lo ao mudá-lo?

Por vezes há um claro entendimento de que seria muito útil se as pastas pudessem ser adicionadas aos favoritos.

 
A100:
Então tente assim:

Resultado:

1:POINTER_AUTOMÁTICO
1:POINTER_DYNAMIC
2:POINTER_DYNAMIC
2:POINTER_AUTOMÁTICO

Obrigado! Uma solução e tanto.

Mas é provavelmente melhor que o compilador não pragueje:

class B  { public:
                     B(void *b) {d=b;}
                    ~B() { delete d; }
   void             *d; };

Isto é um insecto ou o quê?
Quando se cria uma instância de uma classe via nova , ela não chama o destruidor.

É a única solução para criar uma classe especial para chamar o destruidor? Ou podemos passar sem ele?

 
Andrey Barinov:

Criar com novo e apagar com apagar

A questão é colocar a eliminação num destruidor, mas ao criar uma instância de uma classe através de novo (A *a=novoA ;) o destruidor não é chamado.

 
aleger:

É possível, e se sim, como, derivar em qualquer indicador ZigZag os valores correspondentes dos extremos de preços Alto e Baixo,

assegurando a sua ligação estável e proximidade às partes superiores e inferiores formadas?

Ver exemplo deOBJ_TEXT

 

Obrigado.
É exactamente isso que diz aqui.

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). 
Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". 
Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, 
то деструктор будет вызван в момент выполнения оператора delete.

Portanto, não é um insecto, é uma característica que resulta num círculo vicioso.
Se eu quiser automatizar o processo de apagar um objecto dinâmico, o destruidor é chamado apenas ao apagar, por isso é inútil colocar o apagar no próprio destruidor.
Mas a automatização pode ser implementada através de outra instância de outra classe, como @A100aqui sugerido.

 
aleger:

Obrigado pela dica. Já estou exausto de ler e tentar e tentar e ler. Gostaria de ver um exemplo de trabalho do ZigZag...

Como no meu avatar com ziguezague, mas com uma ligação DIREITA dos extremos superiores, porque a ligação dos extremos inferiores é OK!

A forma de encadernação com k=(WindowPriceMax()-WindowPriceMin())/30 não funciona quando o tamanho da janela muda muito, eu desejo outra coisa...


No exemploOBJ_TEXT, tanto a ligação superior como a inferior. Siga a hiperligação, dê o exemplo ...

 
Nikolai Semko:

Portanto, não é um insecto, mas uma característica, resultando num círculo vicioso.

Já lhe foi dito anteriormente que a forma de resolver o controlo dos recursos não controláveis atribuídos é utilizar apontadores inteligentes. A analogia completa com C++.
Talvez o problema seja que a solução não tenha sido apresentada numa bandeja de prata, desculpe.


Todos podem digitar "shared_ptr" na pesquisa do site e seguir o primeiro resultado, não é difícil, recomendo vivamente que o experimentem.