Невозможно записать в файл, когда ордер открыт - страница 2

 

WHRoeder:

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

Неверный последний аргумент - не int

Не могли бы вы уточнить, что вы имеете в виду?

Хотя в документации (см. FileOpen()) разделитель заключен в одинарные кавычки, в книге (см. Файловые операции) использование одинарных кавычек непоследовательно: некоторые примеры кода показывают использование двойных кавычек.

Кроме того, следующий код:

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

скомпилировался, не имел никаких ошибок во время выполнения и выдал следующий вывод в файле:

Тест файлов №1

 
RaptorUK: У вас ";", а не ';'... В сообщении об ошибке говорилось о параметре 1, разве это не хэндл файла?
Первый параметр - строка, второй - int (как и требуется.) В ошибке говорилось о параметре 1. Несколько проблем?
 
RaptorUK:
Извините, "части" ... вы получаете сообщение **** END TICK USDCHF **** ? или он заканчивается до этого?


Да, файл завершен.
 
RaptorUK:

У вас ";", а не ';'... Сообщение об ошибке, которое вы получили, говорило о параметре 1, разве это не хэндл файла?

Да, кто-то еще говорил о недействительном последнем параметре, не знаю почему. Я заменил ";" на ';', но получил ту же проблему.
 
Thirteen:

Не могли бы вы уточнить, что вы имеете в виду?

Хотя в документации (см. FileOpen()) разделитель заключен в одинарные кавычки, в книге (см. File Operations) использование одинарных кавычек непоследовательно: некоторые примеры кода показывают использование двойных кавычек.

Кроме того, следующий код:

скомпилировался, не имел никаких ошибок во время выполнения и выдал следующий результат в файле:



Я пробовал ";" и ';' и получил ту же проблему.

Мой код запускается и работает отлично, файл создается и каждый тик файл открывается, вся информация записывается в него, а затем файл закрывается. Все работает отлично, пока советник не откроет ордер, тогда в файл ничего не записывается.

 
WHRoeder:
Первое - строка, второе - int (как и требуется.) Ошибка упомянута p 1. Множественные проблемы?


Ошибка заключается в хэндле файла, хэндл всегда равен 1 и всегда работает, но когда советник открывает ордер, на следующем тике он пишет Handle is invalid, хотя он снова равен 1 и работал последние сотни тиков. В последний раз, когда я пробовал, хэндл начал увеличиваться при открытии ордера, он стал 2, 3, 4 и т.д.

Это точно такой же код, я не знаю, почему он не остается равным 1, и даже когда он все еще 1, он все еще выдает ошибку.

 
Есть идеи, ребята?
 
favosys:
Есть идеи, ребята?

Я не вижу проблем с кодом, который вы опубликовали.

Поэтому я вижу 2 варианта :

  • опубликовать весь ваш код, чтобы мы могли попробовать его сами и попытаться исправить проблему
  • создать короткий скрипт/EA, который воспроизводит проблему, и опубликовать его.

 
RaptorUK:

Я не вижу проблемы с кодом, который вы опубликовали.

Поэтому я вижу 2 варианта :

  • опубликовать весь ваш код, чтобы мы могли попробовать его сами и попытаться исправить проблему
  • создать короткий скрипт/советник, который воспроизведет проблему, и опубликовать его.


Спасибо, RaptorUK, я уже создал советника, который в точности повторяет проблему, чтобы попытаться ее решить. В принципе, он запускается, создает файл и каждый тик записывает в файл, считая тики. Таким образом, файл выглядит как тик 1, тик 2 и т.д.

На 15 тике он открывает ордер, информация об ордере появляется в файле и конец (******) также появляется. После этого он должен писать в каждом тике номер тика (16, 17 и т.д.) и статус ордера, т.е. открыт ли он еще или нет. По какой-то причине после 15 тика советник не пишет в файл.

На тике 50 он должен закрыть ордер, но это не важно, важно то, что он продолжает писать в файл, когда он открывает ордер.

На моей машине Windows 7 файлы создаются в C:\Users\{имя пользователя}\AppData\Local\VirtualStore\Program Files (x86)\SIGTrader 4\experts\files.

Appdata - это скрытая папка.

Заранее спасибо

Код:

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


Спасибо RaptorUK, я уже создал советника, который в точности повторяет проблему, чтобы попытаться решить ее. В принципе, он запускается, создает файл и каждый тик записывает в файл, считая тики. Так что файл выглядит как тик 1, тик 2 и т.д.

На тике 15 он открывает ордер, информация об ордере появляется в файле и также появляется конец (******). После этого он должен писать в каждом тике номер тика (16, 17 и т.д.) и статус ордера, т.е. открыт ордер или нет. По какой-то причине после 15 тика советник не пишет в файл.

На тике 50 он должен закрыть ордер, но это не важно, важно то, что он продолжает писать в файл, когда он открывает ордер.

На моей машине Windows 7 файлы создаются в C:\Users\{имя пользователя}\AppData\Local\VirtualStore\Program Files (x86)\SIGTrader 4\experts\files.

Appdata - это скрытая папка.

Заранее спасибо

Код:

Ваш код не будет размещать сделки с брокером, которого я использую для тестирования, это брокер "типа" ECN. Я настрою и установлю TP и SL на 0.0.