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

 
Alexey Kozitsyn:
Isto é, usando muletas? Posso lhes dar um exemplo?

Você não pode adicionar um indicador via ChartIndicatorAdd() a um gráfico que tenha um símbolo ou TF diferente. Será mostrado um erro.

https://www.mql5.com/ru/docs/chart_operations/chartindicatoradd

ChartIndicatorAdd

Adiciona um indicador com a alavanca especificada à janela do gráfico especificado.O indicador e o gráfico devem ser desenhados no mesmo símbolo e no mesmo período de tempo.

Esta é a restrição agora. Não será em Serviços.
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Uma pequena ponta do chapéu, quase sobre o assunto do sujeito.

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

Bichos, insetos, perguntas

fxsaber, 2016.09.23 10:48

  1. Colocamos o indicador em um gráfico NENHUM
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_plots   1
    
    double Buffer[];
    
    int handle = INVALID_HANDLE;
    
    void OnInit()
    {
      ::SetIndexBuffer(0, Buffer, INDICATOR_DATA);
      
      handle = ChartIndicatorGet(0, 1, ChartIndicatorName(0, 1, 0));  
    }
    
    #define  TOSTRING(A) #A + " = " + (string)A + "\n"
    
    int OnCalculate( const int rates_total,
                     const int prev_calculated,
                     const datetime &time[],
                     const double &open[],
                     const double &high[],
                     const double &low[],
                     const double &close[],
                     const long &tick_volume[],
                     const long &volume[],
                     const int &spread[] )
    {
      if (handle != INVALID_HANDLE)
      {
        Buffer[rates_total - 1] = MathRand();
        
        double BufferCopy[];
        
        if (CopyBuffer(handle, 0, 0, 1, BufferCopy) > 0)
          Print(TOSTRING(BufferCopy[0]) + TOSTRING(Buffer[rates_total - 1]));
      }
      
      return(rates_total);
    }
  2. Retirar o indicador do gráfico à mão.
  3. No registro, vemos que o indicador continua a funcionar. Você pode fechar todos os gráficos do terminal, mas ele ainda estará executando. E isso não vai ajudar, é claro,
    void OnDeinit( const int Reason )
    {
      if (handle != INVALID_HANDLE)  
        IndicatorRelease(handle);
      
      return;
    }
  4. A reinicialização do terminal interrompe a execução do indicador.
  5. Quantos indicadores podem ser executados assim em modo inativo, e nós não sabemos nada sobre eles! Não há controle algum.
Sem nenhuma reclamação aos desenvolvedores.
 
fxsaber:
Isto agora é uma restrição. Não será em Serviços.

Não era nada disso que eu estava falando. Não adicionando um indicador de um Expert Advisor, mas criando um indicador usando um Expert Advisor.

A esse respeito:

do que Serviços ou a capacidade de executar vários EAs em um único gráfico não pode cobrir completamente as armadilhas que estão sendo discutidas?

Se não houver possibilidade de criar indicadores usando serviços, o problema de criar um indicador com dados de um arquivo não irá desaparecer. Se a seqüência OnDeinit() -> OnInit() não for controlada. A mudança da TF é uma ação do usuário, e a resposta a essa ação (OnDeit()) ocorrerá quando isso não for necessário (após OnInit() ou talvez até mesmo após OnCalculate()?

Isto é, se o indicador registrar dados em um arquivo e traçar uma série gráfica baseada nestes dados, e os dados não forem escritos "consecutivamente", a exibição correta de todos os dados não ocorrerá.

Mas se o serviço fosse um programa global (como o GPT, mas o programa inteiro) e pudesse criar buffers indicadores, e os cálculos não fossem interrompidos por ações dos usuários como mudança de TFs / fechamento de gráficos - então o problema não existiria. Mas, enquanto isso, os indicadores são castrados, como de costume.

 
Alexey Kozitsyn:

Não era nada disso que eu estava falando. Não adicionando um indicador de um EA, mas criando um indicador usando um EA.

Eu não entendo a terminologia.

 
fxsaber:

Eu não entendo a terminologia.

Calcular e exibir os dados com a gravação em buffers indicadores, não apenas exibir os dados.
 
Slawa:

Ainda não há solução para a OnChartEvent

O que você quer dizer com "não há solução"? Que tipo de serviço seria sem a possibilidade de acessar o mouse? E eu também gostaria de lidar com os eventos dos usuários.
 
Alexey Kozitsyn:
Cálculo e exibição de dados com a gravação em buffers indicadores, não apenas com a exibição dos dados.

Eles reclamam que os dados calculados pelo indicador não podem ser transferidos de forma confiável e lógica para outra cópia deste indicador durante a mudança da TF.

Isto é feito facilmente através de Serviços se o Serviço fará a parte de cálculo e o indicador a exibirá.

Em todos os outros casos, que não se enquadram no destacado em negrito, você pode continuar a escrever os indicadores como os clássicos.

 
fxsaber:

Eles reclamam que os dados calculados pelo indicador não podem ser transferidos de forma confiável e lógica para outra cópia deste indicador durante a mudança da TF.

Isto é feito facilmente através de Serviços, se o Serviço fará a parte de cálculo e o indicador a exibirá.

Em todos os outros casos, que não se enquadram no destacado em negrito, você pode continuar a escrever indicadores da maneira clássica.

Ok, bem, veremos o que vamos conseguir. Quando será a beta?
 
Alexey Kozitsyn:
OK, bem, veremos o que acontece. Quando é o beta?
Se eu der o aval, será hoje à noite.
 
Nikolai Semko:
O que você quer dizer com "sem solução"? Que tipo de serviço seria sem a possibilidade de acessar o mouse? E eu também gostaria de lidar com eventos de usuários.

Nenhuma solução significa "ainda não sabe como resolver", não "não resolverá".

E não há nenhum problema com eventos personalizados