il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
Надо в лентах Боллинджера определить период, когда ширина лент меньше минимальной на предыдущих 120 барах.
Вроде сделал, только оно раскрашивает сами ленты правильно, а область между лент закрашивает со сдвигом на бар вправо - см. файл BBSqueeze.png во вложении.
Снизу индикатор показывает расстояние между лентами, оранжевым выделен интересующий диапазон.
Сверху - ленты с раскраской того же диапазона.
Подскажите, пожалуйста, почему границы лент и средняя раскрашиваются правильно, а область между лент закрашивает со сдвигом на бар вправо?
Код индикатора Bollinger Bands:
Код: |
_SECTION_BEGIN("Bollinger Bands Squeeze");
FieldBB = ParamField("Price field BB", 3); //3 - returns Close array
PeriodsBB = Param("Periods BB", 20, 2, 300, 1);
WidthBB = Param("Width BB", 2, 0, 10, 0.05);
ColorBB = ParamColor("Color BB", colorLightGrey);
StyleBB = ParamStyle("Style BB");
FieldMA = ParamField("Price field MA", 3); //3 - returns Close array
PeriodsMA = Param("Periods MA", 20, 2, 300, 1, 10);
ColorMA = ParamColor("Color MA", colorLightGrey);
StyleMA = ParamStyle("Style MA");
AreaColor = ColorBlend(ColorMA, GetChartBkColor(), 0.8);
BBTop = BBandTop(FieldBB, PeriodsBB, WidthBB);
BBBot = BBandBot(FieldBB, PeriodsBB, WidthBB);
BBMiddle = MA(FieldMA, PeriodsMA);
Band = Nz((BBTop - BBBot) / BBMiddle) * 100;
Squeeze = LLV(Band, 120) * 1.05;
cond = Band < Squeeze;
LevelLLV = 0;
for (bar = 1; bar < BarCount; bar++)
{
if (cond[bar-1])
{
LevelLLV = Max(Squeeze[bar-1], LevelLLV);
}
cond[bar] = (cond[bar]) OR (Band[bar] < LevelLLV) ;
if (NOT cond[bar])
{
LevelLLV = 0;
}
}
AreaColor = IIf(cond, colorLightOrange, AreaColor);
ColorBB = IIf(cond, colorLightOrange, ColorBB);
ColorMA = IIf(cond, colorLightOrange, ColorMA);
//Рисуем BB
Plot(BBTop, "BBTop", ColorBB, StyleBB);
Plot(BBBot, "BBBot", ColorBB, StyleBB);
Plot(BBMiddle, "BBMiddle", ColorMA, StyleMA);
//Рисуем BB Area
PlotOHLC(BBTop, BBTop, BBBot, BBBot, "", AreaColor,
styleNoLabel | styleCloud | styleNoRescale, Null, Null, Null, -1);
_SECTION_END();
|
Код индикатора, показывающего ширину лент:
Код: |
Band = Nz((BBandTop( C, 20, 2 ) - BBandBot( C, 20, 2)) / MA(Close, 20 )) * 100;
Squeeze = LLV(Band, 120) * 1.05;
cond = Band < Squeeze;
LevelLLV = 0;
for (bar = 1; bar < BarCount; bar++)
{
if (cond[bar-1])
{
LevelLLV = Max(Squeeze[bar-1], LevelLLV);
}
cond[bar] = (cond[bar]) OR (Band[bar] < LevelLLV) ;
if (NOT cond[bar])
{
LevelLLV = 0;
}
}
Plot(Band, "BandWidth", IIf(cond, colorLightOrange, colorGreen));
|
Спасибо за ответ(ы). |
|
|