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

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


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

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


Господа помогите...
Просмотрел первые три урока Сергея. Здорово!
Пытаюсь воспроизвести сову по третьему уроку.... по ТМА.
Засада на ровном месте.
Вопрос - почему высвечиваются ошибки и symbol не подсвечивается в цвет?
http://joxi.ru/eAOlzELIJOnBro (для увеличения кликните мышкой на картинку)


С большой буквы нужно Symbol() код регистрозависимый.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

Уважаемые программисты не подскажите почему получается так что если выписать все прибыльные сделки по определённому шагу цены от точки до точки в столбец друг за другом игнорируя убыточные то выходит согласованность между ними по входам и выходам более 90% это на кроссах, а на слабо волатильных валютах меньше? Просто у меня сложилось такое впечатление что Рынок закономерен или я не прав?

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

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


Уважаемые программисты не подскажите почему получается так что если выписать все прибыльные сделки по определённому шагу цены от точки до точки в столбец друг за другом игнорируя убыточные то выходит согласованность между ними по входам и выходам более 90% это на кроссах, а на слабо волатильных валютах меньше? Просто у меня сложилось такое впечатление что Рынок закономерен или я не прав?

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

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



Уважаемые программисты не подскажите почему получается так что если выписать все прибыльные сделки по определённому шагу цены от точки до точки в столбец друг за другом игнорируя убыточные то выходит согласованность между ними по входам и выходам более 90% это на кроссах, а на слабо волатильных валютах меньше? Просто у меня сложилось такое впечатление что Рынок закономерен или я не прав?

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

Создаём шаг на бай и на сел где один смещён в большую или в меньшую сторону кому как угодно, но это нужно для работы по тренду, далее связываем шаг бай и сел между собой. Далее получается статистика по шагу из неё выбираем только прибыльные для анализа записываем в столбец и получаем практическую закономерность. В данном примере выборку не делал только шаги кому надо сам выберет и посмотрит. Выписывать на бай вход прибыль и на сел вход прибыль в отдельный столбец и получается очень высокая точность (Закономерность).

EURJPYM1.png

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

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

Добрый день!
Есть ли в видеоуроках информация о удалении несработанного отложенного ордера, если например сработал тейк проф, спасибо. :-b

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
garanyan1985, боюсь, что те, кто в этом топике в основном отвечают, интересующих вас видео уроков как раз и не смотрели. :( :)
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, пишу бота на цикле.
1) открывается сделка (все равно в какую сторону) к примеру BUY 0,02 лота с фиксом прибыли в 1$
далее если сделка закрывается в + , сразу открывается такая же
2) если пара идет в другую сторону , через 4 пункта (старые) открывается сделка объемом в 3 раза больше 0,06 Sell , и ждем закрытия сделок с общим профитом в 1$
3) и так далее но не более 5 сделок , если 5-ая опять идет не туда , закрывается убыток но не более 10% от депозита

Не открывает третью противоположную сделку, и не закрывает все ордера когда AccountProfit() = 1 $


Добавлено: 24-11-2015 21:44:49


Добрый день!
Есть ли в видеоуроках информация о удалении несработанного отложенного ордера, если например сработал тейк проф, спасибо. :-b



_https://www.mql5.com/ru/articles/1413 здесь второй бот
так же можешь через OrderDelete() написать:
if(OrderProfit() == TakeProfit)
{
OrderSelect(...);
{
OrderDelete(...);
}
} // ну или OrderProfit() можешь чем то другим заменить.

14.mq4

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

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

:-/ Как корректно переводить пипсы в цену и обратно? Может, кто кинет ссылку, где это толково объясняется? Вообще, есть какие-то служебные функции типа NormalizeDouble -для чего они, и как ими пользоваться? Может, где то это понятно описано?

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

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


:-/ Как корректно переводить пипсы в цену и обратно? Может, кто кинет ссылку, где это толково объясняется? Вообще, есть какие-то служебные функции типа NormalizeDouble -для чего они, и как ими пользоваться? Может, где то это понятно описано?


Пипс * Point - Цена, Цена / Point - Пипс.
NormalizeDouble - округляет число. Изменено пользователем Qj
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите пожалуйста!
Урок № 2 обновленный.
При компилировании выдает ошибку ""BuyLimitCount" - функция не определена"- function not defined и для 'BuyCount'
'SellLimitCount' тоже, а для 'SellCount' - нет. Что делать?
Еще засунул в бот со второго урока старого, функцию "DeleteOrders()" убирать не сработавшие ордера. - Выдает предупреждение -Возвращаемое значение '' OrderDelete должны быть проверены - return value of 'OrderDelete' should be checked.

Заранее спасибо.

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

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


Подскажите пожалуйста!
Урок № 2 обновленный.
При компилировании выдает ошибку ""BuyLimitCount" - функция не определена"- function not defined и для 'BuyCount'
'SellLimitCount' тоже, а для 'SellCount' - нет. Что делать?
Еще засунул в бот со второго урока старого, функцию "DeleteOrders()" убирать не сработавшие ордера. - Выдает предупреждение -Возвращаемое значение '' OrderDelete должны быть проверены - return value of 'OrderDelete' should be checked.

Заранее спасибо.



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

второй вопрос - да, они желательно должны быть проверяемыми.

лучше делать так:
if (OrderDelete(параметры функции))
{
можно вывести какое либо ссобщение. или вобще ничего тут не делать
}

тоже самое касается OrderSelect, OrderModify и тому подобных.
Ссылка на сообщение
Поделиться на другие сайты

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

откуда ты вообще взял эти функции?
Со второго урока - все в точь исполнил, убрал - перестал ругаться.
Второй вопрос:
лучше делать так:
if (OrderDelete(параметры функции))
{
можно вывести какое либо сообщение. или вообще ничего тут не делать - Убрал параметр.
}

убрал параметр - получил:

Ноль ошибок и ноль замечаний.

Спасибо, это мой первый советник - кривой, но все же.
Будем работать.


Добавлено: 26-11-2015 18:27:08

Вот такая вот петрушка, мой бот берет только общую максимальную цену, а максимальную дня не пересчитывает, вроде все по уроку второму сделал. может кто разъяснит ситуацию по второму уроку - обновленному.
Настройки
extern int BarCount = 10;
extern int HourStart = 10;
extern int HourEnd = 23;

void GetMinPrice()
{
for (int i = 0; i
{
mp = iLow (Symbol(), PERIOD_CURRENT, i);
if (mp minprice = mp;
}
return;
}
//+------------------------------------------------------------------+

void GetMaxPrice()
{
for (int i = 0; i
{
mp = iLow (Symbol(), PERIOD_CURRENT, i);
if (mp > maxprice)
maxprice = mp;
}
return;
}


Спасибо.

501888090.jpg

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

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


Подскажите пожалуйста!
Урок № 2 обновленный.
При компилировании выдает ошибку ""BuyLimitCount" - функция не определена"- function not defined и для 'BuyCount'
'SellLimitCount' тоже, а для 'SellCount' - нет. Что делать?
Заранее спасибо.



Сделал все по уроку №2. При компиляции ошибок не было.
Файл прилагаю.

Огромное спасибо xbms !

test2.mq4

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

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

Можно как-нибудь(например, массивом строк) получить список ВСЕХ валютных пар, которые поддерживает брокер?

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

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


Можно как-нибудь(например, массивом строк) получить список ВСЕХ валютных пар, которые поддерживает брокер?




Почитайте здесь
В цикле читаете символы (SymbolName) и пишете в массив. Изменено пользователем Pavel888
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Выполнил домашнее задание к обновленному второму уроку.
От себя добавил:
[list type=decimal]

  • время открытия ордеров не только в часах, но и в минутах,

  • возможность отключать/включать установку лимитных ордеров

  • возможность отключать/включать установку стоп ордеров

  • проверку на количество знаков у брокера (из старых уроков) (все параметры в советнике задаем в старых пунктах)


  • Прошу уважаемого xbms проверить и указать на ошибки, если таковые будут ( а куда они денутся :) )

    test2_dom_zadanie.mq4

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

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



    void GetMinPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp minprice = mp;
    }
    return;
    }
    //+------------------------------------------------------------------+

    void GetMaxPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp > maxprice)
    maxprice = mp;
    }
    return;
    }


    Спасибо.



    у тебя в обеих функциях(а они по идее должны быть процедурами с возвращающим double), возвращает всегда null в независимости от расчётов? так и должно быть?
    • Лайк 1
    Ссылка на сообщение
    Поделиться на другие сайты

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




    void GetMinPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp minprice = mp;
    }
    return;
    }
    //+------------------------------------------------------------------+

    void GetMaxPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp > maxprice)
    maxprice = mp;
    }
    return;
    }


    Спасибо.



    у тебя в обеих функциях(а они по идее должны быть процедурами с возвращающим double), возвращает всегда null в независимости от расчётов? так и должно быть?


    Так и должно быть. Мы находим mp в цикле и сравниваем его с заданным minpice. И, если mp Как-бы возвращать функция ничего и не должна. Поэтому для выхода из нее используем команду return.

    Тут специально используется тип void
    Цитата

    Синтаксически тип void является фундаментальным типом наравне с типами char, uchar, bool, short, ushort, int, uint, color, long, ulong, datetime, float, double и string. Этот тип используется либо для указания того, что функция не возвращает значения, либо в качестве параметра функции обозначает отсутствие параметров.

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

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

    ок, понял, типичная ошибка новичка при поиске минимального значения)))

    чему равен записываемый минимум ДО сравнения? который minprice? нулю? null??? none??? то все логично, ЛЮБОЙ другой минимум будет больше этого значения - и перезаписи не будет.

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

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

    Обучение языку MQL4 под MetaTrader 4 Опубликовано
    dermitay, спасибо за ваши советы, я только начал обучение, и любая информация полезна.

    Цитата

    чему равен записываемый минимум ДО сравнения? который minprice? нулю? null??? none??? то все логично, ЛЮБОЙ другой минимум будет больше этого значения - и перезаписи не будет.



    так мы в самом начале задаем переменные

    double minprice=99999,
    maxprice=-99999,

    а потом в цикле сравниваем mp, найденное через iLow(iHigh) с заданными значениями.

    Цитата

    void GetMinPrice()
    {
    for (int i=0; i {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp minprice = mp;
    }
    return;
    }

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

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


    dermitay, спасибо за ваши советы, я только начал обучение, и любая информация полезна.

    Цитата

    чему равен записываемый минимум ДО сравнения? который minprice? нулю? null??? none??? то все логично, ЛЮБОЙ другой минимум будет больше этого значения - и перезаписи не будет.



    так мы в самом начале задаем переменные

    double minprice=99999,
    maxprice=-99999,

    а потом в цикле сравниваем mp, найденное через iLow(iHigh) с заданными значениями.

    Цитата

    void GetMinPrice()
    {
    for (int i=0; i {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp minprice = mp;
    }
    return;
    }




    смотри. допустим цена сейчас равна 1.0570 (евробакс сейчас), пусть это будет и минимум(iLow) и максимум(iHigh).
    это меньше 99999? да, перезаписываем минимум.
    это больше 99999? нет, не перезаписываем максимум.

    следующая итерация. цена поменялась бар назад на 1.0560.
    это меньше 1,0570? да, перезаписываем минимум.
    это больше 99999? нет, не перезаписываем максимум.

    следующая итерация. цена поменялась бар назад на 1.0580.
    это меньше 1,0560? нет, не перезаписываем минимум.
    это больше 99999? нет, не перезаписываем максимум.

    и так далее.

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

    minprice = MarketInfo(Symbol(), MODE_BID);
    maxprice = MarketInfo(Symbol(), MODE_BID);

    ну или просто

    minprice = Bid;
    maxprice = Bid;

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

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

    Здравствуйте. Вот я тут что-то сделал , но не получилось, посмотрите пожалуйста и подскажите как надо.

    Идея ТС.
    Торговля на пробое.
    Открытие позиций:
    Линия S1 взята от внешнего индикатора. Буферы в индикаторе выключены.
    При пересечении линии S1 ценой вверх советник открывает ордер на покупку.
    При пересечении той же линии S1 ценой вниз советник открывает ордер на продажу.
    Одновременно может быть открыта только одна сделка.
    Закрытие позиций:
    Cоветник закрывает позиции автоматически при достижении уровня стоп-лосс или тейк профит.

    Test-1.ex4 в тесте ордера не открывает.
    Если я меняю условие на
    if( Bid if(Ask>LastAsk)
    - ордера открываются, но они никак не связаны с индикатором (в приложение- скрин).
    Что надо добавить, чтобы ордера открывались только при пробое линии.

    Test_-1.mq4
    Screen.png
    ok.mq4

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

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


    так мы в самом начале задаем переменные

    double minprice=99999,
    maxprice=-99999,

    а потом в цикле сравниваем mp, найденное через iLow(iHigh) с заданными значениями.

    Цитата

    void GetMinPrice()
    {
    for (int i=0; i {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp minprice = mp;
    }
    return;
    }



    имхо, начальное значение maxprice=-99999 корректно.
    Хотя вариант dermitay тоже рабочий.

    Ошибка, как мне кажется, в другом.


    void GetMaxPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp > maxprice)
    maxprice = mp;
    }
    return;
    }



    Почему mp = iLow? Хай дня по лоям свечей не узнаешь... Вроде должен быть mp = iHigh... :) Изменено пользователем Старик
    • Лайк 1
    Ссылка на сообщение
    Поделиться на другие сайты

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



    так мы в самом начале задаем переменные

    double minprice=99999,
    maxprice=-99999,

    а потом в цикле сравниваем mp, найденное через iLow(iHigh) с заданными значениями.

    Цитата

    void GetMinPrice()
    {
    for (int i=0; i {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp minprice = mp;
    }
    return;
    }



    имхо, начальное значение maxprice=-99999 корректно.
    Хотя вариант dermitay тоже рабочий.

    Ошибка, как мне кажется, в другом.


    void GetMaxPrice()
    {
    for (int i = 0; i
    {
    mp = iLow (Symbol(), PERIOD_CURRENT, i);
    if (mp > maxprice)
    maxprice = mp;
    }
    return;
    }



    Почему mp = iLow? Вроде должен быть iHigh. :)


    Старик, и тот и тот вариант работают одинаково, я специально проверил. А на счет того, что mp = iLow? Вроде должен быть iHigh. :), так это просто кусок кода без контекста. На самом деле mp присваивается либо minprice из iLow, либо maxprice из iHigh.

    Цитата

    //+------------------------------------------------------------------+
    //Находим минимальную цену за n баров |
    //+------------------------------------------------------------------+
    void GetMinPrice()
    {
    for (int i=0; i {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp minprice = mp;
    }
    return;
    }

    //+------------------------------------------------------------------+
    //Находим максимальную цену за n баров |
    //+------------------------------------------------------------------+
    void GetMaxPrice()
    {
    for (int i=0; i {
    mp = iHigh(Symbol(), PERIOD_CURRENT, i);
    if(mp>maxprice)
    maxprice = mp;
    }
    return;
    }



    Тут я виноват, что вырвал кусок без объяснения.
    Ссылка на сообщение
    Поделиться на другие сайты

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

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

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

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

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

    Войти

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

    Войти

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


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

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