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

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

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

Вложения

  • TLW.png
    TLW.png
    30,3 КБ · Просмотры: 31
  • TLW1.png
    TLW1.png
    7 КБ · Просмотры: 30
  • FindLevels.mq4
    FindLevels.mq4
    2,6 КБ · Просмотры: 24
А обхитрить компилятор, переименовав файл с расширением, например, txt, - прокатит? По сути tpl - это же обычная текстовка.
Проблема не в имени или расширении файла, а в расположении.
Чтобы прочесть файл без WinAPI надо просто сохранить файл в папке /files/ функцией ChartSaveTemplate и прочесть этот файл функцией FileLoad в массив типа ushort и потом массив перевести в строку, найти индикатор по имени, дальше найти уровень и перевести полученную строку в число типа double
Как-то так.
Можно конечно и руками сохранить шаблон в песочницу, но это будет куцая программа…
 
Резюме: короче, надо записывать и потрошить шаблон. Спасибо всем за ответы и участие.
 
Всем привет! Хочу получать 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;
}
//---
}
 
Всем привет! Хочу получать OHCLV. Запускаю на демосчете следующий код (см. ниже) Но в самом терминале после запуска срипта выводятся только 0. Судя по всему демосчет отстает на пару часов. Я опробовал все возможные значения 2-го и 3-го параметров в функциях OHCLV. Но результат тот же - только нули. В чем может быть проблема ?
Проверяйте.
 

Вложения

  • GetData.mq4
    GetData.mq4
    3,8 КБ · Просмотры: 13
  • GetData.PNG
    GetData.PNG
    25,2 КБ · Просмотры: 84
Класс. Спасибо. Выходит нужно было всего лишь вместо "EURUSD" поставить NULL. Но тогда вопрос, как скрипт понимает, какую валютную пару мы хотим запросить ?
На свой вопрос, Вы найдете ответ в справке, а вот почему у Вас указан четвертый бар со знаком минус - вот над этим задумайтесь.
 
Добрый день!
Коллеги, подскажите по коду, как в режиме оптимизации/тестирования исключить в МТ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;
   ....
}
 
Мерфи, ну это вообще первый класс, вторая четверть.
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 ... И там не работал он. завтыкал ))). Спасибо.
 
Последнее редактирование:
На свой вопрос, Вы найдете ответ в справке, а вот почему у Вас указан четвертый бар со знаком минус - вот над этим задумайтесь.
В справке я прочитал, что NULL в - это значит текущий символ iOpen(NULL, PERIOD_H1, 0). Но вопрос о том, где и как устанавливается этот текущий символ, остается открытым.
И еще, почему все таки, если символ указать принудительно, не NULL, а EURUSD - то опять возвращаются 0 ?
 
В справке я прочитал, что NULL в - это значит текущий символ iOpen(NULL, PERIOD_H1, 0). Но вопрос о том, где и как устанавливается этот текущий символ, остается открытым.
И еще, почему все таки, если символ указать принудительно, не NULL, а EURUSD - то опять возвращаются 0 ?
🤦‍♂️🤦‍♂️🤦‍♂️🤦‍♂️🤦‍♂️ это уже даже не первый класс, а что-то перед ним........
Дорогой Сколфилд, рекомендую прочитать справку от начала до конца максимально тщательно, прилежно и вдумчиво.
Наверное, Вы будете удивлены, но текущий символ единовластно и самочинно выбираете лично Вы в тот самый момент, когда накидываете скрипт, индюк или советник на график валютной пары. Или когда выбираете её в соответствующем месте в тестере. Вот та самая пара и становится текущим символом.
А 0 возвращается оттого, что при всём желании Вам помочь, ни скрипт, ни тестер не в состоянии заглянуть на четыре бара вперёд в будущее, а именно туда Вы и приказываете скрипту заглянуть, используя отрицательное значение. Далее читаем вводную к разделу "Доступ к таймсериям и данным индикаторов".
 
Всем привет!
Ну сейчас, надеюсь, задам вопрос уже из 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

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

В чем может быть проблема ?
 
Ну изначально проблема в том что оба условия одинаковые ))), а действия по ним предполагаются разные ))). Ну и там так с наскоку так НЕ РАБОТАЕТ ВСЁ )), уже говорил много раз, перед тем как задавать вопросы и что-то пытаться писать нужно хотя-бы изучить справку, ну вот правда вот... )
хорошо, пойду справку читать))
Еще короткий вопрос. Мне нужно получать OHCLV по 20-минуткам. А в MQL4 - их нет. Есть только в MQL5. А он как я понял не состыкован с Финам Форекс, который я выбрал для своих экспериментов. Я правильно понимаю, что если мне нужны 20-минутки, то единственный вариант - это смена брокера ?
 
Всем привет!
Ну сейчас, надеюсь, задам вопрос уже из 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() должна вернуть результат, раньше проходило так как Вы написали, а сейчас нужно что-то делать с этим результатом. Присвойте её результат какой-то переменной или выполните какое-то условие.
 
и далее не происходит ничего. Результаты, отчет, график - все пусто. На визуализации соответственно тоже ничего не двигается.

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

Боюсь что это будет НЕПОСИЛЬНАЯ задача, посчитать 20 минутки, да и с MQL5 разобраться тоже...
 
Последнее редактирование:
Ф-ция OrderSend() должна вернуть результат, раньше проходило так как Вы написали, а сейчас нужно что-то делать с этим результатом. Присвойте её результат какой-то переменной или выполните какое-то условие.
нашел в чем косяк. Условие while(!IsStopped()) все стопарило на себе. Не помню уже, зачем я его добавлял. Но в общем без него все успешно тестируется! До кнопки "Бабло" конечно еще далеко, но первый шаг сделан))
 
Это всё слишком "хитро" написано. Ничего не происходит потому что депозит маленький стоит, а объем лота 1, скорее всего как-то так. Смотреть в журнале надо что там пишет прежде всего ).

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

Посмотрели (406) Посмотреть

Отслеживают (499) Посмотреть

Назад
Верх