Author

Topic: Bollinger Bands Tabanlı Sinyal Üretici TV betiği (Read 164 times)

sr. member
Activity: 340
Merit: 278
Bollinger Bands kullanarak satış sinyali üreten betiği altta paylaşıyorum. Bende bunun gibi 50-60 tane betik var, gönlünüzden geçen bir şey varsa yazın, muhtemelen o konuda da birkaç satır kod yazmışımdır. Bu betikleri genellikle ticaret botumu nasıl programlamam gerektiği konusnda bana fikir vermesi amacıyla yani "backtesting" için yazıyorum ama son zamanlarda TV kullanarak direk bot'a emir göndermeye başladım. Ticaret botu kullananlar paylaştığım betikleri ufak tefek modifikasyonlar ile kendilerine uygun hale getirip kullanabilirler.

Code:
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © niko_83

//@version=4

strategy(shorttitle="Bollinger Bands Satış Sinyali Üretici", title="BB Satış Sinyali Üretici", overlay=true, calc_on_every_tick=true, initial_capital=1000, default_qty_type = strategy.cash, default_qty_value=10)

fromyear = input(defval = 2020, minval = 1900, maxval = 2100, title = "Başlangıç Yılı")
frommonth = input(defval = 06, minval = 01, maxval = 12, title = "Başlangıç Ayı")
fromday = input(defval = 01, minval = 01, maxval = 31, title = "Başlangıç Günü")
fromhour = input(defval = 00, minval = 00, maxval = 23, title = "Başlangıç Saati")
frommin = input(defval = 00, minval = 00, maxval = 59, title = "Başlangıç Dakikası")

toyear = input(defval = 2100, minval = 1900, maxval = 2100, title = "Bitiş Yılı")
tomonth = input(defval = 12, minval = 01, maxval = 12, title = "Bitiş Ayı")
today = input(defval = 31, minval = 01, maxval = 31, title = "Bitiş Günü")
tohour = input(defval = 23, minval = 00, maxval = 23, title = "Bitiş Saati")
tomin = input(defval = 59, minval = 00, maxval = 59, title = "Bitiş Dakikası")

//var trade_limit = input(title="Stop signals if leverage becomes greater than", type=input.float, defval=8, minval=0.05, maxval=100, step=1)
var maxConsOrders = input(title="Azami Ardışık Emir Sayısı", type=input.integer, defval=5, minval=1, step=1)

gain = input(0.75, minval=0.01, title="Pozisyonu kapatmak için gereken asgari kazanç %", step=0.01)

length = input(20, minval=1, title="BB Uzunluğu")
src = input(close, title="BB Kaynağı")
mult = input(2.0, minval=0.001, maxval=50, title="BB Standart Sapma", step=0.1)
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(basis, "Baz", color=#872323, offset = offset)
p1 = plot(upper, "Üst", color=color.teal, offset = offset)
p2 = plot(lower, "Alt", color=color.teal, offset = offset)
fill(p1, p2, title = "Arka Plan", color=#198787, transp=95)

//tt="Short Signal"
entryName="Satış Emri"

signalCondition = crossover(high, upper) and (time > timestamp(fromyear, frommonth, fromday, fromhour, frommin) and time < timestamp(toyear, tomonth, today, tohour, tomin))
closePrice = strategy.position_avg_price * (100-gain) / 100
closeCondition = crossunder(close, closePrice)
plot(closePrice, "Poizsyon Kapama Seviyesi", color=color.yellow)

if (signalCondition)
//label.new(bar_index, high, yloc=yloc.abovebar, text="Signal", style=label.style_label_down, color = color.yellow, textcolor=color.black, tooltip = tt, size=size.tiny)
strategy.order(entryName, strategy.short, when = (strategy.opentrades < maxConsOrders ))

//alertcondition(signalCondition, title = tt)
strategy.close_all(comment="Tüm Pozisyonu Kapat", when = crossunder(close, closePrice))

Bu kod art arda belirli bir sayıdan fazla emir açmıyor. Bunun için Pine'da yerleşik "strategy.opentrades" değişkenini kullanıyor. Bunun yerine "strategy.position_size" değişkenini kullanarak kullandığınız kaldıraçın belirli bir seviyeyi geçmemesini sağlayabilirsiniz. Tabi bu noktada, simülasyon ile gerçek hayat arasında farklılıklar ortaya çıkabileceğini unutmamak gerekiyor. Betik belirli bir kazanç elde edildiği anda pozisyonun tamamen kapatıldığını varsayıyor. Gerçek hayattaki deneyiminiz bu şekilde olmayabilir. Botunuz farklı şekilde hesap yapabilir veya slippage gibi binbir türlü sebeple farklı performans gösterebilir. Betikteki "Pozisyonu kapatmak için gereken asgari kazanç %" değişkeni, elde edeceğiniz kazancı göstermekten ziyade, piyasanın size içinde bulunduğunuz pozisyonu karlı bir biçimde kapatma şansı tanıyıp tanımayacağını görmek amacını taşıyor.

Betiğe teyit edici başka indikatörler eklemek için mesela mfi_switch ve rsi_switch adlı iki boolean değişken tanımladıktan sonra "signalCondition" adlı boolean değişkene şu şartı ekleyebilirsiniz:

Code:
and (mfi_switch ? (mfi(close, mfi_period) >= mfi_min) : 1) and (rsi_switch ? (rsi(close, rsi_period) >= rsi_min) : 1)

Böylece betik pozisyon açarken RSI, MFI gibi indikatörleri de dikkate alacaktır. Kapatırken de bunları kullanmak isterseniz closeCondition değişkenini max_rsi ve max_mfi değerleri ile üreteceğiniz boolean operatörler ile birleştirebilirsiniz.  mfi_period, rsi_period, mfi_min, rsi_min yerine rakam yazabilir ya da bunları da input fonksiyonu ile kullanıcının gireceği şekilde tanımlayabilirsiniz:

Code:
var rsi_switch = input(title="Enable RSI entry", type=input.bool, defval=false)
//var rsi_src = input(title="RSI Source price", type=input.source, defval=close)
var rsi_period = input(title="RSI Period", type=input.integer, defval=14)
var rsi_min = input(title="Minimum RSI value to short", type=input.float, defval=50.0, step=0.1)

var mfi_switch = input(title="Enable MFI entry", type=input.bool, defval=false)
//var mfi_src = input(title="MFI Source price", type=input.source, defval=close)
var mfi_period = input(title="MFI Period", type=input.integer, defval=14)
var mfi_min = input(title="Minimum MFI value to short", type=input.float, defval=50.0, step=0.1)




49 değişik teknik deniyoruz ama eninde sonunda işe yarayan şeyi söyleyeyim: HLC3.

Jump to: