Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 478

 
lil_lil:

Есть 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;

Файлы:
Fileee.mq4  7 kb
 
STARIJ:

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 strict
bool RUS=true;
datetime t_pre=0;  // Время предыдущего выполнения

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
   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) return DoubleToStr(Цена, Digits);
   return StringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
Файлы:
-Fi----.mq4  5 kb
 

Добрый день, уважаемые форумчане.

Могли бы подсказать, почему при оптимизации и тестировании одних тех же настроек порою выходят разные результаты?

Котировки загружал с SQ Tick Downloader и прогонял через скрипт

 
Aidar Kaliaskar:

Добрый день, уважаемые.

Могли бы подсказать, почему при оптимизации и тестировании одних тех же настроек порою выходят разные результаты?

Я вам больше скажу: при торговле на реалтном счёте у одного брокера на 2 разных счетах могут быть разные результаты. 
 
Vladislav Andruschenko:
Я вам больше скажу: при торговле на реалтном счёте у одного брокера на 2 разных счетах могут быть разные результаты. 

Это наверное больше зависит от брокера. Но могли бы подсказать по начальному вопросу?

 
Aidar Kaliaskar:

Это наверное больше зависит от брокера. Но могли бы подсказать по начальному вопросу?

Спред, если выставлен в текущий. Конечная дата тестирования,  если она выставлена на текущий момент.  Причин ещё может быть много.