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

 
MrBrooklin #:
Единственное, что понял, это якобы существует зависимость разворота ценового графика при значительном повышении волатильности. Кроме того, прочитал несколько тем, связанных с применением индикатора волатильности ATR, но установив его на график, ни чего такого ценного не увидел. Может Вы в сжатой форме подскажете, чем так ценна волатильность для трейдера? Буду очень признателен.

если писать многотомник про Форекс (или вообще про ТА), то 2/3 томов будет так или иначе о волатильности :-) 

простейшее практичное применение ATR - в приведённый вами код, добавить параметр "сдвиг".  Потому как 

И повторится все, как встарь:
Ночь, ледяная рябь канала,
Аптека, улица, фонарь.

Рынок цикличен, периодичен и ATR (средний истинный диапазон, амплитуда волатильности) повторяется раз от раза. 

Внутри дня: cдвиньте показания вашего индикатора вправо на PeriodSeconds(PERIOD_D1)/PeriodSeconds(PERIOD_CURRENT)-ATR_PERIOD/2. То есть на кол-во баров за 1 день минус "задержка" от усреднений ATR

получите средний диапазон (дистанция от Open до самого дальнего high/low, разброс цен) каким он был вчера в то-же самое время. Теперь можно сравнить текущий размер свечей с ним и сделать выводы, торговля идёт активнее или наоборот. Уже хорошо

Касаясь вскользь, сугубо техническое: у нас в 99% случаев в TA используются оконные функции, то есть усреднения, сравнения за какой-то период. Они все поголовно барахлят в трёх случаях: когда внутри окон малые почти одинаковые значения, когда на концах окон слишком разные значения и когда значения большие но "в разнобой". Это примерно соотносится с малым и значительным ATR и его разворотами. То есть когда диапазон мал, индикаторы слишком чуствительны и реагируют на малейший шум, а когда резко растёт (или резко падает) то тоже ерунда получается 

можно продолжать и продолжать... :-)

 
Maxim Kuznetsov #:
Внутри дня: cдвиньте показания вашего индикатора вправо на PeriodSeconds(PERIOD_D1)/PeriodSeconds(PERIOD_CURRENT)-ATR_PERIOD/2. То есть на кол-во баров за 1 день минус "задержка" от усреднений ATR ...

Спасибо, Максим, за уделённое внимание и ответ! Теперь есть над чем подумать.

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

 
MrBrooklin #:

Исправленный вариант:

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

Благодарю. Правда, так никто и не ответил, что выдает функция индикатора с количеством периодов 0 и почему копируется только 3 элемента и как, если нужно, и нужно ли, скопировать все:
int copy_buffer = CopyBuffer(Handle_ATR, 0, 0, 3, atr_array_value);

Такое дело... 

Надо сказать, я стал лучше понимать суть волатильности. Раньше думал, что это отклонение цен от средней цены. Но и ATR, и теория говорят, что это коридор цен.
 
maxvoronin74 #:
Благодарю. Правда, так никто и не ответил, что выдает функция индикатора с количеством периодов 0 и почему копируется только 3 элемента и как, если нужно, и нужно ли, скопировать все:

Такое дело... 

Надо сказать, я стал лучше понимать суть волатильности. Раньше думал, что это отклонение цен от средней цены. Но и ATR, и теория говорят, что это коридор цен.

Ничего не выдаёт. Минимально может быть 1:

//+------------------------------------------------------------------+
//| 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);
  }


Если ввести значение меньше 1, то будет установлено значение по умолчанию 14:

//+------------------------------------------------------------------+
//| 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);
  }


Так сделано в индикаторе. Вы, конечно можете у себя сделать что угодно, но период меньше 1 ничего не даст в расчётах.

Зачем Вам нулевой период расчёта? Смысл какой?

 
Artyom Trishkin #:

Ничего не выдаёт. Минимально может быть 1:

Если ввести значение меньше 1, то будет установлено значение по умолчанию 14:

Благодарю. Теперь понятно.

Artyom Trishkin #:

Зачем Вам нулевой период расчёта? Смысл какой?

Это я интересовался, как можно штатными средствами индикатора получить волатильность текущей свечи.

