Seqüência de execução Init() e DeInit() - página 25

 
Alexey Viktorov:

Dimitri, você me parece ser um programador educado. Você não foi ensinado as regras de etiqueta na programação?

Para o resto, você pode escrever como no antigo mql4 com a possibilidade de sobreposições de matriz e outras suposições. Você recebe um erro em resposta... Bom, sinalize-o de volta... Vamos em frente, não temos tempo... E então você se depara com um problema que não vale nada em uma linguagem mais estrita e começa a culpar os desenvolvedores...

Cristo ressuscitou.


Quando você cria um objeto existente, nada terrível acontece, nada terrível também acontece, o objeto simplesmente não é criado e isso é tudo.
 
Nikolai Semko:

Penso que também acrescentarei uma solução mais tarde, mas sem utilizar variáveis globais do terminal e dos arquivos, e com a possibilidade de aplicar vários indicadores idênticos em uma única janela.

A propósito, é uma tarefa interessante escrever uma função que produz um valor diferente para cada conjunto diferente de parâmetros de entrada de indicador.

A primeira coisa que me veio à mente foi através do ChartSaveTemplate.


Desistência global - aparentemente de recursos.

 
fxsaber:

A propósito, é uma tarefa interessante escrever uma função que produz um valor diferente para cada conjunto diferente de parâmetros de entrada de indicador.

A primeira coisa que me veio à mente foi através do ChartSaveTemplate.


Abandonar os globais - aparentemente recursos.


É claro que recursos - eles me parecem a melhor solução, porque são invisíveis, ao contrário das variáveis e arquivos terminais globais, e rápidos. Além disso, você pode passar arrays através deles, assim como através de arquivos, mas mais rápido, porque tudo acontece na RAM. Além disso, eles pertencem à janela, não ao terminal, como no caso do global. Além disso, você pode criar um recurso para todos os mesmos indicadores em uma janela.

Não, eu acho que o ChartSaveTemplate é muito pesado. Vou tentar criar um recurso comum para todas as instâncias de um indicador sem utilizar mudanças globais, modelos e arquivos.

 
Nikolai Semko:

Meu exemplo foi criado para mostrar o problema de uma seqüência ambígua da Unidade da nova TF e da Unidade da antiga TF, não como uma solução.

Você simplesmente ignorou o problema, não o resolveu.
No meu exemplo, é apenas importante apagar o objeto na Unidade do antigo TF em qualquer caso, inclusive quando o TF é modificado, e na Unidade do novo objeto ele é criado novamente.

Se a seqüência é primeiro Deunit da antiga TF, então Unit da nova TF, como deveria ser logicamente. Em seguida, o objeto é apagado e depois criado novamente.

Se a seqüência é primeiro a Unidade do novo TF e depois a Unidade do antigo TF, então o objeto é simplesmente modificado quando se tenta criá-lo na Unidade, porque ainda não foi apagado. E depois é apagado pelo Deunit da antiga TF. Este é o bug.

Esse foi o objetivo deste exemplo - mostrar o que qualquer programador que não tenha lido este ramo e não esteja ciente desta "característica" pode encontrar.
Este exemplo não foi concebido para ser uma solução. Como as variantes da solução são apresentadas aqui e aqui. Acho que também acrescentarei uma solução mais tarde, mas sem utilizar variáveis e arquivos globais do terminal e para que esta solução funcione mesmo que vários indicadores idênticos sejam definidos em uma janela. Você já tentou resolver este problema? Ou você só é capaz de encontrar erros no código de outras pessoas, especialmente quando elas não estão lá.


É um pecado jurar hoje, mas sinto que é...

Eu nem consegui ler seus disparates até o fim.

Repito mais uma vez, não crie um problema onde não há problema.

A resposta a todas as suas perguntas em seu código estava aqui

Alexey Viktorov:

Para que serve usar o exemplo primitivo de rua de mão dupla?

É melhor usar um exemplo de código quase correto .

Eu não estava contando com a absolutização.

Isso é tudo... vá embora, Satanás, não me leve ao pecado.

 
Alexey Viktorov:

É um pecado jurar hoje, mas sinto que é...

Eu nem consegui ler seus disparates até o fim.

Vou dizer novamente, não coloque o problema onde ele não existe.

A resposta a todas as perguntas do seu código estava aqui.

Eu não estava contando com absolutos.

É isso... Satanás se foi, não nos leve ao pecado.


Oh, cara, você precisa ir a outro fórum. Onde os psicoterapeutas dão conselhos. Eu entendo, eu entendo. Déficit de amor na infância, quer atenção e amor. Sinto muito. Eu o ajudarei se você precisar de alguma coisa. Você pode me escrever pessoalmente. Não estou brincando.

E é melhor não fazer isso aqui, porque já divertimos demais as pessoas.

A RESSURREIÇÃO DE FATO!

 
Como fazer! Rodar
#property indicator_chart_window
#property indicator_plots   0

void OnInit()
{
  Print(__FUNCTION__ + (string)ChartIndicatorGet(0, 0, MQLInfoString(MQL_PROGRAM_NAME)));
}

void OnDeinit( const int Reason )
{
  Print(__FUNCTION__);
}

int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[])
{
  return(rates_total);
}

E troque o TF. Não haverá um único Deinit! Todos os indicadores passarão despercebidos, consumindo recursos. E só queria

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

Bichos, insetos, perguntas

fxsaber, 2016.09.22 16:14

Como conheço meu cabo em um gráfico em um indicador? Através deChartIndicatorName não é adequado, pois retorna um nome curto. E com o mesmo nome pode já estar rodando o mesmo indicador com parâmetros de entrada diferentes.

Acontece que, se você quiser conhecer seu manípulo, você deve usar ChartIndicatorGet, mas como mostrado no exemplo acima, será um problema real - o indicador será desinstalável.

Que chatice.


Eu nem mesmo posso fazer isso.

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

Bichos, insetos, perguntas

fxsaber, 2016.09.23 10:20

Como conheço meuINDICADOR_SHORTNAME? IndicadorAbter*-funções não existem!

Não há como saber a partir do indicador em que sub_janela ele bateu. É apenas um bando de vagabundos.

 
fxsaber:

Você não pode dizer pelo indicador em qual sub_janela ele está. É apenas um bando de vagabundos.

https://www.mql5.com/ru/docs/chart_operations/chartwindowfind
Документация по MQL5: Операции с графиками / ChartWindowFind
Документация по MQL5: Операции с графиками / ChartWindowFind
  • www.mql5.com
Операции с графиками / ChartWindowFind - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:
Uma pequena e legal dica! Rodar

E troque a TF. Não haverá um único Deinit! Todos os indicadores passarão despercebidos, consumindo recursos. E eu só queria

Acontece que se você quiser conhecer seu cabo, você deve usar o ChartIndicatorGet, mas, como mostrado no exemplo acima, será uma verdadeira chatice - o indicador não será removível.

Tornar-se-á irrecuperável.

Eu já enfrentei tal coisa. Os desenvolvedores aconselharam a ler a ajuda com mais atenção, pois há um exemplo:

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
   //--- количество окон на графике (всегда есть хотя бы одно главное окно) 
   int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); 
   //--- про ходим по окнам 
   for(int w=0;w<windows;w++) 
     { 
      //--- сколько индикаторов в данном окне/подокне 
      int total=ChartIndicatorsTotal(0,w); 
      //--- переберем все индикаторы в окне 

      for(int i=0;i<total;i++) 
        { 
         //--- получим короткое имя индикатора 
         string name=ChartIndicatorName(0,w,i); 
         //--- получим хэндл индикатора 
         int handle=ChartIndicatorGet(0,w,name); 
         //--- выведем в журнал 
         PrintFormat("Window=%d,  index=%d,  Name=%s,  handle=%d",w,i,name,handle); 
         //--- обязательно освобождаем хендл индикатора, как только он становится ненужным 
         IndicatorRelease(handle); 
        } 
     } 
  }
Entretanto, eles acrescentaram que o comportamento seria "corrigido". Mas aparentemente ainda está sendo ajustado.
 
Alexey Kozitsyn:
https://www.mql5.com/ru/docs/chart_operations/chartwindowfind

Obrigado, mas há a mesma limitação - não há como não ter um nome curto (como você sabe disso?).

 
Alexey Kozitsyn:

Eu me deparei com algo assim. Os desenvolvedores me aconselharam a ler a ajuda com mais atenção, pois há um exemplo:

Entretanto, acrescentou então que o comportamento seria "corrigido". Mas aparentemente ainda está sendo ajustado.

Isso realmente ajudou, Obrigado!

O principal é não fazer IndicatorRelease em Deinit.

Razão: