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

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

#5126

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

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

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

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

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

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

Изменено 28 мая, 2018 пользователем Ar4i

#5127
Ar4i счетчик свечей расписан на 339 странице этой темы, пост 5072
#5128
Sacred70 честно сказать не очень понял. сильно вырвано для меня из контекста:

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

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

Снимок.JPG

#5130

:-?

Изменено 29 мая, 2018 пользователем Ar4i

#5131
Ar4i

Снимок.JPG

#5132
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; }
}
...
или

не понимаю на вашей картинке кода тоже всего и всяких тайм серий так по напичкано. и что оно работает в тестере? почему у меня тогда нет?
#5133

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

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

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

Martingale_test_4.mq410 скач.

#5135

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



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

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


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


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


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



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

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

Изменено 30 мая, 2018 пользователем usver73

#5137

Посмотрите код ошибки. и в 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
#5138

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


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

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

OrderModify error 1


Нужно проверять перед модификацией

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

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



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

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-го ордера все отработало идеально, а потом ошибка. Плавающая, на разных парах сбой происходит на разных ордерах. Не понимаю (

Изменено 31 мая, 2018 пользователем Юлия-Julik

#5142

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


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

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

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

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



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

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

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


Да, сделаю

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

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



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

Изменено 1 июня, 2018 пользователем Юлия-Julik

#5145

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


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

0ll

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



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

0ll_MA_.mq43 скач.

Изменено 1 июня, 2018 пользователем Ar4i

#5147

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



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


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

#5148


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?

Изменено 1 июня, 2018 пользователем usver73

#5149

:d

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

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

ПС: дебаггер вроде-бы есть, но заставить его работать не смог, сам принты ставлю.

Изменено 1 июня, 2018 пользователем 0ll

#5150

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


да ладно!!!!
Спасибо, не знал.. все время скобки ставил...

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

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