creare un numero magico - pagina 4

 
7bit:

No, possono essere qualsiasi cosa tu voglia. proprio come il commento. vedili come una sorta di commento numerico. Tutti i trade manuali aperti con la normale interfaccia utente di MT4 avranno il numero magico 0, quindi puoi per esempio fare un loop su tutti gli ordini e chiudere/cancellare tutti i trade e gli ordini manuali lasciando tutti i trade EA intatti.

Per identificare in modo univoco solo un certo ordine c'è il numero di ticket.

Grazie per aver chiarito e condiviso il tuo punto di vista. Fwiw, ho imparato molto...

 
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);
}

Non ho bisogno di MathPow(), perché nessuno ha visto questo?
/**
* 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);
}
Sto aggiornando il primo post ora.
 
7bit:
Non ho bisogno di MathPow(), perché nessuno ha visto questo?

Mi vengono in mente tre ragioni principali:

  • Chiunque stia già usando una funzione di hashing è improbabile che la sostituisca con il vostro codice, e quindi non si preoccuperà dei dettagli del vostro codice.
  • Chiunque non stia attualmente usando una funzione di hashing, ma che pensa che potrebbe essere una buona idea, probabilmente prenderà il codice come il vostro sulla fiducia, e si preoccuperà solo del fatto che funzioni o meno, e non di quanto sia elegante o ottimizzato.
  • La vostra sostituzione di MathPow() con un'operazione bitwise farà risparmiare sostanzialmente meno di un millisecondo per ogni chiamata a makeMagicNumber(). Stai suggerendo che makeMagicNumber() è chiamato una volta durante la vita di un EA, init(). Pertanto, il tuo cambiamento sta risparmiando meno di un millisecondo per ogni vita dell'EA. È un cambiamento assolutamente banale (e probabilmente riduce la chiarezza del codice).
 
jjc: probabilmente riduce la chiarezza del codice

Non direi che riduce la chiarezza. La mia intenzione principale è la chiarezza, l'eleganza e la precisione, non le prestazioni.

Potrei anche usare potenza, moltiplicazione, divisione (e modulo) per fare l'effettivo spostamento di bit senza usare alcun operatore bitwise. Ma per il bene dell'eleganza (e anche della chiarezza) dovrei farlo o esclusivamente con uno o con l'altro, ma non misto. E poiché il significato della funzione è quello di spostare bit in giro, offuscherei il codice solo se facessi spostamenti di bit con moltiplicazioni.

Inoltre, mentre l'addizione e la moltiplicazione possono essere fatte con interi, la funzione MathPow() internamente usa logaritmi, puzza di approssimazione ed è incredibilmente complessa rispetto a ciò per cui mi serve, usa e restituisce un valore doppio e questo non ha niente a che fare con una funzione intera che dovrebbe spostare solo n bit.

Forse avrei dovuto fare la domanda perché non ho visto questo. Perché ho usato MathPow() in primo luogo? Non lo so. L'ultima volta che ho fatto un po' di assembler è stato 15 anni fa, oggi sono abituato a pensare ai problemi in astrazioni più alte. Forse questa è stata la ragione. Da qualche parte nel mio cervello c'è una forte connessione con l'ennesimo bit che è 2^n, l'ho semplicemente scritto senza pensarci un secondo. Un programmatore assembler non l'avrebbe mai fatto. Spostare a sinistra è moltiplicare per 2, moltiplicare per 2 è spostare a sinistra.

 
Ehi ragazzi, sono solo curioso di sapere perché avreste bisogno di più di un esperto che esegue lo stesso tf, e simbolo con le stesse impostazioni?

La mia soluzione per la persistenza è di usare i 32 bit dell'int per contenere i tf che uso (10), la versione dell'esperto o il metodo di trading che ha aperto l'ordine (ne ho 4). Ho ancora molti bit a disposizione se ne ho bisogno. Uso le operazioni bitwise e alcune funzioni di conversione per gestire questo. So che altri fanno questo o qualcosa di simile, ma dato che questo non sembra essere sufficiente per le vostre situazioni, sto ancora cercando di capire la domanda che ho fatto.
 
7bit:

Come potrebbe nel tuo esempio il Symbol() diventare parte del MN? Hai un numero di EA e un numero di Timeframe, ma il simbolo?

Non lo farebbe, ma il money management che sto usando si basa sul MN. Quindi in questo caso ho bisogno che siano tutti uguali in modo che il MM prenda in considerazione tutti i trade aperti. Metto sempre l'EA, inclusa la versione e le impostazioni di priorità che sto usando, nel campo Trade Comment, in modo da sapere quale versione e TimeFrame sta usando l'EA che sto sviluppando e registrando nel MQL4 Strategy Tester e posso ordinarli con il trade#, la coppia di valute o il campo dei commenti. Quando visualizzo il diario mi dice per quale valuta è il trade. Quando li trasferisco in Excel per l'analisi posso ordinarli per qualsiasi campo io voglia.
Posso vedere i vantaggi del tuo approccio e potrei utilizzarlo in futuro. Ma essendo un NuB sto utilizzando MM dal codice base di MQL4.Com. Quindi a questo punto della mia curva di apprendimento della programmazione, MM non è la mia priorità. Anche se se riesco a trovare un metodo migliore che posso inserire, lo farò fino a quando MM non sarà in cima alla mia lista di priorità, non sono contrario ad usarlo. Noi NuB abbiamo bisogno di tutto l'aiuto possibile!
Per quanto riguarda il nome e/o il numero di versione, il MN permette solo numeri e non lettere.
Non ho esaminato il tuo codice, ma presumo che il tuo algoritmo stia convertendo il nome in parte del tuo MN, nel qual caso non ti direbbe immediatamente a quale coppia di valute ti stai rivolgendo.
 
FourX:
il tuo algoritmo sta convertendo il nome in parte del tuo MN nel qual caso non ti direbbe immediatamente a quale coppia di valute ti stai rivolgendo.

Convertirà in modo affidabile qualsiasi stringa in un numero intero unico. Questa conversione è a senso unico, ma non ho mai e poi mai bisogno di riconvertirla.

Tutto quello che devo sapere è che queste compravendite con lo stesso numero appartengono insieme. È solo un numero identificativo per trovare facilmente tutte le compravendite di questa specifica combinazione EA/simbolo/TF con un solo if() nel ciclo. L'unica cosa che si deve sapere su questo numero è che è unico per ogni combinazione EA/simbolo/timeframe e che è deterministico e non cambierà se il mio PC decide di andare in crash.

Tutti i trade logicamente appartenenti insieme avranno lo stesso MN. Se mai, in un secondo momento, ho bisogno di sapere su quale simbolo sono stati fatti (per esempio per fare delle statistiche a fine mese) posso semplicemente usare OrderSymbol() su questi ordini.

 
circlesquares wrote >>
Ehi ragazzi, sono solo curioso di sapere perché avreste bisogno di più di un esperto che esegue lo stesso tf, e simbolo con le stesse impostazioni?

La mia soluzione per la persistenza è di usare i 32 bit dell'int per tenere i tf che uso (10 di loro), la versione dell'esperto o il metodo commerciale che ha aperto l'ordine (ne ho 4). Ho ancora molti bit a disposizione se ne ho bisogno. Uso le operazioni bitwise e alcune funzioni di conversione per gestire questo. So che altri fanno questo o qualcosa di simile, ma dato che questo non sembra essere sufficiente per le vostre situazioni, sto ancora cercando di capire la domanda che ho fatto.


Non posso parlare per nessun altro, ma ho un EA che può impiegare un po' di tempo per chiudere un ordine, e perde nuovi punti di ingresso perché non è ancora chiuso dall'ordine precedente. Vorrei che gestisse ogni entrata in modo indipendente e che seguisse ogni trade secondo le regole di ogni trade (sl in movimento, chiudere la metà quando il tp viene raggiunto per primo, ecc).
 
joetrader:


Non posso parlare per nessun altro, ma ho un EA che può impiegare un po' di tempo per chiudere un ordine, e perde nuovi punti di ingresso perché non è ancora chiuso dall'ordine precedente. Vorrei che gestisse ogni entrata in modo indipendente e che seguisse ogni trade secondo le regole di ogni trade (sl in movimento, chiudere la metà quando il tp viene raggiunto per primo, ecc).

Capisco. Quindi è bloccato in attesa della risposta del server, e nel frattempo potresti aprire altri ordini?

Ma il fatto che il contesto di scambio sia occupato non blocca qualsiasi azione relativa all'ordine?

Immagino che finché funziona, è tutto ciò che conta davvero.

 

Non tanto la risposta del server, ma semplicemente avere un ordine aperto. Quindi l'EA potrebbe ricevere un segnale di acquisto e comprare, e poi rimanere aperto. Qualche ora dopo arriva un altro segnale di acquisto, ma dato che ha già una posizione aperta, non compra perché sta aspettando di chiudere il primo ordine. Ma non c'è motivo di supporre che il primo segnale di acquisto sia più redditizio del secondo o che ci sia qualcosa da guadagnare aspettando che il primo si chiuda prima di permettere all'EA di aprire altri ordini. Ma ci sto ancora lavorando, quindi per me è ancora teoria :)