Kod nasıl çalışır
CodeScript grafikteki barları tek tek gezer ve kodunun tamamını her bar için baştan sona bir kez çalıştırır. Bunu kavradığın anda hem gösterge değerleri hem de emirlerin ne zaman dolduğu yerine oturur.
Kod yazarken tek bir anı düşünürsün: şu anki fiyat, şu anki ortalama. Motor ise aynı satırları yüzlerce bar için tekrar çalıştırır. Ortaya çıkan şey tek bir sayı değil, bar sayısı kadar değerdir.
Her bar için bir kez, baştan sona
Grafikte 500 bar varsa kodun 500 kez çalışır. Her turda ilk satırdan başlar, son satırda biter. Bir sonraki bara geçildiğinde her şey yeniden hesaplanır.
Satır sırası bu yüzden önemlidir. Bir değişkeni kullanmadan önce tanımlamış olman gerekir; motor yukarıdan aşağı ilerler, ileriye bakmaz.
// bu satirlarin tamami her bar icin bir kez, bastan sona calisir ortalama = sma(close, 20) fark = close - ortalama plot(ortalama, "SMA20", "#2962ff") plot(fark, "fark", "#ff9800", "fark")
Fiyat panelinde mavi 20 barlık ortalama, altta ayrı bir panelde kapanış ile ortalama arasındaki fark. Her bar için iki değer birden hesaplanır.
Her tur yeniden hesaplanır ama geçmiş silinmez. Motor önceki barlarda ürettiğin değerleri saklar; grafikteki çizgiyi oluşturan da bu birikimdir.
Değişkene atadığın şey bir seridir
hizli = sma(close, 10) yazdığında hizli tek bir sayı olmaz. Her bara bir değer düşen bir seri olur. Kodun içinde onu sıradan bir sayı gibi kullanırsın, motor işi bar bar yapar.
Aynısı koşullar için de geçerlidir. close > yavas karşılaştırması tek bir doğru/yanlış üretmez; her bar için ayrı bir doğru/yanlış üretir. Yani koşullar da seridir.
// hizli tek bir sayi degil, her bara bir deger dusen seridir hizli = sma(close, 10) yavas = sma(close, 30) plot(hizli, "hizli", "#26a69a") plot(yavas, "yavas", "#ef5350") plotshape(crossover(hizli, yavas), style="triangleup", location="belowbar", color="#26a69a")
Fiyat panelinde yeşil 10 barlık ve kırmızı 30 barlık ortalama. Hızlı ortalama yavaşı yukarı kestiği her barın altında yeşil bir üçgen belirir.
Bir seriyi tek sayı sanmak en sık düşülen tuzaktır. plot(hizli) o serinin yalnız son değerini değil, bütün barlardaki değerlerini çizer.
Geçmiş barların değerini okumak
Seriyle çalışmanın asıl kazancı geçmişe erişimdir. prev bir serinin belirttiğin kadar bar önceki değerini verir, change ise aradaki farkı.
// prev bir onceki barin degerini, change ise aradaki farki verir oncekiKapanis = prev(close, 1) plot(oncekiKapanis, "onceki kapanis", "#9598a1") plot(change(close, 1), "bar farki", "#2962ff", "fark") barcolor(iff(close > oncekiKapanis, "#26a69a", "#ef5350"))
Fiyat panelinde bir bar geriden gelen gri kapanış çizgisi, alt panelde bar başına fiyat farkı. Barlar önceki kapanışa göre yeşile ya da kırmızıya boyanır.
İlk barlarda geriye bakacak veri yoktur, sonuç boş (na) kalır. Zincirin kopmasını istemiyorsan nz ile bu boşluğu bir sayıya çevir.
prev(source, n=1)
n bar önceki değeri taşıyan seri.
change(source, n=1)
Serinin şimdiki değeri ile n bar öncesi arasındaki fark.
iff(condition, ifTrue, ifFalse)
Her bar için koşula göre seçilmiş değeri taşıyan seri.
Bir barın içinde fiyatın izlediği yol
Bir bar dört fiyat taşır: açılış, düşük, yüksek, kapanış. Ama bar oluşurken fiyat bu dördünde aynı anda durmaz, aralarında bir yol izler. Motor bar içinde ne olduğunu göremediği için bu yolu barın tipine göre kabul eder.
- Yükselen barda (kapanış açılışın üstünde): açılış → düşük → yüksek → kapanış.
- Düşen barda (kapanış açılışın altında): açılış → yüksek → düşük → kapanış.
- Bekleyen emirler ve koruma seviyeleri bu sıraya göre, adım adım denetlenir.
Bu varsayım küçük bir ayrıntı değil, sonucu doğrudan değiştirir. Aynı barda hem kâr-al hem zarar-kes seviyesine değiyorsa hangisinin dolduğunu bu yol belirler.
Bekleyen emirler bu sıraya göre denetlenir
Piyasa emri beklemez; koşulun doğduğu barda dolar. Bekleyen emir ise bir seviyede asılı kalır ve yalnız fiyat oradan geçerse dolar. Kâr-al ile zarar-kes de bekleyen emirdir.
// giriste ayni emre hem kar-al hem zarar-kes bagliyoruz enterLong(crossover(close, sma(close, 20)), id='poz') exit(true, id='koru', fromEntry='poz', limit=close * 1.03, stop=close * 0.98) plot(sma(close, 20), "SMA20", "#2962ff")
Kesişim barında pozisyon açılır ve aynı emre iki koruma bağlanır: %3 üstte kâr-al, %2 altta zarar-kes. Fiyat bar içinde hangisine önce ulaşırsa o dolar, diğeri iptal olur.
Koruma seviyelerini sabit yüzde yerine oynaklığa bağlarsan, sakin ve hareketli barlarda mesafe kendiliğinden değişir. Aşağıdaki kurulumda zarar-kes bir atr, kâr-al iki atr uzaktadır.
// koruma seviyelerini sabit yuzde yerine oynaklikla olcuyoruz oynaklik = atr(14) enterLong(crossover(close, ema(close, 50)), id='poz') exit(true, id='koru', fromEntry='poz', limit=close + 2 * oynaklik, stop=close - oynaklik) plot(ema(close, 50), "EMA50", "#ff9800")
Turuncu EMA50 çizgisi ve her yukarı kesişimde bir giriş. Koruma mesafesi barın oynaklığıyla birlikte genişler ya da daralır.
İki seviye tam olarak eşit denk gelirse zarar-kes önce çalışır. Bu bilinçli bir seçimdir: geriye dönük sınama kendi sonucunu olduğundan iyi göstermesin diye kötü senaryo öne alınır.
Kapanmış bar ile oluşmakta olan bar
Geçmiş barlar kapanmıştır, değerleri artık değişmez. Canlı grafikte en sağdaki bar hâlâ oluşur ve her fiyat güncellemesinde kodun yeniden çalışır. Bu barda bir koşul doğup birkaç saniye sonra sönebilir.
Kararını yalnız kapanmış barda vermek istiyorsan koşulu barstate.isconfirmed ile birlikte kullan.
// karari yalniz kapanmis barda ver sinyal = crossover(close, sma(close, 20)) kesin = sinyal and barstate.isconfirmed enterLong(kesin) exit(crossunder(close, sma(close, 20))) plotshape(kesin, style="triangleup", location="belowbar", color="#26a69a")
Giriş ve üçgen işareti yalnız bar kapandıktan sonra çıkar; oluşmakta olan barın geçici kesişimi işlem açmaz.
Geriye dönük sınamada bütün barlar kapalıdır, bu yüzden barstate.isconfirmed hep doğru döner. Fark yalnız canlı grafikte görünür; sonucun sınamada başka, canlıda başka çıkmasının sık sebeplerinden biri budur.
Sık yapılan hatalar
- Bir seriyi son değeriyle karıştırmak. Koşul her bar için yeniden değerlendirilir.
- Değişkeni kullandıktan sonra tanımlamak. Motor yukarıdan aşağı gider, ileriye bakmaz.
- Bekleyen emri fiyatın yanlış tarafına koymak. Alış limiti fiyatın altına, alış stopu üstüne konur.
- Aynı barda iki koruma seviyesine de değdiğinde kâr-alın dolacağını sanmak. Tam eşitlikte zarar-kes öne geçer.
- Canlı grafikte henüz kapanmamış barın sinyaline güvenmek. Bar kapanana kadar o sinyal geri alınabilir.
Bar bar çalışma, seri mantığı ve bar içi fiyat yolu; dilin geri kalanı bu üç kuralın üstüne oturur. Buradan sonra göstergeleri ve emirleri öğrenmek çok daha kolay gelir.