Announcement

Collapse
No announcement yet.

Confronto tra stringhe

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Confronto tra stringhe

    Buonasera

    La routine che ho scritto e che non funziona serve a confrontare il valore stringa "pair" con il vettore string "DefaultPairs[m ]" per poi memorizzarne il risultato in un file excel .
    Il confronto mi serve a trasformare i valori concatenati della prima valuta in classifica e l'ultima nel vero nome di coppia.
    Come si può vedere dal 'esempio allegato la mia routine mi passa come stringa il valore sbagliato "NZDGBP" ,io vorrei memorizzare il vero valore che corrisponde a "GBPNZD".

    Ringrazio chi mi può aiutare
    Attached Files

    #2
    ciao PISoft

    per inserire le immagini in un post (non va considerato come fosse un file da allegare) puoi leggere qui come si fa:
    https://www.forexdream.net/forum/comu...ni-agli-utenti

    Per quanto riguarda il tuo codice
    non è chiaro cosa fa la funzione TrovaPairs :37.movember_80_anim


    Il codice sorgente puoi anche inserirlo direttamente nel post cliccando la icona a forma di A e poi usando l'icona del codice #
    come in figura codice.gif



    Nel codice vedo vari comportamenti strani:

    Code:
    for(int m=0; m<28; m++)  {
    if(defaultPairs[m]==pair)   newpair=DefaultPairs[m];   continue;
    }
    a cosa serve il continue ?

    quello che hai scritto equivale a

    Code:
    for(int m=0; m<28; m++)  {
    if(defaultPairs[m]==pair) {  newpair=DefaultPairs[m]; }
    continue;
    }
    ed il continue non fa altro che andare alla successiva iterazione del ciclo for, cosa che avrebbe fatto comunque essendo arrivati alla fine del contenuto del ciclo for.

    ..............

    Inoltre,
    nella dichiarazione della stringa
    string newpair = pair;
    stai assegnando a newpair il valore di pair

    Ma... il ciclo for fa la stessa cosa: cerca se un elemento dell'array DefaultPairs[] coincide con il contenuto della stringa pair che passi come parametro alla funzione, se lo trova, newpair assume il valore di DefaultPairs[m] che è = pair

    quindi il ciclo for non ha senso
    La vita non è un giro di prova, cogli l’attimo..
    Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

    Comment


      #3
      Grazie per l'immediata risposta

      #
      void TrovaPairs(string pair,color stato)
      {

      string newpair = pair;

      for (int m = 0; m <28; m++) {
      if(DefaultPairs[m]==pair) newpair=DefaultPairs[m]; continue;
      }

      plsoft = newpair; Banner("ObjHead_05", stato ,Col01_x1+35,Col01_y1+50,newpair,15);

      }
      #

      cosa mi consigli di fare quindi ?

      Comment


        #4
        come scrivevo prima, non ho capito cosa cerchi di fare
        Il confronto mi serve a trasformare i valori concatenati della prima valuta in classifica e l'ultima nel vero nome di coppia.
        che significa ?
        La vita non è un giro di prova, cogli l’attimo..
        Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

        Comment


          #5
          Gentilissimo

          Cerco di spiegarmi meglio

          Le 8 monete principali formano 28 coppie, ogni coppia ha un nome univoco

          esempio;
          EURUSD è un nome valido ,
          USDEUR non è un nome valido.

          L'indicatore che uso per memorizzare i file in excell mi passa una classifica delle 8 monete principali, quindi se concateno la prima moneta in classifica USD e l'ultima moneta EUR memorizzo un file excell con il nome non valido USDEUR .
          Se la classifica cambia la stessa coppia può essere memorizzata come EURUSD.

          Io devo sempre memorizzare i dati sempre in un file univoco.

          Comment


            #6
            Ok, questo è quello che vuoi in linea di massima, ma come vuoi farlo? A che ti serve l'array? Contiene le valute? Qual è il senso del ciclo for?

            Ad esempio, hai EUR e cerchi le coppie di valute nell'array che hanno EUR come parte della stringa?
            Nel caso sia così, devi usare le funzioni di Mql4 per la gestione delle stringhe e la ricerca dentro le stringhe
            La vita non è un giro di prova, cogli l’attimo..
            Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

            Comment


              #7
              Partendo da questo esempio, purtroppo ricevo un risultato sbagliato. Dove sbaglio ?

              //+------------------------------------------------------------------+
              //| Script program start function |
              //+------------------------------------------------------------------+
              void OnStart()
              {

              Comment("");

              string DefaultPairs[] = {"AUDCAD","AUDCHF","AUDJPY","AUDNZD","AUDUSD"," CAD CHF","CADJPY",
              "CHFJPY","EURAUD","EURCAD","EURCHF","EURGBP"," EURJ PY","EURNZD",
              "EURUSD","GBPAUD","GBPCAD","GBPCHF","GBPJPY"," GBPN ZD","GBPUSD",
              "NZDCAD","NZDCHF","NZDJPY","NZDUSD","USDCAD"," USDC HF","USDJPY"};

              string s1="USDEUR";
              string s2="AUDCAD";
              string s3="EURUSD";

              int newpair;

              for (int m = 0; m <28; m++) {
              if(DefaultPairs[m]==s1) newpair=m;
              }

              Comment(DefaultPairs[newpair],"*",newpair);

              }
              //+------------------------------------------------------------------+
              Last edited by PlSoft; 09-03-2019, 21:39.

              Comment


                #8
                In allegato il codice di uno script (stringheForex.mq4) che realizza quanto ho compreso di quel che vuoi fare.

                C'è una stringa pair che può essere del formato corretto, ad esempio EURUSD oppure non corretta perché invertita, USDEUR.

                Avviene una ricerca nell'array DefaultPairs[] per cercare una corrispondenza: se si trova, viene stampato l'indice dell'array,

                altrimenti la stringa pair viene invertita e si cerca nell'array la corrispondenza per la nuova stringa.


                stringheforex.gif


                Attached Files
                La vita non è un giro di prova, cogli l’attimo..
                Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

                Comment


                  #9
                  Ti ringrazio

                  Adesso che ho capito la logica ho riscritto e semplificato il codice.

                  Un saluto e un arrivederci alla prossima occasione.

                  void OnStart()
                  {

                  Comment("");

                  string DefaultPairs[] = {"AUDCAD","AUDCHF","AUDJPY","AUDNZD","AUDUSD","CAD CHF","CADJPY",
                  "CHFJPY","EURAUD","EURCAD","EURCHF","EURGBP","EURJ PY","EURNZD",
                  "EURUSD","GBPAUD","GBPCAD","GBPCHF","GBPJPY","GBPN ZD","GBPUSD",
                  "NZDCAD","NZDCHF","NZDJPY","NZDUSD","USDCAD","USDC HF","USDJPY"};

                  string ErrorPairs[] = {"CADAUD","CHFAUD","JPYAUD","NZDAUD","USDAUD","CHF CAD","JPYCAD",
                  "JPYCHF","AUDEUR","CADEUR","CHFEUR","GBPEUR","JPYE UR","NZDEUR",
                  "USDEUR","AUDGBP","CADGBP","CHFGBP","JPYGBP","NZDG BP","USDGBP",
                  "CADNZD","CHFNZD","JPYNZD","USDNZD","CADUSD","CHFU SD","JPYUSD"};

                  string s1="CHFNZD";

                  int newpair;

                  for (int m = 0; m <28; m++) {
                  if(DefaultPairs[m]==s1 || ErrorPairs[m]==s1) newpair=m;
                  }

                  Comment(DefaultPairs[newpair],"*",newpair);

                  }

                  Comment


                    #10
                    Buongiorno

                    Ho finito una routine ( funzionante ) , che mi serve a memorizzare su un foglio EXEL i valori dell'indicatore a video quando la prima o l'ultima delle otto monete principali si allontana troppo dalla media delle restanti sette e supera un certo valore. ( 4.6 )


                    8.38.JPG
                    Queste memorizzazioni mi permetteranno di fare sul foglio exel le analisi del caso .


                    A_v3.0.JPG

                    Sono incappato in questo errore e anche se poi ho risolto in un altro modo, sono curioso di sapere il motivo dell'errore.

                    Mi sembra naturale di scrivere il codice in questo modo " gda = gsa_196[gda_212[n][1]]; " ma ricevo questo errore " integer expression expected ".
                    La routine sotto scritta in questo modo non mi passa errore

                    for (int n = 0; n <28; n++)
                    {
                    gda = gda_212[n][1];
                    gsa_196[gda];
                    correlazione[n] = DoubleToStr(gda_212[n][0],1)+"|"+gsa_196[gda];
                    }

                    GRAZIE

                    Comment


                      #11
                      ciao,

                      molto probabilmente l'array bidimensionale gda_212[n][1] restituisce un double e non un intero.

                      quando assegni
                      gda = gda_212[n][1];
                      gda è un intero e stai attribuendo ad un intero un valore double che verrà arrotondato.
                      anche se gda_212[n][1] fosse 3.0 di fatto non è un intero = 3, ma un double = 3.0
                      gda = gda_212[n][1]; rende il 3.0 un 3

                      e l'array
                      gsa_196[gda];
                      riesce a capire quale indice sia gda

                      Per avere la prova sicura, metti in testa al codice la riga

                      Code:
                      #property strict
                      e compilando il codice che non ti dà errori, dovresti trovare una riga di warning nella compilazione del tipo

                      possible loss of data due to type conversion

                      relativa all'assegnazione
                      gda = gda_212[n][1];
                      La vita non è un giro di prova, cogli l’attimo..
                      Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

                      Comment


                        #12

                        Ho risolto in questo modo e funziona . :08.sweating_80_anim Grazie

                        Altra cosa, come posso inserire un ciclo di memorizzazione senza creare danni, per togliere le 28 istruzioni che si ripetono " correlazione[n]+ripeti+"\n+ "
                        SONO IN IMBARAZZO QUANDO LEGGO IL CODICE CHE HO SCRITTO IN QUESTO MODO


                        8.67.JPG

                        Comment


                          #13
                          Originally posted by PlSoft View Post
                          Ho risolto in questo modo e funziona . :08.sweating_80_anim Grazie
                          è molto più semplice di quello che credi.

                          Te lo ridico diversamente

                          gsa_196[ ] è un array e l'array vuole un indice di tipo intero

                          cioè quello che è contenuto dentro le parentesi quadre [ ] deve essere una variabile int

                          Invece l'array gda_212[ ][ ] lo hai sicuramente definito come double
                          quindi gda_212[ ][ ] è un double

                          e quando scrivi
                          gda = gsa_196[gda_212[n][1]];
                          stai cercando un indice dell'array gsa_196[ ] con una variabile di tipo double e non int come dovrebbe, da qui l'errore
                          " integer expression expected ".

                          cioè l'array gsa_196[ ] si aspetta un integer
                          La vita non è un giro di prova, cogli l’attimo..
                          Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

                          Comment


                            #14
                            Originally posted by PlSoft View Post
                            per togliere le 28 istruzioni che si ripetono " correlazione[n]+ripeti+"\n+ "
                            potresti fare un ciclo FOR usando delle variabili per andare da 0 a 27
                            La vita non è un giro di prova, cogli l’attimo..
                            Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

                            Comment


                              #15
                              Risolto

                              GRAZIE . Un saluto al prossimo intoppo :30.hi_80_anim_gif:

                              8.66.JPG

                              Comment

                              Working...
                              X