Não pode escrever para arquivar quando o pedido está aberto - página 2

 

WHRoeder:

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

Último argumento inválido - não um int

Você poderia, por favor, explicar melhor o que você quer dizer?

Enquanto a documentação (ver FileOpen()) mostra o delimitador sendo incluído entre aspas simples, o livro (ver File Operations) é inconsistente com relação ao uso de aspas simples: alguns exemplos de código mostram o uso das aspas duplas.

Além disso, o seguinte código:

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());

compilado, não teve nenhum erro de tempo de execução, e produziu a seguinte saída no arquivo:

Teste de arquivo #1

 
RaptorUK: Você tem ";" não ';'. . . a mensagem de erro que você recebeu falou sobre o parâmetro 1, não é que o arquivo trata ?
O primeiro é uma string, o segundo é uma int (como requerido.) O erro mencionado p 1. Problemas múltiplos?
 
RaptorUK:
Desculpe, "peças" . . . você recebe a mensagem **** END TICK USDCHF **** ? ou termina antes disso ?


Sim, o arquivo está completo.
 
RaptorUK:

Você tem ";" não ';'. . . a mensagem de erro que você recebeu falou sobre o parâmetro 1, não é que o arquivo trata ?

Sim, outra pessoa estava falando sobre o último parâmetro inválido, não sei por quê. Ainda assim eu mudei ";" para ';' mas tive o mesmo problema.
 
Thirteen:

Você poderia, por favor, explicar melhor o que você quer dizer?

Enquanto a documentação (ver FileOpen()) mostra o delimitador sendo incluído entre aspas simples, o livro (ver File Operations) é inconsistente com relação ao uso de aspas simples: alguns exemplos de código mostram o uso das aspas duplas.

Além disso, o seguinte código:

compilado, não teve nenhum erro de tempo de execução, e produziu a seguinte saída no arquivo:



Eu tentei ";" e ';' tenho o mesmo problema.

Meu código roda e funciona muito bem, o arquivo é criado e a cada tic tac do arquivo é aberto, toda a informação é escrita nele e então o arquivo é fechado. Tudo funciona muito bem até a EA abrir uma ordem, então nada é escrito no arquivo.

 
WHRoeder:
O primeiro é uma corda, o segundo é uma int (como requerido.) O erro mencionado p 1. Problemas múltiplos?


O erro é o cabo do arquivo, o cabo é sempre 1 e sempre funciona, mas quando a EA abre um pedido, o próximo tique diz que o cabo é inválido mesmo que seja 1 novamente e tenha funcionado para as últimas centenas de carrapatos. A última vez que experimentei o handle começou a subir quando o pedido abriu, ele se tornou 2, 3, 4, etc.

É exatamente o mesmo código, não sei por que não fica como 1, e mesmo quando ainda é 1, ainda dá o erro.

 
Alguma idéia, rapazes?
 
favosys:
Alguma idéia, rapazes?

Não consigo ver um problema com o código que você postou.

Portanto, vejo 2 opções :

  • poste todo seu código para que possamos experimentá-lo por nós mesmos e tentar consertá-lo
  • criar um pequeno roteiro/EA que replique o assunto e poste que

 
RaptorUK:

Não consigo ver um problema com o código que você postou.

Portanto, vejo 2 opções :

  • poste todo seu código para que possamos experimentá-lo por nós mesmos e tentar consertá-lo
  • criar um pequeno roteiro/EA que replique o assunto e poste que


Obrigado RaptorUK, eu já tinha criado uma EA que reproduz o problema exatamente para tentar consertar o problema. Basicamente, ela começa, cria o arquivo cada vez que ele escreve sobre o arquivo, contando os carrapatos. Então o arquivo é como um carrapato 1, um carrapato 2, etc.

No tick 15, ele abre uma ordem, a informação do pedido aparece no arquivo e o final (******) também aparece. Depois disso, é suposto escrever em cada tique o número do tique (16, 17, etc.) e o status do pedido, ou seja, se o pedido ainda está aberto ou não. Por alguma razão, após o tick 15, a EA não escreve no arquivo.

Ao ticar 50 é suposto fechar a ordem, mas isso não é importante, o que é importante é que ela continua escrevendo no arquivo quando abre a ordem.

Em minha máquina Windows 7, os arquivos são criados em C:Usuários (nome do usuário).

Appdata é uma pasta oculta.

Obrigado de antemão

Código:

//+------------------------------------------------------------------+
//|                                                          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:


Obrigado RaptorUK, eu já tinha criado uma EA que reproduz o problema exatamente para tentar consertar o problema. Basicamente, ela começa, cria o arquivo que cada tic que ele escreve no arquivo conta os ticks. Então o arquivo é como um carrapato 1, um carrapato 2, etc.

No tick 15 abre um pedido, a informação do pedido aparece no arquivo e o final (******) também aparece. Depois disso, deve-se escrever em cada tick o número do tick (16, 17, etc) e o status do pedido, ou seja, se o pedido ainda está aberto ou não. Por alguma razão, após o tick 15, o EA não escreve no arquivo.

Ao ticar 50 é suposto fechar a ordem, mas isso não é importante, o que é importante é que ela continua escrevendo no arquivo quando abre a ordem.

Em minha máquina Windows 7 os arquivos são criados em C:Usuários (nome do usuário)

Appdata é uma pasta oculta.

Obrigado de antemão

Código:

Você codificará não fará negócios com o Corretor que eu uso para testes, é um Corretor "tipo" ECN. Vou ajustar e definir o TP e SL para 0,0