MobChartDocs
MobChart'ı aç

Özel göstergeler için API

Kendi göstergelerinizi JavaScript ile yazın, bunları grafiğin yanında güvenli bir sandbox içinde çalıştırın ve diğer kullanıcılarla paylaşın. API size piyasa verilerini (mumlar, emir defterleri, kümeler, likidasyonlar, türev verileri), çizim araçlarını, teknik analiz yardımcılarını ve alarmları sunar.

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.

ParametreTürAçıklama
titlestringGösterge adı
descriptionstringKısa açıklama
type'onchart' | 'offchart'Göstergenin yerleşimi (grafik üzerinde veya ayrı bir panelde)
isPublictrue | falseGöstergenin herkese açık olup olmadığı
isPublicCodetrue | falseKaynak kodun herkese açık olup olmadığı
optionsobject (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).

MetotAçı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.

ParametreAçıklama
exchange, ticker, timeframeVarsayı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.
lookbackGeç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ı):

AyarVarsayılanAçıklama
tickerstüm ticker'larborsanın yalnızca bu ticker'ları
exclude[]atlanacak ticker'lar
type"all""all", "bids" veya "asks"
nearness5güncel fiyattan en fazla uzaklık, yüzde
size100000kote para birimi cinsinden en küçük emir büyüklüğü
lifespan0emrin en az kaç dakikadır beklediği
touches, currentTouches0seviyenin / mevcut emrin en az dokunma sayısı
filled0emrin en az dolmuş kısmı, yüzde
strength, diversity0tarayıcıdaki gibi en az güç (yüzde) ve çeşitlilik
continuousOnlyfalsekaybolup geri gelen emirleri atla
volume1h0ticker'ın kote para birimi cinsinden en az 1 saatlik hacmi
spotAndFuturesfalseyalnızca hem spot hem de vadeli piyasada bulunan ticker'lar
limit500en 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 olarak
const 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.

MetotAçı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–299
status: 200, // HTTP durumu, istek gönderilmediyse 0
headers: { "content-type": "application/json", ... },
data: { ... }, // JSON olarak ayrıştırılmış yanıt gövdesi, gövde JSON değilse null
text: "...", // ham yanıt gövdesi
error: 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şkenAçıklamaÖrnek
currentExchangeGrafikteki geçerli borsabinance, binanceFutures, coinbase, ...
currentTickerGrafikteki geçerli ticker (biçim borsaya bağlıdır)BTCUSDT, ADA-USD, BTC/USDC, ...
currentTimeframeGrafikteki geçerli zaman dilimi1m, 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.

MetotAçı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

MetotAçı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
ParametreVeri TürüAçıklama
titlestringÖğe adı (grafikteki benzersiz tanımlayıcı)
date1number (zaman damgası, ms)Başlangıç zaman damgası
price1numberBaşlangıç fiyatı (Y ekseni koordinatı)
date2number (zaman damgası, ms)Bitiş zaman damgası (çizgiler ve dikdörtgenler için)
price2numberBitiş fiyatı (çizgiler ve dikdörtgenler için)
sizenumberŞekil boyutu (piksel)
radiusnumberDaire yarıçapı (varsayılan 10)
fillstring (hex, ör. "#FF0000")Şeklin dolgu rengi
opacitynumber (0–1)Dolgu opaklığı
strokestring (hex, ör. "#000000")Kontur rengi
strokeOpacitynumber (0–1)Kontur opaklığı
strokeWidthnumberKontur kalınlığı (piksel)
strokeDasharrayarray (ör. [5,5])Kesikli çizgi stili
fontSizenumberMetin boyutu (piksel)
valuestringMetin 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

MetotAçı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
ParametreVeri TürüAçıklama
values, upperValues, lowerValues(number \| null)[]Her mum için bir değer, null mumu gizler
fill, strokestring (hex) veya functionRenk 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)
opacitynumber (0–1) veya functionDolgu opaklığı, areaSeries / bandSeries için (value, i) / (upper, lower, i) işlevi
basenumber | nullareaSeries taban seviyesi, null = grafiğin alt kenarı
stepbooleanbandSeries 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 opak
plot.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ölgelendirilir
plot.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çenekVarsayılanAçıklama
stepgrafiğin tick boyutufiyat 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"
width30en 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
opacity0.6çubuk opaklığı
deltafalsetoplam yerine buy - sell çiz, yalnızca çiftler için
poctrueen büyük değere sahip satırda bir çizgi
valueArea70POC çevresinde tam opaklıkla çizilen toplamın yüzdesi, devre dışı bırakmak için false
valueAreaOpacity0.3değer alanı dışındaki satırların opaklığı
labelstrueyer 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üm
const 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 kenarda
const 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ış renginde
const 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 basar
const 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çenekVarsayılanAçıklama
position"top-right"panelin köşesi: "top-right", "top-left", "bottom-right", "bottom-left"
headerfalseilk satır gölgeli bir şerit üzerinde kalın çizilir
fontSize11px cinsinden metin boyutu, 8 ile 16 arası
color, bg, bordertemaya görevarsayılan metin, panel ve ızgara renkleri; bir hücre color ve bg değerlerini geçersiz kılabilir
opacity0.85panel 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

MetotAçı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

MetotAçı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

MetotAçı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

MetotAçı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

MetotAçı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

MetotAçı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}}.

MetotAçı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.

MetotAçı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

MetotAçıklama
fire(title, message, date)Bir alarm bildirimi tetikler
  • Üç parametrenin tümü zorunludur — title, message veya date eksik 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 mumun startTime değ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 tetiklenir
plot.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ün
plot.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ır
  • candleSeries — callback son mumu {open, close, high, low} alır
  • bandSeries — 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 eder
plot.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 edilir
plot.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ı al
const candles = source.ohlcv();
const colorUp = style.color("Color 1", "#2BB462"); // Yükselen fiyatlar için yeşilimsi renk
const colorDown = style.color("Color 2", "#FB4C51"); // Düşen fiyatlar için kırmızımsı renk
const 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ı al
const cbCandles = source.ohlcv('coinbase', 'BTC-USD');
const binanceCandles = source.ohlcv('binance', 'BTCUSDT');
// Kapanışları çıkar
const 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 çiz
plot.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ır
const 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ır
const 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ışında
const 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 doldurulur
plot.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 alarm
const latestRatio = ratios[b][lastIndex];
if (latestRatio != null && Math.abs(latestRatio) >= alertMinRatio) {
alert.fire(`Pressure ${lower}-${upper}%`, `ratio ${latestRatio.toFixed(1)}%`, candles[lastIndex].startTime);
}
});