Ошибки, баги, вопросы - страница 2634

 

Здравствуйте!

Я хочу запустить несколько МТ4 пакетным файлом.

Подскажите, пожалуйста как это сделать и почему мой код не работает:

SET MY_PATH=C:\"Program Files (x86)"
%MY_PATH%\001\terminal.exe
TIMEOUT /T 160
%MY_PATH%\002\terminal.exe
TIMEOUT /T 160
%MY_PATH%\003\terminal.exe
TIMEOUT /T 160
%MY_PATH%\004\terminal.exe
TIMEOUT /T 160
%MY_PATH%\005\terminal.exe
TIMEOUT /T 160
%MY_PATH%\006\terminal.exe
TIMEOUT /T 160
%MY_PATH%\007\terminal.exe
TIMEOUT /T 160
%MY_PATH%\008\terminal.exe
TIMEOUT /T 160
%MY_PATH%\009\terminal.exe
TIMEOUT /T 160
%MY_PATH%\010\terminal.exe
TIMEOUT /T 160
%MY_PATH%\011\terminal.exe
TIMEOUT /T 160
%MY_PATH%\012\terminal.exe
TIMEOUT /T 160

В лучшем случае запускается несколько МТ4, потом зависает.

Разумеется, недостатка в оперативке нет.

Кроме того, я пробовал на разных компах

 
Igor Zakharov:

нет, не работает.

серверное время, кстати, не останавливается в субботу. тут обратное: в терминале серверное время обновляется с приходом новой котировки. например, у вас в обзоре рынка открыт только один символ (не только в тестере, но и в реальности). а тиков нет секунд пять - все это время таймер серверного времени не сдвинется. к субботе это так относится: на сервере время идёт, но терминал об этом не знает, т.к. тиков нет. тестер просто пропустит этот период.

Я уже проверил. На тестере  TimeLocal в выходные дни работает, TimeTradeServer тоже.  а TimeCurrent естественно нет. Тиков нет, а серверное время стоит.

