Изучаем Mql — Урок N 2 «Циклы, функции и ордера в советнике»

mql урок n 2

И снова здравствуйте, господа форекс трейдеры!
Мы продолжаем цикл уроков по MQL, и в этот раз, закончив знакомство с основами (рассмотрим циклы и функции), мы с Вами напишем наш первый советник. И хотя это один из простейших экспертов, он всё же может претендовать на то, чтобы стать базой для Ваших будущих прибыльных торговых систем.

Домашнее задание

домашнее задание n2 mql

Используя знания, которые Вы приобрели после просмотра этого видео, прошу Вас дописать советник, который мы разбирали в видеоматериале следующим образом:

  • Необходимо добавить внешнюю переменную Indent, которая будет являться отступом (выше/ниже) от экстремумов цены и учитывая этот параметр уже устанавливать лимитные ордера.
  • Выше/ниже экстремумов, на расстоянии PipStop(добавить внешнюю переменную) установить стоп-ордера, учитывая StopLoss и TakeProfit, указанные в параметрах эксперта.

P.S. Если вы только что к нам присоединились, начните с просмотра предыдущего урока Введение в MQL.

С уважением, Сергей aka xbms
TradeLikeaPro.ru

Уроки по MQL , ,
  • Мерлин

    Спасибо за Ваш труд!

  • SeregaDnepr

    Все очень понятно и доступно. Огромное спасибо !

  • SeregaDnepr

    Все очень понятно и доступно. Огромное спасибо !!!

  • Рубака

    Так где сову качать ? Ниче не понимаю

    • Сергей

      вам бы только скачать 🙂

      набери ручками, по ходу дела будешь разбираться как всё работает, благо всё разжёвано до безобразия…

    • LaMer0n

      разговор в аське

      1 чел: че делаешь???
      2 чел: прес качаю
      1 чел: зачем???
      2 чел: ну чтоб быть красивым и сильным.
      1 чел: дай мне ссылочку, я тож скачаю

    • Pennywise

      разговор блондинок:
      -ой я файлик скачала, но он мне оказался не нужен, как его обратно закачать?
      -дура, изза таких как ты скоро в интернете вообще файлов не останется

  • Комар Кровосос

    Чет никто не комментирует!! Или не интересно или все очень понятно 🙂

    • Денис

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

  • Вячеслав

    Павел и всем здравствуйте.
    можно Вам Павел вопрос лично.
    у вас както спросили через сколько времени перестали сливать а начали зарабатывать то вы сказали что 3 года. А не скажете в чем причина была сливов конкретно? может да и скорей всего многие не наступят на те же грабли? если не секрет конечно))))))или причина таже что на всех строчках инета пишут ?
    пасибо )))0

  • georg Tonaev

    Повторенье — мать ученья, может стоит еще один урок — на простых примерах провести — неспеша, что-б в голове забетонировалось — написать еще несколько простых алгоритмов — для разных валют одновременно, или модернизация индикаторов — толщину линии поменять, цвета. Отправка сигнала с текстом или по E-mail. Если спешить и накручивать все более сложные алгоритмы — не все поспеют ухватить основы — мол почему написал if и как-то бегло побежал дальше. Это надо чуток — отполировать))

    • boldin

      Золотые слова. А вообще практика.

    • 123

      Действительно, по сравнению с первым уроком, этот более «агрессивен» для понимания. Большое кол-во действий, и взаимосвязей между ними. Впитывать очень сложно.

      Буду ещё несколько раз пересматривать.

  • dbnzq

    прямо сейчас изучаю. MQL
    для меня очень полезный урок .большое спасибо!

  • 125

    А почему мой комментарий к прошлому уроку вырезали?

    Цензура, или как?

    Да и вроде благодарность выразил.

  • Евгений

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

  • и снова, спасибо)) изложение прекрасное.

  • Алексей

    Здравствуйте, Павел. Очень хорошая идея учить народ азам программирования. Сам програмлю около полутора лет, хочу дать совет новичкам: называйте переменные на кириллице (пр. Пред_свеча, Сделка_в_свечу). Мне очень помогает, особенно в сложных экспертах.

  • AbruptVVM

    Уроки потрясающе великолепны! Спасибо. Сайт и так был супер, а теперь вообще супер-пупер!

  • еще бы неплохо было бы осветить тему несоответствия GMT в терминале и на сервере — в каких случаях оно может возникнуть, на что может повлиять и как с минимальным изменением кода добавить проверку на то, что клиентский часовой пояс совпадает с часовым поясом брокера … спасибо.

  • Дмитрий

    Сергей, как вы смотрите на то, чтобы выкладывать под онлайн курсом ссылку на сам видеофайл в каком-нибудь популярном формате, например .AVI ?

    • Руслан

      качай с ютуба так прще

  • Владимир

    Все отлично я уже и домашнее задание сделал

    • Сергей

      На так поделитесь с нами на форуме, а мы обсудим…
      Думаю, что всем изучающим уроки MQL будет интересно.

      • Владимир

        В какой теме можно выложить результат?

  • Антон

    Узнаю голос и ведения алгоритма кода?! Похоже у меня есть уроки Сергея и весят они 4 гига. По тем урокам я научился программировать.

    • Сергей

      Вы ошибаетесь… Это моя вторая запись видео за всю сознательную жизнь 🙂

      • Евгений Морозов

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

  • alish

    можно если не трудно выкладывать уроки в hd формате,ато плохо видно

    • На шестеренку в окне плеера нажми и выбери 720p

  • Goodwin

    Good made!
    Однако, эффект был просто потрясающим, если бы Вы (Павел и Сергей)
    позволили бы скачать программный текст урока.

    Goodwin

    • Сергей

      Владимир уже выложил своё решение на форуме 🙂

  • Jay

    Thanks Dude! your simply super!

  • Сергей

    Спасибо за Ваш труд!
    в видио все понятно ( пока смотришь и делаешь по инструкции*) )
    вот только с домашкой проблемы, логично что отступ должен быть добавлен к цене (minprice,maxprice), но как это сделать пока не пойму

    • Владимир

      Сергей и Павел, спасибо большое за Ваши труды! Очень полезный сайт и для себя почерпнул много полезного! За уроки программирования отдельное спасибо. Т.к. с программированием никогда дела не имел, то уроки даются с трудом, но, думаю, я справлюсь))) Сергей объясняет доступно, а вот когда дело доходит до ДЗ, тут все стопорится…приходится целыми днями сидеть и пересматривать видео раз за разом, вникать и запоминать))) Как говорится «без труда не вытащишь и рыбку из пруда»))) Но в итоге все получается, хоть и не так быстро как ожидалось))) А на счет ДЗ: Сергей, добавь эти отступы к minprice и maxprice там где мы выставляли отложные ордера…т.е. OrderSend(…, minprice+Indent*Point,…), в зависимости от ордера либо прибавь, либо отними от цены. И точно так же нужно дописать для SL и TP. И еще допиши переменные Indent и PipStop туда, где мы делали проверку на кол-во знаков после запятой…и все получится!))

      • Сергей

        Спасибо

  • Степан

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

  • Евгений Морозов

    Спасибо! Очень нужные уроки!!!

  • masik

    Функция «Comment» выводит информацию в левый
    верхний угол окна графика.
    А можно ли переместить этот блок в правый нижний угол
    и, заодно, увеличить шрифт.
    Спасибо…

  • Lesnik

    Во первом цикле while(x<=10)
    {
    в строке
    dPrice = iLow(Symbol(), 0, x);
    должна использоваться переменная x, а не i, что потом перекочевало и в третий цикл

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

  • Айдар

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

  • alex

    сергей а когда урок 3 будет?

  • Zaven Vardanyan

    Чтобы ни писать 4-6 функций для подчета типов ордеров, можно прибавить 1 аргумент — тип ордера, а если это еще и будет битмаск, то … 🙂

    А вообще — СПАСИБО!

    • Zaven Vardanyan

      А вот и мой (модифицированный Ваш) код

      #define ORDERBUY 1
      #define ORDERSELL 2
      #define ORDERBUYSTOP 4
      #define ORDERSELLSTOP 8
      #define ORDERBUYLIMIT 16
      #define ORDERSELLLIMIT 32

      int OrderCount(int type, int magic = 0, string symbol = «current»)
      {
      int i, count = 0;
      if (symbol == «current»)
      {
      symbol = Symbol();
      }
      for(i = OrdersTotal() — 1; i >= 0; i—)
      {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == symbol && OrderMagicNumber() == magic)
      {
      if (type & ORDERBUY && OrderType() == OP_BUY)
      {
      count++;
      }
      if (type & ORDERSELL && OrderType() == OP_SELL)
      {
      count++;
      }
      if (type & ORDERBUYSTOP && OrderType() == OP_BUYSTOP)
      {
      count++;
      }
      if (type & ORDERSELLSTOP && OrderType() == OP_SELLSTOP)
      {
      count++;
      }
      if (type & ORDERBUYLIMIT && OrderType() == OP_BUYLIMIT)
      {
      count++;
      }
      if (type & ORDERSELLLIMIT && OrderType() == OP_SELLLIMIT)
      {
      count++;
      }
      }
      }
      return(count);
      }

      А собственно вызов может вйглядеть как

      int OpenedPositionsCount = OrderCount(ORDERBUY|ORDERSELL,magic,Symbol());

      или

      int PendingLongPositionsCount = OrderCount(ORDERBUYSTOP|ORDERBYULIMIT,magic,Symbol());

  • Игорь

    Переписал, изменил ордера, работает на парах и на золоте ,НО в тестере на золоте выдает -GOLD,H1: OrderSend error 130 — Хотелось бы узнать почему, и как протестировать на золоте. Спасибо!

  • Санька

    Просмотрел видео, и сразу возник вопрос.
    А разве правильно будет использовать «&&» в этой строке ?
    if (HourStart=TimeHour(TimeCurrent())&&CountBuy=0&&CountSell=0);…
    Просто при false любого из компонентов проверки, вся проверка вернет false.
    Не следует ли в данном случае проверки для sell и buy проводить отдельными функциями ?

  • RMI

    Очень понравились уроки от Сергея aka xbms непринужденными пояснениями. Прошу прощения, если что-то не так скажу…

    В данном уроке #2, на моя взгляд такой код был уместнее на предмет проверки с использованием оператора if так:

    if(HourStart == TimeHour(TimeCurrent()))
    {
    if(CountBuyLimit() == 0)
    {
    SL = NormalizeDouble(minprice — StopLoss*Point, Digits);
    TP = NormalizeDouble(minprice + TakeProfit*Point, Digits);
    OrderSend(Symbol(), OP_BUYLIMIT, Lots, minprice, Slippage, SL, TP, comment, Magic, 0, Blue);
    }
    if(CountSellLimit() == 0)
    {
    SL = NormalizeDouble(maxprice + StopLoss*Point, Digits);
    TP = NormalizeDouble(maxprice — TakeProfit*Point, Digits);
    OrderSend(Symbol(), OP_SELLLIMIT, Lots, maxprice, Slippage, SL, TP, comment, Magic, 0, Red);
    }
    }

    нежели так:

    if(HourStart == TimeHour(TimeCurrent()) && CountBuyLimit() == 0 && CountSellLimit() == 0)

    {

    …..

    }

    Потому что после временной проверки И ОДНОВРЕМЕННОЙ проверки на отложенники может произойти следующее… советник отложит один ордер, например, на покупку, а отложенник на продажу НЕ отложится по причине близкой текущей цены с минимальному значению и тогда условия будут такими, что CountBuyLimit() == 1 и это условие НЕ даст выставить отложенник на продажу… Может я не прав? Извините!

  • Роман

    Сергей — вы молодец!!! Просто нет слов, как нам помогаете!
    Скачал видео с ютюба и пишу сову. Вот уже все написал но при декомпиляции выдает вот такую ошибку:

    «‘end_of_program’ — unbalanced left parenthesis C:Program FilesInstaTraderexpertsTest1.mq4 (181, 1)»

    Как её решить?
    Вот участок кода, в котором выдает ошибку. Вроде все верно написал…:

    //+——————————————————————+

    int CountSellLimit()

    {

    int count = 0;

    for(int trade = OrdersTotal()-1; trade >= 0; trade—)

    {

    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);

    if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

    {

    if (OrderType() == OP_SELLLIMIT)

    count++;

    }

    }

    return(count);

    }

  • Андрей

    А у меня прога не компилируется даже в том виде что её Сергей на уроке пишет, уже убился но так и не понял в чём дело.

    • виктор

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

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

  • Rauf

    СПАСИБО, Сергей! Я повторял все что ты делал на уроке, уже при первой компеляции выходят 2 ошибки: 1)’dLow’ — function is not defined C:Program Files (x86)InstaTraderexpertsMy1.mq4 (49, 15); 2) ‘dHigh’ — function is not defined C:Program Files (x86)InstaTraderexpertsMy1.mq4 (63, 15)

    В чем может быть причина?

  • Юрий

    Здравствуйте Павел и Сергей! Большое спасибо вам за ваши труды и помощь! Отличные уроки!
    Подскажите пожалуйста как можно указать советнику ставить ордера только в определенный час определенного дня недели. Спасибо!

    • Юрий

      Разобрался вроде
      if (Hourstart == TimeHour (TimeCurrent ()) && CountBUYSTOP () == 0 && CountSELLSTOP () == 0 && DayOfWeek()== 1)

      так пойдет?

  • Alex Shvets

    Здравствуйте, спасибо за Ваши пояснения!)
    Подскажите, как можно сделать так, чтобы определялась макс и мин цена за конкретный промежуток времени, например с 15-00 до 19-00?
    Спасибо!

  • Эдуард

    помогите пожалуйста сделал как в видео выходит ошибка не симметрична левая скобка не чего такого не вижу компиляция не проходит

    • AVOHR

      Всем привет ! сделал всё как надо, выдаёт ошибку 4107 подскажите как бороться ?

  • Максим

    Пожалуйста помогите!!! Хочу научиться программировать в MQL, во 2 урока программа стала выдавать ошибку(‘end_of_program’ — unbalanced left parenthesis). Раз 15 всё перепроверил, все скобки, а она всё равно ругается!

    Вот сам код!

    #property copyright «MaksON»

    #property link «»

    extern int StopLoss = 30;

    extern int TakeProfit= 50;

    extern double Lots = 0.1;

    extern int Slippage = 5;

    extern int nBar = 10;

    extern int Magic = 58;

    extern int HourStart = 10;

    extern int HourEnd = 23;

    double minprice,maxprice,SL,TP;

    //+——————————————————————+

    //| expert initialization function |

    //+——————————————————————+

    int init()

    {

    if(Digits == 3 || Digits==5)

    {

    StopLoss *= 10;

    TakeProfit*= 10;

    Slippage *= 10;

    }

    return(0);

    }

    //+——————————————————————+

    //| expert deinitialization function |

    //+——————————————————————+

    int deinit()

    {

    return(0);

    }

    //+——————————————————————+

    //| expert start function |

    //+——————————————————————+

    int start()

    {

    minprice =NormalizeDouble(GetMinPrice(),Digits);

    maxprice =NormalizeDouble(GetMaxPrice(),Digits);

    if(HourStart == TimeHour(TimeCurrent())&& CountBuyLimit()==0)

    {

    SL = NormalizeDouble(minprice — StopLoss*Point,Digits);

    TP = NormalizeDouble(minprice + TakeProfit*Point,Digits);

    OrderSend(Symbol(),OP_BUYLIMIT,Lots,minprice,Slippage,SL,TP,»»,Magic,0,Gold);

    }

    if(HourStart +1 == TimeHour(TimeCurrent())&& CountSellLimit() == 0)

    {

    SL = NormalizeDouble(maxprice + StopLoss*Point,Digits);

    TP = NormalizeDouble(maxprice — TakeProfit*Point,Digits);

    OrderSend(Symbol(),OP_SELLLIMIT,Lots,maxprice,Slippage,SL,TP,»»,Magic,0,Purple);

    }

    if(HourEnd==TimeHour(TimeCurrent())

    {

    DeleteOrders();

    }

    return(0);

    }

    //+——————————————————————+

    double GetMinPrice()

    {

    double dLow;

    for(int i=1; i<nBar; i++)

    {

    dLow = iLow(Symbol(),0,i);

    NormalizeDouble(dLow,Digits);

    // Comment("Максимальная цена за"+nBar+" "+dLow);

    }

    return(dLow);

    }

    //+——————————————————————+

    double GetMaxPrice()

    {

    double dHigh;

    for(int i=1; i=0; trade—)

    {

    OrderSelect(trade, SELECT_BY_POS,MODE_TRADES);

    if (OrderSymbol()== Symbol()&& OrderMagicNumber()==Magic)

    {

    if (OrderType()== OP_BUY )

    count++;

    }

    }

    return(count);

    }

    //+——————————————————————+

    int CountSell()//Количество открытых ордеров на продажу

    {

    int count=0;

    for (int trade = OrdersTotal()-1;trade>=0; trade—)

    {

    OrderSelect(trade, SELECT_BY_POS,MODE_TRADES);

    if (OrderSymbol()== Symbol()&& OrderMagicNumber()==Magic)

    {

    if (OrderType()== OP_SELL )

    count++;

    }

    }

    return(count);

    }

    //+——————————————————————+

    int CountBuyLimit()//Количество отложенных ордеров на покупку

    {

    int count=0;

    for (int trade = OrdersTotal()-1;trade>=0; trade—)

    {

    OrderSelect(trade, SELECT_BY_POS,MODE_TRADES);

    if (OrderSymbol()== Symbol()&& OrderMagicNumber()==Magic)

    {

    if (OrderType()== OP_BUYLIMIT )

    count++;

    }

    }

    return(count);

    }

    //+——————————————————————+

    int CountSellLimit()//Количество отложенных ордеров на покупку

    {

    int count=0;

    for (int trade = OrdersTotal()-1;trade>=0; trade—)

    {

    OrderSelect(trade, SELECT_BY_POS,MODE_TRADES);

    if (OrderSymbol()== Symbol()&& OrderMagicNumber()==Magic)

    {

    if (OrderType()== OP_SELLLIMIT )

    count++;

    }

    }

    return(count);

    }

    //+——————————————————————+

    void DeleteOrders()

    {

    for (int trade = OrdersTotal()-1;trade >=0; trade—)

    {

    OrderSelect(trade, SELECT_BY_POS,MODE_TRADES);

    if (OrderSymbol()== Symbol()&& OrderMagicNumber()==Magic)

    {

    OrderDelete(OrderTicket(),Red);

    }

    }

    }

  • Генадий

    Спасибо за видео. На мой взгляд, материал хороший, но разъяснение рассмотренного в нём материала на порядок ухудшилось по сравнению с видео «Программирование на Mql — вводный урок».

    .

    • Владимир

      Вот решил изучать тоже Mql. Жизнь заставила. Бесплатно никто не напишет, да еще и граль украдет. Только незадача — уже в терминалах Mql5. Там чуть по другому. По этому паралейно и этот курс пытаюсь осилить и на сайте Mql. Застрял на Handles. Вот и вопрос сразу — а как воспользоваться индикаторами , которых нет в справочнике по Mql ? Как узнать какие параметры нужны?

  • Я есть Я

    Большое спасибо! Мне очень понравилось! Правда, кажется, пока в голове не всё уложилось. Наверное, я как телепузик пересмотрю ваше видео 2 или более раза, прежде чем всё уяснить. Мне бы хотелось изучить этот язык программирования, чтобы можно было 1) Быстро тестировать найденные в инете ТС — а то вручную это довольно долго 2) Ну и конечно, чтоб хоть отчасти автоматизировать процесс, чтоб не нужно было всё время сидеть перед терминалом, а робот хотя бы что-то делал за меня.

  • Обновили урок под новые билды

    • евген жук

      достаточно давно читаю статьи на Вашем сайте … и сложилась некая стратегия, требующая проводить больше времени возле компьютера … но специфика моей основной работы не позволяет постоянно находится возле монитора … несколько раз пытался начать изучение MQL , но то большая загруженность на работе, а потом и рождение маленькой дочурки заставляло всё это откладывать в » дальний ящик» .Наверное , если бы не обновлённые уроки , я так бы и откладывал… теперь всё гораздо понятнее и яснее . Хочу сказать огромное спасибо и с нетерпением жду выхода следующих обновлённых уроков.С уважением , Жук

  • асет

    большое спосибо

  • Сергей

    Огромное спасибо за уроки. Выполнил ДЗ, выложил в соответствующей ветке на форуме.

  • Виктория

    Объясните, пожалуйста, в чем принципиальная разница между Indent и PipStop, и тот и другой — внешние перменные, обозначающие отступы от экстремумов. И где выкладывать домашнюю работу?

  • Евгений Литвин

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

  • Злобус Злобин

    Большое спасибо за урок. Но с первых минут просмотра я понял, что он не для меня. Дело в том, что я профессиональный программист с опытом более 5 лет. И я никак не могу найти банальный справочник по всем стандартным функция и переменным этого языка. Он существует в природе? Вот например, откуда вы узнали о переменной iLow (кстати, есть и iLowest). Не могли бы вы поделиться годным ресурсом?

  • Дмитрий Борисович

    что бы открывал в точное время и более не открывал я дописал ещё
    if(TimeHour(TimeCurrent())==HourStart)
    if(TimeMinute (TimeCurrent())==MinuteStart)
    if(TimeSeconds (TimeCurrent())==SecondsStart)

    соответственно во внешних переменных например
    extern int HourStart = 4;
    extern int MinuteStart =0;
    extern int SecondsStart =0;
    т.е открытие в 4 часа 00мин, 00 секунд, и не зависимо как сработает или нет, ордеров не отложенных и не открытых в течение суток более не будет, а вот насчет отступов так и не разобрался, и удаление не сработавшего ордера тоже, кстати написал сов на sellstop, и buystop,