А касаемо второй части вопроса, "почему копируется только 3 элемента и как, если нужно, и нужно ли, скопировать все", существует какое-то объяснение?
 
maxvoronin74 #:

Благодарю. Теперь понятно.

Это я интересовался, как можно штатными средствами индикатора получить волатильность текущей свечи.

А касаемо второй части вопроса, "почему копируется только 3 элемента и как, если нужно, и нужно ли, скопировать все", существует какое-то объяснение?
Человек захотел в примере показать как скопировать три бара. Вы можете копировать столько баров, сколько нужно. Но для советника, впрочем и обычно, достаточно знать текущую волатильность. Это вообще только один нулевой, текущий бар. 
 
Artyom Trishkin #:
Человек захотел в примере показать как скопировать три бара. Вы можете копировать столько баров, сколько нужно. Но для советника, впрочем и обычно, достаточно знать текущую волатильность. Это вообще только один нулевой, текущий бар. 

Хорошая информация. Спасибо.

 

Подскажите вот так правильно нормировать до 5 знаков после запятой ?

//+------------------------------------------------------------------+
//|                                          Export Indicator Values |
//+------------------------------------------------------------------+
#property description "This Script Export Indicators Values to CSV File."
#property description "(You can change the iCustom function parameters to change what indicator to export)"
#property copyright "NFTrader"
#property version   "2.00"
#property script_show_inputs

input int    IndicatorPeriod=14;
input string Indicator_Directory_And_Name="Examples\\RSI";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlRates  rates_array[];
   string sSymbol=Symbol();

// Convert Period to string to use it in the file name
   string  sPeriod=EnumToString(Period());
// Comment to appear in the up left screen
   Comment("Exporting ... Please wait... ");

// Prepare file name, e.g: EURUSD_PERIOD_H1(RSI,14)
   string       ExtFileName; // ="XXXXXX_PERIOD_H1(RSI,14).CSV";
   ExtFileName=sSymbol;
   int pos=StringFind(Indicator_Directory_And_Name,"\\",0);
   string indicatorName=StringSubstr(Indicator_Directory_And_Name,pos+1,-1);
   string indicatorPeriod=IntegerToString(IndicatorPeriod);
   StringConcatenate(ExtFileName,sSymbol,"_",sPeriod,"(",indicatorName,",",indicatorPeriod,")",".CSV");

   ArraySetAsSeries(rates_array,true);
   int MaxBar=TerminalInfoInteger(TERMINAL_MAXBARS);
   int iCurrent=CopyRates(sSymbol,Period(),0,MaxBar,rates_array);

   double IndicatorBuffer[];
   SetIndexBuffer(0,IndicatorBuffer,INDICATOR_DATA);

   int bars=Bars(sSymbol,PERIOD_CURRENT);
   int to_copy=bars;

   int rsiHandle=iCustom(sSymbol,PERIOD_CURRENT,Indicator_Directory_And_Name,IndicatorPeriod);       // Change here.

   CopyBuffer(rsiHandle,0,0,to_copy,IndicatorBuffer);
   ArraySetAsSeries(IndicatorBuffer,true);

   int fileHandle=FileOpen(ExtFileName,FILE_WRITE|FILE_CSV);

   for(int i=iCurrent-IndicatorPeriod-1; i>0; i--)
     {
      string outputData=StringFormat("%s",TimeToString(rates_array[i].time,TIME_DATE));
      outputData+=","+TimeToString(rates_array[i].time,TIME_MINUTES);
      outputData+=","+ DoubleToString(IndicatorBuffer[i],5);
      outputData+="\n";

      FileWriteString(fileHandle,outputData);
     }

   FileClose(fileHandle);
   Comment("Exported Successfully");
  }
//+------------------------------------------------------------------+

Вот в этом месте

outputData+=","+ DoubleToString(IndicatorBuffer[i],5);
Просто у меня получаются расхождения с реальными данными




 
EgorKim #:

Подскажите вот так правильно нормировать до 5 знаков после запятой ?

Вот в этом месте

Просто у меня получаются расхождения с реальными данными

А это точно нужно делать так? Просто мне не понятно с какой целью отнимаете период индикатора:

for(int i=iCurrent-IndicatorPeriod-1; i>0; i--)

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

 

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

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


Посоветуйте что-нибудь или помогите?