int OnInit()
{
  Print(__FUNCTION__," TimeCurrent     ",TimeCurrent());
  Print(__FUNCTION__," TimeLocal       ",TimeLocal());
  Print(__FUNCTION__," TimeTradeServer ",TimeTradeServer());

    EventSetTimer(3*3600);
 return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnTimer()
{
  Print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
  Print(__FUNCTION__," TimeCurrent     ",TimeCurrent());
  Print(__FUNCTION__," TimeLocal       ",TimeLocal());
  Print(__FUNCTION__," TimeTradeServer ",TimeTradeServer());
}
 
Igor Zakharov:

https://www.mql5.com/ru/forum/328008/page2#comment_14166682

Как всегда велосипеды.

Тут вопрос, почему не проходит такая запись.
Ведь переменные из параметров, имеют начальные значения.

void MxResize(int row=1, int col=1)
{
   int A[row][col];    
      
}

А если размер измерений указать числами

void MxSize(int row=1, int col=1)
{
   int A[1][1];    
      
}

То компилятор пропускает, в чём прикол?

Разработчик как то прокомментирует?

 
Andrey Khatimlianskii:

С какой целью? Запустить авто-оптимизацию на выходных? Тогда подойдет установка таймера из ОнТик на отдалении в несколько минут. Если сработает, значит тики прекратились и можно оптимизировать.

Если для других целей, сформулируйте их.

Нет, не для других целей.

Я не думал что в выходные дни TimeLocal работает и сделал так: на TimeCurrent прибавил несколько часов и проверил день недели. Если это суббота, то начать оптимизацию.

С этим конечно точно определить начало субботы нельзя, поскольку рынок в пятницу или в праздничные дни по разному закрывается.

Также нигде не нашел средство, чтобы определить: рынок закрыт или нет.

 
Petros Shatakhtsyan:

Нет, не для других целей.

Я не думал что в выходные дни TimeLocal работает и сделал так: на TimeCurrent прибавил несколько часов и проверил день недели. Если это суббота, то начать оптимизацию.

С этим конечно точно определить начало субботы нельзя, поскольку рынок в пятницу или в праздничные дни по разному закрывается.

Также нигде не нашел средство, чтобы определить: рынок закрыт или нет.

Пробовали ?

SymbolInfoSessionTrade

или

SymbolInfoInteger(SYMBOL_TRADE_MODE)

Что-то из них помню должно годится

 
Aleksey Mavrin:

Пробовали ?

SymbolInfoSessionTrade

или

SymbolInfoInteger(SYMBOL_TRADE_MODE)

Что-то из них помню должно годится

Нет, не пробовал. В справочнике конкретно не написано как определить рынок открыт или нет.

Дело в том, что когда в понедельник рынок "открывается", например у одного брокера котировки начинаются приходить 02ч.05 минут, но сделки не принимаются еще несколько минут, выдает "Market closed".

Не знаю вот это поможет или нет.

SYMBOL_START_TIME

Дата начала торгов по инструменту (обычно используется для фьючерсов)

 
Petros Shatakhtsyan:

Нет, не пробовал. В справочнике конкретно не написано как определить рынок открыт или нет.

Дело в том, что когда в понедельник рынок "открывается", например у одного брокера котировки начинаются приходить 02ч.05 минут, но сделки не принимаются еще несколько минут, выдает "Market closed".

Не знаю вот это поможет или нет.

SYMBOL_START_TIME

Дата начала торгов по инструменту (обычно используется для фьючерсов)

нет это не оно, SymbolInfoSessionTrade же  и показывает когда торги а SymbolInfoSessionQuote когда котировки приходят. в праздники только проверять надо, не проверял.

ап: вот это должно помочь

bool  IsTradeAllowed(
  const string symbol       // символ
  datetime     tested_time  // время
   );

Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman:

Как всегда велосипеды.

Тут вопрос, почему не проходит такая запись.
Ведь переменные из параметров, имеют начальные значения.

А если размер измерений указать числами

То компилятор пропускает, в чём прикол?

Разработчик как то прокомментирует?

Роман, вы второй раз попадаете на элементарном нежелании почитать документацию.

Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов массива начинается с 0. Последний элемент одномерного массива имеет номер на 1 меньший, чем размер массива, то есть обращение к последнему элементу массива из 50 целых чисел будет выглядеть как a[49]. То же самое относится и к многомерным массивам – индексация одного измерения производится от 0 до размер измерения-1. Последний элемент двумерного массива из примера будет выглядеть как m[6][49].

Статические массивы не могут быть представлены в виде таймсерий, то есть к ним не применима функция ArraySetAsSeries(), которая устанавливает доступ к элементам массива от конца массива к его началу. Если требуется обеспечить доступ к массиву как в таймсериях, используйте объект динамического массива.

При доступе за пределы массива исполняющая подсистема сгенерирует критическую ошибку и выполнение программы будет остановлено.

А в документации mql4, если мне память не совсем изменила было, чётко сказано о недопустимости применения переменных в качестве размера массива.

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Переменные должны быть объявлены перед их использованием. Для идентификации переменных используются уникальные имена. Описания переменных используются для их определения и объявления типов. Описание не является оператором. Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов...
 
Roman:

Как всегда велосипеды.

Тут вопрос, почему не проходит такая запись.
Ведь переменные из параметров, имеют начальные значения.

А если размер измерений указать числами

То компилятор пропускает, в чём прикол?

Разработчик как то прокомментирует?

Я не разработчик, но прокомментирую.

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

Сколько памяти должен выделить компилятор, если row и col во время компиляции неизвестно?

Начальные значения используются только, если при вызове параметры опущены. Реальные параметры известны только во время выполнения.

Так что, никаких приколов, учите язык.

 
Aleksey Mavrin:

нет это не оно, SymbolInfoSessionTrade же  и показывает когда торги а SymbolInfoSessionQuote когда котировки приходят. в праздники только проверять надо, не проверял.

ап: вот это должно помочь

bool  IsTradeAllowed(
  const string symbol       // символ
  datetime     tested_time  // время
   );

Думаю что это не то. Вот тут есть специальная тема : https://www.mql5.com/ru/forum/40295

Не посмотрел до конца, тем более что это для MQL4.

Я думаю что сервер не должен отправить котировки символа, если рынок закрыт

На мой робот это не очень-то влияет, поскольку после "открытия" рынка, когда приходят тики, он анализирует тренд, их развороты, а для этого необходимо некоторое время. За это время рынок открывается.

Но это мешает, если мы хотим в это время вручную совершить какие-то сделки. И если исполнение рыночное, то запрос висит, пока не откроется рынок и естественно исполняется с текущей цены.

Явно не хватает прямая функция, которая получила-бы имя символа и вернула true/false, (рынок открыт/закрыт).

Как правильно выяснить, что рынок закрыт? (mql4)
Как правильно выяснить, что рынок закрыт? (mql4)
  • 2015.01.31
  • www.mql5.com
Перевел советника в режим работы OnTimer() теперь когда рынок закрыт он этого не понимает и пытается торговать, в общем обращается к серверу и естественно получает ошибки и забивает логи журнала.
Причина обращения: