Хотя в документации (см. FileOpen()) разделитель заключен в одинарные кавычки, в книге (см. Файловые операции) использование одинарных кавычек непоследовательно: некоторые примеры кода показывают использование двойных кавычек.
Хотя в документации (см. FileOpen()) разделитель заключен в одинарные кавычки, в книге (см. File Operations) использование одинарных кавычек непоследовательно: некоторые примеры кода показывают использование двойных кавычек.
Кроме того, следующий код:
скомпилировался, не имел никаких ошибок во время выполнения и выдал следующий результат в файле:
Я пробовал ";" и ';' и получил ту же проблему.
Мой код запускается и работает отлично, файл создается и каждый тик файл открывается, вся информация записывается в него, а затем файл закрывается. Все работает отлично, пока советник не откроет ордер, тогда в файл ничего не записывается.
WHRoeder: Первое - строка, второе - int (как и требуется.) Ошибка упомянута p 1. Множественные проблемы?
Ошибка заключается в хэндле файла, хэндл всегда равен 1 и всегда работает, но когда советник открывает ордер, на следующем тике он пишет Handle is invalid, хотя он снова равен 1 и работал последние сотни тиков. В последний раз, когда я пробовал, хэндл начал увеличиваться при открытии ордера, он стал 2, 3, 4 и т.д.
Это точно такой же код, я не знаю, почему он не остается равным 1, и даже когда он все еще 1, он все еще выдает ошибку.
Я не вижу проблемы с кодом, который вы опубликовали.
Поэтому я вижу 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"externstring Nombre_archivo="log";
externint Take_Profit=6;
externint Stop_Loss=35;
externint Deslizamiento=4;
externdouble 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 openingif(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 accompanimentreturn; // 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 openingPrint("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 accompanimentreturn; // 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);
}
//+------------------------------------------------------------------+
Спасибо 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.
WHRoeder:
Неверный последний аргумент - не int
Не могли бы вы уточнить, что вы имеете в виду?
Хотя в документации (см. FileOpen()) разделитель заключен в одинарные кавычки, в книге (см. Файловые операции) использование одинарных кавычек непоследовательно: некоторые примеры кода показывают использование двойных кавычек.
Кроме того, следующий код:
скомпилировался, не имел никаких ошибок во время выполнения и выдал следующий вывод в файле:
Извините, "части" ... вы получаете сообщение **** END TICK USDCHF **** ? или он заканчивается до этого?
Да, файл завершен.
У вас ";", а не ';'... Сообщение об ошибке, которое вы получили, говорило о параметре 1, разве это не хэндл файла?
Да, кто-то еще говорил о недействительном последнем параметре, не знаю почему. Я заменил ";" на ';', но получил ту же проблему.
Не могли бы вы уточнить, что вы имеете в виду?
Хотя в документации (см. FileOpen()) разделитель заключен в одинарные кавычки, в книге (см. File Operations) использование одинарных кавычек непоследовательно: некоторые примеры кода показывают использование двойных кавычек.
Кроме того, следующий код:
скомпилировался, не имел никаких ошибок во время выполнения и выдал следующий результат в файле:
Я пробовал ";" и ';' и получил ту же проблему.
Мой код запускается и работает отлично, файл создается и каждый тик файл открывается, вся информация записывается в него, а затем файл закрывается. Все работает отлично, пока советник не откроет ордер, тогда в файл ничего не записывается.
Первое - строка, второе - int (как и требуется.) Ошибка упомянута p 1. Множественные проблемы?
Ошибка заключается в хэндле файла, хэндл всегда равен 1 и всегда работает, но когда советник открывает ордер, на следующем тике он пишет Handle is invalid, хотя он снова равен 1 и работал последние сотни тиков. В последний раз, когда я пробовал, хэндл начал увеличиваться при открытии ордера, он стал 2, 3, 4 и т.д.
Это точно такой же код, я не знаю, почему он не остается равным 1, и даже когда он все еще 1, он все еще выдает ошибку.
Есть идеи, ребята?
Я не вижу проблем с кодом, который вы опубликовали.
Поэтому я вижу 2 варианта :
Я не вижу проблемы с кодом, который вы опубликовали.
Поэтому я вижу 2 варианта :
Спасибо, RaptorUK, я уже создал советника, который в точности повторяет проблему, чтобы попытаться ее решить. В принципе, он запускается, создает файл и каждый тик записывает в файл, считая тики. Таким образом, файл выглядит как тик 1, тик 2 и т.д.
На 15 тике он открывает ордер, информация об ордере появляется в файле и конец (******) также появляется. После этого он должен писать в каждом тике номер тика (16, 17 и т.д.) и статус ордера, т.е. открыт ли он еще или нет. По какой-то причине после 15 тика советник не пишет в файл.
На тике 50 он должен закрыть ордер, но это не важно, важно то, что он продолжает писать в файл, когда он открывает ордер.
На моей машине Windows 7 файлы создаются в C:\Users\{имя пользователя}\AppData\Local\VirtualStore\Program Files (x86)\SIGTrader 4\experts\files.
Appdata - это скрытая папка.
Заранее спасибо
Код:
Спасибо RaptorUK, я уже создал советника, который в точности повторяет проблему, чтобы попытаться решить ее. В принципе, он запускается, создает файл и каждый тик записывает в файл, считая тики. Так что файл выглядит как тик 1, тик 2 и т.д.
На тике 15 он открывает ордер, информация об ордере появляется в файле и также появляется конец (******). После этого он должен писать в каждом тике номер тика (16, 17 и т.д.) и статус ордера, т.е. открыт ордер или нет. По какой-то причине после 15 тика советник не пишет в файл.
На тике 50 он должен закрыть ордер, но это не важно, важно то, что он продолжает писать в файл, когда он открывает ордер.
На моей машине Windows 7 файлы создаются в C:\Users\{имя пользователя}\AppData\Local\VirtualStore\Program Files (x86)\SIGTrader 4\experts\files.
Appdata - это скрытая папка.
Заранее спасибо
Код: