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

 
Artyom Trishkin #:
Очень разумно верить железяке, говорящей противоречивые сведения (так в цене, или в пунктах?), чем сразу послушать людей, уже сказавших ранее. 
А в чем разница между "в цене" и "в пунктах"? Видимо, речь о приведении цены в пункты. Но я в курсе. Я обычно использую SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE).
 
maxvoronin74 #:
А в чем разница между "в цене" и "в пунктах"? Видимо, речь о приведении цены в пункты. Но я в курсе. Я обычно использую SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE).

TickSize - это не пункт, это минимальное изменение цены. Пункт - это Point() - значение одного пункта.

Цена за раз минимально может изменяться более, чем на один пункт.

 
Artyom Trishkin #:

Цена за раз минимально может изменяться более, чем на один пункт.

Не знал. Не могу представить, почему так. Нашел по теме: https://www.mql5.com/ru/forum/203707#comment_5264074

Стоимость 1 пункта и другие параметры ордера. - Попробуйте вычислить стоимость 1 пункта в валюте депозита для 1 лота.
Стоимость 1 пункта и другие параметры ордера. - Попробуйте вычислить стоимость 1 пункта в валюте депозита для 1 лота.
  • 2017.06.08
  • User_mt5
  • www.mql5.com
И как с помощью этого значения ответить на вопросы. До момента закрытия сделки комиссия по ней нигде не учитывается. Но информация вряд ли будет структурирована именно в таком ракурсе, который Вам нужен. Я пока не могу представить код, который подходил бы и для валютных пар и для индексов
 
Если среднюю волатильность дает индикатор ATR, то есть ли способы представления или модернизации ATR так, чтобы период был произвольным? Ведь в MT5 нет периодов меньше минуты.
 
maxvoronin74 #:
Если среднюю волатильность дает индикатор ATR, то есть ли способы представления или модернизации ATR так, чтобы период был произвольным? Ведь в MT5 нет периодов меньше минуты.

Сделайте тиковый ATR

 
Artyom Trishkin #:

Сделайте тиковый ATR

Благодарю. Но хочется видеть периоды времени, а не тики.

И верно ли я понимаю, что iATR(Symbol, Period, 0) дает волатильность текущей свечи, то есть, именно текущую волатильность?

 
maxvoronin74 #:

Благодарю. Но хочется видеть периоды времени, а не тики.

И верно ли я понимаю, что iATR(Symbol, Period, 0) дает волатильность текущей свечи, то есть, именно текущую волатильность?

1. Из тиков можете сделать любые периоды времени.

2. Откройте код ATR и поглядите на его расчёт.

Ну ведь всё же в доступе протянутой руки.

 
Artyom Trishkin #:

1. Из тиков можете сделать любые периоды времени.

2. Откройте код ATR и поглядите на его расчёт.

Ну ведь всё же в доступе протянутой руки.

Здесь нахожу, как расчитывается ATR: https://www.mql5.com/ru/articles/10748

Там есть алгоритм:

"Сначала нужно рассчитать истинный диапазон, который будет наибольшим значением из следующих:

  • Разница текущего High и текущего Low;
  • Разница текущего High и предыдущего Close (абсолютная величина);
  • Разница текущего Low и предыдущего Close (абсолютная величина).

Получается, для расчета индикатора нужны данные о максимумах, минимумах и ценах закрытия. После этого рассчитывается сам средний истинный диапазон."

Про то, как ведет себя индикатор, если количество периодов равно нулю, там не написано. Где-то в другом месте написано? Покажите, если возможно.

Еще. В коде ATR есть строка: "CopyBuffer(ATRDef,0,0,3,PriceArray)". Взято там же: https://www.mql5.com/ru/articles/10748. Можно узнать, почему копируется только 3 элемента? Как определить размер буфера индикатора и скопировать не три, а все элементы? Или это не нужно?


Разработка торговой системы на основе индикатора ATR
Разработка торговой системы на основе индикатора ATR
  • www.mql5.com
В этой статье мы изучим новый технический инструмент, который можно использовать в торговле. Это продолжение серии, в которой мы учимся проектировать простые торговые системы. В этот раз мы будем работать с еще одним популярным техническим индикатором — Средний истинный диапазон (Average True Range, ATR).
 
maxvoronin74 #:

Здесь нахожу, как расчитывается ATR: https://www.mql5.com/ru/articles/10748

Там есть алгоритм:

"Сначала нужно рассчитать истинный диапазон, который будет наибольшим значением из следующих:

  • Разница текущего High и текущего Low;
  • Разница текущего High и предыдущего Close (абсолютная величина);
  • Разница текущего Low и предыдущего Close (абсолютная величина).

Получается, для расчета индикатора нужны данные о максимумах, минимумах и ценах закрытия. После этого рассчитывается сам средний истинный диапазон."

Про то, как ведет себя индикатор, если количество периодов равно нулю, там не написано. Где-то в другом месте написано? Покажите, если возможно.

