Ваши вопросы по языку MQL4

vladradon

Программист
А обхитрить компилятор, переименовав файл с расширением, например, txt, - прокатит? По сути tpl - это же обычная текстовка.
Переименовывать ничего не нужно, это текстовый файл, все верно.

Набросал по-быстрому индикатор чтения данных из текстового файла. Использовал один из шаблонных файлов для теста (см. скрины). Он находит все строки с прописанными уровнями либо во всем файле, если не прописано имя нужного индикатора, либо только уровни этого индикатора. Файл должен лежать в папке MQL4\Files (стандартно). Написал чисто для эксперимента. Осталось придумать как перенести (скопировать) файл шаблона в папку Files автоматически...
 

Вложения

  • TLW.png
    TLW.png
    30,3 КБ · Просмотры: 30
  • TLW1.png
    TLW1.png
    7 КБ · Просмотры: 29
  • FindLevels.mq4
    2,6 КБ · Просмотры: 19

AlexeyVik

Программист mql4 mql5
А обхитрить компилятор, переименовав файл с расширением, например, txt, - прокатит? По сути tpl - это же обычная текстовка.
Проблема не в имени или расширении файла, а в расположении.
Чтобы прочесть файл без WinAPI надо просто сохранить файл в папке /files/ функцией ChartSaveTemplate и прочесть этот файл функцией FileLoad в массив типа ushort и потом массив перевести в строку, найти индикатор по имени, дальше найти уровень и перевести полученную строку в число типа double
Как-то так.
Можно конечно и руками сохранить шаблон в песочницу, но это будет куцая программа…
 

ИванМН

Местный знаток
Резюме: короче, надо записывать и потрошить шаблон. Спасибо всем за ответы и участие.
 

scolfield

Интересующийся
Всем привет! Хочу получать OHCLV. Запускаю на демосчете следующий код (см. ниже) Но в самом терминале после запуска срипта выводятся только 0. Судя по всему демосчет отстает на пару часов. Я опробовал все возможные значения 2-го и 3-го параметров в функциях OHCLV. Но результат тот же - только нули. В чем может быть проблема ?

#property copyright "Copyright 2023, CryptoPred"
#property link ""
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
int ExtHandle=-1;
void OnStart()
{
datetime lastTradeTime = 0;
while(!IsStopped())
{
if (TimeCurrent() - lastTradeTime >= 10)
{
// Get the current OHLCV data for the symbol
double open = iOpen("EURUSD", PERIOD_H1, -4);
double high = iHigh("EURUSD", PERIOD_H1, -4);
double close = iClose("EURUSD", PERIOD_H1, -4);
double low = iLow("EURUSD", PERIOD_H1, -4);
int volume = (int)iVolume("EURUSD", PERIOD_H1, -4);

// Place your trading logic here

GetLastError();
// Update the last trade time
lastTradeTime = TimeCurrent();
}
}
}

void OnDeinit(const int reason)
{
//---
if(ExtHandle>=0)
{
FileClose(ExtHandle);
ExtHandle=-1;
}
//---
}
 

Cash2020

Активный участник
Всем привет! Хочу получать OHCLV. Запускаю на демосчете следующий код (см. ниже) Но в самом терминале после запуска срипта выводятся только 0. Судя по всему демосчет отстает на пару часов. Я опробовал все возможные значения 2-го и 3-го параметров в функциях OHCLV. Но результат тот же - только нули. В чем может быть проблема ?
Проверяйте.
 

Вложения

  • GetData.mq4
    3,8 КБ · Просмотры: 10
  • GetData.PNG
    GetData.PNG
    25,2 КБ · Просмотры: 80

mobidik

-----
Класс. Спасибо. Выходит нужно было всего лишь вместо "EURUSD" поставить NULL. Но тогда вопрос, как скрипт понимает, какую валютную пару мы хотим запросить ?
На свой вопрос, Вы найдете ответ в справке, а вот почему у Вас указан четвертый бар со знаком минус - вот над этим задумайтесь.
 

MERFY

Местный житель
Добрый день!
Коллеги, подскажите по коду, как в режиме оптимизации/тестирования исключить в МТ4 интервал котировок по дате, к примеру за 2-3 месяца, чтобы тестер просто перепрыгивал данный интервал и далее продолжал процесс тестирования/оптимизации?
 

ИванМН

Местный знаток
Добрый день!
Коллеги, подскажите по коду, как в режиме оптимизации/тестирования исключить в МТ4 интервал котировок по дате, к примеру за 2-3 месяца, чтобы тестер просто перепрыгивал данный интервал и далее продолжал процесс тестирования/оптимизации?
Мерфи, ну это вообще первый класс, вторая четверть.
C-подобный:
sinput datetime StartSkipping = D'01.01.2023', StopSkipping = D'01.03.2023';
...
void OnTick()
{
   if ((IsTesting() || IsOptimization()) && TimeCurrent() > StartSkipping && 
      TimeCurrent() < StopSkipping)
      return;
   ....
}
 

MERFY

Местный житель
Мерфи, ну это вообще первый класс, вторая четверть.
C-подобный:
sinput datetime StartSkipping = D'01.01.2023', StopSkipping = D'01.03.2023';
...
void OnTick()
{
   if ((IsTesting() || IsOptimization()) && TimeCurrent() > StartSkipping &&
      TimeCurrent() < StopSkipping)
      return;
   ....
}
Писал свой код не в OnTick, а в OnTester ... И там не работал он. завтыкал ))). Спасибо.
 
Последнее редактирование:

scolfield

Интересующийся
На свой вопрос, Вы найдете ответ в справке, а вот почему у Вас указан четвертый бар со знаком минус - вот над этим задумайтесь.
В справке я прочитал, что NULL в - это значит текущий символ iOpen(NULL, PERIOD_H1, 0). Но вопрос о том, где и как устанавливается этот текущий символ, остается открытым.
И еще, почему все таки, если символ указать принудительно, не NULL, а EURUSD - то опять возвращаются 0 ?
 

ИванМН

Местный знаток
В справке я прочитал, что NULL в - это значит текущий символ iOpen(NULL, PERIOD_H1, 0). Но вопрос о том, где и как устанавливается этот текущий символ, остается открытым.
И еще, почему все таки, если символ указать принудительно, не NULL, а EURUSD - то опять возвращаются 0 ?
🤦‍♂️🤦‍♂️🤦‍♂️🤦‍♂️🤦‍♂️ это уже даже не первый класс, а что-то перед ним........
Дорогой Сколфилд, рекомендую прочитать справку от начала до конца максимально тщательно, прилежно и вдумчиво.
Наверное, Вы будете удивлены, но текущий символ единовластно и самочинно выбираете лично Вы в тот самый момент, когда накидываете скрипт, индюк или советник на график валютной пары. Или когда выбираете её в соответствующем месте в тестере. Вот та самая пара и становится текущим символом.
А 0 возвращается оттого, что при всём желании Вам помочь, ни скрипт, ни тестер не в состоянии заглянуть на четыре бара вперёд в будущее, а именно туда Вы и приказываете скрипту заглянуть, используя отрицательное значение. Далее читаем вводную к разделу "Доступ к таймсериям и данным индикаторов".
 

scolfield

Интересующийся
Всем привет!
Ну сейчас, надеюсь, задам вопрос уже из 3-ей четверти 1-го класса :)
Создал простенький советник по одному из youtube примеров:
void OnTick()
{
double ma_1,ma_2;

ma_1= iMA(NULL, 0,17,0,MODE_SMMA, PRICE_MEDIAN, 1);
ma_2= iMA(NULL, 0,17,0,MODE_SMMA, PRICE_MEDIAN, 2);

if (ma_1>ma_2 && OrdersTotal()==0)
OrderSend(Symbol(), OP_BUY, 1, Ask, 0, Ask-1000*Point, Ask+2000*Point, "My test order buy", 0,0, clrGreen);

if (ma_1>ma_2 && OrdersTotal()==0)
OrderSend(Symbol(), OP_SELL, 1, Bid, 0, Bid+1000*Point, Bid-2000*Point, "My test order sell", 0,0, clrRed);
}

Запускаю тест этого советника в терминале:
1686138162238.png

и далее не происходит ничего. Результаты, отчет, график - все пусто. На визуализации соответственно тоже ничего не двигается.

В чем может быть проблема ?
 

scolfield

Интересующийся
Ну изначально проблема в том что оба условия одинаковые ))), а действия по ним предполагаются разные ))). Ну и там так с наскоку так НЕ РАБОТАЕТ ВСЁ )), уже говорил много раз, перед тем как задавать вопросы и что-то пытаться писать нужно хотя-бы изучить справку, ну вот правда вот... )
хорошо, пойду справку читать))
Еще короткий вопрос. Мне нужно получать OHCLV по 20-минуткам. А в MQL4 - их нет. Есть только в MQL5. А он как я понял не состыкован с Финам Форекс, который я выбрал для своих экспериментов. Я правильно понимаю, что если мне нужны 20-минутки, то единственный вариант - это смена брокера ?
 

mobidik

-----
Всем привет!
Ну сейчас, надеюсь, задам вопрос уже из 3-ей четверти 1-го класса :)
Создал простенький советник по одному из youtube примеров:
void OnTick()
{
double ma_1,ma_2;

ma_1= iMA(NULL, 0,17,0,MODE_SMMA, PRICE_MEDIAN, 1);
ma_2= iMA(NULL, 0,17,0,MODE_SMMA, PRICE_MEDIAN, 2);

if (ma_1>ma_2 && OrdersTotal()==0)
OrderSend(Symbol(), OP_BUY, 1, Ask, 0, Ask-1000*Point, Ask+2000*Point, "My test order buy", 0,0, clrGreen);

if (ma_1>ma_2 && OrdersTotal()==0)
OrderSend(Symbol(), OP_SELL, 1, Bid, 0, Bid+1000*Point, Bid-2000*Point, "My test order sell", 0,0, clrRed);
}

Запускаю тест этого советника в терминале:
Посмотреть вложение 512272

и далее не происходит ничего. Результаты, отчет, график - все пусто. На визуализации соответственно тоже ничего не двигается.

В чем может быть проблема ?
Ф-ция OrderSend() должна вернуть результат, раньше проходило так как Вы написали, а сейчас нужно что-то делать с этим результатом. Присвойте её результат какой-то переменной или выполните какое-то условие.
 

ZenFX

Почетный гражданин
и далее не происходит ничего. Результаты, отчет, график - все пусто. На визуализации соответственно тоже ничего не двигается.

В чем может быть проблема ?
Это всё слишком "хитро" написано. Ничего не происходит потому что депозит маленький стоит, а объем лота 1, скорее всего как-то так. Смотреть в журнале надо что там пишет прежде всего ).

Боюсь что это будет НЕПОСИЛЬНАЯ задача, посчитать 20 минутки, да и с MQL5 разобраться тоже...
 
Последнее редактирование:

scolfield

Интересующийся
Ф-ция OrderSend() должна вернуть результат, раньше проходило так как Вы написали, а сейчас нужно что-то делать с этим результатом. Присвойте её результат какой-то переменной или выполните какое-то условие.
нашел в чем косяк. Условие while(!IsStopped()) все стопарило на себе. Не помню уже, зачем я его добавлял. Но в общем без него все успешно тестируется! До кнопки "Бабло" конечно еще далеко, но первый шаг сделан))
 

scolfield

Интересующийся
Это всё слишком "хитро" написано. Ничего не происходит потому что депозит маленький стоит, а объем лота 1, скорее всего как-то так. Смотреть в журнале надо что там пишет прежде всего ).

Боюсь что это будет НЕПОСИЛЬНАЯ задача, посчитать 20 минутки, да и с MQL5 разобраться тоже...
не совсем понял. А в чем непосильность по расчету 20-минуток ? И какая разница с чем разбираться с mql4 или mql5 - если и то, и это для меня с чистого листа :)
 

ZenFX

Почетный гражданин
Мне нужно получать OHCLV по 20-минуткам. А в MQL4 - их нет.
Как вариант в интернетах поискать, или даже здесь по форуму, советники или индикаторы которые там нестандартные таймфреймы расчитывают, посмотреть, разобраться как это делается. А почему ничего не происходит, потому что тестер вон на паузе там стоит ).
 
Последнее редактирование:
Верх