Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1022

 

или спрошу проще: 

в функции OnCalculate()  вставлен цикл, так вот он проходит только одну итерацию, следующую только при обновлении графика....

 
ara66676:

или спрошу проще: 

в функции OnCalculate()  вставлен цикл, так вот он проходит только одну итерацию, следующую только при обновлении графика....

Вам похоже нужно к экстрасенсам, ну или КОД В СТУДИЮ.
 
bistreevseh:
Большое спасибо! Работает странно права у меня админские, специально для папки терминала дал все разрушения владельцу, помогло, но потом перестало ратотать. Далее пытался прочитать файл лога функцией FileReadStrArrayW (если не ошибаюсь с названием) считываютсяпустые строки, в режиме ansi скрипт зависает . Получилось считать ansi коды только FileReadCharArr . Может у вас есть какой-то пример, как парсить файл лога с помощью вашей библиотекой? Буду очень признателен!

Да, есть теперь проблема в чтении лога. Раньше было проще.

Дело в том, что сам файл с ANSI-кодировкой, а строки теперь UNICODE.

Вот такой скрипт работает:

#property strict
#property script_show_inputs

#include <FileFunctions.mqh>

input int NumLines = 10;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  string sPath = TerminalPath() + "\\MQL4\\Logs\\" + sName + ".log";
  Print(sPath);
  
  if (!FileCheckW(sPath))
   {
    Print("Файл отсутствует!");
    return;
   }
    
  int hFile = FileOpenExistingW(sPath, GENERIC_READ, SHARE_READ);
  if (hFile == NULL)
   {
    Print("Файл не открыт!");
    return;
   }

  string asArray[];
  ArrayResize(asArray, NumLines);
  Print("hFile = ", hFile);
  for (int i = 0; i < NumLines; i++) asArray[i] = string(i) + "                                                                                                                                                                                                                                                          ";
  FileReadStrArrayMW(hFile, asArray, ArraySize(asArray), 0, NumLines);
  FileCloseHandle(hFile);
  for (int i = 0; i < NumLines; i++) Alert(asArray[i]);
 }

Но он будет работать только, если предварительно файл лога сохранить в UNICODE!

Т.е. библиотека работает правильно. Надо придумать простой способ преобразования от ANSI-кодировки файла в UNICODE-строковый массив или мне в библиотеку добавить функцию, которая преобразовывала бы кодировку строк при чтении файла.

=====================

Вариант 1. Можно не заморачиваться с массивами. Прочитать весть файл, как ANSI, преобразовать в UNICODE, потом парсить средствами MQL.

Вариант 2. Прочитать, как ANSI, записать в текущий каталог терминала, читать его с помощью MQL-функций для работы с CSV-файлами.

Вариант 3. Создать символическую ссылку на файл лога в песочницу функцией из этой же библиотеки и читать его с помощью MQL-функций для работы с CSV-файлами:

#property strict
#include <FileFunctions.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  sName += ".log";
  
  string sPathLogs = TerminalPath() + "\\MQL4\\Logs\\" + sName;
  string sPathFiles = TerminalPath() + "\\MQL4\\Files\\" + sName;
  
  Print(sPathLogs);
  Print(sPathFiles);
  
  if (!FileCheckW(sPathLogs))
   {
    Print("Файл отсутствует!");
    return;
   }
  
  if (!FileCheckW(sPathFiles) && !FileSymbolicLinkW(sPathLogs, sPathFiles))
   {
    Print("Символьная ссылка не создана!");
    return;
   }
  
  int hFile = FileOpen(sName, FILE_READ|FILE_CSV|FILE_ANSI, '\t');
  if (hFile == INVALID_HANDLE)
   {
    Print("Файл не открыт!");
    return;
   }
  
  while (!FileIsEnding(hFile)) Alert(FileReadString(hFile));
  FileClose(hFile);
 }

По моему, это самый красивый и простой вариант.

 

Пытаюсь написать один индикатор канала. Значения для отрисовки на графике вычислил и запихнул в массивы double tob[] и double tos[], но при попытке связать их с буфером для отрисовки на графике - в строках 25 и 26:

SetIndexBuffer(0, tob);
SetIndexBuffer(1, tos);

, эти массивы вместо нужных значений, типа:

0/1.424/1.3679
1/1.42/1.3639

заполняются числом 2147483647, вот так:
0/2147483647/2147483647
1/2147483647/2147483647
2/2147483647/2147483647

Как это вылечить?

Файлы:
channel1.mq4  7 kb
 
Есть горячие клавиши быстрого переключения между периодами ?
Нажав  кнопку D , H1 переключиться на M15 , а нажав кнопку U , переключиться на H1.
 

Помогите найти шаблон для MT4 , чтобы разделять ночь и день. 

Допустим на графике с 00:00 до 8:00 график одним цветом, а с 8:00 до 00:00 другим цветом . 

 

Приветствую всех.

Столкнулся с такой проблемой:

фрагмент кода робота:

int per=Period();
  if(per = 60)
  {

      Print("Если период не Н1 - этой строки не должно быть в журнале");

     Comment (...);

   ... // далее сопственно тело робота

   ...

  ...

}

 подразумевает, что ни тело робота, ни строка Print(...) , ни Comment(...) на экран НЕ будут выполнятся, если на графике включен период, отличный от Н1.

Однако, всё исполняется на любом периоде. Почему ?

Как прописать грамотно, что если период на графике не соответствует заданному - вернуть управление терминалу. (кстати пробовал через RETURN (0) - не помогает - всё равно всё печатает...)

 
Dikons:

Приветствую всех.

Столкнулся с такой проблемой:

фрагмент кода робота:

int per=Period();
  if(per = 60)
  {

      Print("Если период не Н1 - этой строки не должно быть в журнале");

     Comment (...);

   ... // далее сопственно тело робота

   ...

  ...

}

 подразумевает, что ни тело робота, ни строка Print(...) , ни Comment(...) на экран НЕ будут выполнятся, если на графике включен период, отличный от Н1.

Однако, всё исполняется на любом периоде. Почему ?

Как прописать грамотно, что если период на графике не соответствует заданному - вернуть управление терминалу. (кстати пробовал через RETURN (0) - не помогает - всё равно всё печатает...)

Вы делаете присваивание, а нужно сравнение  if(per == 60)
 
Trader76:
Вы делаете присваивание, а нужно сравнение  if(per == 60)

Вот спасибо товарищ... а то весь мозг прокипятил... был значительный перерыв в программировании - подзабыл многое, из того немногого что знал...

---

Ещё бы вопросик... фрагмент поиска макс/мини первых 8 часов в сутках по терминалу:

int h=TimeHour(TimeCurrent()); // узнаём текущий терминальный час (0...23)
if (h<8) return(0); // если нет H1 первых 8 свечей суток = уходим...

 double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // определяем макс первых 8 свечей в сутках.

 double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


Последние две строки работают некорректно, если на графике установлен период не Н1. Почему ? Ведь период для вычислений роботу задан явно...

Если включить на графике к примеру Н4 - робот и пересчитает свечами Н4 (так же и с другими периодами).

 
Dikons:

Вот спасибо товарищ... а то весь мозг прокипятил... был значительный перерыв в программировании - подзабыл многое, из того немногого что знал...

---

Ещё бы вопросик... фрагмент поиска макс/мини первых 8 часов в сутках по терминалу:

int h=TimeHour(TimeCurrent()); // узнаём текущий терминальный час (0...23)
if (h<8) return(0); // если нет H1 первых 8 свечей суток = уходим...

 double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // определяем макс первых 8 свечей в сутках.

 double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


Последние две строки работают некорректно, если на графике установлен период не Н1. Почему ? Ведь период для вычислений роботу задан явно...

Если включить на графике к примеру Н4 - робот и пересчитает свечами Н4 (так же и с другими периодами).

Вы вот тут получаете номер макс/мин бара: iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)

А потом вставляете к примеру бар номер 2, в итоге получаете:  High[2] , и на другом таймфрейме вы и получите значение, отличное от Н1. Почитайте о High.

iHigh(NULL,PERIOD_H1iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7) )