Strateji geleceğe göz atarak gerçekçi olmayan iyi sonuçlar üretir

Pine dilini geliştirmedeki ana hedeflerimizden biri, kullanıcılara mümkün olduğunca çok sayıda yararlı araç sağlamaktır. Bu araçların çeşitli farklı kullanımları olabilir ve belirli manipülasyonlarla, bazı göstergeler ve grafik türleri gelecekteki çubuklardan veya işlemlerden (şu anda işlenen çubuğa göre) veri çıkarmanıza izin verir. Bir işlem yapan birey bu verileri gerçek ticarette alamayacağından, onun etrafında inşa edilen stratejiler, geri test yaparken gerçekçi olmayan karlı sonuçlar üretebilirken, gerçek zamanlı ticarette bu alım satımlar zarar olacaktır. Stratejilerde gelecekten gelen bilgileri kullanma hatasına ileriye dönük önyargı da denir.

Bazı TradingView kullanıcıları, cehaletten veya kötü niyetle, bu özelliği kullanan fikirler ve komut dosyası yayınları oluşturma eğilimindedir. TradingView, bazı durumlarda faydalı olabileceği için özelliğin kendisini kaldıramaz, ancak aynı zamanda kullanıcıları bu davranış konusunda uyarmayı taahhüt ediyoruz.

Japon tarzı mumlar kullanan stratejiler

Bu davranışın çok yaygın bir nedeni, Japon tarzı çizelgelerde (Renko, Kagi, vb.) Geriye dönük strateji testidir. Sorun, Strateji Geriye Dönük Test Motorunun her bir çubuğu, açık, yüksek, düşük ve kapanış fiyatları ile (normal bir mum grafikte olduğu gibi) 4 işlem olarak değerlendirmesinden kaynaklanmaktadır. Bu nedenle, bir Renko çizelgesinde, Strateji Geriye Dönük Test Motoru, gerçekte var olmayan bir fiyata bir pozisyona girebilir / çıkabilir. Buna ek olarak, bir Kutu Boyutu değerini darphane çubuğundan daha küçük olarak ayarlarsanız, Backtesting Engine işlemi işlemeden önce bir sonraki fiyatın mevcut fiyattan daha yüksek veya düşük olup olmayacağını kontrol etmek ve pozisyona önceden girip çıkmak mümkündür gerçek fiyat.

//@version=4strategy("My Strategy", overlay=true)if close < close[1]    strategy.entry("ShortEntryId", strategy.short)strategy.close("ShortEntryId", when = close > close[1])if close > close[1]    strategy.entry("LongEntryId", strategy.long)strategy.close("LongEntryId", when = close < close[1])
JavaScript

Ekran görüntüsünde görebileceğiniz gibi, bu basit strateji, maksimum / minimum fiyatlara çok yakın fiyatlarda anlaşmalar yapabilir.

calc_on_order_fills = true parametresini kullanan stratejiler

Strateji işlevinde calc_on_order_fills = true parametresi belirtildiğinde, Backtesting Engine, sipariş yürütüldükten sonra çubuğun içinde ek bir hesaplama gerçekleştirir (strateji yalnızca çubuğun kapanmasında hesaplandığında olağan durumun aksine). Aynı zamanda, hesaplama sırasında strateji, yüksek ve düşük değerler gibi birçok ek çubuk parametresine erişim sağlar. Bu, geriye dönük test yaparken mükemmel performans gösterecek bir strateji yazmanıza olanak tanır:

//@version=4strategy("CalcOnOrderFillsStrategy", overlay=true, calc_on_order_fills=true)// a variable is used to prevent double entry on the same barvar lastTimeEntry = 0 longCondition = close > sma(close, 14)  and lastTimeEntry != timeif longCondition    strategy.entry("LongEntryId", strategy.long) strategy.exit("exitId", "LongEntryId", limit=high)lastTimeEntry := time
JavaScript

Ekran görüntüsünde, girişin bir barın açık fiyatında olduğunu ve çıkışın aynı çubuğun yüksekliğinde gerçekleştiğini görebilirsiniz. Yani, hesaplama sırasında, emir gerçekleştirildikten sonra, strateji.çıkış limit fiyatını gerçek ticarette yapamayacağımız mevcut çubuğun yüksek seviyesine eşit olarak belirledik.

security lookahead = barmerge.lookahead_on parametresi ve Pine v3'ten önceki security

Pine'daki güvenlik işlevi, diğer sembollerden ve / veya zaman dilimlerinden veri istemenizi sağlar. Uygulamaya bağlı olarak, bu, stratejinin gelecekten veri almasına izin verebilir: örneğin, bir günlük çubuğun yakın veya yüksek olmasını isterse, strateji geri test edilirken bu değerleri günün açılışında bilebilir.

Sürüm 3'ten önce, güvenlik işlevi, daha yüksek zaman diliminden değeri, erişilebilir olması gerekmeden önce bile döndürecekti. Sürüm 3'te bu davranış düzeltildi, ancak uyumluluk için önden okuma parametresi güvenlik işlevine eklendi. Varsayılan olarak yanlıştır (yani, gelecek görüş kapalıdır), ancak önden okuma parametresinin değerini barmerge.lookahead_on olarak ayarlayarak etkinleştirebilirsiniz).

Bu özelliği kullanarak oluşturulmuş karlı bir strateji örneği:

//@version=4strategy("My Strategy", overlay=true)dayStart = security(syminfo.tickerid, "1D", time, lookahead=barmerge.lookahead_on)dayHigh = security(syminfo.tickerid, "1D", high, lookahead=barmerge.lookahead_on)dayLow = security(syminfo.tickerid, "1D", low, lookahead=barmerge.lookahead_on)// entry at first bar of a dayif time == dayStart    // distance to daily high is further, so we can earn more    if abs(open - dayHigh) > abs(open - dayLow)        strategy.entry("LongEntryId", strategy.long)        strategy.exit("exitLongId", "LongEntryId", limit=dayHigh)    else        strategy.entry("ShortEntryId", strategy.short)        strategy.exit("exitShortId", "ShortEntryId", limit=dayLow)        plot(dayHigh)plot(dayLow)
JavaScript

İlk çubukta, fiyatın açılış fiyatına göre daha fazla yukarı veya aşağı hareket edip etmeyeceğini analiz ediyoruz ve buna göre sırasıyla uzun veya kısa pozisyon girip ardından günün maksimum veya minimum fiyatından çıkış yapıyoruz.

security() 'nin barmerge.lookahead_on argümanına sahip olduğu tüm durumların geleceğe yorumlanamadığını unutmayın: örneğin, yukarıdaki kodu değiştirmekte time/high/low inside security() 'dan time[1]/high[1]/low[1] 'ya ise, zaten kapanmış olan çubuklar için değerler alırdık. Bu genellikle deneyimli kodlayıcılar tarafından herhangi bir önden okuma riski olmadan security() veri almak için kullanılır.

Şu anda, bunlar bir stratejinin geleceğe bakması için bilinen yollardır. Bu açıklamanın, bu eksikliklere sahip olmayan stratejiler oluşturmanıza ve yazarlarının fikirlerinde bu özellikleri kullanan yayınlanmış stratejilerden kaçınmanıza izin vereceğini umuyoruz.