Özel göstergeler için API
Yapay zekâ ile gösterge oluşturma
API'nin tamamı, dil modelleri için tek bir metin dosyası olarak da mevcuttur: AI-scripting.txt. Bu dosyayı ChatGPT, Claude, Gemini veya başka bir LLM'e ekleyin ve istediğiniz göstergeyi tarif edin.
Örnek istem:
Read the attached [AI-scripting.txt] https://mobchart.com/docs/public/AI-scripting.txt file and use it as the only reference for the MobChart scripting API.Create a custom indicator that plots a 20-period EMA and a 50-period EMA on the chart. Color the candles green when EMA20 is above EMA50 and red otherwise.Use only the documented API. Do not invent functions. Return the complete indicator code.
Sandbox ve sınırlar
Gösterge Geliştirme
Gösterge geliştirme, göstergenin etkinleştirileceği grafiğin yanına yerleştirilebilen ayrı bir widget içinde yapılır.

Gösterge Oluşturma
define(title, description, type, isPublic, isPublicCode, options)
Göstergeyi sisteme kaydeder.
| Parametre | Tür | Açıklama |
|---|---|---|
title | string | Gösterge adı |
description | string | Kısa açıklama |
type | 'onchart' | 'offchart' | Göstergenin yerleşimi (grafik üzerinde veya ayrı bir panelde) |
isPublic | true | false | Göstergenin herkese açık olup olmadığı |
isPublicCode | true | false | Kaynak kodun herkese açık olup olmadığı |
options | object (isteğe bağlı) | { fullRange, warmup }, aşağıya bakın |
Örnek:
define("My Indicator", "Shows EMA line", "onchart", true, false);
Hesaplama aralığı. Varsayılan olarak bir script, grafiğin yalnızca hesaplama gerektiren kısmını hesaplar: geriye kaydırarak yüklenen mumlar veya yenilemede en son mumlar, ayrıca bunlardan önceki, hesaplamalar için gereken ancak döndürülmeyen warmup kadar geçmiş mum (varsayılan 500). Göstergeniz daha fazla veya daha az geçmişe ihtiyaç duyuyorsa warmup değerini belirtin, örneğin bir EMA(200) için { warmup: 200 }. Değerleri veya şekilleri görünür aralığın tamamına bağlı olan bir script (ilk görünür mumdan itibaren VWAP, kümülatif delta, pencere maksimumundaki bir etiket, grafik boyunca çizilen seviyeler) { fullRange: true } belirtmelidir, aksi takdirde daha fazla geçmiş yüklendikten sonra sonuçları hatalı olur. Mod, script her kaydedildiğinde define() üzerinden okunur: fullRange olmadan kaydedilmiş bir script kısmi olarak hesaplanır, bu nedenle mevcut kümülatif script'leri düzenlerken bu bayrağı ekleyin. Kısmi script'ler parçalar halinde de yüklenir: uzun bir geçmiş üzerinde böyle bir script'i açtığınızda grafik önce en yeni 500 mumu (veya daha fazlaysa warmup kadar mumu) ister ve daha eski kısımlar birer istekle ardından gelir, böylece görünür kısım hemen görüntülenir. fullRange olan script'ler her zaman tüm aralık üzerinde tek bir istekte hesaplanır.
define("Window max", "Label at the highest visible high", "onchart", true, true, { fullRange: true });
onchart ve offchart için gösterge yerleşimi:

Giriş Parametreleri
input ve style sınıfları, kullanıcı tarafından yapılandırılabilen ayarlar oluşturmanızı sağlar (PineScript'teki input() işlevine benzer).
| Metot | Açıklama |
|---|---|
number(title, defaultValue, min, max, step) | Sayısal giriş |
range(title, defaultValue, min, max, step) | Aralık girişi |
select(title, defaultValue, values) | Açılır liste seçimi |
color(title, defaultValue) | Renk seçici |
boolean(title, defaultValue) | Mantıksal (boolean) giriş |
Ana parametreler için örnek (input):
const length = input.number("Period", 14, 1, 100, 1);const type = input.select("Type", 'sma', ['sma', 'ema']);const color = input.color("Line Color", "#FF0000");
Veya görsel parametreler için (style):
const length = style.number("Size", 14, 1, 100, 1);const color = style.select("Background Color", '#FF0000', ["#FF0000", "#AA0000", "#BB0000"]);const color = style.color("Background Color", "#FF0000");

Veri Kaynakları
source sınıfı piyasa verilerini sunucudan alır. Mum tabanlı metotlar aynı parametreleri alır; iki canlı anlık görüntü ise farklıdır: orderbook() bir borsa ve bir ticker, levels() ise bir borsa ve bir ayarlar nesnesi alır.
| Parametre | Açıklama |
|---|---|
exchange, ticker, timeframe | Varsayılan olarak göstergenin açıldığı grafiğin değerlerini alır. Başka bir piyasanın verilerini almak için farklı değerler verin. |
lookback | Geçerli tarihten itibaren geçmiş mum sayısı, en fazla 5000. |
ohlcv(exchange, ticker, timeframe, lookback?)
Mum verileri.
[{"open": 115886.17,"high": 115911.96,"low": 115764.27,"close": 115815.16,"volume": 228.41528,"startTime": 1757699100000},{...},...]
depths(exchange, ticker, timeframe, lookback?)
Geçmiş emir defteri anlık görüntüleri, her mum için bir tane. Yalnızca en büyük limit emirler saklanır (ısı haritasının arkasındaki veriler).
[{"data": {"asks": {"109425": 5.467,"109495": 3.564,...},"bids": {"33000": 3.746,"35000": 16.49,...}},"startTime": 1757699100000},{...},...]
clusters(exchange, ticker, timeframe, lookback?)
Küme (footprint) verileri: mumun her fiyat seviyesindeki alış ve satış hacmi.
[{"data": {"totalBuy": 16053385,"totalSell": 20490989,"0.8654": { "buy": 286845, "sell": 336689 },"0.8653": { "buy": 271848, "sell": 259167 },"0.8652": { "buy": 318814, "sell": 373497 },...},"startTime": 1757699100000},{...},...]
liquidations(exchange, ticker, timeframe, lookback?)
Mumun her fiyat seviyesindeki likidasyon hacmi (yalnızca vadeli işlem piyasaları). Biçimi clusters() ile aynıdır.
[{"data": {"totalBuy": 16053385,"totalSell": 20490989,"0.8654": { "buy": 286845, "sell": 336689 },"0.8653": { "buy": 271848, "sell": 259167 },"0.8652": { "buy": 318814, "sell": 373497 },...},"startTime": 1757699100000},{...},...]
moreData(exchange, ticker, timeframe, lookback?)
Mum başına türev verileri: fonlama oranı, açık pozisyon (OI) mumu, long/short oranları (yalnızca vadeli işlem piyasaları).
[{"data": {"FR": 0.00003777, // Fonlama oranı"OI": { // Açık pozisyon (OI) mumu"open": 85645.708,"close": 83496.225,"high": 85801.04,"low": 83397.918},"LS": { "l": 0.5426, "s": 0.4574 }, // Long/Short oranı"taLS": { "l": 0.552, "s": 0.448 }, // En iyi trader'ların hesap oranı"tpLS": { "l": 0.5996, "s": 0.4004 } // En iyi trader'ların pozisyon oranı},"startTime": 1757699100000},{...},...]
orderbook(exchange, ticker)
Canlı emir defteri anlık görüntüsü: mumlara bağlı olmayan, güncel tam defter.
{"asks": {"109425": 5.467,"109495": 3.564,...},"bids": {"109400": 1.2,"109390": 0.8,...}}
Seviyeler sıralı değildir; defterle çalışmak için ta emir defteri yardımcılarını (ta.bestBid, ta.sumBids, ...) kullanın.
Mumların geçmiş defterleri depths() üzerinden gelir: depths()[i].data aynı biçimdedir, ancak orada yalnızca en büyük limit emirler saklanır.
Örnek:
const candles = source.ohlcv(); // exchange, ticker ve timeframe parametreleri varsayılan olarak geçerli grafiğin değerlerini alır.const closes = candles.map(c => c.close);
levels(exchange, settings?)
Likidite tarayıcısının seviyeleri: bir borsadaki büyük bekleyen limit emirler, tarayıcı sayfasındaki ayarlarla aynı şekilde filtrelenir. Canlı veridir, mumlara bağlı değildir. Bir plan olmadan yakınlık %1 ile, ömür 60 dakika ile ve sonuç 200 seviye ile sınırlıdır; bir planla 2000 seviyeye kadar. En büyük emirler önce gelir. Bir veri kaynağı isteği olarak sayılır.
{"BTCUSDT": {"asks": {"109500": {"price": 109500,"quantity": 42.5, // baz varlık cinsinden büyüklük"quantityUSDT": 4653750, // kote para birimi cinsinden büyüklük"distance": 0.62, // güncel fiyattan uzaklık, yüzde"duration": 184, // emrin kaç dakikadır beklediği"touches": 2,"currentTouches": 1,"filledPercent": 12.4,"strength": 95.5, // yüzde, tarayıcıya bakın"diversity": 11,"isContinuous": true,"date": "2026-10-10T06:12:03.000Z"},...},"bids": { ... },"volume1hTotal": 183000000},...}
Ayarlar (tümü isteğe bağlı):
| Ayar | Varsayılan | Açıklama |
|---|---|---|
tickers | tüm ticker'lar | borsanın yalnızca bu ticker'ları |
exclude | [] | atlanacak ticker'lar |
type | "all" | "all", "bids" veya "asks" |
nearness | 5 | güncel fiyattan en fazla uzaklık, yüzde |
size | 100000 | kote para birimi cinsinden en küçük emir büyüklüğü |
lifespan | 0 | emrin en az kaç dakikadır beklediği |
touches, currentTouches | 0 | seviyenin / mevcut emrin en az dokunma sayısı |
filled | 0 | emrin en az dolmuş kısmı, yüzde |
strength, diversity | 0 | tarayıcıdaki gibi en az güç (yüzde) ve çeşitlilik |
continuousOnly | false | kaybolup geri gelen emirleri atla |
volume1h | 0 | ticker'ın kote para birimi cinsinden en az 1 saatlik hacmi |
spotAndFutures | false | yalnızca hem spot hem de vadeli piyasada bulunan ticker'lar |
limit | 500 | en fazla seviye sayısı, en büyükler önce (en fazla 2000) |
Örnek:
// grafik piyasasının fiyatı etrafındaki büyük emirler, büyüklük ve ömürle etiketlenmiş yatay çizgiler olarakconst candles = await source.ohlcv();const lastDate = candles.at(-1).startTime;const levels = await source.levels(currentExchange, { tickers: [currentTicker], nearness: 3, size: 300000, lifespan: 30 });const own = levels[currentTicker] || { asks: {}, bids: {} };for (const [type, color] of [["asks", "#ef5350"], ["bids", "#26a69a"]]) {for (const [price, level] of Object.entries(own[type])) {plot.horizontalLine(`${type} ${price}`, +price, color, 0.8, Math.min(4, 1 + level.quantityUSDT / 1e6));plot.text(`${type} ${price} label`, `${(level.quantityUSDT / 1e6).toFixed(2)}M · ${level.duration}m`, lastDate, +price, 10, color);}}
HTTP İstekleri
http sınıfı harici HTTP API'lerine istek gönderir ve yanıtı döndürür; böylece bir gösterge source içinde bulunmayan verileri kullanabilir: kendi sunucunuz, herkese açık bir REST API, bir zincir üstü (on-chain) metrik sağlayıcısı, ...
source.* gibi bu çağrılar da senkron işlevler olarak yazılır, await gerekmez.
| Metot | Açıklama |
|---|---|
get(url, options?) | GET isteği |
post(url, body?, options?) | POST isteği. Nesne veya dizi olan body JSON olarak gönderilir (Content-Type: application/json), string olduğu gibi gönderilir |
options değeri { headers: { name: value } } biçimindedir — en fazla 10 özel başlık (örneğin Authorization veya x-api-key).
Her iki metot da aynı yanıt nesnesini döndürür ve asla hata fırlatmaz:
{ok: true, // durum 200–299status: 200, // HTTP durumu, istek gönderilmediyse 0headers: { "content-type": "application/json", ... },data: { ... }, // JSON olarak ayrıştırılmış yanıt gövdesi, gövde JSON değilse nulltext: "...", // ham yanıt gövdesierror: null // istek başarısız olduysa nedeni: "timeout", "url not allowed", "too many requests", ...}
Olası error değerleri: invalid url, url not allowed, invalid headers, invalid body, body too large, response too large, timeout, too many requests, rate limit, busy, proxy unavailable, network error.
Örnek (GET):
define("Fear & Greed", "Crypto Fear & Greed index", "offchart", true, true);const res = http.get("https://api.alternative.me/fng/?limit=30");if (!res.ok) logger.log("request failed:", res.status, res.error);// res.data = { data: [{ value: "71", timestamp: "1757635200" }, ...] }const byDay = {};(res.data?.data || []).forEach((row) => { byDay[Number(row.timestamp) * 1000] = Number(row.value); });const candles = source.ohlcv();const values = candles.map((c) => c ? byDay[c.startTime - (c.startTime % 86400000)] ?? null : null);plot.lineSeries("Fear & Greed", values, "#00C8FF");
Örnek (POST):
const candles = source.ohlcv();const last = candles.at(-1);const res = http.post("https://example.com/api/signals",{ exchange: currentExchange, ticker: currentTicker, close: last.close },{ headers: { "x-api-key": "YOUR_KEY" } } // yalnızca gizli kodda);logger.log("signal sent:", res.ok, res.status, res.data);
Global Değişkenler
| Değişken | Açıklama | Örnek |
|---|---|---|
currentExchange | Grafikteki geçerli borsa | binance, binanceFutures, coinbase, ... |
currentTicker | Grafikteki geçerli ticker (biçim borsaya bağlıdır) | BTCUSDT, ADA-USD, BTC/USDC, ... |
currentTimeframe | Grafikteki geçerli zaman dilimi | 1m, 5m, 15m, ... |
Örnek:
const candles = source.ohlcv(currentExchange, currentTicker, currentTimeframe);const closes = candles.map(c => c.close);
Günlük Kaydı
logger sınıfı bilgi çıktısı vermek ve hata ayıklamak için kullanılır.
| Metot | Açıklama |
|---|---|
log(...args) | Günlüğe bir kayıt ekler (uzunluk ve adet sınırlarıyla) |
Örnek:
const candles = source.ohlcv();logger.log("First candle:", candles?.[0]);

Görselleştirme
plot sınıfı grafik öğelerinin ve veri serilerinin çizilmesinden sorumludur.
Geometrik Şekiller
| Metot | Açıklama |
|---|---|
box(title, date1, price1, date2, price2, fill, opacity, stroke, strokeOpacity, strokeWidth) | Dikdörtgen |
square(title, date1, price1, size, fill, opacity, stroke, strokeOpacity, strokeWidth) | Kare |
diamond(title, date1, price1, size, fill, opacity, stroke, strokeOpacity, strokeWidth) | Eşkenar dörtgen |
triangle(title, date1, price1, size, fill, opacity, stroke, strokeOpacity, strokeWidth) | Üçgen |
circle(title, date1, price1, radius = 10, fill, opacity, stroke, strokeOpacity, strokeWidth) | Daire |
text(title, value, date1, price1, fontSize, fill, opacity) | Grafik üzerinde metin |
table(title, rows, options) | Grafiğin bir köşesine sabitlenmiş tablo, bkz. Tablolar |
straightLine(title, date1, price1, date2, price2, stroke, strokeOpacity, strokeWidth, strokeDasharray) | Düz çizgi |
horizontalLine(title, price1, stroke, strokeOpacity, strokeWidth, strokeDasharray) | Grafiğin tamamı boyunca yatay çizgi |
verticalLine(title, date1, stroke, strokeOpacity, strokeWidth, strokeDasharray) | Grafiğin tamamı boyunca dikey çizgi |
| Parametre | Veri Türü | Açıklama |
|---|---|---|
title | string | Öğe adı (grafikteki benzersiz tanımlayıcı) |
date1 | number (zaman damgası, ms) | Başlangıç zaman damgası |
price1 | number | Başlangıç fiyatı (Y ekseni koordinatı) |
date2 | number (zaman damgası, ms) | Bitiş zaman damgası (çizgiler ve dikdörtgenler için) |
price2 | number | Bitiş fiyatı (çizgiler ve dikdörtgenler için) |
size | number | Şekil boyutu (piksel) |
radius | number | Daire yarıçapı (varsayılan 10) |
fill | string (hex, ör. "#FF0000") | Şeklin dolgu rengi |
opacity | number (0–1) | Dolgu opaklığı |
stroke | string (hex, ör. "#000000") | Kontur rengi |
strokeOpacity | number (0–1) | Kontur opaklığı |
strokeWidth | number | Kontur kalınlığı (piksel) |
strokeDasharray | array (ör. [5,5]) | Kesikli çizgi stili |
fontSize | number | Metin boyutu (piksel) |
value | string | Metin değeri (text metodu için) |
Örnek:
plot.text("Text object", "Hello world!", 1757699100000, 115000, 10, "#00C8FF", 0.5);plot.straightLine(`${namePrefix} Open`, level.timeStart, level.open, level.timeEnd, level.open, color);plot.circle(`${namePrefix} High`, level.timeStart, level.high, 3, color);
Grafikte en fazla 3000 şekil görüntülenebilir.
Veri Serileri
| Metot | Açıklama |
|---|---|
lineSeries(title, values, stroke, strokeOpacity, strokeWidth, strokeDasharray) | Çizgi grafiği |
barSeries(title, values, fill, opacity) | Çubuk grafiği |
candleSeries(title, openValues, closeValues, highValues, lowValues, fill, opacity) | Mumlar |
areaSeries(title, values, fill, opacity, stroke, strokeOpacity, strokeWidth, base) | Çizgi ile base arasındaki dolgulu alan (varsayılan: grafiğin alt kenarı) |
bandSeries(title, upperValues, lowerValues, fill, opacity, stroke, strokeOpacity, strokeWidth, step) | İki seri arasındaki dolgulu bant, her mum kendi rengini ve opaklığını korur |
profile(title, values, options) | Görünür mumların hacim profili tarzı histogramı, bkz. Profiller |
histogram(title, rows, options) | Profil olarak çizilen hazır bir fiyat haritası, bkz. Histogramlar |
| Parametre | Veri Türü | Açıklama |
|---|---|---|
values, upperValues, lowerValues | (number \| null)[] | Her mum için bir değer, null mumu gizler |
fill, stroke | string (hex) veya function | Renk ya da mumun rengini döndüren bir işlev: lineSeries, barSeries, candleSeries ve areaSeries için (value, i), bandSeries için (upper, lower, i) |
opacity | number (0–1) veya function | Dolgu opaklığı, areaSeries / bandSeries için (value, i) / (upper, lower, i) işlevi |
base | number | null | areaSeries taban seviyesi, null = grafiğin alt kenarı |
step | boolean | bandSeries stili: true = mum başına bir sütun (varsayılan), false = kesintisiz bir çokgen |
Örnek:
plot.lineSeries("EMA", ta.ema(closes, 20), "#00C8FF");// her mum kendi rengini korur: kapanış EMA'nın üzerindeyse yeşil, altındaysa kırmızıplot.lineSeries("Close", closes, (v, i) => v > ema[i] ? colorBuy : colorSell);plot.barSeries("Premium %", premiumPercents, ((d) => d > 0 ? color1 : color2), 1);plot.candleSeries("Candles",opens, closes, highs, lows,(v, i) => {return opens?.[i] > closes?.[i] ? colorBuy : colorSell});plot.areaSeries("Volume", volumes, "#00C8FF", 0.3);// mum başına renklendirilmiş alan, büyük mumlarda daha opakplot.areaSeries("Delta", deltas, (v, i) => v >= 0 ? colorBuy : colorSell, (v, i) => Math.min(1, Math.abs(v) / maxDelta));// kapanış ile onun %1 altı arasındaki baskı bandı, mumun dengesizlik oranına göre renklendirilir ve gölgelendirilirplot.bandSeries("Bid pressure",closes,closes.map(c => c * 0.99),(upper, lower, i) => ratios[i] > 0 ? bidColor : askColor,(upper, lower, i) => Math.abs(ratios[i]) / 100);
Grafikte en fazla 20 veri serisi görüntülenebilir.
Profiller
plot.profile(title, values, options?), yerleşik hacim profili gibi fiyata göre bir histogram çizer. values[i], ohlcv() içindeki i mumunun fiyat haritasıdır: { price: value } veya { price: { buy, sell } } (bir clusters() veya liquidations() kaydının data alanı olduğu gibi verilebilir) ya da satırı olmayan bir mum için null. Grafikte görünen mumların satırları, grafiğin kendisinde fiyat adımı başına toplanır; böylece profil yeni bir çalıştırma olmadan kaydırma, yakınlaştırma ve daha fazla yüklemeyi takip eder. Tekil değerler tek renkle çizilir (negatif bir değer fill2 rengini alır), çiftler çubuğu alış ve satış kısımlarına böler ve delta modunu mümkün kılar. profile() bir alarm tanıtıcısı döndürmez.
| Seçenek | Varsayılan | Açıklama |
|---|---|---|
step | grafiğin tick boyutu | fiyat birimi cinsinden satır yüksekliği, fiyatlar aşağı doğru bu adıma yuvarlanır |
orient | "right" | çubukların büyüdüğü kenar, "right" veya "left" |
width | 30 | en geniş satır, grafik genişliğinin yüzdesi olarak |
fill | "#26a69a" | değerin veya alış kısmının rengi |
fill2 | "#ef5350" | satış kısmının rengi |
opacity | 0.6 | çubuk opaklığı |
delta | false | toplam yerine buy - sell çiz, yalnızca çiftler için |
poc | true | en büyük değere sahip satırda bir çizgi |
valueArea | 70 | POC çevresinde tam opaklıkla çizilen toplamın yüzdesi, devre dışı bırakmak için false |
valueAreaOpacity | 0.3 | değer alanı dışındaki satırların opaklığı |
labels | true | yer olduğunda çubukların üzerinde satır toplamları |
Sınırlar: çalıştırma başına 3 profil, mum başına 300 satır, profil başına 200000 satır. Sınırları aşan satırlar atılır ve çalıştırma bir not kaydeder.
Örnek:
// grafiğin hacim profili, yerleşik araçla aynı görünümconst rows = await source.clusters();plot.profile("Volume", rows.map((r) => r?.data ?? null), { step: 5 });// yalnızca büyük işlemler, delta renkli, sol kenardaconst minSize = input.number("Min trade size", 50, 0, 100000, 1);const big = rows.map((r) => {if (!r?.data) return null;const out = {};for (const [price, c] of Object.entries(r.data)) {if (price === "totalBuy" || price === "totalSell") continue;if (c.buy + c.sell >= minSize) out[price] = { buy: c.buy, sell: c.sell };}return out;});plot.profile("Large trades", big, { step: 5, delta: true, orient: "left" });
Histogramlar
plot.histogram(title, rows, options?), sizin önceden oluşturduğunuz bir histogramı çizer: grafiğin tamamı için tek bir fiyat haritası, mumlardan hiçbir şey toplanmaz. Satırlar mumlara aitse ve görünüm görünür aralığı takip etmeliyse profile(), satırlar nihaiyse histogram() kullanın: bir emir defteri anlık görüntüsü, script'in hesapladığı seviyeler, başka bir piyasanın verileri.
rows, profile() için bir mum kaydıyla aynı biçimlere sahiptir: { price: value }, { price: { buy, sell } } veya [price, buy, sell] satırlarından oluşan bir liste. Tekil bir değer tek renkle çizilir (negatif bir değer fill2 rengini alır), çiftler çubuğu alış ve satış kısımlarına böler ve delta modunu mümkün kılar. Seçenekler profile() ile aynıdır, yukarıdaki tabloya bakın.
Histogram, çalıştırmanın son mumuyla tarihlendirilir ve grafik bir başlığın en yeni histogramını tutar; böylece daha eski mumlar üzerindeki kısmi çalıştırmalar (geçmiş yüklenirken) asla güncel olanın yerini almaz. Script'in her yenilenmesinde yeniden çizilir, bu nedenle bir emir defteri histogramı canlı defteri takip eder. histogram() bir alarm tanıtıcısı döndürmez.
Sınırlar: çalıştırma başına 3 histogram, 5000 satır. Sınırı aşan satırlar atılır ve çalıştırma bir not kaydeder.
Örnek, emir defteri:
// sağ kenarda profil olarak canlı emir defteri: alış emirleri alış renginde, satış emirleri satış rengindeconst book = await source.orderbook();const rows = {};for (const [price, qty] of Object.entries(book.bids)) rows[price] = { buy: qty };for (const [price, qty] of Object.entries(book.asks)) rows[price] = { sell: qty };plot.histogram("Order book", rows, { step: 5, width: 25, valueArea: false, poc: false });
Örnek, kendi seviyeleriniz:
// kendi histogramınız: son 100 mumun küme hacmi, yakın tarihli mumlar daha ağır basarconst rows = await source.clusters();const weighted = {};rows.slice(-100).forEach((r, i, arr) => {if (!r?.data) return;const weight = (i + 1) / arr.length;for (const [price, c] of Object.entries(r.data)) {if (price === "totalBuy" || price === "totalSell") continue;const cell = weighted[price] || (weighted[price] = { buy: 0, sell: 0 });cell.buy += (c.buy || 0) * weight;cell.sell += (c.sell || 0) * weight;}});plot.histogram("Weighted volume", weighted, { step: 5, orient: "left", delta: true });
Tablolar
plot.table(title, rows, options?), grafik panelinin bir köşesine sabitlenmiş küçük bir tablo çizer: çoklu zaman dilimi özetleri, yüklenen aralığın istatistikleri, sinyal panoları. rows satırlardan oluşan bir dizidir, bir satır hücrelerden oluşan bir dizidir ve bir hücre bir string, bir sayı veya { text, color, bg, align, bold } olabilir. Aynı köşedeki tablolar sırayla üst üste dizilir. Bir tablo çalıştırmanın son mumuyla tarihlendirilir ve grafik bir başlığın en yeni tablosunu tutar; böylece daha eski mumlar üzerindeki kısmi çalıştırmalar (geçmiş yüklenirken) asla güncel olanın yerini almaz. Tablolar 500 px'den dar grafiklerde çizilmez. Bir tablo fareyle sürüklenebilir: konum çalışma alanıyla birlikte kaydedilir ve script position seçeneğini değiştirdiğinde sıfırlanır. table() bir alarm tanıtıcısı döndürmez.
| Seçenek | Varsayılan | Açıklama |
|---|---|---|
position | "top-right" | panelin köşesi: "top-right", "top-left", "bottom-right", "bottom-left" |
header | false | ilk satır gölgeli bir şerit üzerinde kalın çizilir |
fontSize | 11 | px cinsinden metin boyutu, 8 ile 16 arası |
color, bg, border | temaya göre | varsayılan metin, panel ve ızgara renkleri; bir hücre color ve bg değerlerini geçersiz kılabilir |
opacity | 0.85 | panel opaklığı |
align | "left" | varsayılan hücre hizalaması, "left", "center" veya "right" |
Sınırlar: çalıştırma başına 3 tablo, 50 satır, 10 sütun, hücre başına 100 karakter. Daha uzun metin üç noktayla kesilir, bir sütun grafik genişliğinin en fazla %30'unu kaplar.
Örnek:
const candles = await source.ohlcv();const closes = candles.map((c) => c.close);const rsi = ta.rsi(closes, 14);const last = rsi.at(-1);const change = (closes.at(-1) / closes.at(-25) - 1) * 100;plot.table("Stats", [["Metric", "Value"],["RSI 14", { text: last.toFixed(1), color: last > 70 ? "#ef5350" : last < 30 ? "#26a69a" : undefined }],["Change 24 bars", { text: change.toFixed(2) + "%", align: "right" }],["Volume", candles.slice(-24).reduce((s, c) => s + c.volume, 0).toFixed(0)],], { position: "top-right", header: true });
Teknik Analiz
ta sınıfı PineScript v5 ta.* işlevlerini uygular. Pine mum mum çalışır; burada ise her işlev serilerin tamamını alır (diziler, mum başına bir değer, en eskisi önce) ve doğrudan çizilebilen aynı uzunlukta bir seri döndürür. Periyot henüz dolmamışken değerler null olur ve null girdiler Pine'daki na gibi yayılır. high, low, close veya volume değerlerini örtük olarak okuyan Pine işlevleri bu dizileri argüman olarak alır.
Birden fazla seri döndüren işlevler (bb, kc, macd, stoch, dmi, supertrend) adlandırılmış özelliklere de sahip bir dizi döndürür: const [middle, upper, lower] = ta.bb(closes, 20, 2) veya ta.bb(closes, 20, 2).upper.
Yardımcı İşlevler
| Metot | Açıklama |
|---|---|
highest(values, length) / lowest(values, length) | length mum boyunca en yüksek / en düşük değer |
highestbars(values, length) / lowestbars(values, length) | En yüksek / en düşük muma olan uzaklık (0 veya negatif) |
max(values) / min(values) | Her muma kadar olan tüm zamanların en yüksek / en düşük değeri |
range(values, length) | highest - lowest |
change(values, length = 1) | values[i] - values[i - length] |
mom(values, length) | Momentum |
roc(values, length) | Değişim oranı, % |
cum(values) | Kümülatif toplam |
rising(values, length) / falling(values, length) | Değer, önceki length değerin her birinin üzerinde / altında |
variance(values, length, biased = true) | Varyans |
stdev(values, length, biased = true) | Standart sapma |
dev(values, length) | Ortalama mutlak sapma |
median(values, length) | Medyan |
mode(values, length) | En sık görülen değer (eşitlikte en küçüğü) |
percentile_linear_interpolation(values, length, percentage) | Yüzdelik, en yakın iki sıra arasında doğrusal interpolasyon |
percentile_nearest_rank(values, length, percentage) | Yüzdelik, en yakın sıra yöntemi |
percentrank(values, length) | Önceki length değerden mevcut değere eşit veya ondan küçük olanların yüzdesi |
correlation(series1, series2, length) | Korelasyon katsayısı |
crossover(series1, series2) | Yukarı yönlü kesişim (argümanlardan biri sayı olabilir: ta.crossover(rsi, 70)) |
crossunder(series1, series2) | Aşağı yönlü kesişim |
cross(series1, series2) | Herhangi bir kesişim |
barssince(condition) | condition (boolean dizisi) en son true olduğundan bu yana geçen mum sayısı |
valuewhen(condition, values, occurrence = 0) | condition, occurrence kez önce true olduğunda values değeri |
pivothigh(values, leftbars, rightbars) / pivotlow(...) | Onaylayan mumdaki pivot değeri, pivotun kendisi rightbars mum öncedir |
Hareketli Ortalamalar
| Metot | Açıklama |
|---|---|
sma(values, length) | Basit hareketli ortalama |
ema(values, length) | Üssel hareketli ortalama |
rma(values, length) | Wilder hareketli ortalaması (RSI / ATR tarafından kullanılır) |
wma(values, length) | Ağırlıklı hareketli ortalama |
hma(values, length) | Hull hareketli ortalaması |
alma(values, length, offset = 0.85, sigma = 6, floor = false) | Arnaud Legoux hareketli ortalaması |
swma(values) | 4 mum üzerinden simetrik ağırlıklı hareketli ortalama |
vwma(values, volumes, length) | Hacim ağırlıklı hareketli ortalama |
linreg(values, length, offset = 0) | Doğrusal regresyon eğrisi |
Osilatörler
| Metot | Açıklama |
|---|---|
rsi(values, length) | Göreceli Güç Endeksi (RSI) |
cmo(values, length) | Chande Momentum Osilatörü |
cog(values, length) | Ağırlık Merkezi (Center of Gravity) |
mfi(values, volumes, length) | Para Akışı Endeksi (values genellikle hlc3'tür) |
tsi(values, shortLength, longLength) | Gerçek Güç Endeksi (True Strength Index), -1..1 |
wpr(highs, lows, closes, length) | Williams %R |
stoch(highs, lows, closes, period = 14, smoothK = 3, smoothD = 3) | Stokastik [k, d], smoothK = 1 ham değeri verir |
cci(values, length) / cci(highs, lows, closes, length) | Emtia Kanal Endeksi (ikinci biçimde tipik fiyat üzerinden) |
macd(values, fast = 12, slow = 26, signalPeriod = 9) | MACD [macd, signal, histogram] |
Bantlar ve Kanallar
| Metot | Açıklama |
|---|---|
bb(values, length = 20, mult = 2) / bollinger(...) | Bollinger Bantları [middle, upper, lower] |
bbw(values, length, mult) | Bollinger Bantları genişliği (upper - lower) / middle |
kc(values, highs, lows, closes, length = 20, mult = 2, useTrueRange = true) | Keltner Kanalları [middle, upper, lower] |
kcw(values, highs, lows, closes, length, mult, useTrueRange) | Keltner Kanalları genişliği (upper - lower) / middle |
Trend ve Volatilite
| Metot | Açıklama |
|---|---|
tr(highs, lows, closes, handleNa = false) | Gerçek aralık (handleNa = true ilk mumda high - low verir) |
atr(highs, lows, closes, period = 14) | Ortalama Gerçek Aralık (ATR) |
dmi(highs, lows, closes, diLength = 14, adxSmoothing = 14) | Yönsel Hareket [plus, minus, adx] |
adx(highs, lows, closes, period = 14) | Ortalama Yönsel Endeks |
sar(highs, lows, closes, start = 0.02, inc = 0.02, max = 0.2) | Parabolik SAR |
supertrend(highs, lows, closes, factor = 3, atrPeriod = 10) | Supertrend [supertrend, direction], direction -1 = yükseliş trendi, 1 = düşüş trendi |
Hacim
| Metot | Açıklama |
|---|---|
vwap(values, volumes, anchor?) / vwap(highs, lows, closes, volumes, anchor?) | Kümülatif VWAP (ikinci biçimde tipik fiyat üzerinden), anchor (boolean dizisi) true olan mumlarda yeniden başlar |
obv(closes, volumes) | Denge Hacmi (On Balance Volume) |
accdist(highs, lows, closes, volumes) | Birikim / Dağılım |
iii(highs, lows, closes, volumes) | Gün İçi Yoğunluk Endeksi (Intraday Intensity Index) |
pvt(closes, volumes) | Fiyat-Hacim Trendi |
nvi(closes, volumes) / pvi(closes, volumes) | Negatif / Pozitif Hacim Endeksi |
wad(highs, lows, closes) | Williams Birikim / Dağılım |
wvad(opens, highs, lows, closes, volumes) | Williams Değişken Birikim / Dağılım |
Emir Defteri Yardımcıları
orderbook, source.orderbook() veya source.depths()[i].data değeridir: {asks: {price: quantity}, bids: {price: quantity}}.
| Metot | Açıklama |
|---|---|
orderbookSide(orderbook, side) | Bir taraf ('bids' / 'asks'), en iyi fiyat önce olacak şekilde sıralanmış [[price, quantity], ...] olarak |
bestBid(orderbook) / bestAsk(orderbook) | En iyi alış / satış fiyatı (boş bir defter için null) |
sumBids(orderbook, percent, price, inQuote) | price (varsayılan: en iyi alış) ile price * (1 - percent / 100) arasındaki kümülatif alış miktarı, inQuote = true ise price * quantity toplanır |
sumAsks(orderbook, percent, price, inQuote) | price (varsayılan: en iyi satış) ile price * (1 + percent / 100) arasındaki kümülatif satış miktarı |
Örnek:
const candles = source.ohlcv();const closes = candles.map(c => c.close);const rsiValues = ta.rsi(closes, 14);plot.lineSeries("RSI", rsiValues, "#00C8FF");
Alarmlar
Kullanıcılar, grafikteki gösterge ayarlarının Alarmlar sekmesinden göstergeniz için alarm oluşturabilir. Alarmlar sunucu tarafında düzenli olarak kontrol edilir, bildirimler Telegram'a ve/veya kullanıcının tanımladığı bir Webhook URL'sine gönderilir.
Alarm Ayarları — alertInput
alertInput sınıfı alarm ayarlarını tanımlar. Tam olarak input gibi çalışır, ancak alanlar Alarmlar sekmesinde gösterilir ve her kullanıcı kendi alarmı için kendi değerlerini yapılandırır.
alertInput tanımı içermeyen script'ler alarmlar için kullanılamaz.
| Metot | Açıklama |
|---|---|
number(title, defaultValue, min, max, step) | Sayısal giriş |
range(title, defaultValue, min, max, step) | Aralık girişi |
select(title, defaultValue, values) | Açılır liste seçimi |
color(title, defaultValue) | Renk seçici |
boolean(title, defaultValue) | Mantıksal (boolean) giriş |
Örnek:
const alertVolumeThreshold = alertInput.number("Volume threshold", 1000, 0, 10000000, 1);
Alarm Tetikleme — alert.fire
| Metot | Açıklama |
|---|---|
fire(title, message, date) | Bir alarm bildirimi tetikler |
- Üç parametrenin tümü zorunludur —
title,messageveyadateeksik olan bir çağrı atlanır (günlüğe bir uyarı yazılır). - Alarm başlığını sabit tutun, benzersiz başlıklar üretmeyin. Her başlık çalıştırma başına yalnızca bir kez tetiklenir (çalıştırma başına en fazla 20 başlık).
date, sinyalin ait olduğu mumunstartTimedeğeridir: aynı başlık yalnızca daha yeni bir mum için tetiklendiğinde tekrar bildirim gönderir. Kullanıcının alarmını oluşturduğu andan daha eski mumlara ait sinyaller yok sayılır (spam önleme).
Örnek:
if (candle.volume > alertVolumeThreshold) {alert.fire("High volume", `vol ${candle.volume}`, candle.startTime);}
Şekil Alarmları — plot.<shape>(...).alert(...)
Tüm geometrik şekiller (box, square, diamond, triangle, circle, straightLine, horizontalLine, verticalLine, text) .alert() metoduna sahip bir tanıtıcı döndürür.
Alarm otomatik olarak şeklin date1 değeriyle tetiklenir, böylece spam önleme mantığı ek kod olmadan çalışır — mum başına sinyaller için önerilen yol budur.
İki biçim:
// basit: şekil yeni bir tarih için her çizildiğinde tetiklenirplot.box(...).alert("High volume", `vol ${candle.volume}`);// callback: atlamak için hiçbir şey döndürmeyin, tetiklemek için [title, message] döndürünplot.box(...).alert((shape) => {if (candle.volume > alertVolumeThreshold)alert.fire("High volume", `vol ${candle.volume}`, candle.startTime);});
Callback şekil verilerini alır (date1, price1, date2, price2, ...).
Seri Alarmları — plot.<series>(...).alert(...)
Veri serileri (lineSeries, barSeries, candleSeries, areaSeries, bandSeries) de .alert() tanıtıcısını döndürür.
Callback en son veri noktasını ve en son mum tarihini alır, alarm bu tarihle tetiklenir.
lineSeries/barSeries/areaSeries— callback son değeri (bir sayı) alırcandleSeries— callback son mumu{open, close, high, low}alırbandSeries— callback son{upper, lower}değerini alır
plot.lineSeries("RSI", rsiValues, color).alert((rsi, date) => {if (rsi > alertRsiThreshold) alert.fire("RSI high", `RSI ${rsi.toFixed(1)}`, latestCandle.startTime);});
Doğru kalmaya devam eden bir koşul her yeni mumda bir kez bildirim gönderir. Tek seferlik sinyaller için kesişim tarzı koşullar (ta.crossover) kullanın.
Tam Örnek
const title = "Volume alerts";const description = "Shows boxes on high-volume candles";define(title, description, "onchart", true, true);const color = style.color("Color", "#00C8FF");const volumeThreshold = input.number("Volume threshold", 1000, 0, 10000000, 1);const alertVolumeThreshold = alertInput.number("Alert volume threshold", 5000, 0, 10000000, 1);const alertCloseThreshold = alertInput.number("Alert close threshold", 100000, 0, 10000000, 1);const candles = source.ohlcv();const latestCandle = candles.at(-1);const closes = candles.map(c => c.close);// seri alarmı: en son kapanışı kontrol ederplot.lineSeries("Closes", closes, color).alert((close, date) => {if (close > alertCloseThreshold) alert.fire("Close above threshold", `close ${close}`, latestCandle.startTime);});for (let i = 0; i < candles.length; i++) {const candle = candles[i];if (candle.volume > volumeThreshold) {const right = i < candles.length - 1 ? candles[i + 1].startTime : candle.startTime + 60000;// şekil alarmı: kullanıcının alarm eşiğine göre kontrol edilirplot.box(`Volume ${i}`, candle.startTime, candle.high, right, candle.low, "#00C8FF", 0.3).alert(() => {if (candle.volume > alertVolumeThreshold)alert.fire("High volume", `vol ${candle.volume}`, candle.startTime);});}}
Gösterge örnekleri
const title = "Your first indicator";const description = "Shows closes lines on the chart";const indicatorType = "onchart";define(title, description, indicatorType, true, true);const color = input.color("Line Color", "#00C8FF");const candles = source.ohlcv();const closes = candles.map(c => c.close);plot.lineSeries("Closes", closes, color);
define("Example Indicator", "Demonstrates basic plotting", "onchart", true, true);const color = input.color("Line Color", "#00FF99");const candles = source.ohlcv();const closes = candles.map(c => c.close);const ema20 = ta.ema(closes, 20);plot.lineSeries("EMA 20", ema20, color);
const title = "Colored Volume Bars";const description = "Volumes colored based on candle direction.";const indicatorType = "onchart";const isPublic = true;const isPublicCode = true;define(title, description, indicatorType, isPublic, isPublicCode);// OHLC mumlarını alconst candles = source.ohlcv();const colorUp = style.color("Color 1", "#2BB462"); // Yükselen fiyatlar için yeşilimsi renkconst colorDown = style.color("Color 2", "#FB4C51"); // Düşen fiyatlar için kırmızımsı renkconst volumes = candles.map(candle => candle.volume);plot.barSeries("Volume", volumes, (value, index) => {const currentCandle = candles[index];return currentCandle.close >= currentCandle.open ? colorUp : colorDown;});
define('Coinbase Premium Index', 'Coinbase Premium Index', 'offchart', true, false);const color1 = style.color("Color 1", "#2BB462");const color2 = style.color("Color 2", "#FB4C51");// OHLC mumlarını alconst cbCandles = source.ohlcv('coinbase', 'BTC-USD');const binanceCandles = source.ohlcv('binance', 'BTCUSDT');// Kapanışları çıkarconst cbCloses = cbCandles.map(c => c.close);const binanceCloses = binanceCandles.map(c => c.close);// --- Coinbase Premium Index hesaplaması ---const premiumPercent = cbCloses.map((cb, i) => {const b = binanceCloses[i];return ((cb - b) / b) * 100;});// Premium endeksini çizplot.barSeries("Premium %", premiumPercent, ((d) => d > 0 ? color1 : color2)) // Yüzde farkı
const title = "Candles";const description = "Simple candles draw";const indicatorType = "offchart";const isPublic = true;const isPublicCode = true;define(title, description, indicatorType, isPublic, isPublicCode);const colorBuy = style.color("Buy Color", "#2BB462");const colorSell = style.color("Sell Color", "#7a3d3f");const candles = source.ohlcv();const closes = candles.map(c => c.close);const opens = candles.map(c => c.open);const highs = candles.map(c => c.high);const lows = candles.map(c => c.low);plot.candleSeries("Candles",opens, closes, highs, lows,(v, i) => {return opens?.[i] > closes?.[i] ? colorBuy : colorSell});
Order Book Pressure (fiyat çevresindeki alış / satış derinliği dengesizlik bantları, alım satım terminallerindeki "Order Book Pressure" katmanlarına benzer):
const title = "Order Book Pressure";const description = "Bid / ask depth imbalance bands around the price";define(title, description, "onchart", true, true);const minBidRatio = input.number("Min bid ratio %", 20, 0, 100, 1);const minAskRatio = input.number("Min ask ratio %", 20, 0, 100, 1);const depthFrom = input.select("Depth from", "0%", ["0%", "1%", "2.5%", "5%"]);const depthTo = input.select("Depth to", "5%", ["1%", "2.5%", "5%", "10%"]);const bidColor = style.color("Bid fill color", "#a5d6a7");const askColor = style.color("Ask fill color", "#f1627e");const extremeColor = style.color("Extreme color", "#ffff00");const highlight = style.boolean("Highlight extremes", true);const showRef = style.boolean("Show reference lines", true);const alertMinRatio = alertInput.number("Alert min |ratio| %", 40, 0, 100, 1);const bounds = [1, 2.5, 5, 10]; // kapanıştan % cinsinden derinlik bantlarıconst from = parseFloat(depthFrom);const to = parseFloat(depthTo);const candles = source.ohlcv();const depths = source.depths();const liveBook = source.orderbook();// her mumun emir defteri: depths()[i], candles[i] mumunun anlık görüntüsüdür (en büyük limit emirler), son mum canlı defteri kullanırconst lastIndex = candles.length - 1;const books = candles.map((c, i) => {if (!c) return null;if (i === lastIndex && ta.bestBid(liveBook)) return liveBook;return depths[i]?.data || null;});const closes = candles.map(c => c ? c.close : null);// her bandın % cinsinden dengesizlik oranı (pozitif = alışlar baskın, negatif = satışlar baskın)const ratios = bounds.map((upper, b) => {const lower = b === 0 ? 0 : bounds[b - 1];return candles.map((c, i) => {const book = books[i];if (!c || !book) return null;const bid = ta.sumBids(book, upper, c.close) - ta.sumBids(book, lower, c.close);const ask = ta.sumAsks(book, upper, c.close) - ta.sumAsks(book, lower, c.close);const total = bid + ask;return total > 0 ? ((bid - ask) / total) * 100 : 0;});});// daha güçlü oran -> daha opak bant, aşırı oranlar aşırı rengi alırconst bandOpacity = (ratio) => Math.min(0.95, Math.abs(ratio || 0) / 70 * 0.95);const bandColor = (ratio) => highlight && Math.abs(ratio || 0) >= 63 ? extremeColor : (ratio >= 0 ? bidColor : askColor);bounds.forEach((upper, b) => {const lower = b === 0 ? 0 : bounds[b - 1];if (from > lower || upper > to) return; // bant seçilen derinlik aralığının dışındaconst bidUpper = closes.map(c => c != null ? c * (1 - lower / 100) : null);const bidLower = closes.map(c => c != null ? c * (1 - upper / 100) : null);const askLower = closes.map(c => c != null ? c * (1 + lower / 100) : null);const askUpper = closes.map(c => c != null ? c * (1 + upper / 100) : null);if (showRef) {plot.lineSeries(`Bid ${upper}%`, bidLower, bidColor, 0.4);plot.lineSeries(`Ask ${upper}%`, askUpper, askColor, 0.4);}// alış baskısı: bant yalnızca alışların minimum oranın üzerinde baskın olduğu mumlarda doldurulurplot.bandSeries(`Bid pressure ${lower}-${upper}%`,bidUpper.map((v, i) => ratios[b][i] >= minBidRatio ? v : null),bidLower,(upper, lower, i) => bandColor(ratios[b][i]),(upper, lower, i) => bandOpacity(ratios[b][i]));// satış baskısıplot.bandSeries(`Ask pressure ${lower}-${upper}%`,askUpper.map((v, i) => ratios[b][i] <= -minAskRatio ? v : null),askLower,(upper, lower, i) => bandColor(ratios[b][i]),(upper, lower, i) => bandOpacity(ratios[b][i]));// son mumda alarmconst latestRatio = ratios[b][lastIndex];if (latestRatio != null && Math.abs(latestRatio) >= alertMinRatio) {alert.fire(`Pressure ${lower}-${upper}%`, `ratio ${latestRatio.toFixed(1)}%`, candles[lastIndex].startTime);}});