Rilevamento di 5 cifre

 
double pointsPerPip(){
   string suffix = StringSubstr(Symbol(), 6);
   int digits = MarketInfo("EURUSD" + suffix, MODE_DIGITS);
   if (digits == 0){
      digits = MarketInfo("EURUSD", MODE_DIGITS);
   }
   if (digits == 0){
      return(1);
   }else{
      if (digits == 5){
         return(10);
      }
   }
   return(1);
}
Attualmente sto cercando di trovare il modo più infallibile per rilevare se abbiamo bisogno di 1 o 10 come moltiplicatore di pip. Quanto sopra era la mia prima idea, semplicemente guardando quante cifre ha l'EURUSD. ci sono broker dove questo simbolo è chiamato EURUSDm o EURUSDiam o altre sciocchezze divertenti aggiunte dai broker senza altra ragione che rompere il nostro codice e inoltre ci sono nomi di simboli che non hanno esattamente 6 caratteri, come GOLD o GOLDm per esempio e quanto sopra NON può gestire questo.

Qualcuno ha un algoritmo ancora più sofisticato per trovare le cifre corrette? Penso che tutto si riduca al problema di trovare prima come esattamente il nome del simbolo di EURUSD e poi il resto è facile. C'è per esempio un modo semplice per enumerare tutti i simboli disponibili in modo che io possa cercare un nome che contiene o inizia con "EURUSD"?
 

Di solito lo controllo solo una volta nella sezione "init":

int mypoint;
int init()
{
if(MarketInfo(Symbol(), MODE_DIGITS)==3||MarketInfo(Symbol(), MODE_DIGITS)==5)
mypoint=10;
else mypoint=1;
}
...
 
Roger:

Di solito lo controllo solo una volta nella sezione init:

Il tuo codice non è infallibile, ci sono simboli con 1 o 2 (oro) o altri numeri di cifre.

Ho trovato un modo migliore (devo ancora testarlo con altri broker). Legge symbols.raw nella cartella history per trovare il nome di eurusd e poi usa MarketInfo();

/**
* determine the pip multiplier (1 or 10) depending on how many
* digits the EURUSD symbol has. This is done by first
* finding the exact name of this symbol in the symbols.raw
* file (it could be EURUSDm or EURUSDiam or any other stupid name
* the broker comes up with only to break other people's code) 
* and then usig MarketInfo() for determining the digits.
*/
double pointsPerPip(){
   int i;
   int digits;
   double ppp = 1;
   string symbol;
   int f = FileOpenHistory("symbols.raw", FILE_BIN | FILE_READ);
   int count = FileSize(f) / 1936;
   for (i=0; i<count; i++){ 
      symbol = FileReadString(f, 12);
      if (StringFind(symbol, "EURUSD") != -1){
         digits = MarketInfo(symbol, MODE_DIGITS);
         if (digits == 4){
            ppp = 1;
         }else{
            ppp = 10;
         }
         break;
      }
      FileSeek(f, 1924, SEEK_CUR);
   }
   FileClose(f);
   return (ppp);
}
 

Era un codice per una sola valuta. Se vuoi usare il tuo EA per più valute devi calcolarlo per ogni caso separatamente.

 
7bit:
Ho trovato un modo migliore (devo ancora testarlo con altri broker). Legge symbols.raw nella cartella history per trovare il nome di eurusd e poi usa MarketInfo();

Questo si romperebbe se dovessero cambiare il file symbols.raw (e potrebbe non funzionare con le vecchie versioni di MT4... anche se probabilmente non è un problema).

 
Io uso un metodo uguale a quello di Roger e non mi ha ancora causato un problema.
Funzionerà per la maggior parte delle eventualità. Se in futuro ne trovate uno che non va bene, allora attraversate quel ponte quando lo trovate.

CB
 
//++++ These are adjusted for 5 digit brokers.
double  pips2points,    // slippage  3 pips    3=points    30=points
        pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int init() {
    if (Digits == 5 || Digits == 3) {   // Adjust for five (5) digit brokers.
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
 
WHRoeder:
if (Digits == 5 || Digits == 3) {   // Adjust for five (5) digit brokers.

Stai solo ripetendo la stessa cosa che ho già trovato insufficiente. Usare la variabile Digits da sola non aiuta il problema (il problema l'ho definito io nel primo post) poiché non tiene conto su quale simbolo si sta correndo e quante cifre dovrebbe avere questo simbolo. Ci può essere qualsiasi quantità di cifre da 0 a 5 su alcune coppie esotiche, non solo 5 o 3 contro 4 o 2. Se fosse così semplice non avrei aperto questo thread. Pertanto ora sto solo usando le cifre di eurusd, non importa su quale coppia corre. Trovare il nome effettivo di eurusd era il problema più grande, e finora il metodo symbols.raw sembra essere il più semplice e affidabile.
 
cloudbreaker:
Se ne trovi uno che non va bene in futuro, allora attraversa quel ponte quando lo trovi.

Sto cercando di scrivere codice infallibile che non si rompa. Scrivere (consapevolmente) codice buggato e aspettare che si rompa prima di correggerlo non si adatta alla mia filosofia di come lo sviluppo del software dovrebbe essere fatto.
 
7bit wrote >>
Sto cercando di scrivere codice infallibile che non si rompa. Scrivere (consapevolmente) codice buggato e aspettare che si rompa prima di correggerlo non si adatta alla mia filosofia di come lo sviluppo del software dovrebbe essere fatto.


Non direi che il codice di cui sopra è 'buggato' - semplicemente ha... limitazioni, di cui gli utenti sono ben consapevoli
Il bello della filosofia è che può funzionare in modo asincrono con la praticità :)
-BB-
 
Non è solo una semplice (forse non così semplice in termini matematici) questione di capire cosa sia un punto rispetto a un dato prezzo e poi decidere in quale cifra si trova rispetto alle cifre del prezzo?
Un modo semplice per ottenere questo potrebbe essere prendere un prezzo, aggiungere un punto e confrontarlo con il vostro moltiplicatore + lo stesso prezzo, se il risultato non è lo stesso, aumentate il vostro moltiplicatore in un ciclo fino a quando non corrispondono.
Motivazione: