Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Подскажите как в скрипте сделать так чтобы он исполнился при наступлении определенных условий. Например ждал когда пересекутся машки и после этого открыл ордер. Спасибо. 

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
15 минут назад, Partorius сказал:

Подскажите как в скрипте сделать так чтобы он исполнился при наступлении определенных условий.

по сути можно сделать цикл while пока не подойдет нужное условие, но в этом мало смысла, потому что такой скрипт надолго зависнет на графике и будет крутить до победного. 
Проще сделать индикатор, который будет каждый тик проверять ваше условие и когда оно произойдет - выполнит свое действие, поставит флаг о том, что больше его не нужно выполнять и перейдет в режим ожидания. Либо вместо ожидания можно попробовать после действия удалить этот индикатор с графика ChartIndicatorDelete

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 минуты назад, Rever27 сказал:

по сути можно сделать цикл while пока не подойдет нужное условие, но в этом мало смысла, потому что такой скрипт надолго зависнет на графике и будет крутить до победного. 
Проще сделать индикатор, который будет каждый тик проверять ваше условие и когда оно произойдет - выполнит свое действие, поставит флаг о том, что больше его не нужно выполнять и перейдет в режим ожидания. Либо вместо ожидания можно попробовать после действия удалить этот индикатор с графика ChartIndicatorDelete

Ну надолго вряд ли, все равно рано или поздно машки пересекутся, тем более речь идет о минутном графике. Попробую с циклом while. 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
18 минут назад, Rever27 сказал:

по сути можно сделать цикл while пока не подойдет нужное условие, но в этом мало смысла, потому что такой скрипт надолго зависнет на графике и будет крутить до победного. 
Проще сделать индикатор, который будет каждый тик проверять ваше условие и когда оно произойдет - выполнит свое действие, поставит флаг о том, что больше его не нужно выполнять и перейдет в режим ожидания. Либо вместо ожидания можно попробовать после действия удалить этот индикатор с графика ChartIndicatorDelete

Возникла проблема, если бы было одно условие, допустим любое пересечение машек, тогда понятно по циклу while, но мне надо проверять два условия, например если пересеклись две МА и быстрая выше медленной то открыть ордер в бай, если наоборот то в селл, пока пересечений нет соответственно скрипт ждет.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
29 минут назад, Rever27 сказал:

по сути можно сделать цикл while пока не подойдет нужное условие, но в этом мало смысла, потому что такой скрипт надолго зависнет на графике и будет крутить до победного. 
Проще сделать индикатор, который будет каждый тик проверять ваше условие и когда оно произойдет - выполнит свое действие, поставит флаг о том, что больше его не нужно выполнять и перейдет в режим ожидания. Либо вместо ожидания можно попробовать после действия удалить этот индикатор с графика ChartIndicatorDelete

Такое написание будет корректно:

while ((MAfast2 > MAslow2 && MAfast > MAslow) || (MAfast2 < MAslow2 && MAfast < MAslow )

    {

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

    }

     if (MAfast2 > MAslow2 && MAfast < MAslow2)
        {
         открываем ордер в селл
        } 
       
       if (MAfast2 < MAslow2 && MAfast > MAslow2)
        {
          открываем ордер в бай
        } 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 минуты назад, Partorius сказал:

Такое написание будет корректно:

Можно сделать таким образом.

Но я повторюсь, это не совсем корректно, правильнее кинуть индикатор, который ничем вам не будет мешать и будет обновлять данные каждый тик, а лучше каждый раз после закрытия свечи, чтобы получить нужные данные о показателях МА, при ТФ М1 он будет брать данные МАшек раз в минуту и при соблюдении условий - открывать ордер, активировать флаг о прекращении расчета и уходить в ждущий решим. Можно и информацию в коммент выдавать о значениях МАшек и другую информацию.

Цикл же гоняется каждую милисекунду ваш код, обращаясь к индикатору постоянно, что сделает нагрузку на терминал и не факт, что он завершится когда вам нужно, а не тогда, когда терем зависнет.

   bool exit_loop = false;
   while (!exit_loop && !IsStopped()) {
      MAfast2 = ...
      MAslow2 = ...
     if (MAfast2 > MAslow2 && MAfast < MAslow2)
        {
         
         //открываем ордер в селл
         exit_loop = true;
        } 
       
       if (MAfast2 < MAslow2 && MAfast > MAslow2)
        {
          //открываем ордер в бай
          exit_loop = true;
        } 
   }

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, Rever27 сказал:

Можно сделать таким образом.

Но я повторюсь, это не совсем корректно, правильнее кинуть индикатор, который ничем вам не будет мешать и будет обновлять данные каждый тик, а лучше каждый раз после закрытия свечи, чтобы получить нужные данные о показателях МА, при ТФ М1 он будет брать данные МАшек раз в минуту и при соблюдении условий - открывать ордер, активировать флаг о прекращении расчета и уходить в ждущий решим. Можно и информацию в коммент выдавать о значениях МАшек и другую информацию.

Цикл же гоняется каждую милисекунду ваш код, обращаясь к индикатору постоянно, что сделает нагрузку на терминал и не факт, что он завершится когда вам нужно, а не тогда, когда терем зависнет.


   bool exit_loop = false;
   while (!exit_loop && !IsStopped()) {
      MAfast2 = ...
      MAslow2 = ...
     if (MAfast2 > MAslow2 && MAfast < MAslow2)
        {
         
         //открываем ордер в селл
         exit_loop = true;
        } 
       
       if (MAfast2 < MAslow2 && MAfast > MAslow2)
        {
          //открываем ордер в бай
          exit_loop = true;
        } 
   }

 

С индикатором, мне не понятно что с ним дальше делать после того как он отработал и открыл сделки. Мне надо чтобы он как в скрипте сделал свое дело один раз и удалился. Просто смысл в том чтобы увидев на рынке подходящие условия кинул скрипт (ну или индикатор) который ждет соблюдения условий входа в сделку (в данном случае пересечение машек) открывает ордер и заканчивает работу (удаляется). Потом опять если на рынке сложилась необходимая ситуация опять кидаем скрипт (индикатор) и все повторяется. Как то так.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
9 минут назад, Partorius сказал:

С индикатором, мне не понятно что с ним дальше делать

Вот пример:
Данные обновляются каждый тик. Если нужно 1 раз после закрытия свечи, то строки с Update_Time нужно раскомментировать.

Далее идет сравнение условий, если все окей, то открывается ордер и флаг condition становится true. Если флаг стал тру, то индикатор удаляется.

test.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
3 минуты назад, Rever27 сказал:

Вот пример:
Данные обновляются каждый тик. Если нужно 1 раз после закрытия свечи, то строки с Update_Time нужно раскомментировать.

Далее идет сравнение условий, если все окей, то открывается ордер и флаг condition становится true. Если флаг стал тру, то индикатор удаляется.

test.mq4 4 \u043a\u0411 · 0 загрузок

Спасибо попробую

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 часа назад, Rever27 сказал:

Вот пример:
Данные обновляются каждый тик. Если нужно 1 раз после закрытия свечи, то строки с Update_Time нужно раскомментировать.

Далее идет сравнение условий, если все окей, то открывается ордер и флаг condition становится true. Если флаг стал тру, то индикатор удаляется.

test.mq4 4 \u043a\u0411 · 1 загрузка

Что то у меня индикатор ордера не открывает пишет ошибку "2020.05.08 20:08:58.126    Custom indicator 'Индикатор': OrderSend function cannot be called from a custom indicator"

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 часа назад, Rever27 сказал:

Вот пример:
Данные обновляются каждый тик. Если нужно 1 раз после закрытия свечи, то строки с Update_Time нужно раскомментировать.

Далее идет сравнение условий, если все окей, то открывается ордер и флаг condition становится true. Если флаг стал тру, то индикатор удаляется.

test.mq4 4 \u043a\u0411 · 1 загрузка

Я так понимаю индикатор не может открывать ордера?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@Partorius @Rever27 Приветствую! Кто то по забыл, что торговый действия доступны только в советниках и скриптах.

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 минуту назад, MikR0ReR сказал:

@Partorius @Rever27 Приветствую! Кто то по забыл, что торговый действия доступны только в советниках и скриптах.

Вот про это я и говорю, тогда не понятно как реализовать то что я хочу

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
43 минуты назад, MikR0ReR сказал:

Кто то по забыл, что торговый действия доступны только в советниках и скриптах.

Забыл, что ордера нельзя открывать, но модифицировать и закрывать индикатор может.
Ну значит вместо индикатора нужно сделать советник, вместо ChartIndicatorDelete поставить ExpertRemove();

Изменено пользователем Rever27
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем привет! Подскажите, почему Мартин не работает? Ошибок нет, но открывает только одну сделку.

 

 

 

 

DZ4.mq4

Изменено пользователем Alex Sol
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 26.05.2020 в 17:15, Alex Sol сказал:

Всем привет! Подскажите, почему Мартин не работает? Ошибок нет, но открывает только одну сделку.

 

 

DZ4.mq4 14 \u043a\u0411 · 3 загрузки

Привет! Поправил в циклах условие, должно быть i>=0.

DZ4.mq4

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 26.05.2020 в 14:15, Alex Sol сказал:

Ошибок нет, но открывает только одну сделку.

В строчке 218 должно быть i>=0 
Сейчас код пропускает первый ордер из расчета. 

з.ы. Чтобы самостоятельно найти ошибку нужно по всему коду расставить надпись Print. Допустим такого вида 

Print(__FUNCTION__ + 218);

Тогда можно сразу узнать, в какой функции этот принт сработал. цифры 218 обозначают строчку, где этот принт вызван. Из-за того, что числа не переведены в стринг при компиляции всегда можно найти где эти принты и удалить их, чтобы после решения проблемы не было лишних записей в журнал. Вместо номера строчки можно просто писать 1,2,3 в каждом принте, лишь бы они отличались. Если принта №3 нет, значит ошибка между 2 и 3 принтом.

  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Приветствую!
Ребята, подскажите пожалуйста, как мне к буферам индикатора (прикрепил) привязать советника, чтобы открывал бай, если гистограмма ваше нуля и продавал, соответствено, если ниже. 
Заранее спасибо! :)Fisher_Yur4ik_2.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@Svob в Вашем индикаторе 2 буфера: в 1-м зелёные столбики, в 2-м - красные.

