E agora, uma super-duper mega-pergunta: qual é o contexto de vida dos recursos criados em MQL5? O terminal inteiro, quaisquer contêineres internos como fluxos "symbol-timeframe", gráfico ou qualquer outra coisa? Não há nada escrito sobre isso na ajuda.
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Sequência de execução de Init() e DeInit()
Nikolai Semko, 2017.04.16 09:42 AM
É claro que os recursos - eles me parecem a solução ideal, pois são invisíveis, ao contrário das variáveis e arquivos de terminal glob. e rápidos. E você também pode transferir matrizes por meio deles, assim como por meio de arquivos, mas apenas mais rápido, porque tudo acontece na RAM. Além disso, elas pertencem à janela, não ao terminal, como no caso das globais. Além disso, você pode criar um recurso para todos os mesmos indicadores na janela.
Eu simplesmente acreditei nisso, por isso fiz isso por meio de recursos. Inicialmente, foi por meio de recursos globais.
Não testei
Eu simplesmente acreditei, então fiz isso por meio de recursos. Originalmente, foi por meio da Global.
E há mais uma pergunta: o que acontece se um indicador for criado a partir de um Expert Advisor?
Hmmm...
Sobreposições de funções interessantes...
Como isso funciona? Digamos, usando a função de inicialização como exemplo?
Então...
Então, como a biblioteca é inserida primeiro, ao compilar OnInit() da biblioteca é registrada como uma função de inicialização.
E ela verifica a sincronização e, em seguida, chama a função OldOnInit(). O que é essa função? Ela ainda não está definida!
Aha... Além disso, o identificador OnInit() é definido pela definição como OldOnInit(). Mais tarde, quando a função OnInit() "antiga" for definida, ela será substituída por OldOnInit(), a mesma que será chamada pela função OnInit() da biblioteca.
O uso original de definições. Na minha opinião, bastante perigoso, em termos de suporte adicional e possibilidades de alterar a ordem de declaração dos identificadores. (Eu tinha a impressão de que não era possível usar identificadores não declarados). Mas, do ponto de vista do uso, tudo está limpo e correto.
Na minha opinião, é bastante perigoso em termos de suporte adicional e possibilidades de alterar a ordem de declaração dos identificadores.
Não encontrei um exemplo perigoso.
Na minha memória, essa é a única biblioteca em que o #include está presente, mas em nenhum lugar do código algo é chamado pelo usuário.
Peço desculpas. Fui enganado.
Se você usar um indicador vazio com esse OnInit (sem excluir o recurso):
int OnInit() { uint set[1]; set[0]=3; uint w=1,h=1; if(ResourceReadImage("::Res_name",set,w,h)) Print("o recurso já existe set[0] = "+DoubleToString(set[0],0)); else { if(ResourceCreate("::Res_name",set,1,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA)) Print("Um novo recurso foi criado."); else Print("Não foi possível criar um recurso."); } return(INIT_SUCCEEDED); }
você poderá tirar as seguintes conclusões sobre o recurso:
1. O recurso pertence ao terminal, não à janela. Portanto, é razoável adicionar, digamos, um identificador de janela ao nome do recurso.
2. A vida útil do recurso é o tempo em que o terminal estiver ativo, e o recurso é excluído quando o terminal é reiniciado. Portanto, seria razoável salvar os dados necessários na variável global do terminal (ou arquivo via ResourceSave) quando o terminal for fechado (o código de motivo é REASON_CLOSE) e, quando o terminal for carregado novamente, criar um novo recurso transferindo os dados do PT global (ou arquivo) com a exclusão subsequente do PT global (ou arquivo), para que eles não incomodem seus olhos (então a variável global do terminal existirá somente no momento de fechar e abrir o terminal).
Por um lado, isso é bom, pois há possibilidades interessantes de transferência de dados e sincronização entre janelas e, em geral, tudo no terminal, mas, por outro lado, acrescenta código e algumas complicações.
Desculpe-me novamente por fornecer informações não verificadas.
Mas agora há clareza com recursos mal documentados. E, a propósito, uma ferramenta muito valiosa.
O recurso pertence ao terminal, não à janela. Portanto, é razoável adicionar, digamos, um identificador de janela ao nome do recurso.
return("::" + (string)::ChartID() + (string)INIT_SYNC::crc64(Bytes) + ::MQLInfoString(MQL_PROGRAM_NAME));
Parece que nada mais é necessário.
A propósito, pode ser conveniente não usar o identificador de janela em algumas situações, quando a cópia do indicador deve ser UMA para todo o terminal.
ZY A versão atualizada contém essa correção.
A propósito, talvez a ausência do controle da janela possa ser conveniente em algumas situações, quando a cópia do indicador deve ser UMA para todo o terminal.
Sim, eu também pensei nisso
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Init_Sync:
Autor: fxsaber