Еще. В коде ATR есть строка: "CopyBuffer(ATRDef,0,0,3,PriceArray)". Взято там же: https://www.mql5.com/ru/articles/10748. Можно узнать, почему копируется только 3 элемента? Как определить размер буфера индикатора и скопировать не три, а все элементы? Или это не нужно?


Открываете редактор.

Открываете файл по пути \MQL5\Indicators\Examples\ATR.mq5. Там примеры для всех индикаторов есть. И это со времён сотворения так...

Изучаете:

//+------------------------------------------------------------------+
//|                                                          ATR.mq5 |
//|                             Copyright 2000-2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2000-2024, MetaQuotes Ltd."
#property link        "https://www.mql5.com"
#property description "Average True Range"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  DodgerBlue
#property indicator_label1  "ATR"
//--- input parameters
input int InpAtrPeriod=14;  // ATR period
//--- indicator buffers
double    ExtATRBuffer[];
double    ExtTRBuffer[];

int       ExtPeriodATR;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- check for input value
   if(InpAtrPeriod<=0)
     {
      ExtPeriodATR=14;
      PrintFormat("Incorrect input parameter InpAtrPeriod = %d. Indicator will use value %d for calculations.",InpAtrPeriod,ExtPeriodATR);
     }
   else
      ExtPeriodATR=InpAtrPeriod;
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtATRBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtTRBuffer,INDICATOR_CALCULATIONS);
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpAtrPeriod);
//--- name for DataWindow and indicator subwindow label
   string short_name=StringFormat("ATR(%d)",ExtPeriodATR);
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,short_name);
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
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[])
  {
   if(rates_total<=ExtPeriodATR)
      return(0);

   int i,start;
//--- preliminary calculations
   if(prev_calculated==0)
     {
      ExtTRBuffer[0]=0.0;
      ExtATRBuffer[0]=0.0;
      //--- filling out the array of True Range values for each period
      for(i=1; i<rates_total && !IsStopped(); i++)
         ExtTRBuffer[i]=MathMax(high[i],close[i-1])-MathMin(low[i],close[i-1]);
      //--- first AtrPeriod values of the indicator are not calculated
      double firstValue=0.0;
      for(i=1; i<=ExtPeriodATR; i++)
        {
         ExtATRBuffer[i]=0.0;
         firstValue+=ExtTRBuffer[i];
        }
      //--- calculating the first value of the indicator
      firstValue/=ExtPeriodATR;
      ExtATRBuffer[ExtPeriodATR]=firstValue;
      start=ExtPeriodATR+1;
     }
   else
      start=prev_calculated-1;
//--- the main loop of calculations
   for(i=start; i<rates_total && !IsStopped(); i++)
     {
      ExtTRBuffer[i]=MathMax(high[i],close[i-1])-MathMin(low[i],close[i-1]);
      ExtATRBuffer[i]=ExtATRBuffer[i-1]+(ExtTRBuffer[i]-ExtTRBuffer[i-ExtPeriodATR])/ExtPeriodATR;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
maxvoronin74 #:

Здесь нахожу, как расчитывается ATR: https://www.mql5.com/ru/articles/10748

Там есть алгоритм:

"Сначала нужно рассчитать истинный диапазон, который будет наибольшим значением из следующих:

  • Разница текущего High и текущего Low;
  • Разница текущего High и предыдущего Close (абсолютная величина);
  • Разница текущего Low и предыдущего Close (абсолютная величина).

Получается, для расчета индикатора нужны данные о максимумах, минимумах и ценах закрытия. После этого рассчитывается сам средний истинный диапазон."

Про то, как ведет себя индикатор, если количество периодов равно нулю, там не написано. Где-то в другом месте написано? Покажите, если возможно.

Еще. В коде ATR есть строка: "CopyBuffer(ATRDef,0,0,3,PriceArray)". Взято там же: https://www.mql5.com/ru/articles/10748. Можно узнать, почему копируется только 3 элемента? Как определить размер буфера индикатора и скопировать не три, а все элементы? Или это не нужно?

Всё! Не мучайтесь. Вот Вам код для получения значений индикатора ATR:

//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+
input ushort Averaging_Period=14; // Период усреднения индикатора ATR

int Handle_ATR;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Handle_ATR=iATR(_Symbol, PERIOD_CURRENT, Averaging_Period); // получим хэндл индикатора ATR
   if(Handle_ATR==INVALID_HANDLE)
     {
      Print("Некорректный хэндл индикатора ATR!");
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(Handle_ATR);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double atr_array_value[]; // создадим массив для значений индикатора ATR
   ArraySetAsSeries(atr_array_value, true); // зададим индексацию элементов массива, как в таймсериях
   int copy_buffer = CopyBuffer(Handle_ATR, 0, 0, 3, atr_array_value); // копируем в массив данные указанного буфера индикатора ATR
   if(copy_buffer > 0) // если скопированные данные больше нуля
      Print("Значение ATR = ", atr_array_value[0]); // выведем на печать
  }
//+------------------------------------------------------------------+

Дальше, уж будьте добры, сами.

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

Причина обращения: