Impossibile scrivere su file quando l'ordine è aperto - pagina 2

 

WHRoeder:

Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE,";");//File opening
Handle=FileOpen(File_Name,FILE_CSV|FILE_READ|FILE_WRITE,";");//File opening

Ultimo argomento non valido - non è un int

Potreste spiegare meglio cosa intendete?

Mentre la documentazione (vedi FileOpen()) mostra che il delimitatore è racchiuso tra virgolette singole, il libro (vedi File Operations) è incoerente riguardo all'uso delle virgolette singole: alcuni esempi di codice mostrano l'uso delle virgolette doppie.

Inoltre, il seguente codice:

int handle=FileOpen("testing.csv", FILE_CSV|FILE_WRITE|FILE_READ, ";");
if(handle > 0) {
   FileSeek(handle, 0, SEEK_END);
   FileWrite(handle, "test1", "test2", "test3", "test4");
   FileClose(handle);
}
else
   Print ("FileOpen failed. Error # ", GetLastError());

compilato, non ha avuto alcun errore di runtime, e ha prodotto il seguente output nel file:

Test del file #1

 
RaptorUK: Hai ";" non ';'. . . il messaggio di errore che hai ricevuto parlava del parametro 1, non è l'handle del file?
Il primo è una stringa, il secondo è un int (come richiesto). L'errore parlava del p 1. Problemi multipli?
 
RaptorUK:
Scusa, "parti" ... ricevi il messaggio **** END TICK USDCHF **** o finisce prima?


Sì, il file è completo.
 
RaptorUK:

Hai ";" non ';'. . . il messaggio di errore che hai ricevuto parlava del parametro 1, non è l'handle del file?

Sì, qualcun altro parlava di un ultimo parametro non valido, non so perché. Ho comunque cambiato ";" con ';' ma ho avuto lo stesso problema.
 
Thirteen:

Potreste spiegare meglio cosa intendete?

Mentre la documentazione (vedi FileOpen()) mostra che il delimitatore è racchiuso tra virgolette singole, il libro (vedi File Operations) è incoerente riguardo all'uso delle virgolette singole: alcuni esempi di codice mostrano l'uso delle virgolette doppie.

Inoltre, il seguente codice:

compilato, non ha avuto alcun errore di runtime, e ha prodotto il seguente output nel file:



Ho provato ";" e ';' ottenendo lo stesso problema.

Il mio codice viene eseguito e funziona alla grande, il file viene creato e ogni tick il file viene aperto, tutte le informazioni vengono scritte in esso e poi il file viene chiuso. Tutto funziona alla grande finché l'EA non apre un ordine, poi non viene scritto nulla sul file.

 
WHRoeder:
Il primo è una stringa, il secondo è un int (come richiesto.) L'errore menzionato p 1. Problemi multipli?


L'errore è l'handle del file, l'handle è sempre 1 e funziona sempre, ma quando l'EA apre un ordine, il tick successivo dice Handle is invalid anche se è di nuovo 1 e ha funzionato per le ultime centinaia di tick. L'ultima volta che ho provato l'handle ha iniziato a salire quando l'ordine si è aperto, è diventato 2, 3, 4, ecc.

È lo stesso identico codice, non so perché non rimane come 1, e anche quando è ancora 1 dà ancora l'errore.

 
Qualche idea ragazzi?
 
favosys:
Qualche idea ragazzi?

Non riesco a vedere un problema con il codice che hai postato.

Quindi vedo 2 opzioni:

  • postare tutto il tuo codice in modo che possiamo provarlo da soli e provare a risolverlo
  • creare un breve script/EA che replichi il problema e postarlo

 
RaptorUK:

Non riesco a vedere un problema con il codice che hai postato.

Quindi vedo 2 opzioni:

  • postare tutto il tuo codice in modo che possiamo provarlo da soli e provare a risolverlo
  • creare un breve script/EA che replichi il problema e postarlo


Grazie RaptorUK, avevo già creato un EA che replica esattamente il problema per provare a risolverlo. In pratica parte, crea il file loro ogni tick scrive sul file contando i tick. Quindi il file è come tick 1, tick 2, ecc.

Al tick 15 apre un ordine, le informazioni dell'ordine appaiono nel file e appare anche la fine (******). Dopo di che dovrebbe scrivere in ogni tick il numero di tick (16, 17, ecc.) e lo stato dell'ordine, cioè se l'ordine è ancora aperto o no. Per qualche motivo dopo il tick 15 l'EA non scrive sul file.

Al tick 50 dovrebbe chiudere l'ordine ma questo non è importante, l'importante è che continui a scrivere sul file quando apre l'ordine.

Sulla mia macchina Windows 7 i file sono creati in C:\Users\username\AppData\Local\VirtualStore\Program Files (x86)\SIGTrader 4\experts\files

Appdata è una cartella nascosta.

Grazie in anticipo

Codice:

//+------------------------------------------------------------------+
//|                                                          log.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern string     Nombre_archivo="log";
extern int        Take_Profit=6;
extern int        Stop_Loss=35;
extern int        Deslizamiento=4;
extern double     vol=1;
int               Handle, Qnt_Symb, ticket, err, abierta = 0;
string            File_Name, larcor;


int cont=1;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   File_Name = StringConcatenate(Nombre_archivo, " - ", Symbol(), " - ", TimeToStr(TimeLocal(),TIME_DATE), " - ", TimeHour(TimeLocal()), ".", TimeMinute(TimeLocal()), ".", TimeSeconds(TimeLocal()), ".txt");
   Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE,';');//File opening
   if(Handle==-1)                      // File opening fails
     {
      Alert("An error while opening the file. ",// Error message
              "May be the file is busy by the other applictiom");
      PlaySound("Bzrrr.wav");          // Sound accompaniment
      return;                          // Exir start()      
     }
     FileClose( Handle );
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   double op, cl;
   
   Print("Order open: ", abierta);
   //Print("File: ", File_Name);

    Handle=FileOpen(File_Name,FILE_CSV|FILE_READ|FILE_WRITE,';');//File opening
    Print("Handle: ", Handle);
   if(Handle==-1)                      // File opening fails
     {
      Alert("An error while opening the file. ",// Error message
              "May be the file is busy by the other applictiom");
      PlaySound("Bzrrr.wav");          // Sound accompaniment
      return;                          // Exir start()      
     }
   FileSeek(Handle, 0, SEEK_END);
   
   Qnt_Symb=FileWrite(Handle,"**** INICIANDO TICK PAR ", Symbol(), ": ", TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS), " ****");
   Qnt_Symb=FileWrite(Handle,"************************************************************");   
   
   Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Este es el tick num: ", cont);
   if(cont == 15){
      op = iOpen(NULL, 0, 0);
      cl = iClose(NULL, 0, 0);
      
      if(op < cl){
         Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Estamos en LARGO, se abre compra");
         ticket = OrderSend(Symbol(),OP_BUY,vol,Ask,Deslizamiento,Ask-Stop_Loss*Point,Ask+Take_Profit*Point);
         if(ticket == -1){
            err = GetLastError();
            Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - "," Error No. ", err, " al tratar de abrir la orden");
         }
         else{
            Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - "," Abierta orden ", ticket, ", hora: ", TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
            abierta = 1;
         }
       }
       else{
         Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Estamos en CORTO, se abre venta");
         ticket = OrderSend(Symbol(),OP_SELL,vol,Bid,Deslizamiento,Bid+Stop_Loss*Point,Bid-Take_Profit*Point);
         if(ticket == -1){
            err = GetLastError();
            Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - "," Error No. ", err, " al tratar de abrir la orden");
         }
         else{
            Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - "," Abierta orden ", ticket, ", hora: ", TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
            abierta = 1;
         }
       }
   }
   
   if((cont > 15) && (cont < 50)){
      if(ticket != -1){
         if(OrderSelect(ticket, SELECT_BY_TICKET) == true){
            datetime horacierre = OrderCloseTime();
            if(horacierre == 0){
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Orden ", ticket, " en par ". Symbol(), " sigue abierta.");   
            }
            else{
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","La orden ", ticket, " se cerro automaticamente a las ", TimeToStr(horacierre,TIME_DATE|TIME_SECONDS));
            }
          }
      }
   }
   
   if(cont == 50){
      if(abierta == 1){
         if(larcor == "LARGO"){
            if(OrderClose(ticket,OrderLots(),Ask,3)){
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Se cerro la orden ", ticket, " en LARGO");
            }
            else{
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","No se pudo cerrar la orden ", ticket, " en LARGO");
            }
         }
         else{
            if(OrderClose(ticket,OrderLots(),Bid,3)){
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Se cerro la orden en CORTO");
            }
            else{
               Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","No se pudo cerrar la orden ", ticket, " en CORTO");
            }
         }
      }
   }
   
   if(cont > 50){
      Qnt_Symb=FileWrite(Handle,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)," - ","Fin de EA");
   }
   
   Qnt_Symb=FileWrite(Handle,"***************************");      
   Qnt_Symb=FileWrite(Handle,"**** FIN TICK PAR ", Symbol(), " ****");        
   FileClose( Handle );
   cont++;   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
favosys:


Grazie RaptorUK, avevo già creato un EA che replica esattamente il problema per cercare di risolvere il problema. In pratica parte, crea il file li ogni tick scrive sul file contando i tick. Quindi il file è come tick 1, tick 2, ecc.

Al tick 15 apre un ordine, le informazioni dell'ordine appaiono nel file e appare anche la fine (******). Dopo di che dovrebbe scrivere in ogni tick il numero di tick (16, 17, ecc.) e lo stato dell'ordine, cioè se l'ordine è ancora aperto o no. Per qualche motivo dopo il tick 15 l'EA non scrive sul file.

Al tick 50 dovrebbe chiudere l'ordine ma questo non è importante, l'importante è che continui a scrivere sul file quando apre l'ordine.

Sulla mia macchina Windows 7 i file sono creati in C:\Users\username\AppData\Local\VirtualStore\Program Files (x86)\SIGTrader 4\experts\files

Appdata è una cartella nascosta.

Grazie in anticipo

Codice:

Il tuo codice non piazzerà compravendite con il Broker che uso per i test, è un Broker "tipo" ECN. Regolerò e imposterò il TP e lo SL a 0,0
Motivazione: