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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
JR заметил этот косяк и вообще перестал пользоваться функциями, обращающимися к данным другого ТФ - тупо считаю значения баров из текущего ТФ. У Вас тиковая история М1 присутствует?
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll, да, конечно присутствует - экспорт всех таймфреймов делаю. Я бы тоже не пользовался другими ТФ, но как быть, если к примеру в сове рассчитываются входы на м15, а данные по тренду берутся, ну пусть даже с машки с H4? Или например хотел получить размер свечи с другого ТФ как доп фильтр... Ну и таких ситуевин может быть много. А в обычном терминале с котирами брокера это вроде работает, в тикстори - нет.

З.Ы. и это..меня можно и на ТЫ :)
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
JR с машкой проблем меньше всего - нужно пропорционально ТФ изменить период. А свечи другого ТФ пересчитываю. В общем борюсь с МТ по всякому... Заметил, что это даёт результат - совы меньше глючить на реале стали.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Исправил ошибку в логике безубытка (безубыток всегда считался от заданного в параметрах стопа внезависимости менялся он или нет).

Просьба проверить работу безубытка кому не сложно.

TPSLHelper02.ex4

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

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

Ребят, вот еще такая задачка. Нужна функция, считающая количество валютных пар, на которых есть открытые ордера.
Т.е. первое что приходит на ум это при переборе в цикле открытых ордеров создать массив, заполнить его названиями пар с открытыми ордерами, а потом сделать сравнение и выборку с подсчетом (собственно что-то подобное сейчас и пишу). Но может есть более изящный и менее ресурсо-затратный алгоритм?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
JR
- создай пустую строку
- ищи название пары в строке
- если нет пиши его туда, добавляй счетчик
- если есть - следующий
- после перебора ордеров количество символов в счетчике.

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

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


:d перфекционизируем по случаю пятницы?!

Веришь - на ходу придумал, экспромт однако... :d
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

int CountTradesSymbol() //Считаем количество пар с открытыми ордерами 
{
if (OrdersTotal() == 0)
return(0);
int count = 0;
string sym = "";
for (int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (StringFind(sym, OrderSymbol(), 0)) {
sym += OrderSymbol();
count++;
}
}
}
return (count);
}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
JR обязательно добавь разделитель сюда: sym += OrderSymbol() + ","; !
иначе может найти составленный из соседних пар кросс ;)
Сортируй по типу, а то и отложки посчитает...
Контроль риска можно через маржу оценивать (я так обычно делаю), но в мультивалютных совах, возможно, другие задачи... Изменено пользователем 0ll
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Молодцы, парни - действительно красивое решение!
Фигня вроде - а летает. :d

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

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


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

int CountTradesSymbol() //Считаем количество пар с открытыми ордерами 
{
if (OrdersTotal() == 0)
return(0);
int count = 0;
string sym = "";
for (int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (StringFind(sym, OrderSymbol(), 0)) {
sym += OrderSymbol();
count++;
}
}
}
return (count);
}

В тестере работает, на реале проверю в понедельник.

Мне кажется или тут ошибка? if (StringFind(sym, OrderSymbol(), 0)) => if (!StringFind(sym, OrderSymbol(), 0))
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

Да, все правильно, забыл что у StringFind возвращаемое значение типа int ( -1 если не найдено). Вот так сейчас оставил:

int CountTradesSymbol() //Считаем количество пар с открытыми ордерами 
{
if (OrdersTotal() == 0)
return(0);
int count = 0;
string sym = "";
for (int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
if (StringFind(sym, OrderSymbol(), 0) sym += OrderSymbol() + ",";
count++;
}
}
}
}
return(count);
}
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Тест на внимательность из всей команды условно прошел только Qj :)

Но всё равно кодик полезный весьма и весьма - скопипастил! :d

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

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

Да просто глаза уже замылились когда писал, если бы в рынке проверить - сразу бы заметил, а так жду понедельника.

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

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

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

Народ, здравия!
Никак не могу решить такую задачку (только начал программить в MQL4):
Есть две МА. Надо найти количество баров с момента их последнего пересечения.
Я округляю их до Digits(через NormolizeDouble), сравниваю их, а вот как посчитать количество баров - фиг его знает. И до конца непонятно, как работают сдвиги в этих МА.

double aa, bb;
int counted_candles = 0;

for ( int i=1; i {
aa = iMA(Symbol(), 0, 13, 0, MODE_SMA, PRICE_CLOSE, i);
bb = iMA(Symbol(), 0, 26, 0, MODE_SMA, PRICE_CLOSE, i);

if ( NormalizeDouble(aa, Digits) == NormalizeDouble(bb, Digits
{
counted_candles++;
Print ("i=", i, "; aa=", NormalizeDouble(aa, Digits), "; bb=", NormalizeDouble(bb, Digits));
break;
}
}


Он мне выводит i какой-то и показывает, что при этом i значения моих МА были равны. Но как эту инфу привязать к количеству баров?

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

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

Так тут i и будет количество баров. Код перебирает в цикле значения двух машек на каждом баре от 1-го (0 - текущий) до 1000-го. Как только значения совпадают (машки пересекаются) печается i - на каком баре от 1-го это произошло.

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

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

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

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

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

Вам наверное стоит посмотреть видеоуроки по MQL в блоге.
Если вы исполняете приведенный код в функции OnTick() советника, то весь цикл перебора баров будет проходить за один тик.
И почитайте описание iMA.

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

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


Вам наверное стоит посмотреть видеоуроки по MQL в блоге.
Если вы исполняете приведенный код в функции OnTick() советника, то весь цикл перебора баров будет проходить за один тик.
И почитайте описание iMA.


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

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



Народ, здравия!
Никак не могу решить такую задачку (только начал программить в MQL4):
Есть две МА. Надо найти количество баров с момента их последнего пересечения.
Я округляю их до Digits(через NormolizeDouble), сравниваю их, а вот как посчитать количество баров - фиг его знает. И до конца непонятно, как работают сдвиги в этих МА.

double aa, bb;
int counted_candles = 0;

for ( int i=1; i {
aa = iMA(Symbol(), 0, 13, 0, MODE_SMA, PRICE_CLOSE, i);
bb = iMA(Symbol(), 0, 26, 0, MODE_SMA, PRICE_CLOSE, i);

if ( NormalizeDouble(aa, Digits) == NormalizeDouble(bb, Digits
{
counted_candles++;
Print ("i=", i, "; aa=", NormalizeDouble(aa, Digits), "; bb=", NormalizeDouble(bb, Digits));
break;
}
}


Он мне выводит i какой-то и показывает, что при этом i значения моих МА были равны. Но как эту инфу привязать к количеству баров?


Не уверен конечно, но попробуйте это
Спойлер



double aa, bb;
int counted_candles = 0;

for ( int i=1; i {
aa = iMA(Symbol(), 0, 13, 0, MODE_SMA, PRICE_CLOSE, i);
bb = iMA(Symbol(), 0, 26, 0, MODE_SMA, PRICE_CLOSE, i);

if ( NormalizeDouble(aa, Digits) != NormalizeDouble(bb, Digits))
{
counted_candles++;
break;
}
}


counted_candles - кол-во свечей с последнего пересечения

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

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

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

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

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

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

Войти

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

Войти

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


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

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