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

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


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

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

нехватка знаний работы с массивами x_x

есть скажем задача: открытия ордера (или другого действия) по открытию "n"-го бара от линии iМА.

по идеи все должно было выглядеть так:

if ( Open[3]
ну или в таком духе. но что то идет не так и сов открывает, то на 2-м баре - то на 4-м. хотя если задать [0] то все ок, работает по текущему.

надо скорей всего сделать счетчик с Bars. но я не пойму как его слепить.

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

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

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

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

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

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

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

Перейти

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

Перейти

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

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

" ...{ countB++; countS = 0; }
else { countS++; countB = 0; }..."

а чем являются countB и countS, в смысле кой они имеют идентификатор.
double countB = Open[0]; // ?? или,
int countB = Bars; // ??
наверное вы тут считаете отдельно бычьи свечи и отдельно медвежьи?
я так понял вы уже прикрутили, и у вас работает. может покажите в коде или объясните. если не трудно, буду благодарен.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sacred70 ну в принципе понятно . а если сторона движения свечи не важно счетчик такой по идеи:

if ( Open[1] )
countBars++; // или

if(Open>Close) countB++;
if(Open) countS++;
countBS = countB + countS; // ни так, ни так кстати не работает

все равно, не в том суть. проблема что у меня есть условия для запуска счетчика. и наверное именно в том что условие это содержащие одноименную (или схожую) переменную Open[1]. из за чего я так понимаю и сбой. по идеи из предложного и моих потребностей вид должен был быть приблиз-но следующий:

if ( Open[1] {
if (Close[1] > Open[1] )
{ countB++; countS = 0; }
else { countS++; countB = 0; }
}
...
или

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

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

есть скажем задача: открытия ордера (или другого действия) по открытию "n"-го бара от линии iМА.

Может только я не понял... как это n-бар от MA? Время(бары) от пересечения считать или пункты? Может оказаться что и счётчик не нужен...
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте!
Не могу понять, где и что в тесте по мартингейлу сделала не так. Изначально все ордера открываются, модифицируются, закрываются, все идеально. Но в какой-то момент происходит ошибка модификации и на этом все.
Помогите разобраться, пожалуйста.

Martingale_test_4.mq4

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

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

Может только я не понял... как это n-бар от MA? Время(бары) от пересечения считать или пункты? Может оказаться что и счётчик не нужен...



считать бары. первый допустим тот который закрылся после пересечения. "n" заданное количество баров. я думаю нужен счетчик, без него не корректно работает.
мне кажется как то так может должно быть: if(Close[1] но так не работает почему то.
Ссылка на сообщение
Поделиться на другие сайты

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

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


Посмотрите код ошибки. и в Help или сюда


Добавлено: 30-05-2018 18:02:37


Может только я не понял... как это n-бар от MA? Время(бары) от пересечения считать или пункты? Может оказаться что и счётчик не нужен...



считать бары. первый допустим тот который закрылся после пересечения. "n" заданное количество баров. я думаю нужен счетчик, без него не корректно работает.
мне кажется как то так может должно быть: if(Close[1] но так не работает почему то.

Тоже, если понял суть задачи...
Сигнал возникает в том случае, если цена пересекла МА не далее n свечей. Так?
Если-да, то делаете цикл по свечам от 1-ой до n-ой и проверяете было ли пересечение.
В теле цикла цену МА видимо тоже необходимо считать для i-той свечи..
Изменено пользователем usver73
Ссылка на сообщение
Поделиться на другие сайты

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

Посмотрите код ошибки. и в Help или сюда


В журнале выглядит так:

2018.05.30 21:12:18.446 2018.02.02 15:41:04 Martingale (test 4) AUDUSD,H1: OrderModify error 1
2018.05.30 21:12:18.446 2018.02.02 15:41:04 Martingale (test 4) AUDUSD,H1: ошибка модификации ордеров
2018.05.30 21:12:18.446 2018.02.02 15:41:04 Martingale (test 4) AUDUSD,H1: OrderModify error 1
2018.05.30 21:12:18.446 2018.02.02 15:41:04 Martingale (test 4) AUDUSD,H1: ошибка модификации ордеров
2018.05.30 21:12:18.005 2018.01.30 07:55:00 Martingale (test 4) AUDUSD,H1: ордера успешно модифицированы
2018.05.30 21:12:18.005 2018.01.30 07:55:00 Martingale (test 4) AUDUSD,H1: modify #11 buy 1.00 AUDUSD at 0.80620 sl: 0.00000 tp: 0.81287 ok
2018.05.30 21:12:18.005 2018.01.30 07:55:00 Martingale (test 4) AUDUSD,H1: open #11 buy 1.00 AUDUSD at 0.80620 ok
2018.05.30 21:12:17.932 2018.01.26 19:33:35 Martingale (test 4) AUDUSD,H1: open #10 buy 0.50 AUDUSD at 0.81120 tp: 0.81620 ok
2018.05.30 21:12:17.930 2018.01.26 19:33:35 Tester: take profit #9 at 0.81118 (0.81118 / 0.81120)
2018.05.30 21:12:17.930 2018.01.26 19:33:35 Tester: take profit #8 at 0.81118 (0.81118 / 0.81120)
2018.05.30 21:12:17.796 2018.01.25 21:21:44 Martingale (test 4) AUDUSD,H1: ордера успешно модифицированы
2018.05.30 21:12:17.796 2018.01.25 21:21:44 Martingale (test 4) AUDUSD,H1: modify #8 buy 0.50 AUDUSD at 0.80951 sl: 0.00000 tp: 0.81118 ok
Ссылка на сообщение
Поделиться на другие сайты

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

В журнале выглядит так:


не смог воспроизвести Вашу ошибку.
Наиболее часто встречающаяся причина- ненормализация double, но у Вас вроде все нормально.
Попробуйте строку
else Print ("ошибка модификации ордеров");

расширить- запишите № ордера, его цену, ТП, и новый ТП (без приведения DoubleToString).
Еще есть версия (не моя), что битые котировки- попробуйте на другом символе.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Ar4i можно решить вопрос без циклов:
- запоминаем время свечи, но которой было пересечение - datetime dtcross; (на глобальном уровне)
if ( Open[0] MA ) { direct = 0 /*UP*/; dtcross = Time[0]; } // запомнили направление и время пересечения
// для селл направления изменить знаки
- теперь следим за временем (barCount - заданное кол-во баров после пересечения МА) -
if ( direct >= 0 && Time[0] - dtcross > barCount * 60 ) { // здесь код что делать дальше
direct = -1; // после открытия ордеров сбрасываем направление пересечения, т.к. оно отработало }
Ссылка на сообщение
Поделиться на другие сайты

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

Еще есть версия (не моя), что битые котировки- попробуйте на другом символе.



Это происходит на всех символах.
Вот здесь видно:

2018.05.31 16:31:49.831 2018.02.28 15:47:30 Martingale (test 4) USDCHF,H1: OrderModify error 1
2018.05.31 16:31:49.190 2018.02.20 10:09:56 Martingale (test 4) USDCHF,H1: modify #26 sell 0.50 USDCHF at 0.92340 sl: 0.00000 tp: 0.92554 ok
2018.05.31 16:31:49.190 2018.02.20 10:09:56 Martingale (test 4) USDCHF,H1: ордера успешно модифицированы
2018.05.31 16:31:49.190 2018.02.20 10:09:56 Martingale (test 4) USDCHF,H1: modify #27 sell 1.00 USDCHF at 0.92840 sl: 0.00000 tp: 0.92554 ok
2018.05.31 16:31:49.189 2018.02.20 10:09:56 Martingale (test 4) USDCHF,H1: ордера успешно модифицированы
2018.05.31 16:31:49.189 2018.02.20 10:09:56 Martingale (test 4) USDCHF,H1: modify #28 sell 2.00 USDCHF at 0.93340 sl: 0.00000 tp: 0.92554 ok
2018.05.31 16:31:49.189 2018.02.20 10:09:56 Martingale (test 4) USDCHF,H1: open #28 sell 2.00 USDCHF at 0.93340 ok
2018.05.31 16:31:49.112 2018.02.16 21:01:22 Martingale (test 4) USDCHF,H1: ордера успешно модифицированы
2018.05.31 16:31:49.112 2018.02.16 21:01:22 Martingale (test 4) USDCHF,H1: modify #26 sell 0.50 USDCHF at 0.92340 sl: 0.00000 tp: 0.92173 ok
2018.05.31 16:31:49.112 2018.02.16 21:01:22 Martingale (test 4) USDCHF,H1: ордера успешно модифицированы
2018.05.31 16:31:49.112 2018.02.16 21:01:22 Martingale (test 4) USDCHF,H1: modify #27 sell 1.00 USDCHF at 0.92840 sl: 0.00000 tp: 0.92173 ok
2018.05.31 16:31:49.112 2018.02.16 21:01:22 Martingale (test 4) USDCHF,H1: open #27 sell 1.00 USDCHF at 0.92840 ok
2018.05.31 16:31:49.040 2018.02.15 09:39:25 Martingale (test 4) USDCHF,H1: open #26 sell 0.50 USDCHF at 0.92340 tp: 0.91840 ok
2018.05.31 16:31:49.040 2018.02.15 09:39:25 Tester: take profit #25 at 0.92342 (0.92340 / 0.92342)
2018.05.31 16:31:49.012 2018.02.14 20:24:54 Martingale (test 4) USDCHF,H1: open #25 sell 0.50 USDCHF at 0.92842 tp: 0.92342 ok
2018.05.31 16:31:49.012 2018.02.14 20:24:54 Tester: take profit #24 at 0.92844 (0.92842 / 0.92844)
2018.05.31 16:31:48.935 2018.02.13 09:54:56 Martingale (test 4) USDCHF,H1: open #24 sell 0.50 USDCHF at 0.93344 tp: 0.92844 ok
2018.05.31 16:31:48.935 2018.02.13 09:54:56 Tester: take profit #23 at 0.93346 (0.93344 / 0.93346)
2018.05.31 16:31:48.935 2018.02.13 09:54:56 Tester: take profit #22 at 0.93346 (0.93344 / 0.93346)
2018.05.31 16:31:48.935 2018.02.13 09:54:56 Tester: take profit #21 at 0.93346 (0.93344 / 0.93346)
2018.05.31 16:31:48.935 2018.02.13 09:54:56 Tester: take profit #20 at 0.93346 (0.93344 / 0.93346)


Открываем 24, ставим тэйк-профит. Открываем 25, ставим тэйк-профит. Открываем 26. Открываем 27, модифицируем. Модифицируем 26. Открываем 28, модифицируем. Еще раз модифицируем 27. Еще раз модифицируем 26.
Вот что-то на 24-25 ордере? Потому что 26-й тоже открывается на 0,5, и группа 26-27-28 отрабатывает нормально. Но из-за 24-25 - сбой.
До 24-го ордера все отработало идеально, а потом ошибка. Плавающая, на разных парах сбой происходит на разных ордерах. Не понимаю ( Изменено пользователем Юлия-Julik
Ссылка на сообщение
Поделиться на другие сайты

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

Плавающая, на разных парах сбой происходит на разных ордерах. Не понимаю (


Подозрение на ошибку, когда советник пытается установить ТП ордена по той же цене, что OrderTakeProfit.
machine Вам предложил добавить проверку, чтобы это исключить.
Я предложил сделать Print() при возникновении ошибки, чтобы видеть, какие параметры передаются в функцию модификации. Предполагал ту же ошибку.
Ссылка на сообщение
Поделиться на другие сайты

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

Вот что-то на 24-25 ордере? Потому что 26-й тоже открывается на 0,5, и группа 26-27-28 отрабатывает нормально. Но из-за 24-25 - сбой.
До 24-го ордера все отработало идеально, а потом ошибка. Плавающая, на разных парах сбой происходит на разных ордерах. Не понимаю (

Почему Вы думаете что ошибка из-за 24 и 25 ордера? Они давно закрыты и забыты.
Ошибка возникает через 8 дней (по тестеру) после последней модификации. Что там в сове, может доп. условия закрытия, кроме ТП есть?
Ссылка на сообщение
Поделиться на другие сайты

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

Что там в сове, может доп. условия закрытия, кроме ТП есть?



Советник стандартный, буква в букву, знак в знак по видеоуроку. Предполагаю, что буква в букву, переписывала 2 раза: в первый раз возникали те же ошибки, поэтому еще раз переписала, думала, где-то ошиблась, в циклах, знаках.

Добавлено: 31-05-2018 15:22:15

Я предложил сделать Print() при возникновении ошибки, чтобы видеть, какие параметры передаются в функцию модификации. Предполагал ту же ошибку.


Да, сделаю

Добавлено: 01-06-2018 09:11:20

Подозрение на ошибку, когда советник пытается установить ТП ордена по той же цене, что OrderTakeProfit.



Всем спасибо, разобралась. Ошибка вылетает, потому что на счету заканчиваются деньги. Я начинаю тест с 1 лота, а не с 0,1. Попробую на 0,1 Изменено пользователем Юлия-Julik
Ссылка на сообщение
Поделиться на другие сайты

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

Ошибка вылетает, потому что на счету заканчиваются деньги. Я начинаю тест с 1 лота, а не с 0,1. Попробую на 0,1


честно говоря, странно... Если денег мало, то будет ошибка 134. Я б на Вашем месте докопался до причины Err 1.
Ссылка на сообщение
Поделиться на другие сайты

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

0ll

можно решить вопрос без циклов



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

0ll_MA_.mq4

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

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

Если денег мало, то будет ошибка 134



Да, еще посмотрю. Но пока это самая вероятная версия.


2018-06-01_11-58-32.jpg

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

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


0ll

можно решить вопрос без циклов



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

Надеюсь 0ll меня простит... :)
У Вас в 66 строке как минимум ошибка:
   if ( direct >= 0 && Time[0] - dtcross > barCount *60)

Time[0] - dtcross- надо в скобки окружить...
Дальше не смотрел


Добавлено: 01-06-2018 16:38:14


Если денег мало, то будет ошибка 134



Да, еще посмотрю. Но пока это самая вероятная версия.
Вот не понял Ваш посыл...
ИМХО -если в сове есть ошибка и есть мысли, где она образуется, то в этом месте ставим
  
if(Error != GetLastError()) Print(__FUNCTION__ , ":XXX line Error ",Error,": ",ErrorDescription(Error));

Выдрано из кода...
Смысл- поймать строку , где генерится ошибка..

Всем(особенно 0ll)- кроме Print , есть дебагер в mql? Изменено пользователем usver73
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

:d

Надеюсь 0ll меня простит...
У Вас в 66 строке как минимум ошибка:
Код: [Выделить]
if ( direct >= 0 && Time[0] - dtcross > barCount *60)
Time[0] - dtcross- надо в скобки окружить...

Ладно, прощу в этот раз... :d
Согласно "Приоритеты и порядок операций" mql, операция вычитания выше чем операции сравнения.
Так что нет там ошибки, ошибка есть в моём посте: вместо barCount *60, надо barCount *_Period * 60, а то действительно для М1 получилось.
Вы на словах опишите условия открытия и закрытия - а то я не понял.

ПС: дебаггер вроде-бы есть, но заставить его работать не смог, сам принты ставлю. Изменено пользователем 0ll
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Согласно "Приоритеты и порядок операций" mql, операция вычитания выше чем операции сравнения.


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

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

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

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

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

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

Войти

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

Войти

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


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

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