Koşullar ve karşılaştırma
Bir strateji, özünde "şu olursa şunu yap" kurallarının listesidir. Bu sayfada koşulu nasıl kurduğunu, nasıl birleştirdiğini ve neredeyse herkesin takıldığı yeri öğreniyorsun: kesişim bir andır, bir durum değil.
Koşul nedir
Betiğin her barda baştan çalışır. Bir karşılaştırma yazdığında tek bir cevap almazsın; her bar için ayrı bir cevap alırsın. Yani koşul da bir seridir. Kapanış serisi bar bar sayı taşır, koşul serisi bar bar doğru-yanlış taşır.
Bunu bir kez oturttuğunda gerisi kolaylaşır. Çizim işlevleri koşulu doğru olan barlara işaret koyar, boş barlara hiçbir şey çizmez. Strateji işlevleri de koşulun doğru olduğu barda emri verir.
Karşılaştırma işleçleri
Altı işleç var ve hepsi iki tarafı bar bar karşılaştırır. Her iki taraf da seri olabilir, biri sabit sayı da olabilir.
- a > b — a, b'den büyükse doğru
- a < b — a, b'den küçükse doğru
- a >= b — a, b'ye eşit ya da ondan büyükse doğru
- a <= b — a, b'ye eşit ya da ondan küçükse doğru
- a == b — iki taraf eşitse doğru (tek eşittir atama yapar, karşılaştırma yapmaz)
- a != b — iki taraf eşit değilse doğru
ortalama = sma(close, 20) // bu satir tek bir cevap degil, bar basina bir cevap uretir ustunde = close > ortalama plot(ortalama, "SMA20", "#787b86") plotshape(ustunde, style="circle", location="belowbar", color="#26a69a")
Fiyat panosunda gri bir SMA20 çizgisi. Kapanışın bu çizginin üstünde olduğu HER barın altında yeşil bir daire; altında kaldığı barlarda hiçbir şey.
Koşulu bir isme bağla. "ustunde" gibi kısa bir ad, kuralı hem okunur yapar hem de aynı karşılaştırmayı üç yerde tekrar yazmandan kurtarır.
and, or, not ile koşul birleştirme
Tek bir karşılaştırma nadiren yeter. Gerçek bir kural genelde birkaç şartın üst üste gelmesini ister. Üç anahtar sözcük bu işi görür ve üçü de bar bar çalışır.
- and — iki şart da doğruysa sonuç doğru. Süzgeç eklemek için kullanılır, sinyali azaltır.
- or — şartlardan biri doğruysa sonuç doğru. Alternatif tanımak için kullanılır, sinyali çoğaltır.
- not — şartı tersine çevirir. Doğru olan yanlışa, yanlış olan doğruya döner.
trendYukari = close > sma(close, 50) hacimli = volume > sma(volume, 20) asiriAlim = rsi(close, 14) > 70 // uc sart birden: trend yukari, hacim ortalama ustu, henuz asiri alimda degil girisSarti = trendYukari and hacimli and not asiriAlim plotshape(girisSarti, style="triangleup", location="belowbar", color="#26a69a")
Yalnızca üç şartın birlikte sağlandığı barların altında yeşil üçgen. Üçünden biri bile bozulursa o barda işaret çıkmaz.
and, or'dan önce değerlendirilir. "a or b and c" ifadesi "a or (b and c)" demektir. İstediğin bu değilse parantez koy; sonradan bakınca da niyetin okunur olur.
Kesişim: bir olaydır, durum değil
Yeni başlayanların en sık takıldığı yer burası. "Hızlı ortalama yavaşı yukarı kesince al" cümlesindeki "kesince" bir andır. Ama bunu koda "hizli > yavas" diye çevirirsen, kesişimden sonraki bütün barlarda da doğru olan bir durum yazmış olursun.
Farkı grafikte gör
hizli = sma(close, 10) yavas = sma(close, 30) // DURUM: hizli, yavasin ustunde oldugu SURECE dogru durum = hizli > yavas // OLAY: yalnizca ustune GECTIGI barda dogru olay = crossover(hizli, yavas) plot(hizli, "SMA10", "#26a69a") plot(yavas, "SMA30", "#ef5350") plotshape(durum, style="circle", location="belowbar", color="#787b86") plotshape(olay, style="triangleup", location="abovebar", color="#26a69a")
Yükseliş boyunca bar altlarında kesintisiz gri daire dizisi. Yeşil üçgen ise o dizinin yalnız ilk barında, bar üstünde, bir kez çıkar. Aradaki fark tek bakışta görülür.
Girişi duruma bağlarsan, yükseliş kırk bar sürdüğünde kırk barın kırkında da sinyal üretmiş olursun. Sinyal sayın patlar, geriye dönük sınama sonuçların anlamsızlaşır. Bir olay istiyorsan crossover ya da crossunder kullan.
crossover aslında ne yapıyor
Kesişim tek bir karşılaştırma değil, ikisinin birleşimidir: bu barda üstünde, önceki barda değil. Bunu elle de yazabilirsin; crossover sadece kısayoldur. İkisini yan yana çizip aynı barlara düştüklerini görmek, kavramı oturtmanın en hızlı yolu.
hizli = sma(close, 10) yavas = sma(close, 30) // bu barda ustunde VE onceki barda ustunde degil elle = hizli > yavas and prev(hizli, 1) <= prev(yavas, 1) plotshape(elle, style="triangleup", location="belowbar", color="#2962ff") plotshape(crossover(hizli, yavas), style="triangledown", location="abovebar", color="#ff9800")
Mavi üçgen bar altında, turuncu üçgen bar üstünde — ve ikisi hep aynı barlarda. crossover'ın kısayoldan ibaret olduğunu gösterir.
Sabit bir eşikle kesişim
İkinci taraf bir seri olmak zorunda değil; düz bir sayı da verebilirsin. Aynı ayrım burada da geçerlidir. "RSI 70'in altında" bir durumdur, "RSI 70'i aşağı kesti" bir olaydır.
guc = rsi(close, 14) plot(guc, "RSI", "#2962ff", "rsi") // asiri alimdan CIKIS ani: sadece 70'in altina dustugu bar plotshape(crossunder(guc, 70), style="arrowdown", location="abovebar", color="#ef5350")
Alt "rsi" panosunda RSI çizgisi. Fiyat panosunda, RSI'nin 70'in altına düştüğü barda tek bir kırmızı ok. RSI 70 üstünde kaldığı sürece ok tekrarlamaz.
Kesişimi emre bağlamak
Kural aynı: giriş ve çıkış olaya bağlanır. Aşağıdaki iskelet çoğu trend-takip stratejisinin temelidir; giriş ve çıkış koşulunu değiştirerek pek çok strateji buradan türer.
hizli = sma(close, 10) yavas = sma(close, 30) // giris ve cikis olaya bagli: her yukselis barinda degil, donus barinda enterLong(crossover(hizli, yavas)) exit(crossunder(hizli, yavas)) plot(hizli, "SMA10", "#26a69a") plot(yavas, "SMA30", "#ef5350")
Her yukarı kesişimde bir AL işareti, her aşağı kesişimde bir Çıkış işareti. İki işaret arasında tek bir uzun işlem görürsün; aradaki barlarda yeni giriş açılmaz.
Süzgeç eklerken yapıyı bozma: olay çekirdekte kalsın, durumlar and ile yanına eklensin. Örneğin crossover(hizli, yavas) and close > sma(close, 200) yazarsan giriş yine tek barda olur, ama yalnız uzun vadeli eğilim yukarıyken.
iff ile koşula göre değer seçmek
Şimdiye kadar koşulu bir işaret çizdirmek ya da emir vermek için kullandın. Bazen istediğin bu değildir: koşula bakıp iki değerden birini seçmek istersin. iff tam bunu yapar. Üç şey alır — koşul, doğruysa alınacak değer, yanlışsa alınacak değer — ve her bar için birini döndürür.
En sık kullanımı renktir. Bir de sayı seçtirmek için kullanılır: eşik, mesafe, çarpan gibi.
// yukselis barinda yesil, dusus barinda kirmizi cizgi plot(close, color=iff(close > open, "#26a69a", "#ef5350")) // iff sayi da secer: trend zayifken zarar-kes mesafesi genisler mesafe = iff(rsi(close, 14) > 50, atr(14), atr(14) * 2) plot(close - mesafe, "zarar-kes seviyesi", "#ff9800")
Kapanış çizgisi bar bar renk değiştirir: yükseliş barında yeşil, düşüş barında kırmızı. Altında turuncu bir zarar-kes çizgisi; RSI 50'nin altına düştüğünde fiyattan belirgin biçimde uzaklaşır.
İkiden fazla durum gerekiyorsa iff'i iç içe yazarsın. Yanlış dalına ikinci bir iff koymak yeter; okunurluk için üçüncü seviyeden sonra durmakta fayda var.
guc = rsi(close, 14) // uc durum: guclu, zayif, arada renk = iff(guc > 60, "#26a69a", iff(guc < 40, "#ef5350", "#787b86")) plot(guc, "RSI", renk, "rsi") // na verirsen o bar hic boyanmaz — sessiz bolgeyi bos birakmanin yolu bgcolor(iff(guc > 60, rgb(38, 166, 154, 0.12), iff(guc < 40, rgb(239, 83, 80, 0.12), na)))
Alt panodaki RSI çizgisi 60 üstünde yeşil, 40 altında kırmızı, arada gri. Arka plan da aynı üç bölgeyi soluk tonla gösterir; 40 ile 60 arasında hiç boyanmaz.
iff koşulu her barda yeniden değerlendirir; geçmiş bir kararı hatırlamaz. "Son sinyalden bu yana" gibi bir şey gerekiyorsa barssince, sinyal anındaki değeri istiyorsan valuewhen işine yarar.
İşlev özeti
crossover(a, b)
a'nın b'yi yukarı kestiği barda doğru, diğer bütün barlarda yanlış olan bir koşul serisi.
crossunder(a, b)
a'nın b'yi aşağı kestiği barda doğru olan koşul serisi. crossover'ın aşağı yönlü karşılığıdır.
cross(a, b)
İki seri hangi yönde kesişirse kesişsin, kesişim barında doğru olan koşul serisi.
iff(condition, ifTrue, ifFalse)
Her bar için, koşul doğruysa ifTrue değerini, yanlışsa ifFalse değerini taşıyan seri.
nz(source, replacement=0)
Kaynaktaki na değerlerin yerine bir sayı konmuş seri; kalan değerlere dokunulmaz.
Sık yapılan hatalar
- Kesişim yerine durum yazmak. enterLong(hizli > yavas) her yükseliş barında tetiklenir; istediğin dönüş anıysa enterLong(crossover(hizli, yavas)) yaz.
- Karşılaştırmada tek eşittir kullanmak. Tek eşittir bir değeri isme bağlar; karşılaştırma için iki eşittir gerekir.
- and ile or'u parantezsiz karıştırmak. and önce işlediği için kural sessizce senin okuduğundan başka bir şey söyler.
- İlk barlarda boş değeri unutmak. Gösterge ısınana kadar değer üretmez; o barlarda karşılaştırma yanlış sonuç verir. Kuralı sağlamlaştırmak için nz kullan.
- Aynı karşılaştırmayı üç ayrı yerde tekrarlamak. Bir isme bağla; hem değiştirmesi tek yerden olur hem de hesap bir kez yapılır.
- Çok fazla and koymak. Her süzgeç sinyal sayısını düşürür; beş şart üst üste gelince geriye dönük sınamada kural neredeyse hiç tetiklenmez.