[ ... funzione hash ... ]
Per la cronaca, fbj una volta ha fatto qualcosa di simile usando la nota funzione hash djb2: https://www.mql5.com/en/forum/120034/page2
il djb2 menzionato nel tuo link sopra potrebbe essere scritto senza tutte le centinaia di linee intorno semplicemente come:
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); }
il djb2 menzionato nel tuo link sopra potrebbe essere scritto senza tutte le centinaia di linee intorno ad esso semplicemente come: [...]
Non sono un esperto di algoritmi di hash, tanto meno di djb2 in particolare, ma mi sembra di ricordare che l'inizializzazione del valore di hash (la variabile h nella vostra versione) a 5381 è considerata significativa, anche se nessuno è esattamente sicuro del perché.
* magic = makeMagicNumber(name+ Symbol() + Period());Non voglio fare il pignolo, ma dovresti essere in grado di usare anche questo:
* magic = makeMagicNumber(WindowExpertName() + Symbol() + Period());Grazie per aver postato il codice (e l'articolo sull'hashish!).
Domanda - Sto lavorando ad un metodo per aprire e chiudere più ordini sullo stesso grafico, stesso algoritmo, ecc.
Mi sto avvicinando in 2 passi -
1) generando una base MN (che è quello che il codice sopra sembra fare) come un intero. La base sarebbe sempre la stessa per ogni grafico/simbolo/timeframe
2) generando un suffisso specifico espresso come un punto decimale per ogni specifico ordine, una volta che un suffisso diventa inutilizzato, rendendolo nuovamente disponibile
Quindi il MN sarebbe XXXXXX.YYY dove X è la base e Y è il suffisso specifico. I suffissi inizierebbero a .001 e aumenterebbero di .001 per ogni nuovo invio. Ad ogni invio, verrebbe assegnato il suffisso più basso attualmente non utilizzato. In questo modo, posso recuperare l'MN più tardi rigenerando l'MN di base e scorrendo i suffissi
Sembra un po' troppo complicato. C'è un modo migliore per farlo?
Sto postando quello che ho quando è finito.
Io uso solo i primi 5 numeri per la versione dell'EA # e gli ultimi 4 per il numero di minuti in cui viene scambiato.
Come NuB non sono sicuro del perché tu voglia o abbia bisogno di un MagicNumber "criptato"?
Io uso solo i primi 5 numeri per la versione dell'EA # e gli ultimi 4 per il numero di minuti in cui viene scambiato.
Come potrebbe nel tuo esempio il Symbol() diventare parte del MN? Hai un numero di EA e un numero di Timeframe, ma il simbolo?
Identifico i miei ordini solo per MN, i miei cicli sulla lista degli ordini confrontano solo OrderMagicNumber(), il tuo dovrebbe controllare anche il nome del simbolo. Ho alcuni altri script indipendenti che fanno cose con la lista degli ordini, per esempio tracciare i plot azionari degli EA o copiare i trade su un'altra piattaforma, tutti hanno bisogno solo del numero magico per identificare i trade di uno specifico EA su una specifica coppia e uno specifico timeframe.
Io non uso affatto numeri di serie per i miei diversi EA, uso nomi brevi di 4 o 5 lettere per tutti i miei EA. Un EA chiamato snowball.mq4 per esempio avrà il nome "snow". Questo è cablato nel codice e non viene mai cambiato. Uso questo nome breve anche per i commenti agli ordini.
Quindi ho 3 cose: nome breve, Symbol e timeframe. Il modo più conveniente per convertire questo in un MN è un hash. Potrei dare dei numeri ai miei EA al posto dei nomi, ma non ci sarebbe comunque un modo semplice per convertire il nome del simbolo in un numero. Un Hash risolve semplicemente tutti questi problemi in una volta sola.
Come NuB non sono sicuro del perché tu voglia o abbia bisogno di un MagicNumber 'criptato'?
Io uso solo i primi 5 numeri per la versione dell'EA # e gli ultimi 4 per il numero di minuti in cui viene scambiato.
Dovreste anche vedere questo -> https://www.mql5.com/en/forum/120034
Il problema che ho con questo approccio è che a volte ho esperti/simbolo/timeframe identici che girano sullo stesso conto. Quindi alla fine dovrei comunque cambiare qualcosa manualmente, ed è per questo che preferisco impostare manualmente la magia stessa.
Il problema che ho con questo approccio è che a volte ho un esperto/simbolo/timeframe identico che gira nello stesso conto. Quindi alla fine dovrei ancora cambiare qualcosa manualmente, ed è per questo che preferisco impostare manualmente la magia stessa.
E se usassimo i secondi? TimeCurrent() restituisce un numero che sarà sempre unico - beh, almeno al di fuori di quell'arco di secondi.
- Assegnate un numero ID di GlobalVariable al vostro esperto. Restituitelo con WindowExpertName().
- Concatenare quell'ID con un contatore di incremento (se si attacca lo stesso esperto) e TimeCurrent ()
- Se il numero restituito da TimeCurrent() supera la dimensione consentita. Allora scarta la quantità di anni e mesi fino ad avere il modulo di giorni, ore, minuti e secondi.
Che ne dite di usare i secondi? TimeCurrent() restituisce un numero che sarà sempre unico - beh, almeno al di fuori di quell'arco di secondi.
- Assegnate un numero ID al vostro esperto. Restituirlo con WindowExpertName().
- Concatenare quell'ID con un contatore di incremento e TimeCurrent ()
- Se il numero restituito da TimeCurrent() supera la dimensione consentita. Allora scarta la quantità di anni e mesi fino ad avere il modulo di giorni, ore, minuti e secondi.
Perché allora devi mantenere un livello di persistenza per questa magia. Cosa succede se il tuo terminale si riavvia? La magia sarebbe diversa...
Perché allora devi mantenere un livello di persistenza per questa magia. Cosa succede se il tuo terminale si riavvia? La magia sarebbe diversa...
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso