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

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


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

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

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

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

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

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

Перейти

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

Перейти

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

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


0ll уже не знаю что не так.

if(OrderStopLoss()
if(OrderStopLoss()
f(OrderStopLoss()



Вполне возможно ,что не работает вот из-за этой строчки if(OrderOpenPrice()
Вы TrailingStop на Point не умножили!!!
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Dron15 просто делай так:
if(OrderType() == OP_BUY)
{
if(OrderOpenPrice() {
if(OrderStopLoss() если и после этого работать не будет, давай всю сову в .mq4
Ссылка на сообщение
Поделиться на другие сайты

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


Dron15 просто делай так:
if(OrderType() == OP_BUY)
{
if(OrderOpenPrice() {
if(OrderStopLoss() если и после этого работать не будет, давай всю сову в .mq4



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

исправил.txt
SNAG-15062218503000.png

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

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

Еще раз всем добрый день.
Попробовав свои силы, пришел к решению, что нужно попрактиковаться на чем-то попроще, чем советник. Хотя с "подхватом" ордеров справился. Спасибо за советы и моральную поддержку.
Решил написать простенький скрипт, который открывал бы ордер с рынка на продажу, выставлял стоп за ближайший минимум и профит в 4 раза больше стопа.

Но что-то не так. Ордер открывается, в нужную сторону, даже СЛ и ТП ставятся... но слишком далеко. Боюсь, что я так и не понял, как правильно выставлять, а точнее логически прописывать установку, стопов. Или что-то еще не так?

Скрипт во вложении.
Заранее спасибо за помощь.

Test_Script.mq4

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

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


Еще раз всем добрый день.
Попробовав свои силы, пришел к решению, что нужно попрактиковаться на чем-то попроще, чем советник. Хотя с "подхватом" ордеров справился. Спасибо за советы и моральную поддержку.
Решил написать простенький скрипт, который открывал бы ордер с рынка на продажу, выставлял стоп за ближайший минимум и профит в 4 раза больше стопа.

Но что-то не так. Ордер открывается, в нужную сторону, даже СЛ и ТП ставятся... но слишком далеко. Боюсь, что я так и не понял, как правильно выставлять, а точнее логически прописывать установку, стопов. Или что-то еще не так?

Скрипт во вложении.
Заранее спасибо за помощь.



Ну начнём с того,что
SL=NormalizeDouble(Bid-NL*Point, Digits); //Вычисляем СЛ
TP=NormalizeDouble(Bid+(NL*Point)*x, Digits);
NL не надо умножать на Point,это и так цена , не целое число(3;5;10).
Во-вторых .А чему равно NL???
Надо примерно так:

double L = 1000000; //Стоплосс для БАЙ
double L1 = 0; //Стоплосс для СЕЛЛ

for(int i = 1; i {
if(iLow(Symbol(),0,i) }
for(int i = 1; i {
if(iHigh(Symbol(),0,i) > L1) L1 = iHigh(Symbol(),0,i);
}
В третьих надо найти численное значение SL.
Для этого :

int Sl = (int) ((Цена открытия - полученное значение Стоплосса)/Point);

И вот теперь :

TP=NormalizeDouble(Цена открытия+(Sl*x)*Point, Digits);

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

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


...
Вот как-то так!!!



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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Dron15 почитал по-быстрому код Вашего бота. Вам придётся его переписывать.
Домашнее задание:
1. подготовить в текстовом виде общий алгоритм, без уточнений.
2. в ф-ции OnTick() не должно быть циклов (такое вот задание)
3. сбор сведений о последнем ордере (тип, лот, цена) в одной процедуре - запись в глобальные переменные
4. Вызов ф-ции CountTredes() - один раз! за проход (сохраняйте в переменную и потом используйте)
5. Поиск точки входа 1 раз на открытии бара, а не на каждом тике.
Пока достаточно.
Ссылка на сообщение
Поделиться на другие сайты

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


Dron15 почитал по-быстрому код Вашего бота. Вам придётся его переписывать.
Домашнее задание:
1. подготовить в текстовом виде общий алгоритм, без уточнений.
2. в ф-ции OnTick() не должно быть циклов (такое вот задание)
3. сбор сведений о последнем ордере (тип, лот, цена) в одной процедуре - запись в глобальные переменные
4. Вызов ф-ции CountTredes() - один раз! за проход (сохраняйте в переменную и потом используйте)
5. Поиск точки входа 1 раз на открытии бара, а не на каждом тике.
Пока достаточно.



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

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

Хорошо спасибо, обязательно сделаю. Единственный вопрос доделали мы трал или нет ?

Не совсем - он запускается криво, а чтоб всё ровно - надо домашку сделать.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте! Друзья, подскажите, кто знает, как правильно написать код, чтоб советник начинал работу с открытия бара и закрывал открытые позиции перед закрытием бара? (прилагаю часть кода, для примера: открываем покупку на пробитии дневного максимума, а закрыть позицию нужно перед закрытием свечи, тоже самое и на продажу: если текущая свеча пробивает минимум предыдущей свечи)

G.Day.mq4

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

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

Еще раз добрый день всем. И опять я со своим скриптом :)

Вроде переписал, используя советы тов. Konstebl. Но возник другой вопрос: как правильно вытянуть тикет из уже открытого ордера? Моя попытка ордер открывает, но при выставлении стопов выдает: "2015.06.24 15:38:25.694 Test_Script BRN,M5: invalid ticket for OrderModify function" и "2015.06.24 15:38:25.694 Test_Script BRN,M5: invalid takeprofit for OrderModify function" вот в таком порядке. Я правильно понимаю, что я как-то некорректно передаю тикет от функции OrderSelect() функции OrderModify()? Подскажите пожалуйста, где я ошибся.
Заранее спасибо, текст скрипта во вложении.

Test_Script.txt

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sany2912 Нужно следить за изменением времени открытия бара. Если время изменилось - значит новый бар. Например:
static datetime dd;
if (dd != iTime(NULL, PERIOD_D1, 0)) //новый бар!
{
max = iHigh(Symbol(), PERIOD_D1, 1);
min = iLow(Symbol(), PERIOD_D1, 1);
}
Крайне не советую использовать функции типа iTime(NULL, PERIOD_D1, 0) (т.е. брать данные с другого ТФ) код при 1 запуске может выдавать неадекватные значения. Если есть возможность - используйте текущий ТФ и функции типа Time[0]

Dron15 пришлось переделать - сова не умеет ждать и работает практически в цикле. Вот пример алгоритма:
1. Проверяем нет ли открытых ордеров в рынке. Если ДА: далее, если НЕТ: п.2.
1.1. Проверяем дистанцию от ордера до цены. Если > xx пп.: п.3, если менее: далее
1.2. если дистанция менее - уу пп.: п.4. если более - выход
2. Проверка условий на вход. Если ДА - далее, если НЕТ - выход.
2.1. Входим.
3. Профит. Ставим СЛ и Трал.
4. Усреднение. Проверка условий. если ДА - далее, если нет - выход.
4.1. Вычисляем лот и открываем усредняющий ордер.
Ссылка на сообщение
Поделиться на другие сайты

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


Еще раз добрый день всем. И опять я со своим скриптом :)

Вроде переписал, используя советы тов. Konstebl. Но возник другой вопрос: как правильно вытянуть тикет из уже открытого ордера? Моя попытка ордер открывает, но при выставлении стопов выдает: "2015.06.24 15:38:25.694 Test_Script BRN,M5: invalid ticket for OrderModify function" и "2015.06.24 15:38:25.694 Test_Script BRN,M5: invalid takeprofit for OrderModify function" вот в таком порядке. Я правильно понимаю, что я как-то некорректно передаю тикет от функции OrderSelect() функции OrderModify()? Подскажите пожалуйста, где я ошибся.
Заранее спасибо, текст скрипта во вложении.



for(int i=1;i if(iLow(Symbol(),0,i)
for(int y=0;y {
if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
{
if( (OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) )
{pos=OrderTicket(); OP=OrderOpenPrice();}
}

SL=MathRound(OP-L/Point); ПЕРВАЯ ОШИБКА!!!

OrderModify( pos,OrderOpenPrice(),NormalizeDouble(Bid-SL*Point,Digits),NormalizeDouble(Bid+(SL*x)*Point,Digits),0 );
}
}

1). Вы пытаетесь из цены открытия (допустим 0,9.....) вычесть 1000000 ну или какое-то другое целое число!!!
Надо хотя-бы поставить (). SL=MathRound((OP-L)/Point);
for(int y=0;y {
if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
{
if( (OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) )
{
if(OrderType == OP_BUY)
{
pos=OrderTicket();
OP=OrderOpenPrice();
SL=MathRound((OP-L)/Point);
OrderModify( pos,OrderOpenPrice(),NormalizeDouble(Bid-SL*Point,Digits),NormalizeDouble(Bid+(SL*x)*Point,Digits),0 );
}
}
}
Попробуйте так. Изменено пользователем Konstebl
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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


Sany2912 Нужно следить за изменением времени открытия бара. Если время изменилось - значит новый бар. Например:
static datetime dd;
if (dd != iTime(NULL, PERIOD_D1, 0)) //новый бар!
{
max = iHigh(Symbol(), PERIOD_D1, 1);
min = iLow(Symbol(), PERIOD_D1, 1);
}
Крайне не советую использовать функции типа iTime(NULL, PERIOD_D1, 0) (т.е. брать данные с другого ТФ) код при 1 запуске может выдавать неадекватные значения. Если есть возможность - используйте текущий ТФ и функции типа Time[0]

Спасибо за помощь! Только это не работает!!! я уже так делал... Проблема в том, что после закрытия позиции, в данном случае в 23.55, он продолжает открывать сделки на каждом тике и в 23.56 и в 23.57 и т.д. Этого не должно быть... Следующий анализ ситуации должен происходить с открытия следующего бара.
Может быть есть еще какиенибудь варианты???

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sany2912 что именно не работает? - я-ж только намекнул как определить приход нового бара, а как этим пользоваться это Ваша задача.
Нужно на листочке расписать алгоритм работы совы, где, какие проверки делать и т.д. Например:
1. Если новый день
1.1. Определяем уровни мах/мин предыдущего
1.2. Вычисляем время окончания работы
1.3. флаг работы = тру.
2. Если цена на уровне, флаг работы == тру и сделок нет - открываемся, иначе выход
3. если время окончания - закрываем ордера, флаг работы = фалсе. Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

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


Sany2912 что именно не работает? - я-ж только намекнул как определить приход нового бара, а как этим пользоваться это Ваша задача.
Нужно на листочке расписать алгоритм работы совы, где, какие проверки делать и т.д. Например:
1. Если новый день
1.1. Определяем уровни мах/мин предыдущего
1.2. Вычисляем время окончания работы
1.3. флаг работы = тру.
2. Если цена на уровне, флаг работы == тру и сделок нет - открываемся, иначе выход
3. если время окончания - закрываем ордера, флаг работы = фалсе.



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

G.Day.mq4

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

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


Sany2912 попробуй мой вариант. я не запускал, но думаю работать будет.



Нееет, не работает!! Я о чем и говорю: вроде бы все правильно написано, а не работает... прилагаю скрин.

Рисунок1.jpg
Рисунок2.jpg

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

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

Новый урок от Сергея XBMS



Реконнект для советника

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

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

Oll
5. Поиск точки входа 1 раз на открытии бара, а не на каждом тике.

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

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

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


Oll
5. Поиск точки входа 1 раз на открытии бара, а не на каждом тике.

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



Используйте отложенные ордера .БАЙСТОП и СЕЛЛСТОП!
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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



Oll
5. Поиск точки входа 1 раз на открытии бара, а не на каждом тике.

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



Используйте отложенные ордера .БАЙСТОП и СЕЛЛСТОП!


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

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

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

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

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

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

Войти

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

Войти

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


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

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