Условие на продажу выглядит так: if ( fiser1 == EMPTY ) //зелёных столбиков нет - продаём! 

на покупку if ( fisher2 == EMPTY )

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
11 часов назад, 0ll сказал:

@Svob в Вашем индикаторе 2 буфера: в 1-м зелёные столбики, в 2-м - красные.

Условие на продажу выглядит так: if ( fiser1 == EMPTY ) //зелёных столбиков нет - продаём! 

на покупку if ( fisher2 == EMPTY )

Спасибо! Получилось, правда, не очень. Советник не открывает сделки. Поможете разобраться
Код прикрепил.RomRenko_v7.mq4

 

Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано

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

Несколько общий вопрос...

Довольно часто выключается терминал. После включения советник не "видит" сделки, которые были набраны до отключения.

Вопрос: Как добиться, чтобы советник не терял сделки свои сделки, вне зависимости от внешних факторов.?

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@Владимир Стариков  сделки открытые или закрытые? может закрытые во время выключения терминала? Как Вы поняли что советник их потерял?

В общем существует несколько способов сохранения или восстановления информации, какой способ выбрать зависит от советника - какая информация ему нужна для нормальной работы.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
14 минут назад, 0ll сказал:

@Владимир Стариков  сделки открытые или закрытые? может закрытые во время выключения терминала? Как Вы поняли что советник их потерял?

В общем существует несколько способов сохранения или восстановления информации, какой способ выбрать зависит от советника - какая информация ему нужна для нормальной работы.

Как Вы поняли что советник их потерял? - после запуска терминала на инфо панели не отображается информация про открытые ордера. Кнопки робота не закрывают открытые ордера.

Очень важно иметь актуальну информацию про открытые ордера.

Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...