[ ... função hash ... ]
Para registro, fbj fez algo semelhante usando a conhecida função de hash djb2: https://www.mql5.com/en/forum/120034/page2
O djb2 mencionado em seu link acima poderia ser escrito sem todas as centenas de linhas em torno dele simplesmente como:
int djb2(string key){ int i, h, k; for (i=0; i<StringLen(key); i++){ k = StringGetChar(key, i); h = (h << 5) + h + k; } return(h); }
a djb2 mencionada em seu link acima poderia ser escrita sem todas as centenas de linhas em torno dela, simplesmente como: [...]
Não sou especialista em algoritmos de hash, muito menos em djb2 em particular, mas parece que me lembro que a inicialização do valor de hash (a variável h em sua versão) para 5381 é considerada significativa, embora ninguém esteja exatamente certo do motivo.
* magic = makeMagicNumber(name+ Symbol() + Period());Não é para fazer uma "nitpick", mas você deve ser capaz de usar isto também:
* magic = makeMagicNumber(WindowExpertName() + Symbol() + Period());Obrigado por postar o código (e o artigo de haxixe!).
Pergunta - Estou trabalhando em um método para abrir e fechar vários pedidos no mesmo gráfico, no mesmo algoritmo, etc.
Estou me aproximando em 2 passos -
1) gerando uma MN base (que é o que o código acima parece fazer) como um número inteiro. A base seria sempre a mesma para cada gráfico/símbolo/tempo
2) gerando um sufixo específico expresso como ponto decimal para cada fim de pedido específico, uma vez que um sufixo fica inutilizado, tornando-o disponível novamente
Assim, o MN seria XXXXXX.YYY onde X é a base e Y é o sufixo específico. Os sufixos começariam em 0,001 e aumentariam em 0,001 para cada novo envio. A cada final de pedido, ele atribuiria o sufixo mais baixo atualmente não utilizado. Desta forma, eu posso recuperar o MN posteriormente, regenerando a base MN e pedalando através dos sufixos
Parece um pouco complicado demais. Existe uma maneira melhor de fazer isto?
Estou postando o que tenho quando estiver terminado.
Eu apenas uso os primeiros 5 números para a versão do EA # e os últimos 4 para o número de minutos em que ele está sendo negociado.
Como um NuB, não tenho certeza porque você quer ou precisa de um MagicNumber 'criptografado'?
Eu apenas uso os primeiros 5 números para a versão do EA # e os últimos 4 para o número de minutos em que ele está sendo comercializado.
Como em seu exemplo o Symbol() se tornaria parte do MN? Você tem um número EA e um número de tempo, mas e quanto ao símbolo?
Eu identifico meus pedidos apenas por MN, meus loops sobre a lista de pedidos comparam apenas OrderMagicNumber(), o seu também teria que verificar o nome do símbolo. Tenho alguns outros scripts independentes que fazem coisas com a lista de ordens, por exemplo, gráficos de equidade de EAs ou copiar as ordens para outra plataforma, todos eles precisam apenas do número mágico para identificar as ordens de um EA específico em um Par específico e um Cronograma específico.
Eu não uso números de série para meus diferentes EAs, eu uso nomes curtos de 4 ou 5 letras para todos os meus EAs. Um EA chamado bola de neve.mq4, por exemplo, teria o nome "neve". Este é um código com fio rígido e nunca mudou. Eu uso este nome curto também para comentários de pedidos.
Então eu tenho 3 coisas: nome curto, Símbolo e Prazo. A maneira mais conveniente de converter isto em um MN é um hash. Eu poderia dar números para meus EAs ao invés de nomes, mas ainda não haveria uma maneira fácil de converter o nome do símbolo em um número. Um Hash simplesmente resolve todos estes problemas de uma só vez.
Como NuB, não tenho certeza porque você quer ou precisa de um MagicNumber 'criptografado' ?
Eu apenas uso os primeiros 5 números para a versão do EA # e os últimos 4 para o número de minutos em que ele está sendo negociado.
Você também deve ver isto -> https://www.mql5.com/en/forum/120034
O problema que tenho com toda esta abordagem é que às vezes tenho especialistas/símbolos/tempo idênticos correndo na mesma conta. Portanto, eventualmente eu ainda teria que mudar algo manualmente, e é por isso que prefiro apenas definir a magia manualmente.
O problema que tenho com toda esta abordagem é que às vezes tenho especialistas/símbolos/tempo idênticos correndo na mesma conta. Portanto, eventualmente eu ainda teria que mudar algo manualmente, e é por isso que prefiro apenas definir a magia manualmente.
E quanto ao uso de segundos? TimeCurrent() retorna um número que será sempre único - bem, pelo menos fora desse intervalo de segundos.
- Atribua um número de identificação GlobalVariable ao seu Expert. Devolva-o com WindowExpertName().
- Concatenar esse ID com um contador de incremento (caso você anexe o mesmo especialista) e TimeCurrent()
- Se o número devolvido pelo TimeCurrent() exceder o tamanho permitido. Então descarte a quantidade de anos e meses até que tenhamos o módulo de dias, horas, minutos e segundos.
E quanto ao uso de segundos? TimeCurrent() retorna um número que será sempre único - bem, pelo menos fora desse intervalo de segundos.
- Atribua um número de identificação para seu especialista. Devolva-o com WindowExpertName().
- Concatena esse ID com um contador de incremento e o TimeCurrent ()
- Se o número retornado por TimeCurrent() exceder o tamanho permitido. Então descarte a quantidade de anos e meses até que tenhamos o módulo de dias, horas, minutos e segundos.
Porque então você tem que manter um nível de persistência para essa magia. O que acontece se seu Terminal for reiniciado? A magia seria diferente...
Porque então você tem que manter um nível de persistência para essa magia. O que acontece se seu Terminal for reiniciado? A magia seria diferente...
- 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