Есть FileSeek(Файл,0,SEEK_END); и в файл записывается всё с новой строки.
Проблема в том, что файлов 4 штуки и нужно записывать данные по четырём позициям, по каждой в отдельный файл, у каждого файла в имени тикет позиции, а пишутся данные только в один, последний файл, данные по последней позиции.
Имена файлов правильно формируются? Вместо Ticket=OrderTicket(); ИмяФайла=_Ticket+Symbol()+".txt"; написал бы ИмяФайла=(string)OrderTicket()+Symbol()+".txt"; и в начале директиву #property strict добавил бы - помогает устранить ошибки
STARIJ: Имена файлов правильно формируются? Вместо Ticket=OrderTicket(); ИмяФайла=_Ticket+Symbol()+".txt"; написал бы ИмяФайла=(string)OrderTicket()+Symbol()+".txt"; и в начале директиву #property strict добавил бы - помогает устранить ошибки
Спасибо, переделано формирование имени по вашей рекомендации, но пишет всё равно только данные последней позиции.
Да и, имена новых файлов не изменились) Подозреваю не в имени дело, файл последней позиции и так находил.
1501896125EURUSD.txt Время Полу BID Цена 2018.02.22 22:53 P 1,23259 0,88322 2018.02.22 22:54 P 1,23259 0,88322 2018.02.22 22:55 P 1,23259 0,88322 2018.02.22 22:56 P 1,23249 0,88322
1501896094EURUSD.txt Время Полу BID Цена 2018.02.22 22:43 L 1,23212 1,23203 2018.02.22 22:44 L 1,23220 1,23203 2018.02.22 22:44 L 1,23224 1,23203 2018.02.22 22:45 L 1,23244 1,23203 2018.02.22 22:45 L 1,23242 1,23203 2018.02.22 22:46 L 1,23251 1,23203 что-то изменил? посмотрите... вот это: string sy=""; int op=-1, mn=-1; вряд ли нужно ... может выкинуть? В цикле вместо вложенных if() лучше continue;
1501896125EURUSD.txt Время Полу BID Цена 2018.02.22 22:53 P 1,23259 0,88322 2018.02.22 22:54 P 1,23259 0,88322 2018.02.22 22:55 P 1,23259 0,88322 2018.02.22 22:56 P 1,23249 0,88322
1501896094EURUSD.txt Время Полу BID Цена 2018.02.22 22:43 L 1,23212 1,23203 2018.02.22 22:44 L 1,23220 1,23203 2018.02.22 22:44 L 1,23224 1,23203 2018.02.22 22:45 L 1,23244 1,23203 2018.02.22 22:45 L 1,23242 1,23203 2018.02.22 22:46 L 1,23251 1,23203 что-то изменил? посмотрите... вот это: string sy=""; int op=-1, mn=-1; вряд ли нужно ... может выкинуть? В цикле вместо вложенных if() лучше continue;
Не хочет по всем позициям записывать.
Открыто 7 поз. Записывал один файл
Компилировал когда советник был на графике, он стал записывать данные первой и последней позиций. Теперь пишет данные только по одной, первой позиции.
шести как будто нет, но в алерте Alert(ИмяФайла), тикеты все есть.
в программе много условий, в том числе для записи файла должно выполняться условие: if(t_pre+60<TimeCurrent() && _o_t+1800>TimeCurrent()) // раз в минуту в течение полчаса с открытия ордера. Так надо? { t_pre=TimeCurrent(); Программа содержит разветвления:
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==sy || sy=="")
{
if(OrderType()==OP_BUY ||
OrderType()==OP_SELL)
{
if(op<0 || OrderType()==op)
{
if(mn<0 || OrderMagicNumber()==mn)
{
_o_t=OrderOpenTime();
И еще 5 закрывающих скобок. а можно короче на 10 строк и понятнее записать так
for(i=0; i<k; i++)
{
if( ! OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; // если ошибка выбора ордера - переходим к следующемуif(OrderSymbol()!=sy && sy!="") continue; // а это вообще надо?if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; // а другие разве у Вас есть?if(op>=0 && OrderType()!=op) continue;
if(mn>=0 && OrderMagicNumber()!=mn) continue;
_o_t=OrderOpenTime();
Для чего раньше писали лесенкой? В старой версии MQL4 это ускоряло выполнение. Сейчас это безразлично Переменная _o_t используется лишь в 2 местах. Если заменить ее на OrderOpenTime() программа станет яснее и короче на 2 строки (объявление и присваивание) datetime _o_t; и _o_t=OrderOpenTime();
Нашел а чем дело - отсчет 60 секунд надо вынести за цикл
//+------------------------------------------------------------------+ //| Ежеминутная информация об ордерах, открытых за последнее полчаса | //+------------------------------------------------------------------+ #property strictbool RUS=true;
datetime t_pre=0; // Время предыдущего выполнения//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTick()
{
if(t_pre+60>=TimeCurrent()) return; // Дождаться 60 секунд после прошлой обработки
t_pre=TimeCurrent(); // Это нужно вынести за цикл - в этом было дело !!!!!!!!!!!!string text;
for(int i=0; i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
string ИмяФайла=(string)OrderTicket()+Symbol()+".txt";
Alert(ИмяФайла);
if(OrderOpenTime()+60>=TimeCurrent()) continue; // Пропуск молодых которым меньше 1 минутыif(OrderOpenTime()+1800<=TimeCurrent()) continue; // Пропустк старых которым больше 30 минутif(OrderType()==OP_BUY){if(Bid>OrderOpenPrice())text="P"; else text="L";}
if(OrderType()==OP_SELL){if(Bid<OrderOpenPrice())text="P"; else text="L";}
// Открытие или создание файла и перемещение указателя в конецint Файл= FileOpen(ИмяФайла,FILE_CSV|FILE_READ|FILE_WRITE," ");
if(Файл == -1) { Alert("Ошибка при открытии файла ",ИмяФайла); return; }
FileSeek(Файл,0,SEEK_END);
// Если новый файл записать имя файла и строку заголовков колонокif(FileSize(Файл)==0)
{
FileWrite(Файл,ИмяФайла);
FileWrite(Файл," Время Полу BID Цена ");
}
// Сбор информации и запись в файлFileWrite(Файл, TimeToStr(TimeCurrent()), text,
dstr(Bid), " ", dstr(OrderOpenPrice()));
FileClose(Файл);
}
}
// Преобразование числа double в строку с запятой или точкой в соответствии с локализациейstring dstr(double Цена)
{
if(!RUS) returnDoubleToStr(Цена, Digits);
returnStringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
Есть FileSeek(Файл,0,SEEK_END); и в файл записывается всё с новой строки.
Проблема в том, что файлов 4 штуки и нужно записывать данные по четырём позициям, по каждой в отдельный файл, у каждого файла в имени тикет позиции, а пишутся данные только в один, последний файл, данные по последней позиции.
Имена файлов правильно формируются? Вместо Ticket=OrderTicket(); ИмяФайла=_Ticket+Symbol()+".txt"; написал бы ИмяФайла=(string)OrderTicket()+Symbol()+".txt"; и в начале директиву #property strict добавил бы - помогает устранить ошибки
Спасибо, переделано формирование имени по вашей рекомендации, но пишет всё равно только данные последней позиции.
Да и, имена новых файлов не изменились) Подозреваю не в имени дело, файл последней позиции и так находил.
Почему игнорирует предыдущие позиции?
1501896125EURUSD.txt
Время Полу BID Цена
2018.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322
1501896094EURUSD.txt
Время Полу BID Цена
2018.02.22 22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
что-то изменил? посмотрите... вот это: string sy=""; int op=-1, mn=-1; вряд ли нужно ... может выкинуть? В цикле вместо вложенных if() лучше continue;
1501896125EURUSD.txt
Время Полу BID Цена
2018.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322
1501896094EURUSD.txt
Время Полу BID Цена
2018.02.22 22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
что-то изменил? посмотрите... вот это: string sy=""; int op=-1, mn=-1; вряд ли нужно ... может выкинуть? В цикле вместо вложенных if() лучше continue;
Не хочет по всем позициям записывать.
Открыто 7 поз. Записывал один файл
Компилировал когда советник был на графике, он стал записывать данные первой и последней позиций. Теперь пишет данные только по одной, первой позиции.
шести как будто нет, но в алерте Alert(ИмяФайла), тикеты все есть.
Что ему нужно...
if(t_pre+60<TimeCurrent() && _o_t+1800>TimeCurrent()) // раз в минуту в течение полчаса с открытия ордера. Так надо?
{
t_pre=TimeCurrent();
Программа содержит разветвления:
Для чего раньше писали лесенкой? В старой версии MQL4 это ускоряло выполнение. Сейчас это безразлично
Переменная _o_t используется лишь в 2 местах. Если заменить ее на OrderOpenTime() программа станет яснее и короче на 2 строки (объявление и присваивание)
datetime _o_t; и
_o_t=OrderOpenTime();
Нашел а чем дело - отсчет 60 секунд надо вынести за цикл
Добрый день, уважаемые форумчане.
Могли бы подсказать, почему при оптимизации и тестировании одних тех же настроек порою выходят разные результаты?
Котировки загружал с SQ Tick Downloader и прогонял через скрипт
Добрый день, уважаемые.
Могли бы подсказать, почему при оптимизации и тестировании одних тех же настроек порою выходят разные результаты?
Я вам больше скажу: при торговле на реалтном счёте у одного брокера на 2 разных счетах могут быть разные результаты.
Это наверное больше зависит от брокера. Но могли бы подсказать по начальному вопросу?
Это наверное больше зависит от брокера. Но могли бы подсказать по начальному вопросу?