criando um número mágico - página 4

 
7bit:

Não, eles podem ser o que você quiser. assim como o comentário. veja-os como uma espécie de comentário numérico. Todas as negociações manuais abertas com a interface de usuário MT4 normal terão o número mágico 0, de modo que você pode, por exemplo, loopar sobre todas as ordens e fechar/apagar todas as negociações e ordens manuais enquanto deixa todas as negociações EA intocadas.

Para identificar exclusivamente apenas uma determinada ordem, há o número do bilhete.

obrigado por esclarecer isso e compartilhar seus pontos de vista. Fwiw, eu aprendi muito...

 
7bit:
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = MathPow(2, count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}

Eu não preciso do MathPow(), por que ninguém viu isso?
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = (0x00000001 << count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}
atualizando agora o primeiro lançamento.
 
7bit:
Eu não preciso do MathPow(), por que ninguém viu isto?

Três razões principais vêm à mente:

  • Qualquer pessoa que já esteja usando uma função de hashing é improvável que a substitua por seu código e, portanto, não se importará com os detalhes de seu código.
  • Qualquer pessoa que não esteja usando uma função de hashing no momento, mas que ache que pode ser uma boa idéia, provavelmente só aceitará códigos como o seu em confiança, e só se importará se funciona ou não, e não sobre o quão elegante ou otimizado ele é.
  • Sua substituição de MathPow() por uma operação bitwise economizará substancialmente menos de um milissegundo por chamada para fazerMagicNumber(). Você está sugerindo que o makeMagicNumber() é chamado uma vez durante a vida útil de um EA, init(). Portanto, sua mudança está economizando menos de um milissegundo por vida útil da EA. É uma mudança totalmente trivial (e, sem dúvida, reduz a clareza do código).
 
jjc: indiscutivelmente reduz a clareza do código

Eu não diria que isso reduz a clareza. Minha principal intenção é clareza, elegância e precisão, não desempenho.

Eu também poderia usar potência, multiplicação, divisão (e modulo) para fazer a real troca de bits sem usar nenhum operador bitwise. Mas em nome da elegância (e também da clareza) eu deveria fazê-lo exclusivamente com um ou com outro, mas não misturado. E como o significado da função é deslocar bits ao redor, eu só ofuscava o código se eu fizesse deslocamentos de bits com multiplicações.

Também enquanto a adição e multiplicação pode ser feita com inteiros, a função MathPow() internamente usa logaritmos, cheira a aproximação e é incrivelmente complexa em comparação com o que eu preciso, ela usa e retorna um valor duplo e isto não tem nada a ver com uma função inteira que deveria apenas deslocar n bits.

Talvez eu devesse ter feito a pergunta por que não vi isto. Por que eu usei MathPow() em primeiro lugar? Eu não sei. A última vez que fiz algum assembler foi há 15 anos, hoje estou acostumado a pensar em problemas em abstrações mais altas. Talvez esta tenha sido a razão. Em algum lugar no meu cérebro há uma forte conexão com o nth bit sendo 2^n, eu apenas escrevi isto sem pensar um segundo sobre isso. Um programador de assembler nunca teria feito isto. Deslocar-se à esquerda é multiplicar por 2, multiplicar por 2 é deslocar-se à esquerda.

 
Ei pessoal, apenas curiosos por que vocês precisariam de mais de um especialista rodando o mesmo tf, e símbolo com as mesmas configurações?

Minha solução para a persistência é usar os 32 bits da int para segurar os tf's que eu uso(10 deles), a versão especializada ou o método comercial que abriu o pedido(tenho 4 deles). Ainda há muitos bits a serem utilizados se eu precisar. Utilizo as operações bitwise e algumas funções de conversão para lidar com isso. Sei que outros fazem isso ou algo semelhante, mas como isso não parece ser suficiente para suas situações, ainda estou tentando enrolar minha cabeça em torno da pergunta que fiz.
 
7bit:

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?

Não o faria, mas a administração do dinheiro que estou usando baseia-se no MN. Portanto, neste caso, preciso que todos sejam iguais para que a MM leve em conta todas as transações em aberto. Eu sempre coloco a EA incluindo Versão e as configurações prioritárias que estou usando no campo Trade Comment para que eu saiba qual versão e TimeFrame a EA que estou desenvolvendo está usando e logando no MQL4 Strategy Tester e possa classificá-las com o trade#, par de moedas ou campo de comentários. Quando eu vejo a revista, ela me diz para qual moeda o comércio é. Quando os transfiro para o Excel para análise, posso ordená-los por qualquer campo que eu queira.
Posso ver as vantagens de sua abordagem e posso utilizá-la em algum momento no futuro. Mas sendo um NuB, estou utilizando MM da base de código na MQL4.Com. Portanto, neste ponto da minha curva de aprendizagem de programação, MM não é minha prioridade. Embora se eu conseguir encontrar um método melhor que eu possa unir até que o MM chegue ao topo de minha lista de prioridades, não me oponho a usá-lo. Nós, NuBs, precisamos de toda a ajuda que pudermos obter!
Em relação ao nome e/ou número da versão, o MN só permite números e não letras.
Eu não passei pelo seu código, mas estou assumindo que seu algoritmo está convertendo o nome para parte do seu MN e, nesse caso, ele não lhe dirá imediatamente de qual par de moedas você está se endereçando.
 
FourX:
seu algoritmo está convertendo o nome para parte de seu MN e, nesse caso, ele não lhe dirá imediatamente de que par de moedas você está se endereçando.

Ele converterá de forma confiável qualquer string em um número inteiro único. Esta conversão é uma rua de mão única, mas eu nunca mais preciso convertê-la de volta.

Tudo o que eu preciso saber é que estes ofícios com o mesmo número pertencem juntos. É apenas um número de identificação para encontrar facilmente todas as negociações desta combinação específica EA/símbolo/TF com apenas um único if() no laço. A única coisa que precisa ser conhecida sobre este número é que ele é único para cada combinação EA/símbolo/tempo e que é determinístico e não mudará se meu PC decidir travar.

Todos os comércios logicamente pertencentes juntos terão o mesmo MN. Se eu precisar dizer em algum momento posterior em qual símbolo eles foram feitos (por exemplo, para fazer algumas estatísticas no final do mês) eu posso simplesmente usar o OrderSymbol() nestas ordens.

 
circlesquares wrote >>
Ei pessoal, apenas curiosos por que vocês precisariam de mais de um especialista rodando o mesmo tf, e símbolo com as mesmas configurações?

Minha solução para a persistência é usar os 32 bits da int para segurar os tf's que eu uso(10 deles), a versão expert ou o método comercial que abriu o pedido(tenho 4 deles). Ainda há muitos bits a serem utilizados se eu precisar. Utilizo as operações bitwise e algumas funções de conversão para lidar com isso. Sei que outros fazem isso ou algo semelhante, mas como isso não parece ser suficiente para suas situações, ainda estou tentando enrolar minha cabeça em torno da pergunta que fiz.


Não posso falar por mais ninguém, mas tenho uma EA que pode levar algum tempo para fechar uma ordem, e ela perde novos pontos de entrada porque ainda não está fechada em relação à ordem anterior. Eu gostaria que ele tratasse cada entrada independentemente e seguisse cada comércio de acordo com as regras de cada comércio (movendo sl, fechando metade quando o tp chegou pela primeira vez, etc.).
 
joetrader:


Não posso falar por mais ninguém, mas tenho uma EA que pode levar algum tempo para fechar uma ordem, e ela perde novos pontos de entrada porque ainda não está fechada em relação à ordem anterior. Eu gostaria que ele tratasse cada entrada independentemente e seguisse cada comércio de acordo com as regras de cada comércio (mover sl, fechar pela metade quando o tp chegou pela primeira vez, etc.).

Estou vendo. Então está amarrado à espera da resposta do servidor, e enquanto isso você poderia estar abrindo outras ordens?

Mas, será que o contexto comercial ocupado não impede nenhuma ação relacionada a pedidos?

Acho que enquanto funcionar, isso é tudo o que realmente importa.

 

Não tanto a resposta do servidor, mas apenas ter um pedido aberto. Assim, a EA pode receber um sinal de compra e comprar, e depois ficar aberta. Algumas horas depois vem outro sinal de compra, mas como a EA já tem uma posição aberta, ela não compra porque está esperando para fechar o primeiro pedido. Mas não há razão para supor que o primeiro sinal de compra será mais lucrativo do que o segundo ou que há algo a se ganhar ao esperar que o primeiro feche antes de permitir que a EA abra pedidos adicionais. Mas eu ainda estou trabalhando nisso, então para mim ainda é teoria :)