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

От xbms, 13 апреля, 2013 в Уголок Программиста

#5951

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

#5952
15 минут назад, Partorius сказал:

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

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

#5953
4 минуты назад, Rever27 сказал:

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

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

#5954
18 минут назад, Rever27 сказал:

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

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

#5955
29 минут назад, Rever27 сказал:

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

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

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

    {

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

    }

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

#5956
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;
        } 
   }

 

#5957
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;
        } 
   }

 

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

#5958
9 минут назад, Partorius сказал:

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

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

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

test.mq45 скач.

#5959
3 минуты назад, Rever27 сказал:

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

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

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

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

#5960
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"

#5961
4 часа назад, Rever27 сказал:

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

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

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

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

#5962

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

#5963
1 минуту назад, MikR0ReR сказал:

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

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

#5964
43 минуты назад, MikR0ReR сказал:

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

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

Изменено 8 мая, 2020 пользователем Rever27

#5965

А продолжение курса есть?

#5967

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

 

 

 

 

DZ4.mq47 скач.

Изменено 26 мая, 2020 пользователем Alex Sol

#5968
В 26.05.2020 в 17:15, Alex Sol сказал:

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

 

 

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

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

DZ4.mq45 скач.

#5969
В 26.05.2020 в 14:15, Alex Sol сказал:

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

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

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

Print(__FUNCTION__ + 218);

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

#5970

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

#5971

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

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

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

#5972
11 часов назад, 0ll сказал:

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

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

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

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

 

#5973

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

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

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

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

 

#5974

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

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

#5975
14 минут назад, 0ll сказал:

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

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

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

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

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

Перейти к списку тем
Форум · 2.0.20260627.0025