CODESCRIPT

Kâr-al ve zarar-kes

Pozisyon açmak işin kolay yarısıdır; onu nerede bırakacağını önceden söylemek zor yarısıdır. Bu sayfada iki koruma seviyesini tek emirde kurmayı, aynı barda ikisi de görülünce ne olduğunu ve seviyeleri oynaklığa göre ayarlamayı öğreneceksin.

Çıkışı sonradan elle düşünmeye bırakırsan, çıkış her barda kodun o an ne hesapladığına bağlı kalır. Önceden yerleştirdiğin bir seviye ise sen bakmasan da yerinde durur ve fiyat gelince çalışır. Kâr-al ve zarar-kes, işlemin iki ucunu daha başlarken çizmek demektir.

Neden iki seviyeyi birden kurarsın?

Kâr-al ve zarar-kes tek bir exit çağrısına sığar. İkisi de grafikte bekleyen emir olarak durur. Fiyat hangisine önce ulaşırsa o dolar, diğeri kendiliğinden geri çekilir. Bu "biri dolunca öbürü iptal" davranışı OCO adıyla anılır.

  • limit, kâr aldığın üst seviyedir; fiyat oraya çıkınca dolar.
  • stop, zararı kestiğin alt seviyedir; fiyat oraya inince dolar.
  • id, bekleyen çıkış emrinin adıdır ve limit ya da stop verdiğin her yerde zorunludur.
  • fromEntry, çıkışın hangi giriş parçasını hedeflediğini söyler; vermezsen tüm açık girişler hedeflenir.
CODESCRIPT
// hizli ortalama yavas ortalamayi yukari kesince pozisyon ac
enterLong(crossover(sma(close, 10), sma(close, 30)), id='poz')

// tek emirde iki koruma: ustte hedef, altta zarar-kes
exit(true, id='koru', fromEntry='poz', limit=close * 1.03, stop=close * 0.98)

Kesişim barında bir alım işareti çıkar ve pozisyon açılır. Aynı anda iki bekleyen çıkış emri kurulur: kapanışın %3 üstünde kâr-al, %2 altında zarar-kes. Fiyat hangisine önce değerse işlem orada kapanır, o seviyede bir çıkış işareti belirir ve öteki seviye iptal olur.

exit(condition, fromEntry?, qtyPct?, id?, limit?, stop?, comment?, commentProfit?, commentLoss?)

Değer döndürmez. Koşulun doğru olduğu barda pozisyonu kapatır; limit ya da stop verirsen kapatmak yerine o seviyelerde bekleyen bir çıkış emri kurar.

condition
koşul
Zorunlu. Anında çıkışta "ne zaman kapat", bekleyen emirde "emri ne zaman kur" demektir; bu yüzden bekleyen emirlerde çoğu zaman true yazılır.
fromEntry
sabit metin
İsteğe bağlı. Yalnız bu isimli giriş parçasını hedefler.
qtyPct
sayı
İsteğe bağlı. Hedeflenen girişin KALAN miktarının yüzde kaçının kapatılacağı. 0 ile 100 arasında olmalı.
id
sabit metin
Bekleyen çıkış emrinin adı. limit ya da stop verdiğinde zorunlu, anında çıkışta ise yazılmaz.
limit
fiyat
İsteğe bağlı. Kâr-al seviyesi.
stop
fiyat
İsteğe bağlı. Zarar-kes seviyesi.
DİKKAT

limit ya da stop içeren bir çıkışa id vermeyi unutursan net bir hata alırsın: bekleyen çıkış emri id ister. Tersi de geçerli — koşul dolunca anında kapatan sıradan bir çıkışa id verirsen yine hata alırsın. id yalnız bekleyen emirlere aittir.

Seviyeyi girişe sabitlemek

exit her barda yeniden değerlendirilir. Seviyeyi close üzerinden kurarsan hedefin de fiyatla birlikte yürür; hedef her bar "şu anki fiyatın %3 üstü" olur ve fiyat ona hiç yetişemez. Seviyeyi girişe bağlamak istiyorsan positionAvg() kullan. Bu değer pozisyon açık kaldığı sürece yerinde durur.

CODESCRIPT
enterLong(crossover(sma(close, 10), sma(close, 30)), id='poz')

// pozisyon acikken giris fiyati sabit kalir
giris = positionAvg()
acik = position() != 0

// hedef girisin %3 ustu, zarar-kes girisin %2 alti
exit(acik, id='koru', fromEntry='poz', limit=giris * 1.03, stop=giris * 0.98)
plot(giris, "giris fiyati", "#ff9800")

Turuncu çizgi, pozisyon açıkken giriş fiyatını yatay olarak gösterir; pozisyon kapanınca çizgi kesilir. Hedef ile zarar-kes bu sabit çizgiden hesaplandığı için fiyat yürüdükçe kaçmazlar. Bir önceki örnekte seviyeler her barda kayıyordu; burada oldukları yerde duruyorlar.

positionAvg()

Açık pozisyonun ortalama giriş fiyatı. Pozisyon yokken na döner.

NOT

positionAvg() pozisyon yokken na döner; na ile yapılan çarpma da na kalır. Bu yüzden çıkışı position() != 0 koşuluyla kurarız. Böylece seviye ancak açık bir pozisyon varken hesaplanır.

Aynı barda ikisi de görülürse

Bir bar tek bir fiyat değildir. Açılıştan kapanışa bir yol izler ve bekleyen emirler bu yol boyunca sırayla denetlenir. Aynı barda hem hedefin hem zarar-kesin görüldüğü durumda kararı işte bu yol verir.

  • Yükselen barda yol şudur: açılış, düşük, yüksek, kapanış.
  • Düşen barda yol şudur: açılış, yüksek, düşük, kapanış.
  • Yolda önce hangi seviyeye değerse o emir dolar, diğeri iptal olur.
  • İki seviye tam olarak eşit denk gelirse zarar-kes önce çalışır.
  • Girişte verilen pozisyon düzeyindeki risk durdurması, bekleyen çıkış emirlerinden önce denetlenir.
CODESCRIPT
enterLong(crossover(close, sma(close, 20)), id='poz')

giris = positionAvg()
acik = position() != 0
hedef = giris * 1.02
zarar = giris * 0.99

exit(acik, id='koru', fromEntry='poz', limit=hedef, stop=zarar)

// iki seviyeyi de ciz
plot(hedef, "hedef", "#26a69a")
plot(zarar, "zarar-kes", "#ef5350")

// ayni bar hem hedefi hem zarar-kesi gorduyse isaretle
plotshape(acik and high >= hedef and low <= zarar, "cakisan bar", style="diamond", location="abovebar", color="#ff9800")

Yeşil çizgi hedefi, kırmızı çizgi zarar-kesi gösterir. Turuncu elmas, o barın iki seviyeye birden değdiğini söyler; sonuç bu barlarda belirlenir. Yükselen bir barda önce düşük yürünür, yani zarar-kes dolar. Düşen bir barda önce yüksek yürünür, yani hedef dolar.

DİKKAT

İki seviye aynı barda çakışınca "nasılsa kâr-al dolar" diye düşünme. Geriye dönük sınamanın sonucunu en çok bu barlar değiştirir. Kural yol sırasıdır ve tam eşitlikte zarar-kes kazanır; ihtiyatlı olan taraf öne alınır.

NOT

enterLong yüzde bazlı stopLoss ve takeProfit argümanlarını da alabilir. Bunlar pozisyon düzeyinde risk durdurmasıdır ve aynı bar üzerinde bekleyen çıkış emirlerinden ÖNCE denetlenir. İkisini birlikte kullanırsan hangisinin öne geçtiğini bilerek yaz.

Oynaklığa göre seviye: atr

Sabit yüzde her sembolde aynı şeyi anlatmaz. Sakin bir sembolde %2'lik zarar-kes çok uzaktır, sıçrayan bir sembolde ise sıradan bir dalgalanmanın içinde kalır ve daha ilk barda dolar. atr, son barların ortalama gerçek aralığını fiyat biriminde ölçer; yani "bu sembol son zamanlarda bir barda ne kadar yol alıyor" sorusunun cevabıdır.

CODESCRIPT
// oynaklik olcusu: son 14 barin ortalama gercek araligi
mesafe = atr(14)

enterLong(crossover(close, sma(close, 20)), id='poz')

giris = positionAvg()
acik = position() != 0

// zarar-kes 2 ATR asagida, hedef 3 ATR yukarida
zarar = giris - 2 * mesafe
hedef = giris + 3 * mesafe

exit(acik, id='koru', fromEntry='poz', limit=hedef, stop=zarar)
plot(hedef, "hedef", "#26a69a")
plot(zarar, "zarar-kes", "#ef5350")

Sakin dönemlerde iki çizgi fiyata yaklaşır, hareketli dönemlerde açılır. Riskin 2 ATR, ödülün 3 ATR olması, kazanan işlemin kaybedenin bir buçuk katını getirmesi demektir. Mesafe her barda yeniden hesaplandığı için pozisyon açıkken de oynaklığa göre genişler ya da daralır.

atr(length)

Oynaklığı fiyat biriminde ölçen ortalama gerçek aralık serisi.

length
sayı
Ortalamanın alınacağı bar sayısı; yaygın değer 14. Yüksek, düşük ve kapanışı kendisi kullanır, ayrı bir kaynak argümanı almaz.
İPUCU

Mesafenin pozisyon boyunca sabit kalmasını istiyorsan giriş barındaki değeri saklayabilirsin: valuewhen ile giriş koşulunun son doğru olduğu bardaki atr değerini alırsın. Nefes alan mesafe ile donmuş mesafe farklı stratejilerdir; hangisini istediğine sen karar ver.

Kısmi çıkış: closePart

Hedefe ulaşınca her şeyi kapatmak zorunda değilsin. closePart açık pozisyonun bir oranını kapatır, kalanı açık bırakır. Böylece ilk hedefte kârın bir kısmını cebine koyar, kalan parçayı daha uzak hedefe taşırsın. Kalan parça kâr-al ile zarar-kes arasında beklemeye devam eder.

CODESCRIPT
mesafe = atr(14)

enterLong(crossover(close, sma(close, 20)), id='poz')

giris = positionAvg()
acik = position() != 0
ilkHedef = giris + 1.5 * mesafe

// ilk hedef yukari kirildiginda pozisyonun yarisini kapat
closePart(acik and crossover(high, ilkHedef), 50)

// kalan yari uzak hedef ile zarar-kes arasinda beklemeye devam eder
exit(acik, id='koru', fromEntry='poz', limit=giris + 3 * mesafe, stop=giris - 2 * mesafe)

// kalan ne varsa ters kesisimde kapansin
closeAll(crossunder(close, sma(close, 20)))

Fiyat 1,5 ATR yukarı gittiği barda pozisyonun yarısı kapanır ve kısmi bir çıkış işareti çıkar; positionSize() +1'den +0,5'e iner. Kalan yarı, 3 ATR'deki hedefle 2 ATR'deki zarar-kes arasında bekler. Fiyat ortalamayı aşağı keserse elde kalan ne varsa kapanır.

closePart(koşul, oran?)

Değer döndürmez. Koşulun doğru olduğu barda açık pozisyonun verilen oranını kapatır; oran yazılmazsa tamamını kapatır.

koşul
koşul
Kapatmanın tetiklendiği koşul. Adıyla vermek yerine ilk sırada yazman en sağlamı; bu işlevin argüman adı Türkçe yazımdadır ve İngilizce karşılığı yoktur.
oran
sayı
İsteğe bağlı yüzde, 0 ile 100 arası (100 dahil). Sabit bir sayı olmalıdır. Adlandırmak istersen qtyPct de aynı işi görür.

closeAll(kosul?)

Değer döndürmez. Koşulun doğru olduğu barda açık pozisyonun tamamını piyasa fiyatından kapatır. Açık pozisyon yoksa hiçbir şey yapmaz.

kosul
koşul
Kapatma koşulu. Yine ilk sırada yaz: bu işlevin argüman adı ASCII yazımdadır, kardeşi closePart ise Türkçe yazımı ister.
DİKKAT

Bu iki işlevde koşulu adıyla verme, ilk sırada yaz. Adı yanlış yazarsan closeAll hata vermez; koşul hiç verilmemiş sayılır ve pozisyonu her barda kapatır. Sessizce yanlış çalışan bir strateji, açıkça hata veren stratejiden çok daha pahalıdır.

DİKKAT

Kısmi çıkış her seferinde o an KALAN miktarın oranını kapatır. Art arda gelen %50'ler kalanı hep yarıya indirir ama asla sıfırlamaz: 1 → 0,5 → 0,25 diye gider. Pozisyonu tamamen kapatmak için closeAll ya da oransız bir exit gerekir.

Aynı işi giriş parçası bazında yapmak istersen exit(kosul, fromEntry='poz', qtyPct=50) yazarsın. Fark şudur: closePart açık pozisyonun tamamı üzerinde çalışır, qtyPct'li exit ise yalnız adını verdiğin giriş parçasını küçültür. Kademeli alım yaptığın bir pozisyonda bu ayrım işine yarar.

Sık yapılan hatalar

  • Seviyeyi close üzerinden kurup hedefin fiyatla birlikte kaçtığını fark etmemek. Seviyeyi girişe bağlamak için positionAvg() kullan.
  • Bekleyen çıkışa id vermemek ya da anında çıkışa id vermek. İkisi de hata verir; id sadece bekleyen emirlere aittir.
  • Aynı barda iki seviye de görülünce kâr-alın dolacağını varsaymak. Karar bar içindeki fiyat yoluna göre verilir.
  • Kısmi çıkışı sürekli doğru kalan bir karşılaştırmayla yazmak. high > hedef koşulu barlar boyunca doğru kalır ve her barda yeniden yarılar; crossover ile tek bara indir.
  • Art arda kısmi çıkışların pozisyonu sıfırlayacağını sanmak. Her çağrı yalnız kalanın bir oranını alır.
  • Fiyat seviyeye hiç ulaşmazsa emrin dolmayacağını unutmak. Bekleyen emir bekler; dolmazsa ne işlem ne de işaret oluşur.