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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Foxonn
гипотетически блок "else" будет выполнятся в 99% случаев в рынке. и принты будут засорять лог. это не ошибка открытия оредра, это просто принты.

if (CountSell() == 0 && CountBuy() == 0 && oOpen {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red);
}else Print("Ошибка открытия ордера на продажу");


сам подумай. если открыт хотя бы один ордер, или не будет выполнятся oOpen попробуй принт занести в скобки выше и вставить условие if (ticket
if (CountSell() == 0 && CountBuy() == 0 && oOpen {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red);
if (ticket }
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

или просто
if (CountSell() == 0 && CountBuy() == 0 && oOpen {
if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red))
Print("Ошибка открытия ордера на продажу");
}

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

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


или просто
if (CountSell() == 0 && CountBuy() == 0 && oOpen {
if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red))
Print("Ошибка открытия ордера на продажу");
}



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

if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red)
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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



или просто
if (CountSell() == 0 && CountBuy() == 0 && oOpen {
if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red))
Print("Ошибка открытия ордера на продажу");
}



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

if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red)

Спасибо за помощь dermitay и Silentspec. Теперь такой вопрос, почему не открываются ордера? или для открытие ордера по БО нужен другой подход? в терминале от Альпари ордера открываются, а в терминале от Гранд Капитал нет :-? Изменено пользователем Foxonn
Ссылка на сообщение
Поделиться на другие сайты

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

Уважаемые форумчане,

столкнулся с небольшой проблемой: в учебнике по программированию MQL4 написаны все ценовые константы технического индикатора Moving Average (iMA), кроме Previous Indicator`s Data, которая есть в стандартном наборе к индикатору в МТ4. Это решаемо или надо заказывать?

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

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

Подскажите пожалуйста, как прописать условие для закрытия ордера при входе отложенного ордера в позицию другого направления. Есть такой модуль закрытия по обратному сигналу.
if (M11 = M22) я так понимаю надо здесь поправить
{
for (i=OrdersTotal()-1;i>=0;i--)
{
RefreshRates();
if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true) a = 0;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{
RefreshRates();
if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true) a = 0;
c = OrderClose(OrderTicket(), OrderLots(), Bid, Slipp, Yellow);
ii = 0;
while (c == false && OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true)
{
ii++;
Print("Error =",GetLastError());
Sleep(sec);
RefreshRates();
if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true) a = 0;
c = OrderClose(OrderTicket(), OrderLots(), Bid, Slipp, Yellow);
}
}
}
}

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

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

Я если честно пока в программировании дилетант, но хочется понять механизм программирования путём разбирательства. На ваши вопросы попытаюсь ответить как я понимаю, a и ii это заданные переменные, а=0 не могу разобраться для чего, а ii я так понимаю счётчик ордеров при true ii=0, при false ii++


Добавлено: 15-07-2016 08:36:23

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

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

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


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

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

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

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

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

Помогите написать код, реализующий следующее условие: если ордер находиться в рынке (не важно Buy или Sell) больше 3-х торговых дней, то закрыть.

Заранее благодарю.

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

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


Помогите написать код, реализующий следующее условие: если ордер находиться в рынке (не важно Buy или Sell) больше 3-х торговых дней, то закрыть.

Заранее благодарю.



смотришь на цену открытия ордера, если (текущее время - время открытия ордера)/3600 > 24*3 то закрывай ордер.
Ссылка на сообщение
Поделиться на другие сайты

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

Какая разница между включаемый файл и библиотека функций? И что лучше использовать для создания своей библиотеки функций?

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

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

Приветствую! А может для MQL5 сделать новую ветку? А то тут все перемешается и будет очень неудобно и тем кто MQL4 изучает и тем кто MQL5.

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

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

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

if (Bid >= PriceHigh && PriceRsi >= 70 && CountBuy1() == 0 && CountSell1() == 0&& CountBuy2() == 0 && CountSell2() == 0)
{
SL = NormalizeDouble (Bid + StopLoss * Point, Digits);
TP = NormalizeDouble (Bid - TakeProfit * Point, Digits);

ticet = OrderSend (Symbol(), OP_SELL, Lots1, Bid, 10, 0, 0, NULL, Magic1, 0, Red);

ticet = OrderSend (Symbol(), OP_SELL, Lots2, Bid, 10, 0, 0, NULL, Magic2, 0, Red);

if (ticet > 0)
{
if (OrderSelect(ticet, SELECT_BY_TICKET, MODE_TRADES) == true)
{
bool modify = OrderModify(ticet, OrderOpenPrice(), SL, TP, 0);
}

}

}

if (Ask {
SL = NormalizeDouble (Ask - StopLoss * Point, Digits);
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);

ticet = OrderSend (Symbol(), OP_BUY, Lots1, Ask, 10, 0, 0, NULL, Magic1, 0, Blue);

ticet = OrderSend (Symbol(), OP_BUY, Lots2, Ask, 10, 0, 0, NULL, Magic2, 0, Blue);

if (ticet > 0)
{
if (OrderSelect(ticet, SELECT_BY_TICKET, MODE_TRADES) == true)
bool modify = OrderModify(ticet, OrderOpenPrice(), SL, TP, 0);

}

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

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

Здравствуйте. Подскажите, возможно такое реализовать средствами MQL4?

В сделке всегда один ордер с тейком и стопом (ордера выставляет советник на основе сигналов индикаторов). Если ордер закрывается по стопу, то новый ордер открывается с объемом в два раза больше предыдущего ордера (увеличение объема происходит до тех пор, пока текущий ордер не закроется по тейк профиту) - то есть присутствует классический мартингейл.
Например, в настройках указано открывать ордера объемом 0,01 лота. Первый ордер открылся с объемом 0,01 лота. В случае получения стопа следующий ордер открывается объемом 0,02, снова стоп лосс, значит следующий ордер открывается объемом 0,04 лота, потом 0,08 и так далее до бесконечности.
Если после череды стоп лоссов удалось закрыться по тейк профиту, то следующий, после профитной сделки ордер открывается снова объемом 0,01 лота (как указано в настройках для ордеров).

Как этот алгоритм может выглядеть в виде кода? Возможно мой вопрос не корректен, так как я не силен в написании советников, просто я описал то, что нужно реализовать и прошу подсказать, как это можно сделать, если такое вообще возможно.

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

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


Здравствуйте. Подскажите, возможно такое реализовать средствами MQL4?

В сделке всегда один ордер с тейком и стопом (ордера выставляет советник на основе сигналов индикаторов). Если ордер закрывается по стопу, то новый ордер открывается с объемом в два раза больше предыдущего ордера (увеличение объема происходит до тех пор, пока текущий ордер не закроется по тейк профиту) - то есть присутствует классический мартингейл.
Например, в настройках указано открывать ордера объемом 0,01 лота. Первый ордер открылся с объемом 0,01 лота. В случае получения стопа следующий ордер открывается объемом 0,02, снова стоп лосс, значит следующий ордер открывается объемом 0,04 лота, потом 0,08 и так далее до бесконечности.
Если после череды стоп лоссов удалось закрыться по тейк профиту, то следующий, после профитной сделки ордер открывается снова объемом 0,01 лота (как указано в настройках для ордеров).

Как этот алгоритм может выглядеть в виде кода? Возможно мой вопрос не корректен, так как я не силен в написании советников, просто я описал то, что нужно реализовать и прошу подсказать, как это можно сделать, если такое вообще возможно.



На сайте, в разделе "Обучение" есть видео курс по программированию MQL4. Один из уроков как раз связан с написанием советника по мартину. Там ты найдёшь ответ на свой вопрос.

Добавлено: 26-07-2016 19:51:07



Помогите написать код, реализующий следующее условие: если ордер находиться в рынке (не важно Buy или Sell) больше 3-х торговых дней, то закрыть.

Заранее благодарю.



смотришь на цену открытия ордера, если (текущее время - время открытия ордера)/3600 > 24*3 то закрывай ордер.


Вот фрагмент кода:

extern int StopDay = 3; // Кол-во дней, по истечение которых ордер закроется.

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY && (TimeCurrent()-OrderOpenTime())/3600 > 24*StopDay)
{
if(OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red) == true)
Print("Закрылся успешно!");
}
}
}
}

Так вот, код работает, но в расчёт идут календарные дни, а не торговые. При открытии в 01:00 понедельника ордер закрывается в 01:00 четверга, т.е. прошло 3 полных, торговых дня - всё нормально. Однако при открытии ордера в 01:00 четверга, закрытие происходит в 01:00 понедельника, т.е. проходит лишь 2 полных, торговых дня (или 4 календарных).

Как сделать так, чтобы при открытии в 01:00 четверга закрытие произошло в 01:00 вторника, а не понедельника?
Изменено пользователем Svarog_AZh
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Уважаемые программисты требуется помощь в том что б правильно написать советник, сам написал но он не работает так как надо.
описание правильной работы:
1 открываются ордера в противоположные стороны с тейкпрофитом и стоплосом
2 ордера закрываются по тейку и или лосю
3 тот ордер которые закрылся по лосю увеличивается в multipler раз
после того как убыточный ордер закрылся в плюс объём ордера возвращается к первоначальному
после того как убыточный ордер закрылся по лосю объём ордера опять увеличивается в multipler раз

помогите правильно написать, если напишите код пожалуста поясните в комментариях, желаю не просто получить советник а понять как его написать правильно.

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


Добавлено: 27-07-2016 08:45:55

Огромное спасибо xNorDx помог довести советник до ума!

opposittrans.mq4

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

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

Уважаемые специалисты вынесите пожалуйста в настройки индикатора "Стиль" линий.
Заранее благодарен!!!

Trendlines_Original__LA_.mq4

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

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

Добрый день!
Заинтересовала тема автоматической оптимизации советника во время его торговли в этой статье _https://www.mql5.com/ru/articles/1467 , однако воплотить в жизнь на своем советнике не получается. Предлагаю этот вопрос разобрать в одном из уроков по MQL.

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

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

Доброго времени суток, пишу свой первый советник, подскажите пожалуйста как задать
datetime expiration=0, // срок истечения ордера в функции OrderSend(
для торговли в определенную сессию.
Напишите кусок кода или прикрекпите какую нибудь сову с отложками, я дальше сам разберусь


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

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

у меня возник вопрос при написании советника:
-как при не открытии ордера из серии ордеров открыть не открытый ордер ещё раз.
я понимаю что есть в этом языке метка как в бейсике строка на которую можно вернуться если не открылся ордер, но как это реализовать не знаю. подскажите кто знает

здесь как я думаю надо поставить метку
ticket=OrderSend(Symbol(),OP_SELL, Lots_sell, Bid,Slippage,SL,TP,"oposit",Magic,0,Red);
if(ticket {Print("Не удалось открыть ордер на продажу");
а здесь как я думаю надо написать переход к метке
}

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

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


у меня возник вопрос при написании советника:
-как при не открытии ордера из серии ордеров открыть не открытый ордер ещё раз.
я понимаю что есть в этом языке метка как в бейсике строка на которую можно вернуться если не открылся ордер, но как это реализовать не знаю. подскажите кто знает


вообще, методов много - любой советник нормальный возьмите, там будет блок по обработке функций открытия-закрытия ордеров, чаще всего делают даже с возможным заданием количества попыток. Самый простой метод в Вашем куске кода присвоить ticket =-1. А OrderSend поместить внутрь цикла while (ticket10 к примеру. Самый примитивный пример.
Спойлер


int attempt =0;
ticket =-1;
while (ticket{
ticket = OrderSend(...);
attempt++;
if (attempt>10)
break;
}


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

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

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

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

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

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

Войти

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

Войти

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


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

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