Announcement

Collapse
No announcement yet.

Lettura riga da un file

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

    #16
    Innanzitutto grazie per le risposte che apprezzo moltissimo
    Sono concorde sull'uso facilitato che si fa con i csv rispetto al txt, ma vorrei comunque seguire questa strada e riuscirci sia perchè ormai è diventata una questione personale che devo riuscire sia perchè comunque voglio capire il meccanismo corretto.
    Porto un esempio più chiaro, prima ho lasciato dati di esempio per generare qualcosa da scrivere sul file.
    La funzione VerifiaFile viene richiamata subito dopo la funzione Buy o Sell e ha il compito di scrivere su file tutte le informazioni dell'ordine aperto quali ticket, orario apertura, ecccc..... Crea un file per ogni giorno diverso con dentro tutti gli ordini eseguiti.
    Attualmente sto cercando invano di fare così:


    Code:
    //+------------------------------------------------------------------+
    //| CreaFile()                                                       |
    //+------------------------------------------------------------------+  
    void CreaFile(string date, string Record){
      
       string nome=g_NomeFile+" "+date+".txt";
       string nl = "\r\n";
       string h1=nl+
              "+------------------------------------------------------------------------------+"+nl+
              "+                     Informazioni Valori Aperture ordini                      +"+nl+
              "+==========+==================+=====+========+===================+=============+"+nl+
              "+  Ticket  |     Apertura     | Lot | Cross  |    Commento       |     RSI     +"+nl+
              "+==========+==================+=====+========+===================+=============+"+nl;
    
    
    File=FileOpen(nome,FILE_BIN|FILE_SHARE_READ|FILE_WRITE);
       if(File != -1)  {
             buffer=h1=h1+Record;
             FileWriteString(File,h1, StringLen(h1));
          }
        else  
          Print("Errore ",GetLastError()," - File non creato!!!");  
        
    }
    //+------------------------------------------------------------------+
    //| VerificaFile()                                                   |
    //+------------------------------------------------------------------+
    void VerificaFile(int Ticket, string data,string OrarioAP, double Lottx, string cross, string comment,double RSI){
    
    string Riga=StringConcatenate("+ " , Ticket , " | " + OrarioAP + " | " , Lottx , " | " + cross + " | " + comment + " | " , NormalizeDouble(RSI,2) , "       +" , Volume[0] , "\r\n");
    string nome=NomeFile+" "+data+".txt";
    buffer=buffer+Riga;
      
       if (FileIsExist(nome)){ FileWriteString(File,buffer, StringLen(buffer)); FileFlush(File); }
       else { FileClose(File); CreaFile(data,Riga);}
    
    }

    buffer è una stringa dichiarata globalmente. Praticamente così salvo l'intera informazione li dentro e la scrivo para para dentro il file. Non mi sembra una bella soluzione, per niente..... ma anche così quando crea il file mi segna 0k ed è vuoto.


    Perchè voglio leggere una riga? Perchè voglio aggiungere il profitto quando l'ordine viene chiuso. Quindi ricerco tra gli ordini chiusi il ticket che ho trovato leggendo quel file e mi prendo il profitto andandolo a scrivere dopo sul file.

    Comment


      #17
      Mi sembra di vedere diverse incongruenze in questo ultimo post.:40.thinking_80_anim

      Perché nel codice qui sopra dopo nella funzione CreaFile() dopo la FileWriteString() non usi la FileFlush()?
      Perché nella funzione FileOpen() usi FILE_BIN e non FILE_TXT?
      Che senso ha utilizzare un buffer quando comunque devi scrivere sul file ogni volta?
      Skype: cadddami

      Comment


        #18
        Buongiorno, scusate la latitanza

        Code:
        //+------------------------------------------------------------------+
        //| CreaFile()                                                       |
        //+------------------------------------------------------------------+  
        void CreaFile(string date, string Record){
           
           string nome=NomeFile+" "+date+".txt";
           string nl = "\r\n";
           string h1=nl+
                  "+------------------------------------------------------------------------------+"+nl+
                  "+                     Informazioni Valori Aperture ordini                      +"+nl+
                  "+------------------------------------------------------------------------------+"+nl+
                  "+==========+==================+=====+========+===================+=============+"+nl+
                  "+  Ticket  |     Apertura     | Lot | Cross  |    Commento       |     RSI     +"+nl+
                  "+==========+==================+=====+========+===================+=============+"+nl;
        
        
        File=FileOpen(nome,FILE_BIN|FILE_SHARE_READ|FILE_WRITE); 
           if(File != -1)  {
                 h1=h1+Record;
                 buffer=h1;
                 FileWriteString(File,buffer, StringLen(buffer));
              }
            else   
              Print("Errore ",GetLastError()," - File non creato!!!");  
            
            FileClose(File);
        }
        //+------------------------------------------------------------------+
        //| VerificaFile()                                                   |
        //+------------------------------------------------------------------+
        void VerificaFile(int Ticket, string data,string OrarioAP, double Lottx, string cross, string comment,double RSI){
        
        string Riga=StringConcatenate("+ " , Ticket , " | " + OrarioAP + " | " , Lottx , " | " + cross + " | " + comment + " | " , NormalizeDouble(RSI,2) , "       +" , Volume[0] , "\r\n");
        string nome=NomeFile+" "+data+".txt";
        buffer=buffer+Riga;
           
           if (FileIsExist(nome)){ 
                 File=FileOpen(nome,FILE_WRITE); 
                 FileWriteString(File,buffer, StringLen(buffer)); 
                 FileClose(File); }
           else { 
                  
                 CreaFile(data,Riga);}
        
        }

        ciao caddami, non ho usato FileFlush() perchè non funziona, almeno per come lo sto usando io (in modo sbagliato)
        - In questo modo funziona, ma male! Se apre ordini con un lasso di tempo vicino li scrive correttamente, se invece li apre più avanti riscrive il file e quello che c'era scritto viene cancellato. Inoltre l'intestazione non c'e, viene solo scritta la prima volta che apre l'ordine, dal secondo in poi viene riscritta.
        - ho usato bin xkè ho letto dall'help che si può leggere/scrivere e ho inteso che è quello che richiede meno parametri
        - sono d'accordo sul buffer! non ha senso! ma come devo fa!

        sono in un punto morto....

        Comment


          #19
          Se tu ad ogni scrittura alla fine chiudi il file, quando lui riaprirà da capo il file il cursore sarà ovviamente all'inizio.:47.nod_80_anim_gif:
          Quindi in caso di riavvio e conseguente riapertura del file, una volta aperto quest'ultimo devi spostare il cursore in fondo con la funzione FileSeek().
          Altrimenti è logico che ti sovrascrive tutto.

          Te dirai: "ma se io salvo tutto nel buffer, cosa mi importa di riportare il cursore alla fine?".
          Beh, calcolando che il tuo buffer è una variabile globale, se questa si azzera tu poi perdi i dati (e da quel che ho capito è proprio quello che ti accade).
          Se non l'azzeri te, significa che si azzera perché riavvii l'EA.
          Ricorda che l'EA si riavvia se lo compili, se cambi i parametri esterni, se cambi timeframe, se cambi conto, ecc.

          Il problema sul fatto che ti scrive sempre l'intestazione deriva sicuramente dal fatto che usi la variabile buffer.
          Io non ho ovviamente provato il tuo codice, ma sono particolarmente sicuro che la causa della maggior parte dei tuoi problemi sia quel buffer.
          Rimango comunque sempre dell'idea che non conviene assolutamente utilizzare la FileClose().
          Per quello che vuoi fare te è meglio usarla una volta e alla fine, salvando i dati con la FileFlush() nel resto del codice.

          Nella guida è pieno di esempi funzionanti di codice già fatto che tu potresti benissimo copiare-incollare (adattando un pochino il tutto) senza problemi.
          Poi una volta che hai lo scheletro, magari ci aggiungi i particolari.
          Ma non riesco a capire perché vuoi riscrivere ciò che è già pronto per essere utilizzato.:14.wondering_80_ani

          Riguardo il fatto che usi BIN non ci dovrebbe essere nessun problema.
          Ma se vuoi usare un BIN, allora perché nel nome del file alla fine ci metti ".txt"?

          Credo comunque che sia meglio se posti il codice completo.
          Con solo queste 2 funzioni è molto più difficile trovare i problemi.:23.itwasntme_80_ani
          Skype: cadddami

          Comment


            #20
            Per la questione buffer, vorrei proprio farne a meno, lo usavo solo per test. Ma con la tua spiegazione adesso mi è tutto più chiaro.
            Vorrei anche evitare di aprire e chiudere il file, o quantomeno chiuderlo solo alla fine, ma con il fileflush non mi scrive niente
            Ho anche provato il fileSeek spostando il cursore a strlengh ma nada....
            Quello che c'e nella guida sono le varie prove che ho puntualmente fallito
            Gestisco come bin anche se è un txt, questo non penso comporta problemi.

            Il codice che è postato è tutto quello che c'e lol

            Code:
            void Buy(double lot,double SL,double TP,int Magic)
              {
               double RSI0=iRSI(Symbol(),0,RsiPr,PrezzoRSI,0);
               SL=NormalizeDouble(SL,Digits);
               TP=NormalizeDouble(TP,Digits);
               
               int ticket=-1;
               while(ticket<0)
                {
                 ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,0,0," ",Magic,0,clrBlue);
                 if(ticket<0) {Print("Errore ",GetLastError()," nell\'invio dell'ordine BUY.");Sleep(1000);}
                 else
                  {
                   s=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                   s=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL,Digits),0,OrderExpiration(),clrNONE);
                   if(!s) Print("Errore ",GetLastError()," nell\'invio degli stop per il BUY.",SL);
                 
                 VerificaFile(OrderTicket(), TimeToStr(OrderOpenTime(), TIME_DATE),TimeToStr(OrderOpenTime(),TIME_DATE|TIME_MINUTES),OrderLots(),OrderSymbol(),OrderComment(),NormalizeDouble(RSI0,2));
                 }
                }
              }
            qui la richiamo.

            Grazie ancora per le delucidazioni

            Comment

            Working...
            X