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

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


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

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

Привет! Подскажите как в коде обрисовать ситуацию : есть некий гэп и далее цена проходит определенное расстояние в пунктах.

Гэп - это разница между двумя последовательными тиками. У Вас на картинке гэп пришёлся на начало свечи, но частенько бывает и внутри свечи и на графике его не видно. В советниках можно сделать так:
double lastBid; // на глобальном уровне
if ( lastBid - Bid > gap * _Point ) { ... здесь код для обработки гэпа ... }
lastBid = Bid;
если нужно именно на начало свечи, то надо добавить проверку времени
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

если нужно именно на начало свечи, то надо добавить проверку времени


А если так if close(предыд) - open (текущ) > gap ?

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

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

И как всё-таки можно показать, что цена после прошла X пунктов не закрыв гэп. И вот только тогда идет обработка этого гэпа.


На открытии каждой свечи в цикле смотрите на глубину n-свечей для поиска гэпа.
Если в промежутке n - 0-я свеча был гэп и Open[0] Ну и расстояние можно посчитать как разницу между Open`s
Ссылка на сообщение
Поделиться на другие сайты

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

А если так if close(предыд) - open (текущ) > gap ?
И как всё-таки можно показать, что цена после прошла X пунктов не закрыв гэп. И вот только тогда идет обработка этого гэпа.

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

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

Добрый день!
Помогите плиз разобраться с циклами.
Написал 2 цикла. Первый ищет цену открытия самого первого ордера в рынке. Второй ищет номер тикета этого же первого рыночного ордера. Дальше советник закрывает этот ордер при равенстве цены открытия уровню мувинга. Компиляция ошибку не выдает, а на тестировании появляется ошибка OrderClose Erorr138

Спойлер

//+------------------------------------------------------------------+
double FindFerstOrderPrice(int otype)
{
int oldticket;
double ferstopenprice=0;
ticket=0;
for (int cnt=OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
ticket=oldticket;
ferstopenprice=OrderOpenPrice();
}
}
}
}
return(ferstopenprice);
}
//+------------------------------------------------------------------+
double FindFerstTicket(int otype)
{
int oldticket;
double ferstticket=0;
ticket=0;
for (int cnt=OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
ticket=oldticket;
ferstticket=OrderTicket();
}
}
}
}
return(ferstticket);
}
//+------------------------------------------------------------------+

if(BuyCount()>=1 && SellCount()==0)
{
if (PriceM {
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY && OrderTicket() == FindFerstTicket(OP_BUY))
{
if (OrderClose(OrderTicket(), OrderLots(), Ask, 5, Blue))
Print ("Ордер успешно закрыт");
else Print ("Ошибка закрытия ордера");

}
}
}
}
}

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

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

Братцы! Ну подскажите, очень сильно начинающему програмеру, где нарыть на форуме решение моей занозы в ж... (уверен, где-то есть, найти не могу >D-b

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Chuchundra кнопка должна отсылать евент (событие нажатия) графику и сове, сова должна ловить событие и проверять статус кнопки и делать некое действие. Читайте справку по функциям EventChartCustom и OnChartEvent.

lordsamven Нужно находить ордер и запоминать цену и тикет в одном цикле, Зная тикет можно (и нужно!) выбрать ордер по тикету (читайте справку OrderSelect), при закрытии ордера Бай используйте цену Бид - это же продажа
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Chuchundra кнопка должна отсылать евент (событие нажатия) графику и сове, сова должна ловить событие и проверять статус кнопки и делать некое действие. Читайте справку по функциям EventChartCustom и OnChartEvent.


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

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

Если решения нет - распиши понятнее, можно с картинкой.



после гэпа цена без отката проходит нужное количество пунктов
[SPOILER]
Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо за наводку, буду морщить лоб и разбираться.. А нет ли постов на форуме, где это разжевывается для нубов ?


Читайте здесь

sleturin Ваша задача решается так:
1. Обнаружили гэп. Сохраняем направление, цену открытия и закрытия гэпа и вычисляем цену входа.
2. на каждом тике определяем положение цены, их может быть 3: за гэпом сверху(цена закрыла дырку), внутри от начала гэпа до цены входа, и за ценой входа.
3. Реакция совы на положение цены, их тоже 3: ждём следующий гэп, ждём входа, вход.
Справитесь?
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Справитесь?


Спойлер

double PreCl = iClose(Symbol(), 0, 1);
double PreOp = iOpen(Symbol(), 0, 1);
double CurOp = iOpen(Symbol(), 0, 0);

double nizGap, verhGap, tochkaBuy, tochkaSell;
bool sigbuy=false,sigsell=false;
bool readySell = false, readyBuy = false;

bool white ;

if (PreCl >= PreOp) white = true ;

else

white = false; // черная


if (white == false) {

if ( PreCl > CurOp) {

if ( (PreCl - CurOp) >= mingap * _Point && (PreCl - CurOp) readyBuy = true;
nizGap = CurOp;
verhGap = PreCl;
tochkaBuy = CurOp - prohod * _Point;
}
}

}

if (white == true) {

if ( PreCl
if ( (CurOp - PreCl) >= mingap * _Point && ( CurOp - PreCl) readySell = true;
nizGap =PreCl;
verhGap = CurOp;
tochkaSell = CurOp + prohod * _Point;
}

}

}

if (readyBuy == true && Bid >= verhGap) readyBuy = false;

if (readySell == true && Bid

if (readyBuy == true && Bid
if (readySell == true && Bid >= tochkaSell) {readySell = false; sigsell = true;}



Это даже работает.
Но только тогда, когда проход в X пунктов был на нулевой свече. Сохранить гэп и контролировать ход цены относительно него на последующих свечках хз как. >:d
Ссылка на сообщение
Поделиться на другие сайты

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

Но только тогда, когда проход в X пунктов был на нулевой свече. Сохранить гэп и контролировать ход цены относительно него на последующих свечках хз как.


Извиняюсь, код не разбирал.... Но если про предложение на предыдущей странице:
Зачем сохранять информацию о гэпе?
Она (информация о гэпе) актуальна сколько-то времени( Х свечей)...
Смотрите Х свечей назад (в цикле проверяя MathAbs(Close[Х+1]-Open[Х]) )- был ли гэп...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Сохранить гэп и контролировать ход цены относительно него на последующих свечках хз как.

Нужно просто объявить переменные на глобальном уровне (вне функции ОнТик)
Логика такая: если в переменных записано -1, то ждём гэп, если записаны уровни гэпа, значит ждём отход цены, если цена закрыла гэп или тайм-оут - записываем в переменные -1, и цикл повторяется. На каждой свече переписывать переменные или пытаться найти гэп - ненужно!
Стрелочки рисуются по времени - просто передайте в функцию Time[X_bar]
ПС: вместо iOpen(Symbol(), 0, 0) можно использовать Open[0] - будет быстрее работать.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Нужно просто объявить переменные на глобальном уровне (вне функции ОнТик)


0ll, а если рабочий ТФ >H1, то наверно надо озаботиться о восстановлении переменной после reboot?
Ссылка на сообщение
Поделиться на другие сайты

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

ПС: вместо iOpen(Symbol(), 0, 0) можно использовать Open[0] - будет быстрее работать.


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

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

Нужно просто объявить переменные на глобальном уровне (вне функции ОнТик)

0ll, а если рабочий ТФ >H1, то наверно надо озаботиться о восстановлении переменной после reboot?
Ну это следующий этап, сначала делаем тестерный вариант, а потом, если будет результат, будем заморачиваться ребутами :d

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

Там, где круглые скобки, работать будет медленне в сравнении с квадратными ;)
Круглые скобки - это вызов функции, создание стеков, выделение памяти - куча тактов процессора, а квадратные скобки это просто чтение ячейки массива из памяти. Кстати _Symbol будет быстрее, чем Symbol(). Всё имхо, я внутрь МТ не заглядывал...
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день. Пожалуйста, подскажите по такому моменту: нужно привязать к советнику индикатор зигзаг, он вроде стандартный, но в документации его нет. Получается его цеплять через iCustom? И еще подскажите как в условии прописать направление движения зигзага(например: пересечение МА сверху вниз)?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sacred70 в зигзагах может быть 1 или 2 буфера. В буфер записываются цена вершины или 0 для каждого бара.
Нужно искать ближайшие вершины и вычислять пересечения, или ждать появления новой вершины, но она появляется не на 0 баре! а на каком не известно - придётся на каждом баре смотреть вглубь циклом...
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день.
Перечитал ветку на предмет обсуждения урока 9 по теме"Введение в объекто ориентированное програмирование" (массивы начало можн осказать)
Домашние задание выполнил кроме п.п.3 в котором надо: Создайте отдельно структуру и массив, в котором будет содержаться информация об отложенных ордерах. Выведите информацию(номер тикета,тип ордера, цена) в виде комментария на экран, однако это нужно через функцию, с передачей адреса массива в функцию(аналог ShowInfo).
- итого при выполнении это пункта сделал. Но криво=) почему то при переборе ордеров не выбираться ТОЛЬКО отложные, а фигачит все что есть и те что в рынке. понять не могу в чем проблема. Знаний не хватает.
Если кто от делал этот урок, либо есть готовый пример функции по выбору ОТЛОЖНЫХ ордеров, выведение их в comment и все это в массивах (массив конечно задан в глобальном) поделитесь для изучения самостоятельного.
Свой вариант не выкладываю, потому что не хочу сторонних исправлений, хочу начать доходить своей головой, изучая учебник и примеры..
Спасибо вам за материал=) интересно! и полезно-)

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

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

Но криво=) почему то при переборе ордеров не выбираться ТОЛЬКО отложные, а фигачит все что есть и те что в рынке. понять не могу в чем проблема.


Когда Вы в цикле перебираете ордера, то нужно делать проверку OrderType() >1.т.е. если тип ордера от 2 до 5, значит он отложенный.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Но криво=) почему то при переборе ордеров не выбираться ТОЛЬКО отложные, а фигачит все что есть и те что в рынке. понять не могу в чем проблема.


Когда Вы в цикле перебираете ордера, то нужно делать проверку OrderType() >1.т.е. если тип ордера от 2 до 5, значит он отложенный.

Спасибо! а я делал так. видимо не корректно. if (OrderType()==OP_BUYLIMIT || OrderType()== OP_BUYSTOP|| OrderType()== OP_SELLLIMIT || OrderType()== OP_SELLSTOP)
А еще вопрос, массив можно вывести на печать либо на коммент только поэлементно. то-есть [1], [2] ..[Х] это каждую строку записывать с каждой цифрой или есть более элегантные способы? а то помучается ограничение выводимых строк в комментах. и если например ордеров больше чем я записал. они просто не отобразятся.

p/s/ не помогло. все равно выдает подряд два ордера из 4, при том почему то один берет от ложный а второй в рынке. (но тот что был в рынке он ранее был отложным. может в этом дело?)
Прикрепил файл. Пожалуйста укажите на ошибку. или лучше скажите в какую сторону копать. не хочу просто исправлений они не учат в основном-)

test_9.mq4

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

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

p/s/ не помогло. все равно выдает подряд два ордера из 4, при том почему то один берет от ложный а второй в рынке. (но тот что был в рынке он ранее был отложным. может в этом дело?)

if (OrderType()>=2)

OrdersTD.TicketTD = OrderTicket();
OrdersTD.TypeTD = OrderType();
OrdersTD.OpenPriceTD = OrderOpenPrice();

Последние три строки забыли окружить { }

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


В Comment точно нарветесь на ограничение, а в журнал (Print) вполне можно вывести.
Делаете цикл по массиву (от 0 до ArraySize()-1) и на каждой итерации собираете нужные данные по ордеру в одну строку, типа:
string str = OrdersTD.TicketTD+" "+OrdersTD[1].TypeTD+ " " ....
Print(str);
p.s. Не забудьте привести все типы к string.
Изменено пользователем usver73
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо! заработало, действительно элементарная ошибка в правописании =)
только интересно что под [1] в массиве идет нулевое значение.
И вообще конечно вы правы и Лучше делать вывод данных через цикл. попробую именно так еще. Потому что если сделать как я:
---------------------------
"Номер тикета1 оредра" + IntegerToString (OrdersTD[1].TicketTD) +"\n" +
"Номер тикета2 оредра" + IntegerToString (OrdersTD[2].TicketTD) +"\n" +
"Номер тикета3 оредра" + IntegerToString (OrdersTD[3].TicketTD) +"\n" +
-----------------------------
То если есть 1 ордер а я в коде записал запрос на вывод трех то советник перестает работать! вывод надо перебирать и выводить только те что есть в наличии, а не жестко прописывать в коде количество строк вывода. спасибо еще раз-)

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

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

Добрый день. Подскажите, пожалуйста, как заставить советника открывать ордера на открытии свечи, на тесте в результатах время открытия вроде правильно показывает, но на графике отображается не на открытии?

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

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

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

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

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

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

Войти

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

Войти

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


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

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