creare un numero magico - pagina 3

 
//|                                                      This_EA.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

#define This_EA  101
#define That_EA  102
#define Other_EA 103 // put this list of ea names to each of your ea's header, or...
                     // .. alternatively you can use a number suffix to your ea's file name 
                     // so it can be identified with --> StringSubstr(WindowExpertName(),x,y);
double This_EA_qty;
string magic_prefix;

int init()
  {

   if(GlobalVariableGet(This_EA_qty) >= 0.0){
            GlobalVariableSet("This_EA_qty", This_EA_qty + 1);
   }
   magic_prefix = StringConcatenate(This_EA, DoubleToStr(This_EA_qty,0));

   return(0);
  }

int deinit()
  {

      GlobalVariableSet("This_EA_qty", This_EA_qty - 1);
   
   return(0);
  }

int start()
  {
      double lots, SL, TP; int slip, time_stamp ;
      bool BuyCondition;
   
      if( BuyCondition == true )
      {
         time_stamp  = TimeCurrent(); 
         string magic_name = StringConcatenate(magic_prefix, time_stamp );
         int magic = StrToInteger(magic_name);
         
                                      // Integers range from -2147483648 to 2147483647
                                      // the resulting magic integer would most probably exceed that 
                                      // so we cut the number returned with TimeCurrent() short with 
                                      // MathMod(time_stamp,x) x being years, months not necessary for 
                                      // magic unique-ness. I don't include this calculation, 
                                      // since I'm short in time for testing it...
      
      
         OrderSend(Symbol(),0, lots, Ask, slip, SL, TP, NULL, magic, 0, CLR_NONE);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
richiede un po' più tempo di quanto pensassi ...
edit : condizione GVget != -1.0 a >= 0.0; edit
 
cameofx:
[...] ci vuole un po' più tempo di quello che pensavo...

Questo sta diventando sempre più un rimaneggiamento (scusate il gioco di parole) del precedente argomento che ho già menzionato: https://www.mql5.com/en/forum/120034. Tutto ciò che coinvolge le variabili globali solleva questioni relative al backup e al disaster-recovery. Se il trading deve essere spostato in fretta su un nuovo server, allora o ci deve essere un backup recente di gvariables.dat disponibile, o l'utente deve essere in grado di ricreare le variabili globali manualmente.

Non ho studiato il tuo codice da vicino, ma non sono nemmeno sicuro di cosa succede se ci sono più copie dell'EA e MT4 viene riavviato. Sembra che il codice possa assumere che gli EA saranno automaticamente ricaricati nello stesso ordine in cui sono stati originariamente caricati manualmente. In altre parole, più copie dell'EA possono avere diversi valori di This_EA_qty attraverso i riavvii, e non posso quindi vedere come identificano correttamente i loro ordini storici nella lista di MT4. Ma potrei sbagliarmi su questo.

 
cameofx:
ci vuole un po' più di tempo di quello che pensavo ...
modifica: condizione GVget != -1,0 a >= 0,0
// TimeCurrent() in seconds since 1970 would most probably exceed that 

TimeCurrent() restituisce un intero a 32 bit. Il tipo datatime è un alias per il tipo int, int è anche un intero a 32 bit.


L'altra cosa che non capisco nel tuo codice è perché stai usando un MN diverso per ogni trade aperto? Questo è l'opposto di quello per cui sono stati pensati gli MN. L'idea di un MN è che tu possa identificare tutti i trade di un certo EA semplicemente guardando l'MN. Qual è la ragione della parte casuale della MN? Come sarebbe il codice del tuo EA che chiuderebbe tutti i trade aperti di questo EA o seguirebbe tutti gli stop di questo EA?
 
Se ho capito bene - la tua soluzione per 2 esperti diversi che hanno accidentalmente lo stesso ID è di mettere tutti gli ID degli esperti nell'intestazione di ogni esperto. È un po' una rottura di palle... Anche se metti quella parte in un file include, avresti comunque bisogno di ricompilare tutti gli esperti per ogni nuovo esperto che fai.

La questione della persistenza è ancora lì. Non so come questo funzionerebbe correttamente dopo un riavvio del terminale o dopo il passaggio a un terminale completamente diverso...
 
jjc:

Questo sta diventando sempre più un re-hash (scusate il gioco di parole) dell'argomento precedente che ho già menzionato: https://www.mql5.com/en/forum/120034. Tutto ciò che coinvolge le variabili globali solleva questioni relative al backup e al disaster-recovery. Se il trading deve essere spostato in fretta su un nuovo server, allora o ci deve essere un backup recente di gvariables.dat disponibile, o l'utente deve essere in grado di ricreare le variabili globali manualmente.

Non ho studiato il tuo codice da vicino, ma non sono nemmeno sicuro di cosa succede se ci sono più copie dell'EA e MT4 viene riavviato. Sembra che il codice possa assumere che gli EA saranno automaticamente ricaricati nello stesso ordine in cui sono stati originariamente caricati manualmente. In altre parole, più copie dell'EA possono avere diversi valori di This_EA_qty attraverso i riavvii, e non posso quindi vedere come identificano correttamente i loro ordini storici nella lista di MT4. Ma potrei sbagliarmi su questo.

Questi sono i tipi di feedback che mi aspetto... grazie a gordon, 7bit & jjc.

le tue risposte hanno bisogno di qualche riflessione... ma per rispondere velocemente :

- se This_EA expert è già attaccato una volta su un altro grafico, magic_number avrebbe allora il valore di : 101-1-time_stamp (trattino per chiarezza)

- le informazioni contenute sarebbero 101 - id dell'esperto; 1 - quantità di This_EA operante al momento; time_stamp - ora di OrderSend

- possiamo allora scannerizzarlo con StringSubStr e sapere che un ordine particolare è stato aperto da This_EA mentre c'era 1 altro This_EA attaccato.

 
7bit:

TimeCurrent() restituisce un numero intero a 32 bit. Il tipo datatime è un alias del tipo int, anche int è un intero a 32 bit.


L'altra cosa che non capisco nel tuo codice è perché stai usando un MN diverso per ogni trade aperto? Questo è l'opposto di quello per cui sono stati pensati gli MN. L'idea di un MN è che tu possa identificare tutti i trade di un certo EA semplicemente guardando l'MN. Qual è la ragione della parte casuale della MN? Come sarebbe il codice del tuo EA che chiuderebbe tutti i trade aperti di questo EA o seguirebbe tutti gli stop di questo EA?

Scusa, quello che volevo dire è che l'int magic_name risultante supererebbe quell'allocazione. Sposterò il commento nel codice di conseguenza.

Per equiparare la nostra percezione. Proporrei questi requisiti per questo magic_number "automatico". Il MN avrebbe il seguente:

- È possibile identificare con quale EA - questo particolare ordine con detto MN - era aperto.

- Un EA contenente questa tecnica - se collegato a numerosi (più di 1) non genererebbe lo stesso numero magico se quell'EAs apre ordini simultaneamente al di fuori di un intervallo di 1 secondo

- quindi non entrerebbe in conflitto nella gestione degli ordini, ma allo stesso tempo l'origine del MN può ancora essere tracciata

- si prega di aggiungere se la mia lista non è completa...

 
cameofx:
- le informazioni contenute sarebbero 101 - id dell'esperto; 1 - quantità This_EA operante al momento; time_stamp - ora di OrderSend

- possiamo quindi scansionarlo con StringSubStr e sapere che un ordine particolare è stato aperto da This_EA mentre c'era 1 altro This_EA attaccato.

Ma a cosa serve la parte di tempo nel MN? Perché non usare solo i numeri EA e non usare substr? L'uso di substr avrebbe bisogno di convertire l'int in una stringa, poi alcune operazioni con le stringhe e un confronto tra stringhe, la parte di tempo del MN viene buttata via perché non è mai necessaria. Le operazioni di stringa con gli interi tendono generalmente a sembrare amatoriali perché nella maggior parte dei casi potrebbero essere risolte meglio codificando le informazioni in diversi bit della parola a 32 bit e usare operazioni bitwise per manipolarle o controllarle, il che sarebbe ordini di grandezza più veloce e più elegante.

Perché non usare semplicemente un valore int (EA-instance-unique) per il mn e usare un semplice confronto tra interi per confrontare l'intero numero o alcuni bit di esso?

Per esempio, lasciamo che i primi 28 bit siano l'ID e gli ultimi quattro bit un numero da 0..15 per identificare diversi tipi di operazioni (per esempio se può aprire 3 diversi tipi di ordini: iniziale, livello1, livello2 e hedge)

ID = hash & 0xFFFFFFF0  // this has the 4 low bits always zero


// generate the mn for level 1 trades
MN = (ID + 1);
OrderSend(..., MN, "level 1");


// generate the mn for hedge trades
MN = (ID + 15);
OrderSend(..., MN, "hedge the whole mess");


// this strategy may not make any sense, only to illustrate the code:
// close the hedge trades and trail the stops of all levels
for(...){
   if (OrderMagicNumber() & 0xFFFFFFF0 == ID){  // this trade belongs to us
      if (OrderMagicNumber() & 0x0000000F == 15){ // this is a hedge trade
         OrderClose(...)
      }else{ // this is one of the other levels
         Trail(OrderTicket());
      }
   }
}

// or even easier:
MN = (ID + 15); // all our hedge trades have this MN
for(...){
   if (OrderMagicNumber() == MN){
      OrderClose(...)
   }
}
 
gordon:
Se ho capito bene - la tua soluzione per 2 esperti diversi che accidentalmente hanno lo stesso ID è di mettere tutti gli ID degli esperti nell'intestazione di ogni esperto. Questo è un po' una rottura di palle... Anche se metti quella parte in un file include, avresti comunque bisogno di ricompilare tutti gli esperti per ogni nuovo esperto che fai.

La questione della persistenza è ancora lì. Non so come questo funzionerebbe correttamente dopo un riavvio del terminale o dopo il passaggio a un terminale completamente diverso...

No, non l'hai fatto :) per favore leggi i commenti nel codice riguardo WindowExpertName().

Se chiamato da expert recupererebbe il nome del file expert/script/indicator senza il ".mq4" o ".ex4" non devi mettere nessun include solo nominare i tuoi EA di conseguenza.

PS: scusa per la risposta spammosa :)

 
7bit:

Ma a cosa serve la parte di tempo nel MN? Perché non usare solo i numeri EA e non usare substr? L'uso di substr richiederebbe che l'int sia convertito in una stringa, poi alcune operazioni con le stringhe e un confronto tra stringhe, la parte di tempo del MN viene buttata via perché non è mai necessaria. Le operazioni di stringa con gli interi tendono generalmente a sembrare amatoriali perché nella maggior parte dei casi potrebbero essere risolte meglio codificando le informazioni in diversi bit della parola a 32 bit e utilizzare le operazioni bitwise per manipolarle o controllarle, il che sarebbe ordini di grandezza più veloce ed elegante.

Perché non usare semplicemente un valore int (EA-instance-unique) per il mn e usare un semplice confronto tra interi per confrontare l'intero numero o certi bit di esso?

Per esempio, lasciamo che i primi 28 bit siano l'ID e gli ultimi quattro bit un numero da 0..15 per identificare diversi tipi di trade (per esempio se può aprire 3 diversi tipi di ordini: iniziale, livello1, livello2 e hedge)


hmm... Uso la parte temporale perché ho pensato che MN per ogni ordine aperto da un EA deve essere unico rispetto ad altri ordini che si aprono nello stesso momento con lo stesso EA su grafici diversi.

la premessa sarebbe: se un EA ha aperto due (più) ordini simultaneamente con lo stesso numero magico, essi non possono avere lo stesso MN, altrimenti entrerebbero in conflitto nella gestione degli ordini e o

identificazione dell'ordine... forse ho confuso erroneamente questo con l'acquisizione dell'OrderTicket (o no?).

- incorporare la strategia al MN sarebbe il prossimo passo naturalmente

- Vedo che la tua abilità mi supera di anni luce: )). Non ho ancora la capacità di ottimizzare le operazioni, ecco perché ho postato questo. Ora so che il controllo con operazioni bitwise sarebbe più veloce.

Grazie. Potrei aver bisogno di chiederti spiegazioni su come fare più tardi :)))

 
cameofx:

hmm... Uso la parte temporale perché ho pensato che MN per ogni ordine aperto da un EA deve essere unico rispetto agli altri ordini

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 è possibile ad esempio fare un loop su tutti gli ordini e chiudere/cancellare tutti i trade e gli ordini manuali lasciando tutti i trade EA intatti.

Tutti i miei EA creano il proprio numero, unico per (nome EA + simbolo + timeframe), ecco perché ho speso tanti sforzi per trovare una buona e facile funzione hash per creare questo numero. L'hash è anche così buono che posso facilmente tagliare gli ultimi bit di questo hash per fare spazio ai sotto-numeri (se ne ho bisogno, ma raramente ne ho bisogno) e sarebbe ancora abbastanza sicuro contro le collisioni.

Ma la maggior parte dei miei EA usano direttamente l'hash e non hanno una sotto-numerazione perché hanno solo un tipo di trade e trattano tutti i loro trade in modo identico.

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