CODESCRIPT

Bekleyen emirler

Bekleyen emir, hemen dolmayan emirdir: bir fiyat seviyesine asılır ve fiyat oraya gelene kadar orada durur. Burada bekleyen emri nasıl kurduğunu, nasıl geri çektiğini ve neden bazen hiç dolmadığını öğrenirsiniz.

Bir koşul doğduğunda iki seçeneğin var. Ya o anki fiyattan hemen alırsınız, ya da fiyata bir seviye söyleyip beklersiniz. Birincisi piyasa emri, ikincisi bekleyen emirdir.

Bekleyen emir size daha iyi bir giriş fiyatı arama imkânı verir. Karşılığında bir risk alırsınız: fiyat o seviyeye hiç gelmeyebilir ve işlem hiç açılmaz.

Piyasa emri mi, bekleyen emir mi

order tek başına bir piyasa emri kurar. Koşulun doğru olduğu barda seviye aramaz, doğrudan dolar. entryMarket ile birebir aynı işi yapar; ikisi aynı işlevin iki adıdır.

CODESCRIPT
// piyasa emri: kosul dogdugu barda beklemeden dolar
order(crossover(close, sma(close, 20)))
exit(crossunder(close, sma(close, 20)))
plot(sma(close, 20), "SMA20", "#2962ff")

Mavi çizgi 20 barlık ortalamadır. Kapanış bu çizgiyi yukarı kestiğinde bir alış işareti çıkar, aşağı kestiğinde pozisyon kapanır. Beklenen bir seviye olmadığı için her sinyal işleme dönüşür.

order bir seviyede bekletme yapmaz; yalnızca koşul ve yön alır. Emri bir fiyata asmak istiyorsanız enterLong ya da enterShort çağırın ve limit veya stop verin.

limit ve stop: iki farklı bekleyiş

Bir girişe limit verirseniz daha iyi bir fiyatı beklersiniz. stop verirseniz hareketin doğrulanmasını beklersiniz. Hangisinin fiyatın altına, hangisinin üstüne düştüğü yöne göre değişir.

  • Uzun girişte limit güncel fiyatın altına asılır; fiyat oraya inerse dolar.
  • Uzun girişte stop güncel fiyatın üstüne asılır; fiyat oraya çıkarsa dolar.
  • Kısa girişte limit fiyatın üstüne, stop fiyatın altına asılır; kural aynen tersine döner.
  • Kısacası limit ucuzu bekler, stop kırılımı bekler.

limit: seviye gelirse alın

Aşağıdaki stratejide kapanış 20 barlık ortalamanın altına düştüğünde bir alım emri kuruluyor. Emir hemen dolmuyor; ortalamanın yüzde iki altında bekliyor.

CODESCRIPT
// ortalamanin %2 altina asili alim emri
hedef = sma(close, 20) * 0.98
enterLong(crossunder(close, sma(close, 20)), limit=hedef)
exit(crossover(close, sma(close, 50)))
plot(hedef, "bekleyen seviye", "#ff9800")

Turuncu çizgi emrin beklediği seviyedir. Kesişim barında alış işareti çıkmaz; işaret ancak fiyat turuncu çizgiye kadar inerse, emrin dolduğu barda belirir.

stop: kırılırsa al

Stop emri bunun tersini yapar. Fiyat yukarı kırmadan işlem açılmaz. Girişe daha pahalıya girersiniz ama hareketin başladığını görmüş olursunuz.

CODESCRIPT
// son 20 barin tepesi kirilirsa al
tepe = highest(high, 20)
enterLong(rsi(close, 14) > 55, stop=tepe)
exit(crossunder(close, sma(close, 20)))
plot(tepe, "kirilim seviyesi", "#2962ff")

Mavi çizgi son 20 barın en yükseğidir. RSI 55'in üstündeyken emir kurulur ve yalnız fiyat bu çizgiyi yukarı kırarsa dolar. Kırılım gelmezse hiç işlem açılmaz.

Aynı girişe limit ve stop birlikte verilemez. Biri aşağı in der, öteki yukarı kır der; ikisi tek bir emirde anlamlı bir bekleyiş oluşturmaz ve CodeScript net hata verir.

Emri adlandırmak: id

id vermek bekleyen emre bir ad takar. Ad verilince aynı anda birden çok emri listede tutabilir, her birini ayrı ayrı yönetebilirsiniz. Ad sabit bir metin olmalıdır; bar bar değişen bir ad emri izlenemez kılar.

ocaGroup ise aynı kurulumun iki yüzünü birbirine bağlar. Aynı grup etiketini taşıyan emirlerden biri dolunca kalanlar listeden silinir.

CODESCRIPT
// iki senaryo ayni anda bekler: dipten alim ve kirilimdan alim
dip = sma(close, 20) * 0.98
kirilim = highest(high, 20)
enterLong(rsi(close, 14) < 45, id="dip", limit=dip, ocaGroup="kurulum")
enterLong(rsi(close, 14) < 45, id="kirilim", stop=kirilim, ocaGroup="kurulum")
exit(crossunder(close, sma(close, 50)))

RSI 45'in altına inince iki emir birden kurulur: biri fiyat düşerse, öteki fiyat yükselirse dolar. Aynı ocaGroup verildiği için biri dolduğu an öteki silinir ve tek bir işlem açılır.

Aynı id ile ikinci bir emir verirseniz yeni emir eskisinin yerine geçer, iki ayrı emir oluşmaz. İki emri birlikte bekletmek istiyorsanız iki ayrı ad kullanın. Hiç ad vermezsen tek bir bekleyen emir yuvası vardır ve o emir yalnızca açık pozisyon yokken dolar.

Emri geri çekmek: cancel ve cancelAll

Kurduğunuz emir artık istemediğiniz bir emirse geri çekersiniz. cancel yalnız adını verdiğiniz emri siler. cancelAll bekleyen ne varsa hepsini birden temizler.

CODESCRIPT
// kurulum bozulursa bekleyen emri geri cek
dip = sma(close, 20) * 0.98
enterLong(crossunder(close, sma(close, 20)), id="dip", limit=dip)
cancel("dip", rsi(close, 14) > 60)
exit(crossover(close, sma(close, 50)))

dip emri kurulur ve fiyatı bekler. RSI 60'ı aşarsa emir listeden silinir; fiyat sonradan seviyeye inse bile artık dolmaz ve o senaryonun alış işareti hiç çıkmaz.

CODESCRIPT
// gun donmeden once hem bekleyen girisi hem bekleyen cikisi temizle
enterLong(crossunder(close, sma(close, 20)), id="dip", limit=sma(close, 20) * 0.98)
exit(true, id="hedef", limit=close * 1.05)
exit(crossunder(close, sma(close, 50)))
cancelAll(hour == 23)

Gün içinde hem bekleyen bir alım hem de yüzde beş yukarıda bir kâr-al seviyesi listede durur. Saat 23 barında cancelAll ikisini birden siler. Açık pozisyon varsa yerinde kalır ve yalnız ortalama kesişimiyle kapanır.

cancel ve cancelAll açık bir pozisyonu kapatmaz. İkisi de yalnız henüz dolmamış emirleri siler; pozisyondan çıkmak için exit ya da closeAll kullanırsınız. Dikkat: cancelAll bekleyen çıkış emirlerini de siler, yani kâr-al ve zarar-kes koruman da kalkar.

Emir neden dolmadı

Grafikte bekleyen emri görüyorsunuz ama alış işareti yok. Bu çoğu zaman bir hata değil, kuralın sonucudur. Sık sebepler şunlardır.

  • Emir bu barda yeni kuruldu. Kurulduğu barda dolmaz, en erken bir sonraki barda dolabilir.
  • Fiyat seviyeye hiç gelmedi. Bekleyen emir ancak fiyat o seviyeden gerçekten geçerse dolar.
  • Aynı barda önce başka bir seviye görüldü ve aynı ocaGroup içindeki kardeş emir iptal oldu.
  • cancel ya da cancelAll çalıştı ve emir listeden kalktı.
  • Aynı id ile ikinci bir emir verdiniz; eskisi silindi, artık bekleyen yeni seviyedir.
  • Adsız bekleyen emir kullandınız ve pozisyon açıktı. Adsız emir yalnız pozisyon yokken dolar.

Kurulduğu barda dolmaz

CodeScript her barı önce açılıştan geçirir, sonra stratejinizi çalıştırır. Strateji bir bekleyen emir kurduğunda o barın fiyat yolu çoktan geçmiştir. Bu yüzden emir en erken bir sonraki barda denenir.

Kural geriye dönük sınamanın dürüst kalmasını sağlar. Aksi hâlde barın tamamını görüp aynı barın içinde işlem yapmış olurdunuz; sonuçlar gerçekte elde edemeyeceğiniz kadar iyi çıkardı.

Fiyat seviyeye hiç gelmedi

En sık sebep budur ve en kolay doğrulanandır. Seviyeyi çizdirip fiyatın ona değdiği barları işaretlerseniz sorunun cevabını gözünle görürsünüz.

CODESCRIPT
// bekleyen seviyeyi ciz ve fiyatin degdigi barlari isaretle
seviye = sma(close, 20) * 0.98
enterLong(crossunder(close, sma(close, 20)), id="dip", limit=seviye)
exit(crossover(close, sma(close, 50)))
plot(seviye, "bekleyen seviye", "#ff9800")
mark(low <= seviye, shape.circle, location.belowbar, "#26a69a", "degdi")

Turuncu çizgi emrin beklediği seviyedir. Altında yeşil daire çıkan barlarda fiyat oraya inmiştir. Hiç daire görmüyorsanız emrin dolmamasının sebebi bellidir: fiyat o seviyeye hiç uğramamıştır.

Bir emir dolmuyorsa önce seviyeyi çizdir. Seviye grafiğin çok uzağında kalıyorsa sorun emirde değil, seviyeyi üreten hesaptadır; çarpanı fiyata yaklaştır.

Bar içinde önce başka seviye görüldü

Bir bar tek bir fiyat değildir. Açılıştan kapanışa bir yol izler ve bekleyen emirler bu yol boyunca sırayla denetlenir. İki seviyen aynı barda görülürse yolda önce gelen dolar.

  • Yükselen barda yol şudur: açılış, dip, tepe, kapanış.
  • Düşen barda yol şudur: açılış, tepe, dip, kapanış.
  • İki seviye de aynı barda görülürse yolda önce gelen dolar, öteki iptal olur.
  • Tam eşitlikte zarar-kes önce çalışır; bu, ihtiyatlı tarafta kalmak için konmuş bir kuraldır.

Fiyatın bir barın içinde gerçekte hangi sırayla dolaştığını bar verisi söylemez; yol yukarıdaki iki kurala göre varsayılır. Bu yüzden iki seviyenin de aynı barda göründüğü durumlarda sonucu tek bir bara bakarak değil, çok sayıda örneğe bakarak değerlendir.

Bar içinde denetim sırası

Aynı bar içinde birden çok şey olabilecekse CodeScript şu sırayla bakar. Bekleyen giriş emirleri en sonda gelir; yani önlerinde bir çıkış dolduysa tablo çoktan değişmiş olabilir.

  • Önce pozisyonun kendi zarar-kes, kâr-al ve iz-süren stop seviyeleri denetlenir.
  • Sonra id ile kurulmuş bekleyen çıkış emirleri denetlenir.
  • En son bekleyen giriş emirleri denetlenir.

Emir hangi fiyattan dolar

Emir dolduğunda fiyat her zaman yazdığınız seviye olmaz. Bar seviyenin ötesinde açılırsa emir açılış fiyatından dolar; yani beklediğinden daha iyi bir fiyat alırsınız. Bar seviyenin berisinde açılıp seviyeye sonradan gelirse emir tam seviyeden dolar.

  • limit emrinde kayma uygulanmaz; beklediğiniz fiyattan ya da daha iyisinden dolarsınız.
  • stop emrinde kayma hareketin yönünde uygulanır, çünkü seviyeyi çoktan geçmiş bir harekete katılıyorsunuz.
  • Kayma oranını slippage ile, işlem masrafını commission ile ayarlarsınız.

Ayarlarda limit emirleri için bir doğrulama payı tanımlıysa fiyatın seviyeye değmesi yetmez; seviyeyi o pay kadar aşması gerekir. Emir inatla dolmuyorsa bu ayarı da denetleyin.

İşlev özeti

cancel(id[, when])

Değer döndürmez. Verdiğiniz adı taşıyan bekleyen emri listeden siler.

id
metin
İptal edilecek emrin adı. Sabit metin olmalı; bar bar değişen bir ad kullanılamaz. Aynı ad hem bekleyen girişte hem bekleyen çıkışta aranır.
when
koşul
İsteğe bağlı. İptalin hangi barda çalışacağı. Vermezsen her barda çalışır. Böyle bir emir yoksa hiçbir şey olmaz.

cancelAll([when])

Değer döndürmez. Bekleyen tüm giriş ve çıkış emirlerini birlikte temizler; açık pozisyona dokunmaz.

when
koşul
İsteğe bağlı. Temizliğin hangi barda çalışacağı. Vermezsen her barda çalışır, bu da hiçbir emrin bekleyememesi demektir.

order(koşul, yön?)

Değer döndürmez. Koşulun doğru olduğu barda piyasa emri yönlendirir. entryMarket ile birebir aynı işlevdir.

koşul
koşul
Doğru olduğu barda pozisyona girilir. Seviye almadığı için bekleme olmaz.
yön
metin
İsteğe bağlı. short verirseniz kısa, vermezsen uzun girilir. Zarar-kes ve kâr-al gibi risk ayarları için enterLong ya da enterShort kullanın.