Untitled

 avatar
unknown
plain_text
a month ago
3.9 kB
43
Indexable

//@version=5
indicator("Oto trend", overlay=true)

// Pivot Ayarları
pivotLeg = input.int(20, "Pivot Uzunluğu", maxval = 100)

type Pivot
    float value
    int loc

var allPH = array.new<Pivot>()  // Yüksek pivotlar
var allPL = array.new<Pivot>()  // Düşük pivotlar

// Pivot noktalarını belirleme
ph = ta.pivothigh(high, pivotLeg, pivotLeg)
pl = ta.pivotlow(low, pivotLeg, pivotLeg)

// Pivot noktalarını ekleme
if not na(ph)
    array.push(allPH, Pivot.new(ph, bar_index[pivotLeg]))

if not na(pl)
    array.push(allPL, Pivot.new(pl, bar_index[pivotLeg]))

// Maximum pivot noktası kontrolü
var MAX_PIVOTS = 100
if array.size(allPH) > MAX_PIVOTS
    array.shift(allPH)
if array.size(allPL) > MAX_PIVOTS
    array.shift(allPL)

type lineArgs
    int x1
    int x2
    float y1
    float y2
    color color

type Signal
    bool valid
    lineArgs args

drawLine(lineArgs args) =>
    line.new(args.x1, args.y1, args.x2, args.y2,color = args.color, extend = extend.right, width = 3)

// Yükselen ve alçalan trendleri kontrol etme metodları
method isup(array<Pivot> this) =>
    if array.size(this) < 2
        Signal.new(false, lineArgs.new(0, 0, 0.0, 0.0, #00dd00))
    else
        curr = array.get(this, array.size(this) - 1)
        prev = array.get(this, array.size(this) - 2)
        valid = curr.value > prev.value
        Signal.new(valid, lineArgs.new(prev.loc, curr.loc, prev.value, curr.value, #00dd00))

method isdown(array<Pivot> this) =>
    if array.size(this) < 2
        Signal.new(false, lineArgs.new(0, 0, 0.0, 0.0, #dd0000))
    else
        curr = array.get(this, array.size(this) - 1)
        prev = array.get(this, array.size(this) - 2)
        valid = curr.value < prev.value
        Signal.new(valid, lineArgs.new(prev.loc, curr.loc, prev.value, curr.value, #dd0000))

type lineItem
    line line
    float x1
    bool active

var bullishline = array.new<lineItem>()
var bearishline = array.new<lineItem>()

// Yükselen trend çizgileri
if array.size(allPL) >= 2
    bullish = isup(allPL)
    if bullish.valid
        if array.size(bullishline) == 0
            array.push(bullishline, lineItem.new(drawLine(bullish.args), bullish.args.x1, true))
        else
            last = array.get(bullishline, array.size(bullishline) - 1)
            if bullish.args.x1 > last.x1
                array.push(bullishline, lineItem.new(drawLine(bullish.args), bullish.args.x1, true))

// Alçalan trend çizgileri
if array.size(allPH) >= 2
    bearish = isdown(allPH)
    if bearish.valid
        if array.size(bearishline) == 0
            array.push(bearishline, lineItem.new(drawLine(bearish.args), bearish.args.x1, true))
        else
            last = array.get(bearishline, array.size(bearishline) - 1)
            if bearish.args.x1 > last.x1
                array.push(bearishline, lineItem.new(drawLine(bearish.args), bearish.args.x1, true))

// Yükselen trend çizgilerini güncelleme
if array.size(bullishline) > 0
    for i = 0 to array.size(bullishline) - 1
        item = array.get(bullishline, i)
        if item.active
            price = line.get_price(item.line, bar_index)
            if close < price
                line.set_extend(item.line, extend.none)
                line.set_x2(item.line, bar_index)
                line.set_y2(item.line, price)
                item.active := false

// Alçalan trend çizgilerini güncelleme
if array.size(bearishline) > 0
    for i = 0 to array.size(bearishline) - 1
        item = array.get(bearishline, i)
        if item.active
            price = line.get_price(item.line, bar_index)
            if close > price
                line.set_extend(item.line, extend.none)
                line.set_x2(item.line, bar_index)
                line.set_y2(item.line, price)
                item.active := false
Editor is loading...
Leave a Comment