Страница 1 из 1

Инд. PinBar почему отображается с нуля ?

Добавлено: 15 апр 2020, 20:17
tormovies
Сделал индикатор pinBar
но почему то при нанесении индикатора - свечной график начинает отображаться с нуля (а не масштабируется внутри графика ), в итоге свечной график сужается в горизонтальную полоску
возможно я что то недопонимаю , гляньте, у кого какие идеи

Код: Выделить всё

function Initialize()
{
// Обязательные параметры:
    IndicatorName = "pinBar";
    AddInput("Input", Inputs.Candle);
    PriceStudy = true;
    AddSeries("Buy", DrawAs.Custom, Color.Blue);
    AddSeries("Sell", DrawAs.Custom, Color.Red);
    AddSeries("Body");
}

function Evaluate()
{
// AlfaDirect. 2014. OX
// Delat (Дельта) - разница между объемом сделок покупателей  и продавцов
    Buy = 0; Sell = 0;
    Body = Math.Abs(Input.Open[0] - Input.Close[0]);
    var Upshadow = 0.0; var Downshadow = 0.0;
    var Pinbar_h = 0.0; var Pinbar_l = 0.0;
   
    if(Input.Open[0]>Input.Close[0])
        Upshadow = Input.High[0] - Input.Open[0];
    else
        Upshadow = Input.High[0] - Input.Close[0];
   
    if(Input.Open[0]>Input.Close[0])
        Downshadow = Input.Close[0] - Input.Low[0];
    else
        Downshadow = Input.Open[0] - Input.Low[0];
   
    if(Input.Close[-1]>Input.Open[-1]){
        if(Body[-1]>Body){
            if(Upshadow>0.5*Body){
                if(Upshadow>2*Downshadow){
                    Pinbar_h = 1;
                }
            }
        }
    }
   
    if(Input.Open[-1]>Input.Close[-1]){
        if(Body[-1]>Body){
            if(Downshadow>0.5*Body){
                if(Downshadow>2*Upshadow){
                    Pinbar_l = 1;
                }
            }
        }
    }
   
    if(Pinbar_l>0){ Buy = Input.Low[0]-Body;   Buy.DrawFigure(Figure.Up,Color.Blue,Line.Solid,5,Color.Orange,0);   }
    if(Pinbar_h>0){ Sell = Input.High[0]+Body; Sell.DrawFigure(Figure.Down,Color.Red,Line.Solid,5,Color.Orange,0); }
   
}

Re: Инд. PinBar почему отображается с нуля ?

Добавлено: 16 апр 2020, 07:09
evge
Приветствую!

Проблемы 2, однотипные.

Для серии Body отключаем отображение.

AddSeries(Name, Type, Color, Visible)

ставим Visible = false

Но это первая часть проблемы.

Вторая, это задание значение по умолчанию в 0 для Buy, Sell
Хоть они и при 0 и не отрисовываются, но график автоматически масштабирует до отображения значений 0.
Не задаем 0 по умолчанию и всё будет хорошо (в коде ниже закомментировал).

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

Код: Выделить всё

function Initialize()
{
    IndicatorName = "pinBar";
    AddInput("Input", Inputs.Candle);
    PriceStudy = true;
    AddSeries("Buy", DrawAs.Custom, Color.Blue);
    AddSeries("Sell", DrawAs.Custom, Color.Red);
    AddSeries("Body", DrawAs.Custom, Color.Black, false);
}

function Evaluate()
{
// AlfaDirect. 2014. OX
// Delat (Дельта) - разница между объемом сделок покупателей  и продавцов

    //Buy = 0; Sell = 0;
    Body = Math.Abs(Input.Open[0] - Input.Close[0]);
    var Upshadow = 0.0; var Downshadow = 0.0;
    var Pinbar_h = 0.0; var Pinbar_l = 0.0;
   
    if(Input.Open[0]>Input.Close[0])
        Upshadow = Input.High[0] - Input.Open[0];
    else
        Upshadow = Input.High[0] - Input.Close[0];
   
    if(Input.Open[0]>Input.Close[0])
        Downshadow = Input.Close[0] - Input.Low[0];
    else
        Downshadow = Input.Open[0] - Input.Low[0];
   
    if(Input.Close[1]>Input.Open[1]){
        if(Body[1]>Body[0]){
            if(Upshadow>0.5*Body){
                if(Upshadow>2*Downshadow){
                    Pinbar_h = 1;
                }
            }
        }
    }
   
    if(Input.Open[1]>Input.Close[1]){
        if(Body[1]>Body[0]){
            if(Downshadow>0.5*Body){
                if(Downshadow>2*Upshadow){
                    Pinbar_l = 1;
                }
            }
        }
    }
   
    if(Pinbar_l>0){ Buy = Input.Low[0]-Body;   Buy.DrawFigure(Figure.Up,Color.Blue,Line.Solid,5,Color.Orange,0); }
    if(Pinbar_h>0){ Sell = Input.High[0]+Body; Sell.DrawFigure(Figure.Down,Color.Red,Line.Solid,5,Color.Orange,0); }
}

Re: Инд. PinBar почему отображается с нуля ?

Добавлено: 28 апр 2020, 16:36
Gman_cpt
Добрый день!
Скажите возможно привязать фильтр объема к этому индикатору. Чтобы отображал только те пинбары по которым высокий и крайне высокий объемы проходят.

Re: Инд. PinBar почему отображается с нуля ?

Добавлено: 28 апр 2020, 17:04
evge
Здравствуйте!
Возможно.

В чем объем задавать? Считать средний за период и при отклонении от среднего на > указанного % рисуем ?

Или просто задаем нужный объем выше больше которого рисуем?

Второе менее универсально.

Re: Инд. PinBar почему отображается с нуля ?

Добавлено: 28 апр 2020, 17:18
Gman_cpt
Да по первому варианту будет правильнее. "Считать средний за период и при отклонении от среднего на > указанного % рисуем"

Re: Инд. PinBar почему отображается с нуля ?

Добавлено: 28 апр 2020, 17:40
evge
В переменной "O" считается отклонение в % от среднего объема за период PeriodV до текущего бара (не включая его объем).
Оно может быть и минусовым в %.

Добавлены параметры:

PeriodV - за какой период считаем средний объем
Perc - фильтр в % на сколько от среднего должен быть больше объем

Код: Выделить всё

function Initialize()
{
    IndicatorName = "pinBarVol";
    AddInput("Input", Inputs.Candle);
    PriceStudy = true;
    AddSeries("Buy", DrawAs.Custom, Color.Blue);
    AddSeries("Sell", DrawAs.Custom, Color.Red);
    AddSeries("Body", DrawAs.Custom, Color.Black, false);
    AddParameter("PeriodV", 20);
    AddParameter("Perc", 100);
    AddGlobalVariable("sumV", Types.Double, 0);
    AddGlobalVariable("VA", Types.Double, 0);
}

function Evaluate()
{
// AlfaDirect. 2014. OX
// Delat (Дельта) - разница между объемом сделок покупателей  и продавцов

// pinBarVol
// evge 28.04.2020 https://alfadirect4.ru

   double O = 0;
   if (VA != 0) O = Input.Volume[0] / VA * 100 - 100;
   
   sumV += Input.Volume[0];
   if (CurrentIndex > PeriodV) sumV -= Input.Volume[PeriodV];
   VA = sumV / PeriodV;

    //Buy = 0; Sell = 0;
    Body = Math.Abs(Input.Open[0] - Input.Close[0]);
    var Upshadow = 0.0; var Downshadow = 0.0;
    var Pinbar_h = 0.0; var Pinbar_l = 0.0;
   
    if(Input.Open[0]>Input.Close[0])
        Upshadow = Input.High[0] - Input.Open[0];
    else
        Upshadow = Input.High[0] - Input.Close[0];
   
    if(Input.Open[0]>Input.Close[0])
        Downshadow = Input.Close[0] - Input.Low[0];
    else
        Downshadow = Input.Open[0] - Input.Low[0];
   
    if(Input.Close[1]>Input.Open[1]){
        if(Body[1]>Body[0]){
            if(Upshadow>0.5*Body){
                if(Upshadow>2*Downshadow){
                    Pinbar_h = 1;
                }
            }
        }
    }
   
    if(Input.Open[1]>Input.Close[1]){
        if(Body[1]>Body[0]){
            if(Downshadow>0.5*Body){
                if(Downshadow>2*Upshadow){
                    Pinbar_l = 1;
                }
            }
        }
    }
   
    if(Pinbar_l>0 && O >= Perc){ Buy = Input.Low[0]-Body;   Buy.DrawFigure(Figure.Up,Color.Blue,Line.Solid,5,Color.Orange,0); }
    if(Pinbar_h>0 && O >= Perc){ Sell = Input.High[0]+Body; Sell.DrawFigure(Figure.Down,Color.Red,Line.Solid,5,Color.Orange,0); }
}

Re: Инд. PinBar почему отображается с нуля ?

Добавлено: 28 апр 2020, 20:07
Gman_cpt
Большое спасибо!