FXOpen Broker

10+ years’
experience in FX

VISIT WEBSITE

Trading Accounts

ECN, STP,
Micro, Crypto

START TRADING

Try Free Demo

Practice Forex trading
risk free

OPEN DEMO ACCOUNT

PAMM Technology

Become a Master
or a Follower

JOIN PAMM SERVICE
Page 1 of 2 12 LastLast
Results 1 to 15 of 24

Thread: MQL4 уроки от eevviill (2)

  1. #1
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default MQL4 уроки от eevviill (2)

    Здесь будут уроки.
    MQL4 programmer

    Volli Correla lines

  2. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  3. #2
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 1 - ex4 и mq4 файлы

    Итак начнём с самого простого. Все скрипты, индикаторы и советники имеют разширенее файла ex4 или mq4.
    Для чего 2 типа файлов?
    1) mq4 это исходный код програмы. Значок выглядит как знак восклицания на желтом фоне. С таким расширением мы можем редактировать файл(код). Редактирование файла проходит в програме Meta Editor. Чтобы изменить код надо или просто открыть файл или в терминале на нужном на файле нажать изменить.
    Если советник с таким расширением, то в терминале в вкладке советники мы будем видить слева от названия советника желтую голову с синей шляпой.
    MQ4 НЕ ИСПОЛЬЗУЕТСЯ ТЕРМИНАЛОМ!
    2) ex4 это скомпилированый файл. Его нельзя редактировать. Компиляция проходит тогда, когда при редактировании файла mq4 нажать кнопку "Компилировать"(сверху, по середине). Если советник с таким расширением, то в терминале в вкладке советники мы будем видить слева от названия советника серую голову с серой шляпой.
    EX4 ИСПОЛЬЗУЕТСЯ ТЕРМИНАЛОМ!
    MQL4 programmer

    Volli Correla lines

  4. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  5. #3
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 2 - основные функции и типы данных

    1.1) OnInit()
    1) Основные функции. Основными функциями являются:
    Вызывается при инициализации(прикреплению к графику) файла. В этой функции нужно прописывать то, что вы хотите чтобы советник(индикатор) узнал сразу при прикреплении к графику.
    1.2) OnDeinit()
    Вызывается при удалении с графика советника(индикатора). В этой функции нужно прописывать то, что вы хотите чтобы советник(индикатор) стёр с графика сразу при его удалении.
    1.3) OnTick() OnCalculate() OnStart()
    Это основная функция советников, индикаторов, скриптов. Если без первых двух файл сможет работать, то без этих не сможет. У советников функция начинает работать после очередного тыка, у индикатора и скрипта - после прикрепления. Все вычислительные операции в советниках и скриптах надо проводить в этих функции.
    1.4)OnTimer()
    Функция код в которой выполняется через определённый интервал времени. Интервал задаётся с помощью EventSetTimer() в секундах.

    2) Типы данных. Чтобы файл понимал что мы ему подсовываем, надо перед тем писать к какому типу данных это относится. Их можно объявлять(писать) прямо в функции где это надо, но лучше их писать сначало.
    Есть такие типы данных:
    2.1)
    int - целые числа. Это те числа которые в априоре не могут быть дробными.
    Пример
    int Stop_Loss = 34;
    2.2)
    double - числа, которые могут быть дробными.
    Пример
    double ATR_Level = 0.0004;
    2.3)
    bool - логический тип данных. Может быть true\false
    Пример
    bool useATR = true;
    2.4)
    string - строковый тип данных. Переменной являются буквы.
    Пример
    string gb5 = "Hello";
    2.5)
    color - тип данных цвета.
    Пример
    color MA = clrGray;
    2.6)
    datetime - тип данных времени.
    Пример
    datetime End_trade = D'24.03.2019';
    MQL4 programmer

    Volli Correla lines

  6. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  7. #4
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 3 - разделительные знаки и операции

    1) Разделительные знаки.
    1.1) , (запятая) - применяется для отделения названий свойств некоторой операции. Может не понятно объяснил, но по примеру поймёте.
    Пример
    PHP:
    MarketInfo(Symbol(),MODE_LOTSTEP);
    1.2) ; (точка с запятой) - используеться для завершения какого то расчёта. Смысл примерно такой как точка в конце предложения.
    1.3) {} (квадратные скобки) - применяются для начала фунции и конца.
    1.4) () (скобки) - в них(не всегда) записываются свойства операции.
    1.5) " " (не знаю как называются) - то что в них не используется в самых расчётах, но можна выводить на экран или в настройки.
    1.6) // или /* */ - используются для коментирования кода.
    Если // в начале строки то всё что дальше закрасится в серый цвет и експертом вообще не будет применятся.
    Если надо больше одной строки, то в начале /* и в конце */ надо поставить.
    2) Операции.

    Арифметические операции.
    +Сумма величинx + 2 -Вычитание величин или изменение знакаx — 3, y = — y *Умножение величин3 * x /Частное от деленияx / 5 %Остаток от деленияminutes = time % 60 ++Добавление 1 к значению переменнойy++y = y + 1--Вычитание 1 из значения переменной
    (+,-,*,/) - это все знают.
    % Остаток от деления
    ++ Добавление 1 к значению переменной - тоесть x=6. Если х++, то х=7
    -- Отнемание 1 из значения переменной

    Операции присваивания
    = Присваивание значения x=6
    += Увеличение значения переменной x+=3 значит x+3
    -= Уменьшение значения переменной
    *= Умножение значения переменной
    /= Деление значения переменной
    %= Остаток от деления значения переменной

    Операции отношения
    == Истина, если x равно y x == y
    != Истина, если x не равно y x != y
    < Истина, если x меньше y x < y
    > Истина, если x больше y x > y
    <= Истина, если x меньше или равно y x <= y
    >= Истина, если x больше или равно y x >= y

    Логические операции
    ! (логическое отрицание)
    || (ИЛИ)
    && (И)
    MQL4 programmer

    Volli Correla lines

  8. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  9. #5
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 4 - написание простейшего скрипта

    PHP Code:
    1)#property copyright "eevviill"
    2)#property show_inputs
    3)extern double a 4;
    4)extern double b 7;
    5)double c;

    6)void OnStart()
    7){
    8)c=a+b;
      
    9)Alert(c);
    10)  } 
    Пояснение

    1)Это не обязательная строка. В ней пишется кому принадлежат авторские права на файл. Пишется #property copyright "" В кавычках тот, кому принадлежат авторские права.

    2)Эта функция даёт возможность, при прикреплении скрипта к графику, менять переменные которые в файле имеют приписку extern. В советниках и индикаторах чтобы увидеть, при прикреплении файла к графику, переменные с припиской extern этой функции не надо. Пишется #property show_inputs

    3)Первая переменная. Так как она написана, это называется объявлением переменной. Это делается для того чтобы файл знал с какой переменной имеет дело, какого она типа, её значение и выводить ли переменную в свойства файла при прикреплении файла к графику. Желательно, рекомендовано и необходимо объявлять переменные вначале файла(но не обязательно. можно и в самой функции). Итак.
    3.1)extern - значит что мы выводим переменную в свойства файла при прикреплении его к графику.
    3.2)double - значит что мы указываем тип переменной(урок 2). В нашем случае переменная может быть с дробной частью.
    3.3)a значит что мы указываем название переменной.
    3.4)= значит что мы присваиваем переменной какое то значение.
    3.5)4 значит что мы присвоили переменной число 4.
    3.6); значит что мы закончили объявлять переменную(урок 3).
    Пишется extern double a = 4;
    4)Аналогично с 3)
    5)Мы объявили переменную, но не вывели во внешние переменные(прикрепление к графику) и не присвоили ей значения. Тоесть без extern и без =
    Пишется double c;
    6)После объявления переменных идёт название функции где проходят все вычесления. А именно фунция Старт.
    Пишется int start()
    7)Левая квадратная скобка. Обязательно должна быть после написания названия функции. Она указывает на начало расчётов в функции.
    Пишется {
    8)Собственно наш расчёт. Где a и b это нашы переменные которые мы можем менять во внешних переменных(прикрепление к графику).
    с у нас будет ровно сумме a и b(значение которых мы укажем).
    Пишется c=a+b;
    9)Это выхов сигнала при прикрепленни файла к графику. Итак.
    9.1)Alert значит что мы указали функцию, которая выведет на екран сообщение.
    9.2)(с) значит что мы указали в скобках что нам выводить в сообщении на экран. Если с, то после пересчёта его значения, в сообщении выведется результат.
    9.3); значит конец действия(по простому - точка).
    Пишется Alert(c);
    10)Правая квадратная скобка. Обязательно должна быть после окончания расчётов. Она указывает на конец расчётов в функции.
    Пишется }
    MQL4 programmer

    Volli Correla lines

  10. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  11. #6
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 5 - скрипт калькулятор

    PHP Code:
    #property copyright "eevviill"
    #property show_inputs
    1)extern double a 4;
    extern double b 7;
    2)extern string Znak="";
    3)string Plus "+";
    string Minus "-";
    string Umnogenie "*";
    string Delenie "/";
    double  c;
     
     
    void OnStart()
      {
    4)if(Znak==Plusc=a+b;
    if(
    Znak==Minusc=a-b;
    if(
    Znak==Umnogeniec=a*b;
    if(
    Znak==Deleniec=a/b;
    5)Alert(DoubleToStr(c,8));
      } 
    Пояснение.
    1)Был выбран тип данных double(урок 2). Посколько у нас скрипт должен выполнять функцию калькулятора, то мы можем вводить не только целые числа.
    2)Был выбран тип данных string(урок 2), потому что +-*/ относятся к этому типу данных, а именно "Строковый тип данных". Переменная выведена во внешние свойства файла(прикрепление к графику) и значение этой переменной не указано потому что мы сами будем её выбирать при прикреплению к графику. Но значение можно указать и тогда оно во внешних свойствах будет отображатся по умолчанию.
    3)Был выбран тип данных string(урок 2), потому что +-*/ относятся к этому типу данных, а именно "Строковый тип данных". Значения переменных указано.
    4)Здесь используется функция if(). Очень необходимая функция. Если дословно озвучить что написано в этой строке, то выйдет так "Если значение переменной Znak равняется значению переменной Plus, то переменной с присваиваится сумма значений 2-ух переменных а и b."
    Пишется if(Znak==Plus) c=a+b;
    4.1)if() значит что мы в скобках записываем какое то условие. Например Znak==Plus.
    4.2)Znak==Plus. == не означает ровно(присвоить значение). Знак проверяет одинаковы ли значения переменных.
    4.3)c=a+b значит что если в функции if() то что в скобках истинно, то выполняется действие которое стоит после скобок.
    5)Поскольку у нас скрипт-калькулятор, то надо чтобы он выводил нам результат с определённым количеством цифр после запятой.
    DoubleToStr(с,8) имеет 2 свойства.
    5.1)(с,) первым записывается название переменной(функция бедет брать её значение).
    5.2)(,8) вторым записывается количество цифр после запятой которое буде выводится на экран(например 7,88990011).
    Пишется DoubleToStr()
    MQL4 programmer

    Volli Correla lines

  12. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  13. #7
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 6 - скрипт открывающий ордер с заданым риском

    PHP Code:
    #property copyright "eevviill"
    #property show_inputs

    extern string Risk_by_trade_in_percents;
    extern double Percent 10;
    extern bool buy false;
    extern bool sell false;
     
    extern int SL 44;
    extern int TP 41
    int sell_TP;
    int buy_TP;
    int sell_SL;
    int buy_SL;
    extern int Slippage 4;
    extern int Magic 3414;
    double Margin;
    double Cost_of_1_lot;
    double Lot_step;
    double Lot_rounded;
    double Max_lot;
    double Min_lot;
    voidOnTick()
      {
    1)Margin AccountFreeMargin();
    2)Cost_of_1_lot MarketInfo(Symbol(),MODE_MARGINREQUIRED);  
    3)Lot_step MarketInfo(Symbol(),MODE_LOTSTEP);
    4)Lot_rounded MathFloor(Margin*Percent/100/Cost_of_1_lot/Lot_step)*Lot_step ;
    5)Min_lot MarketInfo(Symbol(),MODE_MINLOT);
    Max_lot MarketInfo(Symbol(),MODE_MAXLOT);
    6)if(Lot_rounded<Min_lotLot_rounded Min_lot;
    if(
    Lot_rounded>Max_lotLot_rounded Max_lot;
    7)double SLbuy=0SLsell=0,TPbuy=0,TPsell=0
    8)if(SL>0) {SLbuy=Ask-SL*PointSLsell=Bid+SL*Point;}
    if(
    TP>0) {TPbuy=Ask+TP*Point;TPsell=Bid-TP*Point;}
    9)while(!IsTradeAllowed()) Sleep(1000);
    10)if(buyOrderSend(Symbol(),OP_BUY,Lot_rounded,Ask,Slippage,SLbuy,TPbuy,"Risk by trade",Magic,0,Blue);
    while(!
    IsTradeAllowed()) Sleep(1000);
    if(
    sellOrderSend(Symbol(),OP_SELL,Lot_rounded,Bid,Slippage,SLsell,TPsell,"Risk by trade",Magic,0,Orange);
    11)if(buyAlert(Symbol(),"  Buy  ",Ask,"  ",Percent,"%  ",Lot_rounded);
    if(
    sellAlert(Symbol(),"  Sell  ",Bid,"  ",Percent,"%  ",Lot_rounded);
      } 
    Пояснение.
    До функции Start() это всё объявление переменных. Это мы уже знаем.
    1)Функция AccountFreeMargin() возвращает суму свободных средств на счете. Тоесть если в терминале у нас 400 доларов в средствах, то переменной Margin будет присвоено значение 400.00.
    2)Функция MarketInfo(Symbol(),MODE_MARGINREQUIRED) узнаёт то условие торговли у нашего брокера что нам надо. Имеет 2 свойства.
    2.1)MarketInfo(Symbol(),) название валютной пары. Если Symbol(), то значит проверка идёт по той валютной паре, к графику какой мы прикрипили скрипт.
    2.2)MarketInfo(,MODE_MARGINREQUIRED) это то количество денег, что надо для покупки 1-го лота валютной пары.
    3)MarketInfo(Symbol(),MODE_LOTSTEP) тоже что и в придыдущем примере, только MODE_LOTSTEP значит минимальный шаг на который мы можем увеличивать объём ордера.
    4)Функция MathFloor округляет значения чегото то до 2 цифр после запятой. Это нам нужно, для того чтобы округлить наш 4-ох значный после запятой лот.
    5)Функция MarketInfo(Symbol(),MODE_MINLOT). MODE_MINLOT это минимальный лот который разрешает брокер.
    6)if(Lot_rounded<Min_lot) Lot_rounded = Min_lot; Здесь мы указали что если наш рисковый лот меньше минимальнодопустимого лота, то рисковый лот будет минимальнодопустимым.
    7)double SLbuy=0, SLsell=0,TPbuy=0,TPsell=0; Здесь мы объявили переменные для ТП и СЛ. Они должны стоять со значениями 0.
    8)if(SL>0) {SLbuy=Ask-SL*Point; SLsell=Bid+SL*Point;}
    Здесь, мы указали что если СЛ больше 0, то(расчёт СЛ).
    Квадратные скобки нужны если после if мы используем 2 и больше действия в случае if(истина).
    Расчёт СЛ нужен потому что в ордере что мы открываем нужно указывать цену СЛ, а не на сколько пунктов она от цены открытия.
    Point это то что переводит наш СЛ в цену.
    9)Функция while(!IsTradeAllowed()) Sleep(1000);
    while будет выполнять(зацикливание) то что у неё в скобках пока оно не станет ЛОЖЬ. (!IsTradeAllowed()) значит что скрипт не будет дальше выполнятся, пока не будет разрешена торговля(отключение терминала, торговля запрещена и т.д.) IsTradeAllowed значит что разрешена торговля, но у нас стоит знак ! значит не разрешена.
    Sleep(1000) это количество милисекунд на выполнение цыкла.
    10)if(buy) OrderSend(Symbol(),OP_BUY,Lot_rounded,Ask,Slippage,SLbuy,TPbuy,"Risk by trade",Magic,0,Blue);
    Это уже окрытие ордера. Мы написали условие для его открытия, а именно если мы поставим buy=true(при прикреплении к графику).
    OrederSend имеет 11 свойств.
    10.1)Валютная пара.
    10.2)бай, сел, бай стоп, сел стоп, бай лимит, сел лимит.
    10.3)Лот.
    10.4)Цена. Ask Bid.
    10.5)Проскальзывание(в пунктах).
    10.6)СЛ(в цене).
    10.7)ТП(в цене).
    10.8)Коментарий(будет виден в столбце Коментарии).
    10.9)Магик намбер. Индивидуальный номер ордера.
    10.10)Время истечения действия отложенного ордера.
    10.11)Цвет стрелки на графике при открытии ордера.
    11)if(buy) Alert(Symbol()," Buy ",Ask," ",Percent,"% ",Lot_rounded);
    Это обычный алерт, но с условием и показан пример как делать растояние между значением переменных.
    MQL4 programmer

    Volli Correla lines

  14. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  15. #8
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 7 - советник на основе МА и ATR

    PHP Code:
    #property copyright "eevviill"
     
    extern double Lot 0.1;
    extern int MA_Enter_period 30;
    extern int MA_Exit_period 60;
    extern double ATR_level=0.0002;
    extern int Size_of_Enter_Candle=5;
    extern int Stop_Loss 24;
    extern int Take_Profit 21;
    extern int Slippage 4;

    int Magic 284;
    double MA1;
    double MA2;
    double ATR;


     
    void OnTick()
      {
     
    1)MA1=iMA(Symbol(),0,MA_Enter_period,0,MODE_LWMA,PRICE_CLOSE,1);
     
    MA2=iMA(Symbol(),0,MA_Exit_period,0,MODE_LWMA,PRICE_CLOSE,1);
     
    2)ATR=iATR(Symbol(),0,14,1);
     
     
    double SLbuy=0SLsell=0,TPbuy=0,TPsell=0
    if(
    Stop_Loss>0) {SLbuy=Ask-Stop_Loss*PointSLsell=Bid+Stop_Loss*Point;}
    if(
    Take_Profit>0) {TPbuy=Ask+Take_Profit*Point;TPsell=Bid-Take_Profit*Point;}
     
    3)if(Volume[0]>1) return;
    while(!
    IsTradeAllowed()) Sleep(2000);
    4)if(OrdersTotal()<1)
    5){if(Open[1]>MA1&&Close[1]<MA1&&ATR>=ATR_level&&High[1]-Low[1]>=Size_of_Enter_Candle*PointOrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,SLsell,TPsell,"MA",Magic,0,Green);
     if(
    Open[1]<MA1&&Close[1]>MA1&&ATR>=ATR_level&&High[1]-Low[1]>=Size_of_Enter_Candle*PointOrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,SLbuy,TPbuy,"MA",Magic,0,Green);}
     
    if(
    Volume[0]>1) return;
    while(!
    IsTradeAllowed()) Sleep(2000);
    6)OrderSelect(0,SELECT_BY_POS);
    7)if(OrderMagicNumber()==284
     
    8){int ticket OrderTicket();
     
    9)if (Open[1]>MA2&&Close[1]<MA2 && OrderType()==OP_BUY
    10)OrderClose(ticket,Lot,Bid,Slippage,OrangeRed);
     if (
    Open[1]<MA2&&Close[1]>MA2 && OrderType()==OP_SELLOrderClose(ticket,Lot,Ask,Slippage,OrangeRed);}

     } 
    Пояснение.
    1)MA1=iMA(Symbol(),0,MA_Enter_period,0,MODE_LWMA,PRICE_CLOSE,1);
    Здесь мы присвоили переменной МА1 значение(цену где находится) индикатор МovingАvarage. Если индикатор встроееный в терминал, то перед его названием надо дописать i
    МА имеет 7 свойств.
    1.1)Название валютной пары(если Symbol(), то текущая валютная пара).
    1.2)Таймфрейм(если 0, то текущий ТФ).
    1.3)Период МА.
    1.4)Сдвиг индикатора относительно ценового графика.
    1.5)Метод усреднения(Simple==SMA и т.д.).
    1.6)Цена закрытия или открытия свечи(цена открытия свечи==PRICE_OPEN и т.д.).
    1.7)С какой свечи брать инфомацию(0==с текущей,1==с прошлой закрытой свечи,2==с позапрошлой закрытой свечи и .т.д.).
    2)ATR=iATR(Symbol(),0,14,1);
    Здесь мы присвоили переменной ATR значение(уровень) индикатора ATR. Имеет 4 свойства.
    2.1)Название валютной пары(если Symbol(), то текущая валютная пара).
    2.2)Таймфрейм(если 0, то текущий ТФ).
    2.3)Период индикатора.
    2.4)С какой свечи брать инфомацию(0==с текущей,1==с прошлой закрытой свечи,2==с позапрошлой закрытой свечи и .т.д.).
    3)if(Volume[0]>1) return; здесь мы написали чтобы персчёт начинался только с новой свечи.
    Volume содержит данные всех тиков. [0] здесь записывается номер свечи. Выходит мы написали если на свече больше 1 тика, то остальные действия прерываются.
    4)if(OrdersTotal()<1) здесь мы написали что если открытых(и отложенных) ордеров меньше 1, то... Функция rdersTotal() возвращает значение всех открытых и отложеных ордеров.
    5){if(Open[1]>MA1&&Close[1]<MA1&&ATR>=ATR_level&&High[1]-Low[1]>=Size_of_Enter_Candle*Point) здесь мы написали условие для открытия ордера, а именно SELL. Итак.
    5.1)Open[1]>MA1&&Close[1]<MA1
    Open это цена открытия свечи. Номер свечи записывается в[](0==текущая свеча,1==прошлая закрытая свеча,2==позапрошлая закрытая свеча и т.д.).
    Close это цена закрытия свечи. Номер свечи записывается в[](0==текущая свеча,1==прошлая закрытая свеча,2==позапрошлая закрытая свеча и т.д.).
    5.2)ATR>=ATR_level здесь мы указали что минимальный уровень ATR должен ровнятся или быть больше ATR_level.
    5.3)High[1]-Low[1]>=Size_of_Enter_Candle*Point здесь мы указали что входная свеча должа быть больше определённой величины.
    High это максимальная цена свечи. Номер свечи записывается в[](0==текущая свеча,1==прошлая закрытая свеча,2==позапрошлая закрытая свеча и т.д.).
    Low это минимальная цена свечи. Номер свечи записывается в[](0==текущая свеча,1==прошлая закрытая свеча,2==позапрошлая закрытая свеча и т.д.).
    6)OrderSelect(0,SELECT_BY_POS); если нам надо закрыть ордер, то надо сначало его выбрать с помощю функции OrderSelect(). Она имеет 3 свойства.
    6.1)Если второе свойство SELECT_BY_POS, то здесь вводим порядковый номер в списке открытых ордеров. Если SELECT_BY_TICKET, то номер тикета.
    6.2)SELECT_BY_POS==выбор ордера по порядковому номеру в списке.
    SELECT_BY_TICKET==выбор ордера по тикету ордера.
    6.3)MODE_TRADES==выбор с открытых ордеров.
    MODE_HISTORY==выбор с закрытых ордеров.
    7)if(OrderMagicNumber()==284) здесь мы использовали функцию OrderMagicNumber(). Эта функция находит(среди выбраных) ордер с определённым меджиком.
    8)int ticket = OrderTicket() здесь мы присвоили переменной int ticket тикет выбраного нами ордера с помощю функции OrderTicket()
    9)if (Open[1]>MA2&&Close[1]<MA2 && OrderType()==OP_BUY) здесь мы указали условие на закрытие ордера.
    9.1)OrderType()==OP_BUY значит что мы с помощю функции OrderType()(которая возвращает тип нашего ордера) будем закрывать только BUY.
    10)OrderClose(ticket,Lot,Bid,Slippage,OrangeRed); это функция закрытия ордера. Имеет 5 свойств.
    10.1)Номер тикета.
    10.2)Лот закрытия.
    10.3)Цена(Bis,Ask).
    10.4)Проскальзывание.
    10.5)Цвет значка на графике при закрытиии ордера.
    MQL4 programmer

    Volli Correla lines

  16. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  17. #9
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 8 - цикл for(;;;) и цикл while()

    PHP Code:
    1)int a=6,b=17,i,Suma;
     
    void OnStart()
    {
    2)for(i=a;b>=i;i++)
    {
    Suma=Suma+i;
    }
     
    3)Alert(Suma);

    Пояснение.
    1)Ещё один способ объявления переменных. Можно одной строкой через запятую(если они одного типа). При этом можно сразу присваивать им значение.
    2)Оператор for. После него в скобках должны быть 3 условия, после них должны указыватся наши действия в рамках оператора(в квадратных скобках). Итак.
    2.1)В первом условии записывается с чего начинаем(с числа 6).
    2.2)Во втором условии пишется когда наш оператор закончит свою работу.
    2.3)В третем условии записывается шаг(в нашем случае), на который менять значение переменной i.

    Цикл проходит в таком порядке. Первое условие-второе условие-тело(в квадратных скобках)-третье условие.

    Объясню на нашем примере что делается.
    1-ый круг.
    2.4)Оператор получил первое условие, это число 6.
    2.5)Оператор проверил или 17 больше(или ровно) 6. Если да то продолжаем, если нет оператор for отключается и передаёт управление следуещему оператору.
    2.6)Дальше оператор передаёт значение 1-го условия и пересчитывает то, что в теле. У нас стоит Suma=Suma+i; Перед первым кругом значение переменной Suma не было присвоенно. Значит 0. Подсчитываем. Suma=0+6=6.
    2.7)В третьем условии стоит что нам надо i увеличить на единицу(i++).
    2-ой круг.
    2.8)Оператор получил новое условие, это число 7 (так как в конце прошлого круга мы увеличили i на еденицу).
    2.9)Оператор проверил или 17 больше(или ровно) 7. Если да то продолжаем, если нет оператор for отключается и передаёт управление следуещему оператору.
    2.10)Дальше оператор передаёт значение 1-го условия и пересчитывает то, что в теле. У нас стоит Suma=Suma+i; После первого круга значение переменной Suma = 6. Подсчитываем. Suma=6+7=13.
    2.11)В третьем условии стоит что нам надо i увеличить на единицу(i++).
    И т.д.
    3)После выхода из цыкла(когда 2ое условие стаёт false) for, мы выведем на экран результат.

    Оператор while()
    {}
    Пояснение.
    Этот оператор будет исполнятся пока условие в скобках будет истинным(true). Как только условие станет ложным, оператор закончит свою роботу, и будет выполнятся следующий за ним оператор.
    MQL4 programmer

    Volli Correla lines

  18. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  19. #10
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 9 - скрипт закрывающий ордера

    PHP Code:
    #property copyright "eevviill"
    #property show_inputs
    extern string TO "Тип ордера для закрытия";
    extern bool Buy false;
    extern bool Sell false;
    extern bool BuyStop false;
    extern bool SellStop false;
    extern bool BuyLimit false;
    extern bool SellLimit false;
    extern bool Close_all_lots true;
    extern double Close_lot 0.1;
    double Lot;
    extern int Magic 0;
    extern int Slippage 4;
     

    void OnStart()
      {
    1)for (int i=OrdersTotal()-1i>=0i--)
    {
    if (!
    OrderSelect(i,SELECT_BY_POS) || OrderMagicNumber()!= Magic) continue;
    2)if(Close_all_lots==trueLot=OrderLots();
    if(
    Close_all_lots==falseLot=Close_lot;
    3)if (OrderType()==OP_BUY && Buy==trueOrderClose(OrderTicket(),Lot,Bid,Slippage,Yellow);
    if (
    OrderType()==OP_SELL && Sell==trueOrderClose(OrderTicket(),Lot,Ask,Slippage,Yellow);
    if (
    OrderType()==OP_BUYSTOP && BuyStop==trueOrderDelete(OrderTicket());
    if (
    OrderType()==OP_SELLSTOP && SellStop==trueOrderDelete(OrderTicket());
    if (
    OrderType()==OP_BUYLIMIT && BuyLimit==trueOrderDelete(OrderTicket());
    if (
    OrderType()==OP_SELLLIMIT && SellLimit==trueOrderDelete(OrderTicket());
    }

      } 

    Пояснение.
    1)С помощью функции for мы перебираем ордера с конца. Как мы помним, этот цикл имеет 4 шага.
    1.1)Мы присвоили переменной i значение TotalOrders()-1. Это значит что мы начинаем перебирать ордера начиная с передпоследнего.
    1.2)Проверили есть ли у нас ещё открытые ордера.
    1.3)Выполняется то, что в теле функции.
    1.4)Переменную i уменьшили на еденицу.
    2)Здесь мы выбираем какую часть лота ордера нужно закрыть. Если во внешних переменных Close_all_lots = true, то будет закрыватся весь ордер. Если Close_all_lots = false , то будет закрыватся та часть лотов что укажыте в переменной Close_lot.
    3)Здесь мы перечисляем условия для закрытия ордера бай. А именно.
    3.1)OrderSelect(i,SELECT_BY_POS) мы выбрали ордер для работы с ним с порядковым номером і.
    3.2)OrderMagicNumber()== Magic Меджик должен совпадать с меджиком закрываемого ордера. Если меджик=0, то это ордера открыты вручную.
    3.3)OrderType()==OP_BUY Проверяем тип выбраного ордера.
    3.4)Buy==true Во внешних переменных мы указываем какой тип ордеров закрывать.
    Last edited by eevviill; 07-23-2019 at 09:55 AM.
    MQL4 programmer

    Volli Correla lines

  20. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  21. #11
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 10 - трейлинг стоп

    PHP Code:
    int TrailingStop 10;
     
    1)OrderSelect(0,SELECT_BY_POS);
    2)if(OrderMagicNumber()==Magic
     {
    3)if(OrderType()==OP_BUY && Bid-OrderOpenPrice()>TrailingStop*Point && OrderStopLoss()<Bid-TrailingStop*Point
    OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);
    if(
    OrderType()==OP_SELL && OrderOpenPrice()-Ask>TrailingStop*Point && OrderStopLoss()>Ask+TrailingStop*Point
    OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Blue);
     }
    4)OrderModify(); 
    Пояснение.
    1)Для начала выбираем ордер с которым будем работать.
    2)Проверяем ордер на меджик.
    3)Здесь указываем условие трейлинга для ордера бай.
    3.1)OrderType()==OP_BUY проверяем тип открытого ордера.
    3.2)Bid-OrderOpenPrice()>TrailingStop*Point текущая цена-цена открытия ордера>количество пунктов трейлинга.
    3.3)OrderStopLoss()<Bid-TrailingStop*Point стоп лос ордера<текущая цена-количество пунктов трейлинга.
    4)OrderModify(); функция модификации ордера(СЛ,ТП,цена отложенного ордера).
    MQL4 programmer

    Volli Correla lines

  22. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  23. #12
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 11 - пользовательская функция

    Грубо говоря это блок каких то расчётов, корые находятся вне функции Start() но вызываются ею.
    Будем разсматривать 2 примера. Пример обчисления 3 чисел и пример нахождения цены выше или ниже МА. В этих примерах не будет функции типа Void(). Отличается только тем что не возвращает никаких значений.

    PHP Code:
    int a=3;
    int b=8;
    int c=6;
    int d;
     
    void OnStart()
    {
    1)d=Summa(a,b,c);
    }
     
    2)int Summa(int a,int b,int c)
    {
    3)int g=a+b+c;
    4)return(g);


    Пример2.
    Желательно в входные параметры записывать чем по меньше значений. Тоесть если есть возможность, то проводить расчёты (которые ведутся в функции OnStart()) в самой пользовательской функции.

    PHP Code:
    extern int period_MA=60
    int a;

    void OnStart()
    {
    1)a=Price_MA(period_MA);
    2)if(a>0OrderSend(Symbol(),OP_BUY,0.1,Ask,2,0,0,"user function",54,0,CLR_NONE);
    }

    3)int Price_MA(int period_MA)
    {
     
    4)double MA1 iMA(Symbol(), 0period_MA,,MODE_LWMAPRICE_CLOSE1);
     
     {
     
    5)if(Close[1]<MA1) return(-1); 
     if(
    Close[1]>MA1) return (1);
     }
     
     
    6)return(0);

    Пояснение2.
    1)Мы присвоили переменной a значение, которое будет передано после обчисления функции Price_MA(period_MA). Записывать надо
    1.1)Название без типа данных.
    1.2)В скобках входные данные без типа данных.
    2)Здесь мы указали условие что если после присвоения переменной a значение и если оно будет больше нуля, то открываем ордер.
    3)Название функции и входные параметры. Записывается так.
    3.1)Название пишется с указанием типа данных которое будет возвращатся.
    3.2)Входные параметры пишутся с указанием типа данных.
    4)Здесь прямо в функции присваиваем переменной МА1 значение индикатора МА. Единственным параметром который будет менятся в индикаторе МА это период МА. Он у нас находится во входных параметрах функции Price_MA.
    5)Здесь мы указали что если цена находится ниже индикатора МА, то функция Price_MA при её вызове вернёт -1. Если выше то 1.
    6)Если ни одно из указаных условий не верно(в нашем случае такого быть не может. Значит ошибка где то), то при обращении к функции она вернёт 0.


    Пояснение void.
    Если тип функции такой, то при обращении к ней она ничего не возвращает. Тоесть происходят действия, котрые в теле функции и всё. В большинстве случаев это функции открытия, модификации, подсчёта, закрытия ордеров.
    MQL4 programmer

    Volli Correla lines

  24. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  25. #13
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 12 - индикатор(не буферный)

    PHP Code:
    #property copyright "eevviill"
    #property link      "[email protected]"
    1)#property indicator_chart_window
     
    extern int TF_ATR 5;
    string TF_ATR3
    int TF_ATR2;


    2)void OnDeinit(const int reason)
    {
    ObjectDelete("Name ATR TF");
    ObjectDelete("TF ATR");
    ObjectDelete("ATR");
    ObjectDelete("ATR Value");
    }
     
     
    int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[],const double &open[],const double &high[],
                    const 
    double &low[],const double &close[],const long &tick_volume[],const long &volume[],const int &spread[])
      {
    3)int    counted_bars IndicatorCounted();
     
    4)switch(TF_ATR)
    {
    case 
    TF_ATR2 PERIOD_M1; break;
    case 
    TF_ATR2 PERIOD_M5; break;
    case 
    15 TF_ATR2 PERIOD_M15; break;
    case 
    30 TF_ATR2 PERIOD_M30; break;
    case 
    60 TF_ATR2 PERIOD_H1; break;
    case 
    240 TF_ATR2 PERIOD_H4; break;
    case 
    1440 TF_ATR2 PERIOD_D1; break;
    }
     
    5)double ATR_EURUSD iATR("EURUSD",TF_ATR2,14,1);
    double ATR_EURJPY = (iATR("EURJPY",TF_ATR2,14,1))/100;
    double ATR_EURGBP iATR("EURGBP",TF_ATR2,14,1);
    double ATR_EURCHF iATR("EURCHF",TF_ATR2,14,1);
    double ATR_EURCAD iATR("EURCAD",TF_ATR2,14,1);
    double ATR_EURAUD iATR("EURAUD",TF_ATR2,14,1);
    double ATR_EURNZD iATR("EURNZD",TF_ATR2,14,1);
    double ATR_GBPUSD iATR("GBPUSD",TF_ATR2,14,1);
    double ATR_GBPJPY = (iATR("GBPJPY",TF_ATR2,14,1))/100;
    double ATR_GBPCHF iATR("GBPCHF",TF_ATR2,14,1);
    double ATR_GBPCAD iATR("GBPCAD",TF_ATR2,14,1);
    double ATR_GBPAUD iATR("GBPAUD",TF_ATR2,14,1);
    double ATR_GBPNZD iATR("GBPNZD",TF_ATR2,14,1);
    double ATR_AUDUSD iATR("AUDUSD",TF_ATR2,14,1);
    double ATR_AUDJPY = (iATR("AUDJPY",TF_ATR2,14,1))/100;
    double ATR_AUDCHF iATR("AUDCHF",TF_ATR2,14,1);
    double ATR_AUDCAD iATR("AUDCAD",TF_ATR2,14,1);
    double ATR_AUDNZD iATR("AUDNZD",TF_ATR2,14,1);
    double ATR_NZDUSD iATR("NZDUSD",TF_ATR2,14,1);
    double ATR_NZDJPY = (iATR("NZDJPY",TF_ATR2,14,1))/100;
    double ATR_NZDCHF iATR("NZDCHF",TF_ATR2,14,1);
    double ATR_NZDCAD iATR("NZDCAD",TF_ATR2,14,1);
    double ATR_USDJPY = (iATR("USDJPY",TF_ATR2,14,1))/100;
    double ATR_USDCHF iATR("USDCHF",TF_ATR2,14,1);
    double ATR_USDCAD iATR("USDCAD",TF_ATR2,14,1);
    double ATR_CADCHF iATR("CADCHF",TF_ATR2,14,1);
    double ATR_CADJPY = (iATR("CADJPY",TF_ATR2,14,1))/100;
    double ATR_CHFJPY = (iATR("CHFJPY",TF_ATR2,14,1))/100;
    6)double ATR_all = (ATR_EURUSD+ATR_EURJPY+ATR_EURGBP+ATR_EURCHF+ATR_EURCAD+ATR_EURAUD+ATR_EURNZD+
    ATR_GBPUSD+ATR_GBPJPY+ATR_GBPCHF+ATR_GBPCAD+ATR_GBPAUD+ATR_GBPNZD+
    ATR_AUDUSD+ATR_AUDJPY+ATR_AUDCHF+ATR_AUDCAD+ATR_AUDNZD+
    ATR_NZDUSD+ATR_NZDJPY+ATR_NZDCHF+ATR_NZDCAD+
    ATR_USDJPY+ATR_USDCHF+ATR_USDCAD+
    ATR_CADCHF+ATR_CADJPY+
    ATR_CHFJPY)/28;
    7)string ATR DoubleToStr(ATR_all,6);
     
    8)ObjectCreate("Name ATR TF",OBJ_LABEL,0,0,0);
    ObjectSet("Name ATR TF",OBJPROP_CORNER,1);
    ObjectSet("Name ATR TF"OBJPROP_XDISTANCE,80);
    ObjectSet("Name ATR TF"OBJPROP_YDISTANCE34);
    ObjectSetText("Name ATR TF","Overall ATR TF =",12,"Arrial",Yellow);
    9)switch(TF_ATR)
    {
    case 
    TF_ATR3 "M1"; break;
    case 
    TF_ATR3 "M5"; break;
    case 
    15 TF_ATR3 "M15"; break;
    case 
    30 TF_ATR3 "M30"; break;
    case 
    60 TF_ATR3 "H1"; break;
    case 
    240 TF_ATR3 "H4"; break;
    case 
    1440 TF_ATR3 "D1"; break;
    }
    ObjectCreate("TF ATR",OBJ_LABEL,0,0,0);
    ObjectSet("TF ATR",OBJPROP_CORNER,1);
    ObjectSet("TF ATR"OBJPROP_XDISTANCE,42);
    ObjectSet("TF ATR"OBJPROP_YDISTANCE30);
    ObjectSetText("TF ATR",TF_ATR3,15,"Arrial",OrangeRed);
    ObjectCreate("ATR",OBJ_LABEL,0,0,0);
    ObjectSet("ATR",OBJPROP_CORNER,1);
    ObjectSet("ATR"OBJPROP_XDISTANCE,110);
    ObjectSet("ATR"OBJPROP_YDISTANCE58);
    ObjectSetText("ATR","Overall ATR =",12,"Arrial",Yellow);
    ObjectCreate("ATR Value",OBJ_LABEL,0,0,0);
    ObjectSet("ATR Value",OBJPROP_CORNER,1);
    ObjectSet("ATR Value"OBJPROP_XDISTANCE,22);
    ObjectSet("ATR Value"OBJPROP_YDISTANCE54);
    ObjectSetText("ATR Value",ATR,15,"Arrial",DeepSkyBlue);
       return(
    rates_total);
      } 
    Пояснение.
    1)Здесь указывается где будет наш индикатор(в нашем случае в основном графике). Если в отдельном окне, то надо писать #indicator_separate_window
    2)Как мы помним эта функция используется при удаления файла с графика. В нашем случае при удалении индикатора с графика будут удалены объекты с названиями указаные в скобках. Если надо удалять все объекты с графика то надо писать ObjectsDeleteAll();
    3)Это стандартная вставка генератора файлов MetaEditor. Показывает количество подсчитаных свечей. Вообще нужная вещь, но у нас использоватся не будет.
    4)Ето оператор. Его задача примерно такая. Если значение переменной такое, то делаем то. По нашему примеру. Так как нам надо в индикатор записывать период, а он обозначается на просто цифрой, то надо писать что то типа если ТФ АТР = 5 , значит присваиваем другой переменной ТФ АТР2(которая записана у нах в свойствах индикатора) PERIOD_M5.
    4.1)switch() здесь указывается назавание оператора, а в скобках записывается название переменной, значение которой мы будем перебирать.
    4.2){} начало и конец оператора.
    4.3)case : ;brake; здесь записывается значение переменной-потом 2 вертикальные точки-потом что делать-потом brake(значит что мы передаём управление дальше).
    5)Здесь мы присваивали переменным значения индикатора ATR.
    6)Здесь мы подсчитываем среднее значение ATR.
    7)Здесь мы присваиваем string переменной значение типа double(ну и делаем так чтобы показывалось 6 цифр после запятой). Делается это потому что при создании надписи на графике тип надписи должен быть string.
    8)Собственно это и есть создание и форматирование надписи на графике. В нашем примере это надпись Overall ATR TF =
    8.1)ObjectCreate("Name ATR TF",OBJ_LABEL,0,0,0);
    Этой функцией мы создаём что то. Параметры(название объекта,что мы создаём( у нас надпись),номер окна где создаём(0 это главный график), дальше идут координаты цены и времени(мы не используем)).
    8.2)ObjectSet("Name ATR TF", OBJPROP_XDISTANCE,80);
    Этой функцией мы форматируем созданый объект. Параметры(название форматируемого объекта,OBJPROP это обязательно и через _ пишем что мы хотим поменять(у нас растояние от правого края в пикселях справа на лево),величина 2-го параметра).
    8.3)ObjectSetText("Name ATR TF","Overall ATR TF =",12,"Arrial",Yellow);
    Если у нас объект текст, то мы можем его отформатировать. Параметры(название форматируемого объекта, текст который будет выводится на график, размер шрифта, стиль шрифта, цвет шрифта).
    9)Здесь также как в пункте 7 надо данные перевести с одного типа(int) в string для отображения на графике.
    Last edited by eevviill; 07-23-2019 at 09:49 AM.
    MQL4 programmer

    Volli Correla lines

  26. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  27. #14
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 13 - функция iCustom

    PHP Code:
    #property copyright "eevviill"
    #property link      "[email protected]"

    extern double Lot 0.1;
    extern int Stop_Loss 24;
    extern int Take_Profit 21;
    extern int magic 7352;
    extern int Slippage 2;

    1)extern string Indicator "sidus v.2";
    extern int FastEMA 16;
    extern int SlowEMA 24;

    voidOnStart()
      {
    while(!
    IsTradeAllowed()) Sleep(2000);
    if(
    Volume[0]>1) return;
      
    2)double arrow_up iCustom(Symbol(),0,"sidus v.2",FastEMA,SlowEMA,3,1); //1
    double arrow_down iCustom(Symbol(),0,"sidus v.2",FastEMA,SlowEMA,4,1); //2

    double SLbuy=0SLsell=0,TPbuy=0,TPsell=0
    if(
    Stop_Loss>0) {SLbuy=Ask-Stop_Loss*PointSLsell=Bid+Stop_Loss*Point;}
    if(
    Take_Profit>0) {TPbuy=Ask+Take_Profit*Point;TPsell=Bid-Take_Profit*Point;}

    if(
    OrdersTotal()<1)
    {
    3)if(arrow_up>0OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,SLbuy,TPbuy,"Sidus v2",0,Green);
    if(
    arrow_down>0OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,SLsell,TPsell,"Sidus v2",0,Red);
    }

      } 
    Пояснение.
    1)Здесь мы указываем те настройки индикатора, которые хотим менять с помощю советника. ОБЯЗАТЕЛЬНО! настройки должны совпадать:
    1.1)С порядком настроек в индикаторе. Это можно посмотреть при прикреплении индикатора к графику.
    1.2)С типом данных настроек которые в индикаторе. Например в нашем случае это периоды МА. А это тип данных int.
    2)Здесь мы присваиваем переменной arrow_up значение индикатора. ОБЯЗАТЕЛЬНО! тип данных будет double, чтобы не передавал индикатор. Свойства.
    2.1)Валютная пара с которой брать данные.
    2.2)Тайм фрейм с которого брать данные.
    2.3)Название индикатора в скобках без разширения.
    2.4)Параметры которые мы хотим менять с помощю советника. Порядок обязателен.
    2.5)Здесь мы указываем из какого буфера брать данные. Чтобы узнать какой нам буфер нужен, нужно зайти в свойства индикатора (при прикрепление к графику). Там в вкладке Цвета и будут наши буферы. Нумерация начинается с 0 до 7.
    В нашем примере если мы сначала прикрепим индикатор к графику, а потом зайдём в свойства, то увидем что 3 буфер зелёного цвета и отвечает за стрелку вверх, а 4 красного цвета и отвечает за стрелку вниз.
    2.6)С какой свечи брать данные.(0=текущая, 1=прошлая, 2=позапрошлая и т.д.)
    3)Условие на покупку. Мы указали что если значение arrow_up больше 0 то бай.
    Почему именно так???
    Тут надо проводить опыт.
    3.1)После функции iCustom где нибудь в конце пишем строчку
    Alert(arrow_up," ",arrow_down). Это делается для того чтобы узнать что(какое значение) нам возвращает индикатор.
    3.2)Заходим в тестер. Запускаем советник с визуализацией. После окончания тестирования заходим в вкладку журнал тестера и смотрим что там нам Алерт писал.
    3.3)Итак. Когда стрелок нет Алерт выдаёт (0 0). Вывод (0-стрелки вверх нету 0-стрелки вниз нету).
    Если (1.2345 0). Вывод. Ага! Если появилась стрелка вверх, то индикатор возвпащает цену где появилась. Ну и наоборот.
    Конечный итог. 0=нету сигнала. >0 есть сигнал.
    MQL4 programmer

    Volli Correla lines

  28. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

  29. #15
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,351
    FXO Shares
    0
    FXO Bonus
    0.000
    Thanks
    1,380
    Thanked 1,290 Times in 1,164 Posts

    Default Урок 14 - перебор ордеров

    PHP Code:
    1)for(int i=OrdersTotal()-1i>=0i--)
     {
     
    2)OrderSelect(i,SELECT_BY_POS);
     {
     
    3)if(OrderMagicNumber()==magic)
     {
     
    4)if(OrderType()==OP_BUY...) OrderClose(OrderTicket(),Lot,Bid,slippage,Yellow); 
     }
     }
     } 
    1)Собственно это и есть перебор ордеров функцией for.
    1.1)Начинаем с общего количества ордеров+1.
    1.2)Будем продолжать пока ордеров будет 0 или больше.
    1.3)На каждом переборе будем уменьшать количество перебираемых ордеров на 1.
    2)Функция OrderSelect(); С помощью неё мы выбираем конкретный ордер. В нашем слачае (порядковый номер в терминале i, из тех что находятся в закладке торговля).
    3)После того как выбрали ордер проверяем или это ордер нашего советника. Проверку делаем с помощью меджик намбера, который должен совпадать с меджиком открытого ордера.
    4)Здесь уже проводятся конкретные действия. Например если ордер бай и
    цена пересекла МА сверху вниз закрываем ордер.
    MQL4 programmer

    Volli Correla lines

  30. The Following User Says Thank You to eevviill For This Useful Post:

    Prezident (07-23-2019)

Page 1 of 2 12 LastLast

Bookmarks

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Disclaimer
2005-2019 © FXOpen All rights reserved. Various trademarks held by their respective owners.

Risk Warning: Trading on the Forex market involves substantial risks, including complete possible loss of funds and other losses and is not suitable for all members. Clients should make an independent judgment as to whether trading is appropriate for them in the light of their financial condition, investment experience, risk tolerance and other factors.

FXOpen Markets Limited, a company duly registered in Nevis under the company No. C 42235. FXOpen is a member of The Financial Commission.

FXOpen AU Pty Ltd., a company authorised and regulated by the Australian Securities & Investments Commission (ASIC). AFSL 412871ABN 61 143 678 719.

FXOpen Ltd. a company registered in England and Wales under company number 07273392 and is authorised and regulated by the Financial Conduct Authority (previously, the Financial Services Authority) under FCA firm reference number 579202.

FXOpen does not provide services for United States residents.

Join us