Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1483

 
Alexey Viktorov #:

Вы в правильном направлении. Но не достаточно внимательны

Привет, Алексей! Очень хорошо, что ты поддерживаешь начинающих изучать язык программирования и не устаёшь от таких, как мы. Спасибо тебе ОГРОМНОЕ!

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

За сим хочу ещё раз выразить свою благодарность всем тем, кто откликается на наши дилетантские вопросы и пожелать - дай Бог Вам всем здоровья, долгих лет жизни, удачи и благополучия!!!

С уважением, Владимир.

 

Всем доброе время суток.
Подскажите, как прикрутить индикатор  Accelerator Oscillator, чтобы на красном цвете давал сигнал на SELL, на зеленом на BUY, на закрытие последнего бара.

Спасибо

 
makssub #:

Всем доброе время суток.
Подскажите, как прикрутить индикатор  Accelerator Oscillator, чтобы на красном цвете давал сигнал на SELL, на зеленом на BUY, на закрытие последнего бара.

Спасибо

Подключаете индикатор к советнику и получаете его данные посредством CopyBuffer(). Буфер цвета имеет индекс 1, где значение 0 — зелёный цвет, 1 — красный цвет.
Документация по MQL5: Технические индикаторы / iAC
Документация по MQL5: Технические индикаторы / iAC
  • www.mql5.com
iAC - Технические индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin #:
Подключаете индикатор к советнику и получаете его данные посредством CopyBuffer(). Буфер цвета имеет индекс 1, где значение 0 — зелёный цвет, 1 — красный цвет.

Если не затруднит. Можно пример.

Тяжело мне MQL5 после MQL4 дается.

 
makssub #:

Если не затруднит. Можно пример.

Тяжело мне MQL5 после MQL4 дается.

Примеры по ссылкам в моëм сообщении выше
 

Здравствуйте.

Есть в кодбазе индикатор ADX. В нём такой кусок кода 

//--- set draw begin
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtADXPeriod<<1);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtADXPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtADXPeriod);

Если

ExtADXPeriod=14

получается ExtADXPeriod<<1 равносильно значению 9 

Зачем тогда нужна такая запись ? Нельзя её прописать без побитовых сдвигов?

ExtADXPeriod<<1

полный код индикатора ниже


//+------------------------------------------------------------------+
//|                                                          ADX.mq5 |
//|                             Copyright 2000-2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2000-2023, MetaQuotes Ltd."
#property link        "https://www.mql5.com"
#property description "Average Directional Movement Index"
#include <MovingAverages.mqh>

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   3
#property indicator_type1   DRAW_LINE
#property indicator_color1  LightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_type2   DRAW_LINE
#property indicator_color2  YellowGreen
#property indicator_style2  STYLE_DOT
#property indicator_width2  1
#property indicator_type3   DRAW_LINE
#property indicator_color3  Wheat
#property indicator_style3  STYLE_DOT
#property indicator_width3  1
#property indicator_label1  "ADX"
#property indicator_label2  "+DI"
#property indicator_label3  "-DI"
//--- input parameters
input int InpPeriodADX=14; // Period ADX
//--- indicator buffers
double    ExtADXBuffer[];
double    ExtPDIBuffer[];
double    ExtNDIBuffer[];
double    ExtPDBuffer[];
double    ExtNDBuffer[];
double    ExtTmpBuffer[];

int       ExtADXPeriod;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- check for input parameters
   if(InpPeriodADX>=100 || InpPeriodADX<=0)
     {
      ExtADXPeriod=14;
      PrintFormat("Incorrect value for input variable Period_ADX=%d. Indicator will use value=%d for calculations.",InpPeriodADX,ExtADXPeriod);
     }
   else
      ExtADXPeriod=InpPeriodADX;
//--- indicator buffers
   SetIndexBuffer(0,ExtADXBuffer);
   SetIndexBuffer(1,ExtPDIBuffer);
   SetIndexBuffer(2,ExtNDIBuffer);
   SetIndexBuffer(3,ExtPDBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,ExtNDBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,ExtTmpBuffer,INDICATOR_CALCULATIONS);
//--- indicator digits
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set draw begin
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtADXPeriod<<1);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtADXPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtADXPeriod);
//--- indicator short name
   string short_name="ADX("+string(ExtADXPeriod)+")";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,short_name);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//--- checking for bars count
   if(rates_total<ExtADXPeriod)
      return(0);
//--- detect start position
   int start;
   if(prev_calculated>1)
      start=prev_calculated-1;
   else
     {
      start=1;
      ExtPDIBuffer[0]=0.0;
      ExtNDIBuffer[0]=0.0;
      ExtADXBuffer[0]=0.0;
     }
//--- main cycle
   for(int i=start; i<rates_total && !IsStopped(); i++)
     {
      //--- get some data
      double high_price=high[i];
      double prev_high =high[i-1];
      double low_price =low[i];
      double prev_low  =low[i-1];
      double prev_close=close[i-1];
      //--- fill main positive and main negative buffers
      double tmp_pos=high_price-prev_high;
      double tmp_neg=prev_low-low_price;
      if(tmp_pos<0.0)
         tmp_pos=0.0;
      if(tmp_neg<0.0)
         tmp_neg=0.0;
      if(tmp_pos>tmp_neg)
         tmp_neg=0.0;
      else
        {
         if(tmp_pos<tmp_neg)
            tmp_pos=0.0;
         else
           {
            tmp_pos=0.0;
            tmp_neg=0.0;
           }
        }
      //--- define TR
      double tr=MathMax(MathMax(MathAbs(high_price-low_price),MathAbs(high_price-prev_close)),MathAbs(low_price-prev_close));
      if(tr!=0.0)
        {
         ExtPDBuffer[i]=100.0*tmp_pos/tr;
         ExtNDBuffer[i]=100.0*tmp_neg/tr;
        }
      else
        {
         ExtPDBuffer[i]=0.0;
         ExtNDBuffer[i]=0.0;
        }
      //--- fill smoothed positive and negative buffers
      ExtPDIBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtPDIBuffer[i-1],ExtPDBuffer);
      ExtNDIBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtNDIBuffer[i-1],ExtNDBuffer);
      //--- fill ADXTmp buffer
      double tmp=ExtPDIBuffer[i]+ExtNDIBuffer[i];
      if(tmp!=0.0)
         tmp=100.0*MathAbs((ExtPDIBuffer[i]-ExtNDIBuffer[i])/tmp);
      else
         tmp=0.0;
      ExtTmpBuffer[i]=tmp;
      //--- fill smoothed ADX buffer
      ExtADXBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtADXBuffer[i-1],ExtTmpBuffer);
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.11.30
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Novichokkk #:

Если

ExtADXPeriod=14

получается ExtADXPeriod<<1 равносильно значению 9 

равносильно 28 (14<<1 всё равно что 14*2, пока разрядов хватает)

не обращайте внимания, всё равно компилятор заведомые const выражения посчитает при компиляции и в код они не попадут. Только их результат

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

 
Maxim Kuznetsov #:

равносильно 28 (14<<1 всё равно что 14*2, пока разрядов хватает)

не обращайте внимания, всё равно компилятор заведомые const выражения посчитает при компиляции и в код они не попадут. Только их результат

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

1-Почему 28?

14 раскладываем в двоичную форму. Будет 1110.

Смещаем на один бит влево, получится 0111, переводим обратно в десятичную, будет 9. 1*1+1*2+1*4=7 (ошибся не 9).


2-Все же хотелось бы конкретный пример в данном случае, что правильнее вставить в такую конструкцию вместо ExtADXPeriod<<1 ?

 
Novichokkk #:

14 раскладываем в двоичную форму. Будет 1110.

Смещаем на один бит влево, получится 0111,

у нас с вами разные "влево" :-)

1110<<1 := 11100

 
Maxim Kuznetsov #:

у нас с вами разные "влево" :-)

1110<<1 := 11100

В интернете читал. Это для 32 бит я так понимаю, для 16 то же самое, на разряд ведь ничего не перескакивало. Но я только учусь, наверное Вы правы.

Не суть, это так, попутно вникал. Удивила такая конструкция в терминале. Это даже не из кодбазы индикатор, из терминала из папки Examples.

Файлы:
8888.jpg  49 kb
Причина обращения: