Pine Script v5’e Merhaba Deyin

Oct 7, 2021

Bugün, Pine v5’e mezun oldu! Gösterge ve strateji programlama dilimizin yeni sürümü, bir dizi heyecan verici yeni özellik ve iyileştirme getiriyor. Pine şimdi her zamankinden daha güçlü ve v5’teki değişiklikler dili yeni seviyelere çıkarmamıza yardımcı olacak. Bu yazı mevcut en son özelliklerden sadece birkaçını sunar; Sürüm Notlarımızı ve Geçiş Kılavuzumuzu okuduğunuzdan eminolun.

V4 – V5 DÖNÜŞTÜRÜCÜ

Pine’ın önceki sürümlerini kullanan mevcut Pine komut dosyaları değişmeden çalışmaya devam edecek, ancak kodlayıcıların v4 komut dosyalarını v5’e dönüştürmelerine yardımcı olmak için Pine Editor’da bir dönüştürme aracı sağladık. Pine’daki gelecekteki iyileştirmeler yalnızca v5 için kullanıma sunulacaktır, bu nedenle yeni özelliklerden yararlanmak istiyorsanız göstergelerinizi ve stratejilerinizi dönüştürmenizi öneririz. v4 ile v5 dönüştürme aracı, Düzenleyici’ye bir v4 komut dosyası yüklendiğinde, Diğer açılır menüsünden kullanılabilir:

Tüm v4 kodlarının otomatik olarak dönüştürülemeyeceğine dikkat edin. Dönüştürme sorunlarıyla karşılaşırsanız veya komut dosyalarınızı el ile dönüştürmeyi tercih ederseniz, v4 ve v5 arasındaki tüm değişiklikleri belgeleyen Geçiş Kılavuzumuz size yol gösterecektir.

KITAPLIK

Pine’a v5 ile birlikte gelen önemli bir ek kütüphanelerdir. Kitaplıklar, diğer komut dosyalarında yeniden kullanılacak özel işlevler oluşturmanıza olanak tanıyan yeni bir yayın türüdir. Bir kitaplık yayımlandıktan sonra, diğer komut dosyaları (göstergeler, stratejiler ve hatta diğer kitaplıklar) onu alabilir ve işlevlerini kullanabilir. Kitaplıkları, sizin veya tüm Pine topluluğunun kolayca yeniden kullanabilmesi için karmaşık algoritmalar veya sık kullanılan işlevler eklemek için kullanabilirsiniz.

Kitaplıklarla çalışmaya başlamak için kitaplıklardaki Kullanım Kılavuzu sayfamızabakın. Bu yazının sonunda PineCoders ekibimizin üyeleri tarafından yayınlanan kütüphane örneklerini bulacaksınız. Yayımlanan kitaplıkları komut dosyası akışından buradan görebilirsiniz.

KULLANICI TANIMLI IŞLEVLER IÇIN VARSAYILAN DEĞERLER

Kitaplıklarla el ele giden bir geliştirme: Kullanıcı tanımlı işlevlerdeki parametreler için varsayılan bir değer tanımlanabilir ve bu da onları etkili bir şekilde isteğe bağlı hale getirir. Aşağıdaki örnekte, tabanı expgücüne yükselten özel bir işlev customPow() ilan ediyoruz. İşlev çağrıldığında exp belirtilmezse, 2 kullanılır:

//@version=5
indicator("")
customPow(base, exp = 2) =>
    result = 1
    for i = 1 to exp
        result *= base
plot(customPow(11)) // 11^2
plot(customPow(11, 4)) // 11^4

SWITCH

Yeni switch deyimi tanıdık if deyimi üzerinde bir bükülmedir. Eğer if-else ifadelerinden oluşan büyük bir ağaç oluşturmak zorunda kaldıysanız, switchile istenen sonucu elde etmenin ne kadar uygun olduğunu takdir edeceksiniz. Bu konuda daha fazla bilgiyi Referans Kılavuzumuz. Aşağıdaki kodda çalışırken görün. Artık hesaplamalarında farklı yumuşatma algoritmaları sağlamak için bir switch deyimi kullanan yerleşik Ortalama Gerçek Aralık göstergemizdir:

//@version=5
indicator(title="Average True Range", shorttitle="ATR", timeframe="")
lengthInput = input.int(title="Length", defval=14, minval=1)
smoothingInput = input.string(title="Smoothing", defval="RMA", options = ["RMA", "SMA", "EMA", "WMA"])

maFunction(source, length) =>
    switch smoothingInput
        "RMA" => ta.rma(source, length)
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        => ta.wma(source, length)

plot(maFunction(ta.tr(true), lengthInput), title = "ATR", color=#B71C1C)

ÇIZIM KOLEKSIYONLARI

Pine çizimleriyle çalışmak için büyük bir yaşam kalitesi iyileştirmesi: yeni line.alllabel.allbox.allve table.all yerleşik dizi değişkenleri her zaman komut dosyanız tarafından çizilen belirtilen türdeki tüm çizimlerin kimliklerini içerir.

Örneğin, grafikte görüntülenen çizimlerin sayısını kullanıcı tanımlı bir değere göre kırpmak için kullanabilirsiniz. Aşağıdaki komut dosyasında, her yeni günlük açık için bir çizgi çiziyoruz (komut dosyasının varsayılan satır sınırına göre ~50 sınırına kadar). Daha sonra komut dosyasının girişlerinin aşılmış olmasına rağmen izin verilen satır sayısını kontrol eder ve varsa en eski satırı sileriz:

//@version=5
indicator("Daily Open", overlay = true)

qtyOfLinesInput = input.int(10, "Draw only last n lines", minval = 0, maxval = 50)

if ta.change(time("1D"))
    line.new(bar_index, open, bar_index + 1, open, extend = extend.right)
    if array.size(line.all) > qtyOfLinesInput
        line.delete(array.get(line.all, 0))

WHILE

v5 ile birlikte gelen uzun zamandır beklenen bir diğer Pine özelliği ise while loops. While deyimi, koşul false olduğunda veya döngüde bir break komutu kullanıldığında duracak bir döngü oluşturur.

Örnek olarak, son n çubuklarının toplam hacmine eşit yukarı ve aşağı hacmi bulmak için geriye bakmamız gereken ortalama mesafe arasındaki farkı hesaplayan bir gösterge aşağıda verilmiştir. Yukarı veya aşağı hacmi bulmak için geriye bakmamız gerektiğinde, değeri o kadar ayı veya boğadır:

//@version=5
var int MAX_BARS_BACK = 500
indicator("Volume bias", max_bars_back = MAX_BARS_BACK)

int lookBackInput = input.int(20, "Volume Look Back (bars)", minval = 2, maxval = int(MAX_BARS_BACK / 4))

// Stop the script if the chart does not contain volume data.
bool noVol = na(volume) and nz(math.sum(nz(volume), 200) == 0, true)
if noVol
    runtime.error("No volume data.")

volumeBias(lookBack, maxLookBack) =>
    bool  barUp = ta.rising(close, 1)
    bool  barDn = ta.falling(close, 1)
    float upVolume = 0.
    float dnVolume = 0.
    float avgVolume = math.sum(nz(volume), lookBack)
    int[] upBarNos = array.new_int(0)
    int[] dnBarNos = array.new_int(0)
    int   bar = 1
    bool  volumeFound = false
    while (not volumeFound) and bar < maxLookBack
        if barUp[bar] and upVolume < avgVolume
            upVolume += nz(volume[bar])
            array.push(upBarNos, bar)
        else if barDn[bar] and dnVolume < avgVolume
            dnVolume += nz(volume[bar])
            array.push(dnBarNos, bar)
        bar += 1
        volumeFound := upVolume >= avgVolume and dnVolume >= avgVolume
    float volumeBias = bar >= maxLookBack ? na : array.avg(dnBarNos) - array.avg(upBarNos)

float bias = volumeBias(lookBackInput, MAX_BARS_BACK)
plot(bias, "Volume Bias", bias > 0 ? color.lime : color.fuchsia)
hline(0)

Komut dosyasının while döngüsü, gerekli birim hem yukarı hem de aşağı birimde bulunana kadar yürütülür ve izin verilen en fazla çubuk sayısını geride aramadık. Komut dosyası ayrıca Pine v5’e eklenen başka bir özelliği de sergiler: runtime.error().

RUNTIME.ERROR()

runtime.error() işlevi artık bir komut dosyasının yürütülmesini durdurmayı ve Pine’da tanımlayabileceğiniz herhangi bir koşulda bir hata iletisi görüntülemeyi mümkün kılar. Bu, kullanıcıların göstergelerini yanlış kullanmasını önlemek isteyen komut dosyası oluşturucuları için kullanışlı olacaktır. Ayrıca, örneğin bir döngü sırasında veya bir işlev içinden yürütmeyi durdurmak için alışılaşamayan bir hata ayıklama aracı olarak da kullanılabilir.

Yeni işlevi kullanmak için, koşullarınız karşılandığında runtime.error() işlevini çağırmanız yeterlidir. Yürütüldünde, komut dosyasını durdurur ve göstergenin adının yanında tanıdık ünlem işaretini görüntüler. Kullanıcılar ünlem işareti simgesine tıkladığında, işlev çağrısında kullandığınız ileti görüntülenir.

Aşağıdaki kod, iki özel hata içeren bir barebones VWAP göstergesidir. İlki, sembol herhangi bir birim verisine sahip olmadığında görünür: VWAP birime göre hesaplanır, bu nedenle birim yoksa komut dosyası çalışamaz. İkincisi, grafikteki zaman dilimi 1D veya daha yüksek olduğunda görünür. Temel VWAP hesaplamaları, her yeni çubukta hacim ağırlıklı hareketli ortalama verileri biriktirir ve yeni bir günün başlangıcında sıfırlanır, böylece gösterge yalnızca gün içi zaman dilimlerinde kullanışlıdır.

//@version=5
indicator("VWAP with custom errors")
if na(volume) // Will be true on symbols with no volume data e.g. TVC:SPX
    runtime.error("There is no volume data for this symbol.")
else if timeframe.isdwm // Will be true on 1D and higher timeframes
    runtime.error("Session-based VWAP does not show meaningful data on timeframes >= 1D.
     Please switch to a lower timeframe.")
plot(ta.vwap)

YENI STRATEJI PARAMETRELERI

Strateji kodlayıcıları için iyi haber! Ticari özellikler, istatistikler ve ölçümler hakkında görünürlük sağlayan bir dizi yeni değişken ve işlev ekledik. Broker öykünücü siparişlerinizi yürütürken değerleri güncellenir, böylece stratejiniz ilerledikçe değerleri takip edebilirsiniz.

Her biri hakkında ayrıntılı bilgi için Pine Referans El Kitabı’nı görmek için buraya tıklayın

strategy.closedtrades.entry_price() / strategy.opentrades.entry_price()

strategy.closedtrades.entry_bar_index() / strategy.opentrades.entry_bar_index()

strategy.closedtrades.entry_time() / strategy.opentrades.entry_time()

strategy.closedtrades.size() / strategy.opentrades.size()

strategy.closedtrades.profit() / strategy.opentrades.profit()

strategy.closedtrades.commission() / strategy.opentrades.commission()

strategy.closedtrades.max_runup() / strategy.opentrades.max_runup()

strategy.closedtrades.max_drawdown() / strategy.opentrades.max_drawdown()

strategy.closedtrades.exit_price()

strategy.closedtrades.exit_bar_index()

strategy.closedtrades.exit_time()

strategy.convert_to_account()

strategy.convert_to_symbol()

strategy.account_currency

YENI AD ALANLARI

Pine kodlayıcıları topluluğumuz, son birkaç yılda Pine’a yaptığımız benzeri görülmemiş ekleme oranını takdir ettiklerini ve gelecekte de aynı hızı sürdürme niyetinde olduğumuzu söylüyor. Bununla birlikte, bu, yeni Pine işlevlerinin ve yerleşik değişkenlerin sabit bir akışını oluşturur. Bu çılgın büyümeyi desteklemek için, dilde kullanılan ~600 geçerli adı daha iyi organize etmemiz gerekiyordu. İşlevleri kullanımlarını daha iyi yansıtacak şekilde gruplamak için yeni ad alanları ekleyerek bunu yaptık. Birçok işlev parametresi adı da anlaşılmasını kolaylaştırmak için yeniden adlandırıldı.

Yeni bir ad alanı örneği ta. Bu, Başvuru Kılavuzu’na göz atmanızı ve ortak göstergelerin değerlerini döndüren tüm değişkenleri ve işlevleri bulmanızı kolaylaştırır. Buna göre, sma() artık ta.sma(). Yeni ad alanlarını hatırlamak gerekli değildir; Düzenleyici’de ad alanı olmayan bir işlevin eski adını yazar ve Otomatik Tamamlama kısayol tuşuna (Ctrl + Boşluk veya MacOS’ta Cmd + Boşluk) baserseniz, eşleşen önerileri gösteren bir açılır pencere görüntülenir:

Aynı şey Başvuru Kılavuzu’nda arama yaparken de geçerlidir; ad alanı olmadan tanıdık bir işlev adı yazmak yeni adını gündeme getirecektir. v5’te yapılan değişikliklerin tam listesini Geçiş Kılavuzumuzda görebilirsiniz.

YAYIMLANMIŞ KITAPLIKLAR

Aşağıdaki yayınlar, yeni Pine özelliklerini test etmemize yardımcı olan PineCoders tarafından TradingView’de yayınlanan kütüphanelere örnektir:

RicardoSantos tarafından colorscheme

Duyck tarafından Matrix_Functions_Lib_JD

hewhomustnotbeNamed tarafından Enchanced_ta

Yeni özellikleri yararlı bulacağınızı umuyoruz. Ve lütfen bize geri bildirim ve önerilerde bulunun – sizin için TradingView oluşturuyoruz ve platform güncellemelerimiz hakkında ne düşündüğünüzü her zaman bilmek istiyoruz.

Look first Then leap

TradingView sizin için tasarlandı, bu nedenle muhteşem özelliklerimizden en iyi şekilde yararlandığınızdan emin olun
Grafiği Açın