Para fins de segurança do sistema, cada chamada de DLL passa por um removedor especial, o que torna a execução mais lenta. A chamada de função DLL não é uma chamada banal XXXX, mas um invólucro complexo com mascaramento de endereço, controle de pilha e falhas dentro da DLL. A MQL5 faz com que, se uma função dentro da DLL bagunçar a pilha ou travar, a execução do script será interrompida sem travar o próprio terminal.
Recomendação geral sobre o uso de funções de DLL: tente fazer chamadas raras com uma grande quantidade de trabalho interno, em vez de dezenas de milhares de chamadas por segundo com resultados pequenos e passageiros.
Eu me pergunto. Por que não ir além?
Como Renat apontou, chamar funções baratas de uma dll é caro.
Então, por que não copiar os dados diretamente na matriz fornecida para essa finalidade?
Eu me pergunto. Por que não ir além?
A quem a pergunta se dirige - ao autor ou aos desenvolvedores?
Se for para os desenvolvedores, o que exatamente você sugere?
Há algum erro na função StringExplode? Em sua forma atual, ela não copia o último componente da cadeia de caracteres se não houver um delimitador depois dele (ou seja, no final da cadeia de caracteres). Na minha opinião, o final da cadeia de caracteres deve ser considerado mesmo que não haja um delimitador no final. Exemplo: alimentamos a cadeia"EURUSD,EURJPY" com o delimitador "," e a função agora seleciona apenas EURUSD.
Aqui está a versão corrigida da função; por conveniência, retornei o número de elementos:
int StringExplode(string s, string separator, string &result[]) { int i, pos; ArrayResize(result, 0); for(i = 0; ; i++) { ArrayResize(result, ArraySize(result) + 1); pos = StringFind(s, separator); if(pos >= 0) { result[i] = StringSubstr(s, 0, pos); s = StringSubstr(s, pos + StringLen(separator)); } else { result[i] = s; i++; break; } } return(i); }
Há um aviso muito sério para aqueles que usam chamadas frequentes de funções de DLL, como Get/Set.
Para fins de segurança do sistema, cada chamada de DLL passa por um removedor especial, o que torna a execução mais lenta. A chamada de função DLL não é uma chamada banal XXXX, mas um invólucro complexo com mascaramento de endereço, controle de pilha e falhas dentro da DLL. A MQL5 faz com que, se uma função dentro da DLL bagunçar a pilha ou travar, a execução do script será interrompida sem travar o próprio terminal.
Conselho geral sobre o uso de funções DLL: tente fazer chamadas raras com uma grande quantidade de trabalho interno, em vez de dezenas de milhares de chamadas por segundo com a transferência de pequenos resultados.
A propósito, mais uma observação sobre várias chamadas de DLL: durante os testes, notei que ocorrem vazamentos de memória de vários bytes em cada chamada
Não há nenhum erro na função StringExplode? Em sua forma atual, ela não copia o último componente da cadeia de caracteres se não houver um delimitador depois dele (ou seja, no final da cadeia de caracteres). Na minha opinião, o final da cadeia de caracteres deve ser considerado mesmo que não haja um delimitador no final. Exemplo: alimentamos a cadeia de caracteres"EURUSD,EURJPY" com o delimitador "," e a função agora seleciona somente EURUSD.
Aqui está a versão corrigida da função; por conveniência, retornei o número de elementos:
Obrigado, eu não prestei atenção. Você pode ver porque o último elemento no descritor é um número aleatório, que não tem significado.
---------
Obrigado! Implementarei todas as sugestões de aprimoramento na medida do possível. A ideia em si é boa, mas eu gostaria que ela não ficasse parada.
A quem a pergunta se dirige - ao autor ou aos desenvolvedores?
Se for para os desenvolvedores, o que exatamente você sugere?
Autor. Você pode passar o tamanho da matriz junto com ela e, em seguida, organizar a cópia única da matriz diretamente da memória para a memória - muito barato e contorna os problemas da MQL4 com referências elemento por elemento. Tenho muitas coisas para fazer agora, caso contrário, eu teria escrito um exemplo.... Espero que você tenha entendido a essência do assunto.
Desde já... -- Se você usar bloqueios e implementar a transferência corretamente, essa abordagem deverá ser segura.
Como isso é complicado!...
Com a ajuda de Ilnur, há um ano, escrevi uma biblioteca em MQL4 para trabalhar com a memória. Você pode alocar memória, mover ponteiros, escrever e ler, transferir o nome da área de memória para qualquer outro programa.
Tudo é baseado no mapeamento. Ela é muito mais simples do que a proposta.
Como isso é complicado!...
Com a ajuda de Ilnur, há um ano, escrevi uma biblioteca em MQL4 para trabalhar com a memória. Você pode alocar memória, mover ponteiros, escrever e ler, transferir o nome da área de memória para qualquer outro programa.
Tudo é baseado no mapeamento. É muito mais simples do que a proposta.
Há um aviso muito sério para aqueles que usam chamadas frequentes de funções de DLL, como Get/Set.
Para fins de segurança do sistema, cada chamada de DLL passa por um removedor especial, o que torna a execução mais lenta. A chamada de função DLL não é uma chamada banal XXXX, mas um invólucro complexo com mascaramento de endereço, controle de pilha e falhas dentro da DLL. A MQL5 faz com que, se uma função dentro da DLL bagunçar a pilha ou travar, a execução do script será interrompida sem travar o próprio terminal.
Conselho geral sobre o uso de funções DLL: tente fazer chamadas raras com uma grande quantidade de trabalho interno, e não dezenas de milhares de chamadas por segundo com resultados pequenos e passageiros.
Muito obrigado ao autor, não é uma biblioteca pequena, com o uso adequado e
e "cruzamentos que não contradizem as leis da genética", é possível obter bons resultados.
Eu, por exemplo, finalmente "puxei" dados de gráficos off-line, no modo on-line))). Plataforma MT4.
Uma colherada de alcatrão)))
Mais de uma vez, houve situações em que na lista de variáveis globais
na lista de variáveis globais eram "antigas" e, por algum motivo, não eram excluídas.
Ainda não consegui descobrir o motivo disso.

- 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
Novo artigo Troca de dados entre indicadores: é fácil foi publicado:
Queremos criar um ambiente que fornecesse acesso aos dados de indicadores anexos ao gráfico e que teria as seguintes propriedades: ausência de cópia de dados; modificação mínima do código dos métodos disponíveis, se precisarmos usá-los; preferencialmente código MQL (claro, temos que usar o DLL, mas usaremos apenas algumas strings do código C++). O artigo descreve um método fácil para desenvolver um ambiente de programa para o terminal MetaTrader, que poderia fornecer meios para acessar os buffers dos indicadores de outros programas MQL.
Autor: Алексей