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 5 of 5 FirstFirst 12345
Results 61 to 75 of 75

Thread: MQL4 заметки от eevviill

  1. #61
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 60 - String split TF

    Разделение переменной string ТаймФреймов отличается от разделения Валютных пар тем что ТФ нам нужны в виде числа. Нам нужно разделить string переменную, преобразовать в число и заполнить елементами буфер.


    PHP Code:
    input string TFs1 "M5-M15";

    string TFs=TFs1;
    string spliter "-";
    int TFs_b[];
    ...
    //onInit
    TFs_to_buf_f();
    ...
    //onTick
    for(int i=0;i<ArraySize(TFs_b);i++)
    {
    Alert(TFs_b[i]);
    }

    ////////////////////////////////////////////////////////////////////////
    void TFs_to_buf_f()
    {
    string str_spl_tf[];
    int size=StringSplit(TFs,StringGetCharacter(spliter,0),str_spl_tf);
    ArrayResize(TFs_b,size);
    for(
    int i=0;i<size;i++)
    {
    TFs_b[i]=String_to_TF(str_spl_tf[i]);
    }

    }

    /////////////////////////////////////////////////////////////////////////
    int String_to_TF(string tf)
    {
    int TF=0;

    if(
    tf=="M1"TF=PERIOD_M1;
    if(
    tf=="M5"TF=PERIOD_M5;
    if(
    tf=="M15"TF=PERIOD_M15;
    if(
    tf=="M30"TF=PERIOD_M30;
    if(
    tf=="H1"TF=PERIOD_H1;
    if(
    tf=="H4"TF=PERIOD_H4;
    if(
    tf=="D1"TF=PERIOD_D1;
    if(
    tf=="W1"TF=PERIOD_W1;
    if(
    tf=="MN1"TF=PERIOD_MN1;


    return(
    TF);

    Last edited by eevviill; 12-23-2019 at 04:36 PM.

  2. #62
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 61 - Bars(шаблон)

    Этот шаблон для рисования свечей на графике.

    PHP Code:
     #property indicator_chart_window

     #property indicator_buffers 4
    #property indicator_color1 clrBlue
    #property indicator_color2 clrRed
    #property indicator_color3 clrBlue
    #property indicator_color4 clrRed
    #property indicator_width1 3
    #property indicator_width2 3

    double buf_OC[];
    double buf_OC2[];
    double buf_HL[];
    double buf_HL2[];

    /////////////////////////////////////////////////////////////////
     
    int OnInit()
      {
       
    SetIndexStyle(0DRAW_HISTOGRAM);
       
    SetIndexBuffer(0buf_OC);
       
    SetIndexStyle(1DRAW_HISTOGRAM);
       
    SetIndexBuffer(1buf_OC2);
       
    SetIndexStyle(2DRAW_HISTOGRAM);
       
    SetIndexBuffer(2buf_HL);
       
    SetIndexStyle(3DRAW_HISTOGRAM);
       
    SetIndexBuffer(3buf_HL2);


       return(
    INIT_SUCCEEDED);
      }

    //////////////////////////////////////////////////////////////////
     
    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[])
      {
            for(
    int i=1;i<Bars-(IndicatorCounted()-2);i++)
         { 
         if(
    i>Bars-20) break;
         
         if(
    Close[i]>Open[i]) {buf_OC[i]=MathMax(Open[i],Close[i]);buf_OC2[i]=MathMin(Open[i],Close[i]);buf_HL[i]=High[i];buf_HL2[i]=Low[i];}
         else
         if(
    Close[i]<Open[i]) {buf_OC2[i]=MathMax(Open[i],Close[i]);buf_OC[i]=MathMin(Open[i],Close[i]);buf_HL2[i]=High[i];buf_HL[i]=Low[i];}
       }


       return(
    rates_total);
      } 
    Last edited by eevviill; 12-23-2019 at 04:36 PM.
    MQL4 programmer

    Volli Correla lines

  3. #63
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 62 - if(правильный порядок)

    В "if()" пишутся условия для дальнейших действий. Если всё что в if истина(true), то выполняется код тот что после if. Вполне логично ставить сначало условия которые скорее не выполнятся чем выполнятся или можно сказать от грубых условий к более тонким. Это для того чтобы в if не проверялись условия дальше если одно не истинно(false).
    Будет понятней на примере.


    Например нам надо условия для рисования стрелок вверх и вниз.
    PHP Code:
    ...
    if(
    Volume[i]>20 && Close[i]>Open[i]) up_arr[i]=Low[i];

    if(
    iVolume[i]>20 && Close[i]<Open[i]) down_arr[i]=High[i];
    ... 
    Что мы здесь видим. Посчитаем сколько условий проверится если iVolume=30.
    4. Тоесть будут проверены для стрелок ввер/вниз все 4 условия.


    Если записать так.
    PHP Code:
    ...
    if(
    Close[i]>Open[i] && iVolume(_Symbol,PERIOD_CURRENT,i)>20up_arr[i]=Low[i];

    if(
    Close[i]<Open[i] && iVolume(_Symbol,PERIOD_CURRENT,i)>20down_arr[i]=High[i];
    ... 
    2. Тосеть мы проверяем направление бара, если оно не совпдает, то объём уже нету смысля проверять.




    Ещё пример.
    if(use_filt && Volume[i]>20) Alert("ok");
    Так правильно. Мы проверим включен ли фильтр и потом проверим его значение.


    if(Volume[i]>20 && use_filt) Alert("ok");
    Так не правильно. Мы проверяем значение фильтра не зависимо от того включен ли он.
    Last edited by eevviill; 01-18-2020 at 09:13 AM.
    MQL4 programmer

    Volli Correla lines

  4. #64
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 63 - enum название

    Для удобства рекомендую при создании списка enum его нужно называть как переменную где этот список будет использоватся + "_e"

    Например.
    PHP Code:
    enum methods_e
    {
    simple,hard
    };

    input methods_e methods simple
    Last edited by eevviill; 01-18-2020 at 08:54 AM.
    MQL4 programmer

    Volli Correla lines

  5. #65
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 64 - time2 в объектах

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

    Если у нас стоит рисовать линию длиной в 9 баров, а рисуем от бара с индексом 4, то получим ошибку выхода за границы буфера.
    PHP Code:
    time2=Time[4-9
    А так будет универсальный метод.
    PHP Code:
    time2=Time[4]+9*PeriodSeconds(); 
    Last edited by eevviill; 01-29-2020 at 03:53 PM.
    MQL4 programmer

    Volli Correla lines

  6. #66
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 65 - переключение графика на другой ТФ и обратно

    Допустим есть задача переключится на другой ТаймФрейм и обратно.


    PHP Code:
    input ENUM_TIMEFRAMES TF_current PERIOD_H1;
     
    input ENUM_TIMEFRAMES TF PERIOD_H4;
     
    input bool once true;
     
    input string gv_id "TFonce";


    void OnTick()
      {
      if(
    Period()==TF_current && (!once || !GlobalVariableCheck(gv_id))) ChartSetSymbolPeriod(0,_Symbol,TF);
      
      
      
    //code
      

      
    if(Period()!=TF_current
      {
      if(
    onceGlobalVariableSet(gv_id,1);
      
    ChartSetSymbolPeriod(0,_Symbol,TF_current);
      }
      } 
    Last edited by eevviill; 02-22-2020 at 09:41 AM.
    MQL4 programmer

    Volli Correla lines

  7. #67
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 66 - приоритет || && (или и)

    Приоритет имеет ||(или) над &&(и) . Но лучше всего ставить скобки().


    В данном примере Алерт выполнится.
    PHP Code:
    int a=4;
    int b=5;
    ...
    if(
    a==|| b==&& b==5Alert("sdf"); 
    Со скобками.
    PHP Code:
    if((a==|| b==2) && b==5Alert("sdf"); 

    P.S. В старых билдах МТ4 был приоритет наоборот в &&. Так что если нужно в старом коде раставить скобки, то нужно это делать с &&. if(a==4 || (b==2 && b==4)).
    Last edited by eevviill; 03-24-2020 at 07:06 AM.
    MQL4 programmer

    Volli Correla lines

  8. #68
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 67 - защита от взлома

    защита от взлома сменой лигики прорамы

    Смысла нету писать в
    PHP Code:
    OnInit() 
    что то типа
    PHP Code:
    if(TimeCurrent()>=D'2000.20.20') return(INIT_FAILED); 
    Такая защита взламывается дисасамблером IDApro.
    Просто убирается эта строка.



    Нужно делать по другому. Нужно изменять логику программы вместо прекращения работы. Тоесть программа будет работать, но не так как нужно. Чем больше заплутывания, тем лучше.
    Например у нас есть советник который берёт данные для расчёта входа с прошлого бара индикатора RSI.
    PHP Code:
     int cc=1;
     
    double rsi=iRSI(_Symbol,PERIOD_CURRENT,14,cc); 
    С защитой так.
    PHP Code:
     int cc=1
    if(
    Time[0]>="2020.12.20"cc=11;
     
    double rsi=iRSI(_Symbol,PERIOD_CURRENT,14,cc); 



    Если это индикатор то можно в главном цикле менять логику.
    Без защиты.
    PHP Code:
    double rsi[];
    ...
    for(
    int i=0;i<Bars-20;i++)
    {
    rsi[i]=iRSI(_Symbol,PERIOD_CURRENT,14,i);

    С защитой.
    PHP Code:
    double rsi[];
    ...
    int cc=0
    if(
    Time[0]>="2020.12.20"cc=11;

    for(
    int i=0;i<Bars-20;i++)
    {
    rsi[i]=iRSI(_Symbol,PERIOD_CURRENT,14,i+cc);

    Last edited by eevviill; 02-22-2020 at 09:42 AM.
    MQL4 programmer

    Volli Correla lines

  9. #69
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 68 - extern input (разница)

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


    Так компилятор не выдаст ошибку.
    PHP Code:
    extern int cc=5;
    ...
    cc=4
    Так выдаст ошибку.
    PHP Code:
    input int cc=5;
    ...
    cc=4
    Last edited by eevviill; 02-22-2020 at 09:43 AM.
    MQL4 programmer

    Volli Correla lines

  10. #70
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 69 - коды стрелок

    Коды стрелок для нарисованых на графике стрелок и буферных стрелок.


    PHP Code:
    input int code 163;

    ObjectCreate(0,"arr",OBJ_ARROW,0,Time[1],0);
    ObjectSetInteger(0,"arr",OBJPROP_ARROWCODE,code);

    SetIndexStyle(0,DRAW_ARROW);
    SetIndexArrow(0,code); 
    Attached Thumbnails Attached Thumbnails ек.png  
    Last edited by eevviill; 02-22-2020 at 09:43 AM.
    MQL4 programmer

    Volli Correla lines

  11. #71
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 70 - направление цикла

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




    PHP Code:
    for(int i=OrdersTotal()-1;i>=0;i--) 
    Мы начинаем цикл с общего количества ордеров и на каждой итерации проверяем или i меньше 0.


    PHP Code:
    for(int i=0;i<OrdersTotal();i++) 
    Начинаем с 0 и на каждой итерации вызываем функцию OrdersTotal() и проверям или i не больше того что возвращает функция. Тоесть мы избыточно(лишние разы) вызываем функцию и к тому же может случится что во время перебора ордеров какой то ордер закроется(или в самом цикле будет закрытие). Тогда индекс(i) перебора ордеров собъётся и мы пропустим ордер.
    Last edited by eevviill; 02-22-2020 at 09:44 AM.
    MQL4 programmer

    Volli Correla lines

  12. #72
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 71 - наложение МА на Momentum

    В терминале переткаскивание МА мышкой в подокно Momentum.

    PHP Code:
     input int period_momentum 350;
     
    input ENUM_APPLIED_PRICE price_momentum PRICE_CLOSE;
     
    input int ma1_period_momentum 34;
     
    input int ma1_shift_momentum 0;
     
    input ENUM_MA_METHOD ma1_method_momentum MODE_EMA;
    ...
       
    double momentum[];ArrayResize(momentum,ma1_period_momentum*10);ArraySetAsSeries(momentum,true);
      for(
    int i=0;i<ma1_period_momentum*10;i++)
      {
      
    momentum[i]=iMomentum(_Symbol,PERIOD_CURRENT,period_momentum,price_momentum,i);
      }

       
    double ma1[];ArrayResize(ma1,ma1_period_momentum*10);ArraySetAsSeries(ma1,true);
      for(
    int i=0;i<ma1_period_momentum*10;i++)
      {
      
    ma1[i]=iMAOnArray(momentum,0,ma1_period_momentum,ma1_shift_momentum,ma1_method_momentum,i);
      } 
    Last edited by eevviill; 03-15-2020 at 12:14 PM.
    MQL4 programmer

    Volli Correla lines

  13. #73
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 72 - пересечение ценой МА

    PHP Code:
     input int period_ma 60;
     
    input int shift_ma 0;
     
    input ENUM_MA_METHOD method_ma MODE_SMA;
     
    input ENUM_APPLIED_PRICE price_ma PRICE_CLOSE;
    ...
    double ma=iMA(_Symbol,PERIOD_CURRENT,period_ma,shift_ma,method_ma,price_ma,1);
    double ma2=iMA(_Symbol,PERIOD_CURRENT,period_ma,shift_ma,method_ma,price_ma,2);

     if(
    Close[1]>ma && Close[2]<=ma2Alert("up");
     if(
    Close[1]<ma && Close[2]>=ma2Alert("down"); 
    Last edited by eevviill; 03-15-2020 at 12:14 PM.
    MQL4 programmer

    Volli Correla lines

  14. #74
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default Заметка 73 - название внешних переменных с ех4 файла

    Бывают случаи что нужно например написать советник который берёт данные с индикатора.
    Для этого нужно скопировать список внешних переменных с индикатора в советник чтобы их потом передать в iCustom.
    А что делать если файл ex4, тоесть открыть его нельзя?

    Есть способ котрый частично решает эту проблему.
    Нужно сделать сет файл индикатора(при прикреплении, в меню настроек нажать сохранить) и открыть его с помощью Блокнота.

    Вид будет такой.
    PHP Code:
    emp0=//////////Main settings/////////
    InpAtrPeriod=14
    Bars_count
    =400
    TF
    =0
    use_median_mtf
    =false
    emp1
    =//////////Volume filter settings/////////
    use_volume_filt=false
    use_volume_value_filt
    =false
    volume_value_filt
    =20.0 
    Останется
    1) Перед переменными добавить
    PHP Code:
    input 
    и тип переменной
    PHP Code:
    double int string bool 
    2) После переменных добавить
    PHP Code:

    3) Значение перменных string поставить в
    PHP Code:
    "" 
    Last edited by eevviill; 03-31-2020 at 12:03 PM.

  15. #75
    Moderator eevviill's Avatar
    Join Date
    Jul 2015
    Location
    Бандерівці
    Posts
    3,849
    Thanks
    1,448
    Thanked 1,448 Times in 1,320 Posts

    Default

    Экстраполяция
    fxopenExtreme
    MQL4 programmer

    Volli Correla lines

Page 5 of 5 FirstFirst 12345

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-2020 © 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