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 ...
Спасибо, Максим, за уделённое внимание и ответ! Теперь есть над чем подумать.
Благодарю. Правда, так никто и не ответил, что выдает функция индикатора с количеством периодов 0 и почему копируется только 3 элемента и как, если нужно, и нужно ли, скопировать все:
int copy_buffer = CopyBuffer(Handle_ATR, 0, 0,3, atr_array_value);
Такое дело...
Надо сказать, я стал лучше понимать суть волатильности. Раньше думал, что это отклонение цен от средней цены. Но и ATR, и теория говорят, что это коридор цен.
maxvoronin74 #: Благодарю. Правда, так никто и не ответил, что выдает функция индикатора с количеством периодов 0 и почему копируется только 3 элемента и как, если нужно, и нужно ли, скопировать все:
Такое дело...
Надо сказать, я стал лучше понимать суть волатильности. Раньше думал, что это отклонение цен от средней цены. Но и ATR, и теория говорят, что это коридор цен.
Ничего не выдаёт. Минимально может быть 1:
//+------------------------------------------------------------------+//| Average True Range |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
if(rates_total<=ExtPeriodATR)
return(0);
int i,start;
//--- preliminary calculationsif(prev_calculated==0)
{
ExtTRBuffer[0]=0.0;
ExtATRBuffer[0]=0.0;
//--- filling out the array of True Range values for each periodfor(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 calculateddouble 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 calculationsfor(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 callreturn(rates_total);
}
Если ввести значение меньше 1, то будет установлено значение по умолчанию 14:
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
//--- check for input valueif(InpAtrPeriod<=0)
{
ExtPeriodATR=14;
PrintFormat("Incorrect input parameter InpAtrPeriod = %d. Indicator will use value %d for calculations.",InpAtrPeriod,ExtPeriodATR);
}
else
ExtPeriodATR=InpAtrPeriod;//--- indicator buffers mappingSetIndexBuffer(0,ExtATRBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtTRBuffer,INDICATOR_CALCULATIONS);
//---IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawnPlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpAtrPeriod);
//--- name for DataWindow and indicator subwindow labelstring short_name=StringFormat("ATR(%d)",ExtPeriodATR);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
PlotIndexSetString(0,PLOT_LABEL,short_name);
}
Так сделано в индикаторе. Вы, конечно можете у себя сделать что угодно, но период меньше 1 ничего не даст в расчётах.
Это я интересовался, как можно штатными средствами индикатора получить волатильность текущей свечи.
А касаемо второй части вопроса, "почему копируется только 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_inputsinputint IndicatorPeriod=14;
inputstring Indicator_Directory_And_Name="Examples\\RSI";
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
MqlRates rates_array[];
string sSymbol=Symbol();
// Convert Period to string to use it in the file namestring sPeriod=EnumToString(Period());
// Comment to appear in the up left screenComment("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");
}
//+------------------------------------------------------------------+
Мой советник не запускается на рабочем столе meta4, даже если я использую предустановленный эксперт, который у них есть. Я выбрал автоторговлю, разрешил торговлю при смене счета, у него есть смайлик и в нижней части в экспертах он показывает, что все хорошо. Так почему же он не открывает сделки?
Единственное, что понял, это якобы существует зависимость разворота ценового графика при значительном повышении волатильности. Кроме того, прочитал несколько тем, связанных с применением индикатора волатильности ATR, но установив его на график, ни чего такого ценного не увидел. Может Вы в сжатой форме подскажете, чем так ценна волатильность для трейдера? Буду очень признателен.
если писать многотомник про Форекс (или вообще про ТА), то 2/3 томов будет так или иначе о волатильности :-)
простейшее практичное применение ATR - в приведённый вами код, добавить параметр "сдвиг". Потому как
Рынок цикличен, периодичен и ATR (средний истинный диапазон, амплитуда волатильности) повторяется раз от раза.
Внутри дня: cдвиньте показания вашего индикатора вправо на PeriodSeconds(PERIOD_D1)/PeriodSeconds(PERIOD_CURRENT)-ATR_PERIOD/2. То есть на кол-во баров за 1 день минус "задержка" от усреднений ATR
получите средний диапазон (дистанция от Open до самого дальнего high/low, разброс цен) каким он был вчера в то-же самое время. Теперь можно сравнить текущий размер свечей с ним и сделать выводы, торговля идёт активнее или наоборот. Уже хорошо
Касаясь вскользь, сугубо техническое: у нас в 99% случаев в TA используются оконные функции, то есть усреднения, сравнения за какой-то период. Они все поголовно барахлят в трёх случаях: когда внутри окон малые почти одинаковые значения, когда на концах окон слишком разные значения и когда значения большие но "в разнобой". Это примерно соотносится с малым и значительным ATR и его разворотами. То есть когда диапазон мал, индикаторы слишком чуствительны и реагируют на малейший шум, а когда резко растёт (или резко падает) то тоже ерунда получается
можно продолжать и продолжать... :-)
Внутри дня: cдвиньте показания вашего индикатора вправо на PeriodSeconds(PERIOD_D1)/PeriodSeconds(PERIOD_CURRENT)-ATR_PERIOD/2. То есть на кол-во баров за 1 день минус "задержка" от усреднений ATR ...
Спасибо, Максим, за уделённое внимание и ответ! Теперь есть над чем подумать.
С уважением, Владимир.
Исправленный вариант:
С уважением, Владимир.
Такое дело...
Надо сказать, я стал лучше понимать суть волатильности. Раньше думал, что это отклонение цен от средней цены. Но и ATR, и теория говорят, что это коридор цен.Благодарю. Правда, так никто и не ответил, что выдает функция индикатора с количеством периодов 0 и почему копируется только 3 элемента и как, если нужно, и нужно ли, скопировать все:
Такое дело...
Надо сказать, я стал лучше понимать суть волатильности. Раньше думал, что это отклонение цен от средней цены. Но и ATR, и теория говорят, что это коридор цен.Ничего не выдаёт. Минимально может быть 1:
Если ввести значение меньше 1, то будет установлено значение по умолчанию 14:
Так сделано в индикаторе. Вы, конечно можете у себя сделать что угодно, но период меньше 1 ничего не даст в расчётах.
Зачем Вам нулевой период расчёта? Смысл какой?
Ничего не выдаёт. Минимально может быть 1:
Если ввести значение меньше 1, то будет установлено значение по умолчанию 14:
Благодарю. Теперь понятно.
Artyom Trishkin #:
Зачем Вам нулевой период расчёта? Смысл какой?
Это я интересовался, как можно штатными средствами индикатора получить волатильность текущей свечи.
А касаемо второй части вопроса, "почему копируется только 3 элемента и как, если нужно, и нужно ли, скопировать все", существует какое-то объяснение?Благодарю. Теперь понятно.
Это я интересовался, как можно штатными средствами индикатора получить волатильность текущей свечи.
А касаемо второй части вопроса, "почему копируется только 3 элемента и как, если нужно, и нужно ли, скопировать все", существует какое-то объяснение?Человек захотел в примере показать как скопировать три бара. Вы можете копировать столько баров, сколько нужно. Но для советника, впрочем и обычно, достаточно знать текущую волатильность. Это вообще только один нулевой, текущий бар.
Хорошая информация. Спасибо.
Подскажите вот так правильно нормировать до 5 знаков после запятой ?
Вот в этом месте
Просто у меня получаются расхождения с реальными даннымиПодскажите вот так правильно нормировать до 5 знаков после запятой ?
Вот в этом месте
Просто у меня получаются расхождения с реальными даннымиА это точно нужно делать так? Просто мне не понятно с какой целью отнимаете период индикатора:
С уважением, Владимир.
Здравствуйте.
Мой советник не запускается на рабочем столе meta4, даже если я использую предустановленный эксперт, который у них есть. Я выбрал автоторговлю, разрешил торговлю при смене счета, у него есть смайлик и в нижней части в экспертах он показывает, что все хорошо. Так почему же он не открывает сделки?
Посоветуйте что-нибудь или помогите?