Ana içeriğe geç

Sinyal Bot: Kapsamlı JSON Kılavuzu

Sinyal Bot için JSON kodu oluşturma konusunda adım adım rehberimizi keşfedin ve her bir özelliğin nasıl çalıştığını net bir şekilde anlayın.

Yazar: Ozge

Bu makalede sunulacak olan Pine Script, strateji parametrelerini dinamik olarak JSON formatına dönüştürmek ve Wundertrading botlarıyla sorunsuz entegrasyon sağlamak üzere tasarlanmıştır. Bu komut dosyası, her bir işlem için Kar Al, Zarar Durdur, Takip Eden Durdurma ve daha fazlası gibi temel işlem değişkenlerini özelleştirmenize ve ayarlamanıza olanak tanır.

Bu esneklik, her işlemin özel gereksinimlerine göre benzersiz bir şekilde yapılandırılmasını sağlayarak, stratejiyi değişen piyasa koşullarına ve özel işlem tercihlerine son derece uyarlanabilir hale getirir.

Adım adım ilerleyelim ve olasılıkları keşfedelim.

JSON kullanarak Sinyal Botu Nasıl Oluşturulur?

Sinyal botu kurmaya başlamak için, sol taraftaki Sinyal botu sekmesine gidin ve Bot Oluştur'u seçin.

Sinyal bot ayarları penceresini açtıktan sonra, ayarları özel ihtiyaçlarınızı karşılayacak şekilde düzenlemeye başlayabilirsiniz.

Genel Bilgiler

1. Öncelikle botun adını yapılandırarak başlayın.

2. Bot başlatma koşulu, sinyalin geldiği kaynağı ifade eder. Şu anda JSON, TradingView Göstergesi, API istekleri ve Diğer (Make, IFTTT, Zapier, n8n vb. diğer iş akışı otomasyon araçları için) ile uyumludur. Mevcut özellikler, seçilen kaynağa bağlı olarak değişebilir.

JSON'u etkinleştirdiğinizde, Uyarı bölümü güncellenecektir. Bu bölüm, kodun nasıl çalıştığını anlamanıza yardımcı olmak için TradingView Pine Editörüne kopyalanabilen temel bir çalışma stratejisi sunar. Kodu ayrıntılı olarak inceleyelim.

3. Borsayı ve ilgili API'yi seçin.

Tek bir strateji altında birleştirilmiş en fazla 50 API'yi aynı anda seçebilirsiniz.

Demo hesabı seçmek için "DEMO" modunu etkinleştirin.

4. Her API için listeden işlem çiftinizi seçin veya doğrudan arama alanına yazın.

Gelişmiş ayarlar, her çift için ayrı ayrı Kaldıraç belirlemenize ve API çarpanlarını ayarlamanıza olanak tanıyarak, aynı bot altında birden fazla API'yi yönetirken daha fazla esneklik sağlar.

Her API profili için en fazla 10 farklı çift seçebilirsiniz; bu, bir uyarı işlemi tetiklediğinde, seçilen her çift için ayrı bir işlem oluşturulacağı anlamına gelir.

5. Tercih ettiğiniz Zaman Dilimini seçin. Bu parametre yalnızca Uyarı yorumlarının adını değiştirir ve Sinyal bot listenizdeki botları Zaman Dilimlerine göre filtrelemenizi sağlar. TradingView zaman diliminden bağımsız olarak çalışır.

6. Çoklu giriş seçeneği, ardışık giriş sinyalleri aldığınızda pozisyonunuzu kademeli olarak açmanıza olanak tanır. Aynı anda bir parite için birden fazla açık pozisyon tutmak istiyorsanız bu ayarı etkinleştirin.

7. Swing trade özelliği, yalnızca "Kısa Pozisyona Gir" ve "Uzun Pozisyona Gir" sinyallerini kullanarak işlem yönünü değiştirmenize olanak tanır. Etkinleştirildiğinde, bu özellik Uyarı yorumlarını beş kategoriye ayırır: Uzun Pozisyona Gir, Kısa Pozisyona Gir, Tüm Pozisyondan Çık, Kısmi Uzun Pozisyondan Çık ve Kısmi Kısa Pozisyondan Çık. Swing trade özelliğinin yalnızca Vadeli İşlem piyasaları için geçerli olduğunu unutmayın.


🔵 TradingView için Pine Script'te Strateji Örneği

Bu kodu doğrudan TradingView PineScript düzenleyicinize kopyalayıp yapıştırabilir, grafiğe uygulayabilir ve nasıl çalıştığını gözlemleyebilirsiniz. Bu, kendi stratejinizi oluşturmak ve WunderTrading ile entegre etmek için temel bir örnektir.

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © WunderTrading
//@version=6
strategy('Test Strategy', overlay = true, margin_long=0, margin_short=0)//, initial_capital = 10000, default_qty_type = strategy.fixed) //, commission_type = strategy.commission.percent, commission_value = 0.075)

// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――}
// 🔵 STRATEGY LOGIC
// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{

// Inputs
capital = input.int(title = 'Capital $', defval = 1000, step = 1, minval=1, maxval=1000000, group="Risk and Money Management")
risk_per_trade = input.float(title = 'Risk per trade', defval = 2.0, step = 0.1,group="Risk and Money Management")
riskReward = input.float(title = 'Risk:Reward', defval = 1.0, step = 0.1, group="Risk and Money Management")

// Backtest period
testStartYear = input(2025, "Backtest Start Year", group="Backtest Starting period")
testStartMonth = input(1, "Backtest Start Month",group="Backtest Starting period")
testStartDay = input(26, "Backtest Start Day",group="Backtest Starting period")

testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testPeriod() =>
time >= testPeriodStart

// Variables to store the value of the price when the condition will be met
var entry_price = 0.0
var stop = 0.0
var take1 = 0.0
var entry_amount = 0.0

longCondition = close > open[1]

// Logic of trade execution
if testPeriod()
if longCondition and strategy.position_size == 0 or (strategy.position_size == 0)[1]
entry_price := open

long_stop_prc = (entry_price - low[1]) / entry_price
long_stop_price = entry_price - (entry_price - low[1])

long_tp1_prc = long_stop_prc * riskReward
long_tp1_price = entry_price * (1 + (long_stop_prc * riskReward))

stop := long_stop_price
take1 := long_tp1_price

entry_amount := math.round(math.abs((capital * (risk_per_trade/100)) / long_stop_prc))

if longCondition and strategy.position_size ==0
strategy.entry('Long', strategy.long, qty = entry_amount )

if strategy.position_size > 0
strategy.exit(id = 'Long', from_entry = 'Long', limit = take1, stop=stop)



// Visual representation of your strategy
plot(strategy.position_size > 0 ? stop : na, style = plot.style_linebr, color = color.red, title = 'SL Long')
plot(strategy.position_size > 0 ? take1 : na, style = plot.style_linebr, color = color.green, title = 'TP1 Long')


// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――}
// 🔵 WUNDERTRADING EXECUTION
// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{

// Comment inputs
enter_Long_Comment = input.string(defval = "CHANGE-THIS-ENTER-LONG-COMMENT", tooltip = "Your personal Enter signal from WunderTrading bot settings", group="Comment to WunderTrading Bot")
exit_Long_Comment = input.string(defval = "CHANGE-THIS-EXIT-LONG-COMMENT", tooltip = "Your personal Enter signal from WunderTrading bot settings", group="Comment to WunderTrading Bot")

enter_Short_Comment = input.string(defval = "CHANGE-THIS-ENTER-SHORT-COMMENT", tooltip = "Your personal Enter signal from WunderTrading bot settings", group="Comment to WunderTrading Bot")
exit_Short_Comment = input.string(defval = "CHANGE-THIS-EXIT-SHORT-COMMENT", tooltip = "Your personal Enter signal from WunderTrading bot settings", group="Comment to WunderTrading Bot")

exit_All_Comment = input.string(defval = "CHANGE-THIS-EXIT-ALL-COMMENT", tooltip = "Your personal Enter signal from WunderTrading bot settings", group="Comment to WunderTrading Bot")

// json custom alerts signal bot ----------------------------------------------------------------------------------------

// str : str
styleToJson(name, value) =>
'"' + str.tostring(name) + '"' + ': ' + '"' + str.tostring(value) + '"'

// str : int
styleToJson_num(name, value) =>
'"' + str.tostring(name) + '"' + ': ' + (na(value) ? '"NaN"' : str.tostring(value))

styleToJson_takeProfits(priceDeviation, portfolio) =>
'{' + styleToJson_num("price", priceDeviation) + ',' + styleToJson_num("portfolio", portfolio) + '}'


conditions_for_signal(comment) =>
alert_text = array.new_string()

// SETTINGS PARAMS
// Entry cooment code
entry_comment = '"code": ' + '"' + str.tostring(comment) + '"'
array.push(alert_text, entry_comment)

// Entry Parameters
order_type = styleToJson("orderType", "market")
amount_per_trade_type = styleToJson("amountPerTradeType", "quote")
amount_per_trade = styleToJson_num("amountPerTrade", entry_amount)
leverage = styleToJson_num("leverage", 1)

array.push(alert_text, order_type)
array.push(alert_text, amount_per_trade_type)
array.push(alert_text, amount_per_trade)
array.push(alert_text, leverage)

// Parameters for Limit Orders Only
// time_in_force = styleToJson_num("timeInForce", 1)

// price_deviation = '"priceDeviation": {' +
// styleToJson_num("deviation", 0.01) + ',' +
// styleToJson("deviationType", "percents") + ',' +
// styleToJson("priceType", "last") + '}'

// array.push(alert_text, time_in_force)
// array.push(alert_text, price_deviation)

// Take Profit
take_profits = '"takeProfits": [' +
// styleToJson_takeProfits(take1, 0.5) + ',' +
styleToJson_takeProfits(take1, 1) + ']'

array.push(alert_text, take_profits)

// Stop Loss
stop_loss = '"stopLoss": {' + styleToJson_num("price", stop) + '}'
array.push(alert_text, stop_loss)

// Move Stop Loss to breakeven
// move_to_breakeven = '"moveToBreakeven": {' + styleToJson_num("activationPriceDeviation", 0.05) + '}'
// array.push(alert_text, move_to_breakeven)

// Trailing Stop
// trailing_stop = '"trailingStop": {' +
// styleToJson_num("activation", 0.05) + ',' +
// styleToJson_num("execute", 0.005) + '}'
// array.push(alert_text, trailing_stop)

// Additional Parameters
// keep_position_open = styleToJson("keepPositionOpen", true)
reduce_only = styleToJson("reduceOnly", true)
place_conditional_orders = styleToJson("placeConditionalOrdersOnExchange", false)

// array.push(alert_text, keep_position_open)
array.push(alert_text, reduce_only)
array.push(alert_text, place_conditional_orders)

// DCA Parameters
// dca = '"dca": {' +
// styleToJson_num("extraOrderCount", 10) + ',' +
// styleToJson_num("extraOrderDeviation", 0.005) + ',' +
// styleToJson_num("extraOrderVolumeMultiplier", 1.1) + ',' +
// styleToJson_num("extraOrderDeviationMultiplier", 1.1) + ',' +
// styleToJson("takeProfitsBasedOn", "average_price") + ',' +
// styleToJson("stopLossBasedOn", "average_price") + '}'

// array.push(alert_text, dca)

// Pass Parameters
messageJson = "{" + array.join(alert_text, ', ') + "}"
//

// ALERT SIGNALS
signal_alert_long = conditions_for_signal(enter_Long_Comment)
signal_alert_short = conditions_for_signal(enter_Short_Comment)
signal_aler_exit_long = conditions_for_signal(exit_Long_Comment)
signal_aler_exit_short = conditions_for_signal(exit_Short_Comment)
signal_aler_exit_all = conditions_for_signal(exit_All_Comment)

if longCondition and strategy.position_size == 0
alert(signal_alert_long, alert.freq_once_per_bar_close)

Strateji mantığı bölümü, stratejinin nasıl çalışması gerektiğine dair özel yaklaşımınızı temsil eder. Burada, hayal ettiğiniz herhangi bir stratejiyi veya koşulu tanımlayabilirsiniz. Örneğin, iki Basit Hareketli Ortalama kesiştiğinde veya RSI aşırı alım veya aşırı satım seviyelerini gösterdiğinde bir giriş tetiklenebilir.

WunderTrading İşlem bölümü, alarmlarınızı JSON formatına dönüştürmek için gerekli kodu sağlar ve bu alarmları otomatik işlem yürütme için WunderTrading'e göndermekten sorumludur.

Tek İşlem Çifti Botu'na JSON formatında iletebileceğiniz değişkenler

Giriş Komut Kodu

Alan

Gereksinim

Tür

Komutlar

code

True

string

Bu, komutlarınızdan Enter Long veya Enter Short sinyalini iletecek olan giriş komut kodudur.

Entry Parameters

Alan

Gereksinim

Tür

Komutlar

orderType

True

string

Olası değer: "market", "limit"

amountPerTradeType

True

string

Olası değer: "quote", "percents", "contracts", "base"

  • Spot işlem kullanılabilir değerler: "quote" or "base" or "percents"

  • Vadeli işlem kullanılabilir değerler: "quote" or "contracts" or "percents" or "base"

amountPerTrade

True

num

Range: (0; +Inf)

  • `amountPerTradeType` değeri "percents" değerine eşit ise, `amountPerTrade` değeri ondalık sayılarla verilmelidir..

  • (e.g: 10% -> 0.1 )

leverage

False

num

Aralık: [1, 125]

Varsayılan: 1

Parameters for Limit Orders Only

Alan

Gereksinim

Tür

Komutlar

timeInForce

False

num

Aralık: [5, 20160]

varsayılan: 5

Limit emrinin geçerlilik süresi (dakika cinsinden). (Limit emri için zorunludur)

price

False

num

Aralık: (0; +Inf)

Kesin fiyat değeri.

`priceDeviation` tanımlanmadığında `limit` emri için zorunludur.

priceDeviation

False

object

Fiyat sapması ayarları.

`fiyat` tanımlanmadığında `limit` emri için zorunludur.

deviation

True

num

Aralık:

  • deviationType="percents"

  • LONG: (0.001; 1)

  • SHORT: (0.001; +Inf)

Fiyat sapma değeri

deviationType

False

string

Olası değer: "percents"

priceType

False

string

Olası değer: "bid", “ask”, “last”

Varsayılan: “last”

Sapma yapılacak fiyat türü değeri

Kar Alım Parametreleri

Alan

Gereksinim

Tür

Komutlar

takeProfits

False

array

Dizi Değerleri türü: nesne

price

False

num

Aralık: (0; +Inf)

Kesin fiyat değeri.

(Sadece tek işlem çifti botlar için geçerlidir)

priceDeviation

False

num

Aralık:

  • LONG: (0.001; +Inf)

  • SHORT: (0.001; 1)

Fiyat Sapma değeri `percents ratio` (10% -> 0.1 `percents ratio`)'.

(Çoklu işlem çifti botları için boş olamaz)

portfolio

False

num|null

Aralık: (0; 1]

Fiyat Sapma değeri `percents ratio` (10% -> 0.1 `percents ratio`)'.

(Çoklu işlem çifti botları için boş olamaz)

Stop Loss Parameters

Alan

Gereksinim

Tür

Komutlar

stopLoss

False

object

Olası değer: "price" veya "priceDeviation"

price

True

num

Aralık: (0; +Inf)

Kesin fiyat değeri.

(Sadece tek işlem çifti botlar için geçerlidir)

priceDeviation

True

num

Aralık:

  • SHORT: (0.001; +Inf)

  • LONG: (0.001; 1)

Fiyat Sapma değeri `percents ratio` (10% -> 0.1 `percents ratio`)'.

(Çoklu işlem çifti botları için boş olamaz)

Move Stop Loss to Breakeven

Alan

Gereksinim

Tür

Komutlar

activationPrice

True

(tek işlem çifti botlar için)

num

Aralık: (0; +Inf)

Kesin fiyat değeri.

(Sadece tek işlem çifti botlar için geçerlidir)

executePrice

False

(tek işlem çifti botlar için)

num|null

Aralık: (0; +Inf)
Varsayılan: null (giriş fiyatına eşittir)

Kesin fiyat değeri.

(Sadece tek işlem çifti botlar için geçerlidir)

activationPriceDeviation

True

(tek ve çoklu işlem çifti botlar için)

num

Aralık:

  • LONG: (0.001; +Inf)

  • SHORT: (0.001; 1)

Fiyat Sapma değeri `percents ratio` (10% -> 0.1 `percents ratio`)'.

(Çoklu işlem çifti botları için boş olamaz)

executePriceDeviation

True

(tek ve çoklu işlem çifti botlar için)

num

Aralık: (-1; activationPriceDeviation)

Fiyat Sapma değeri `percents ratio` (10% -> 0.1 `percents ratio`)'.

(Çoklu işlem çifti botları için boş olamaz)

Trailing Stop

Alan

Gereksinim

Tür

Komutlar

activation

True

num

Aralık:

  • LONG: (0.0001; +Inf)

  • SHORT: (0.0001; 1)

Fiyat Sapma değeri `percents ratio` (10% -> 0.1 `percents ratio`)'.

execute

True

num

Aralık:

  • LONG: (0.0001; 1)

  • SHORT: (0.0001; +Inf)

Fiyat Sapma değeri `percents ratio` (10% -> 0.1 `percents ratio`)'.

Additional Parameters

Alan

Gereksinim

Tür

Komutlar

keepPositionOpen

False

bool

Varsayılan: true

Pozisyonumu açık tut.

(Yalnızca `takeProfits`, `stopLoss`, `moveToBreakeven`, `trailingStop` parametreleri boş olan Spot stratejilerini etkiler)

reduceOnly

False

bool

Varsayılan: true

Çıkışlarda yalnızca azalt.

(Spot stratejileri için etkisi yoktur)

placeConditionalOrdersOnExchange

False

bool

Varsayılan: false

Borsada çıkışa yönelik koşullu emirler verin. (Kısmen desteklenir, DCA etkinleştirildiğinde göz ardı edilir)

DCA Parameters

Alan

Gereksinim

Tür

Komutlar

dca

False

object

extraOrderCount

True

num

Aralık: [1; 30]

Giriş emri + extra DCA emirleri adet toplamı.

(Örnek değer 5, 1 giriş emri + 4 ek DCA emri anlamına gelir)

extraOrderDeviation

True

num

Aralık: [0.001; 0.2]

Ekstra DCA emir fiyatı sapması

extraOrderVolumeMultiplier

True

num

Aralık: [1; 10]

Extra DCA emir hacim çarpanı

extraOrderDeviationMultiplier

False

num

Sayı değeri: Aralık: [1; 10]

Varsayılan: null

Ekstra DCA sipariş fiyatı sapma çarpanı

takeProfitsBasedOn

False

string

Olası değer: "average_price", "entry_order"

Varsayılan: “average_price”

Belirtilen koşula bağlı olarak kar alma fiyatı.

stopLossBasedOn

False

string

Olası değer: "average_price", "entry_order"

Varsayılan: “entry_order”

Belirtilen koşula bağlı olarak stop loss fiyatı

TradingView’de Nasıl Alarm Oluşturulur

Öncelikle, “Grafikte Güncelle” butonuna tıklayarak stratejiyi güncelleyin, ardından “Alarm” butonuna tıklayarak alarmı oluşturun.

Şimdi alarmı ayarlayalım:

  1. Stratejiyi Seçin – Koşul açılır menüsünden stratejinizi seçin.

  2. Alert Function Calls’ı Etkinleştirin – Script koşullarına göre alarm tetiklemek için “alert() function calls only” seçeneğini seçin.

  3. Notifications Sekmesine Gidin – Notifications bölümüne geçin.

  4. Webhook URL’yi Yapıştırın – WunderTrading’den aldığınız Webhook URL’yi buraya ekleyin.

  5. Oluştur’a Tıklayın – İşlem otomasyonunu tamamlamak için alarmı oluşturun.

Hepsi bu! Şimdi giriş alarmını bekleyin ve her şeyin doğru çalışıp çalışmadığını kontrol edin. Bunu yapmak için Sinyal Botları listesine gidin ve oluşturduğunuz ilgili sinyal bot için “Logs” (Kayıtlar) butonuna tıklayın. Burada, alarmın herhangi bir hata olmadan başarıyla çalıştırılıp çalıştırılmadığını görebilirsiniz. Son olarak, açılan pozisyonu görmek için Positions sekmesine gidin.

Bot Kurulum Onayı

Bot alarmlarınız ayarlandıktan sonra, botunuzun başarıyla yapılandırıldığını gösteren bir onay ekranı görürsünüz. Bu aşamada bot, bir alarmın tetiklenmesini bekler ve tetiklendiğinde otomatik olarak pozisyon açar.

Eğer pozisyona hemen girmek isterseniz, “Enter Position Now” seçeneğine tıklayabilirsiniz. Burada, bu bota bağlı olarak long veya short işlem seçebilirsiniz.

Bot ayarlarını istediğiniz zaman düzenleyebilir veya kontrol panelinizden alarm mesajlarını inceleyebilirsiniz..

Bu cevap sorunuzu yanıtladı mı?