Ejemplos de scripts
1Ejemplos de scripts
Ocho scripts listos en LootScript: medias móviles, RSI, VWAP con bandas, CVD con divergencias, interés abierto, tasa de financiación, disbalances de clústeres y una estrategia para el probador.
Ocho scripts listos en LootScript: desde medias móviles y RSI hasta CVD, interés abierto, tasa de financiación y clústeres. Cada uno es un indicador funcional que puedes añadir al Gráfico y ajustar. Todos los ejemplos compilan sin errores ni advertencias con el compilador de la versión actual.
Cómo ejecutar un ejemplo
- Haga clic en ƒ en el panel del Gráfico; en la ventana Indicadores — Editor….
- En el Editor haga clic en Nuevo (Ctrl+N), reemplace la plantilla por el código del ejemplo y pulse Guardar.
- Pulse Añadir al gráfico (Ctrl+Enter). Las opciones de
input.*aparecerán en la ventana de configuración del indicador.
1. Tres medias móviles con selección de tipo
Rápida, media y lenta del mismo tipo, seleccionable. El fondo se ilumina cuando las tres se alinean a favor de la tendencia.
indicator("Три скользящие", shortTitle = "MA×3", overlay = true)
maType = input.string("EMA", "Тип средней", options = ["EMA", "SMA", "WMA", "HMA"])
src = input.source(close, "Источник")
len1 = input.int(20, "Быстрая", minval = 1)
len2 = input.int(50, "Средняя", minval = 1)
len3 = input.int(200, "Медленная", minval = 1)
func ma(s, len) => switch maType {
"SMA" => ta.sma(s, len)
"WMA" => ta.wma(s, len)
"HMA" => ta.hma(s, len)
=> ta.ema(s, len)
}
m1 = ma(src, len1)
m2 = ma(src, len2)
m3 = ma(src, len3)
plot(m1, "Быстрая", color = m1 >= m1[1] ? color.teal : color.red, linewidth = 2)
plot(m2, "Средняя", color = color.orange)
plot(m3, "Медленная", color = color.gray, linewidth = 2)
bgcolor(m1 > m2 and m2 > m3 ? color.new(color.teal, 20) : m1 < m2 and m2 < m3 ? color.new(color.red, 20) : na)Cómo funciona
input.stringconoptionsse convierte en un menú desplegable en la configuración.- La función
maelige la media medianteswitch. El estadota.*vive por cada llamada, por eso tres llamadas amason tres medias independientes. - El color de la línea rápida es una expresión: si sube respecto a la barra anterior (
m1[1]) es teal, si baja es rojo. - El panel puede dibujar hasta tres líneas
plotpor script — de ahí que haya tres medias.
2. RSI con zonas y alertas
RSI con una banda rellenada entre niveles. La línea y el fondo se colorean cuando el RSI está en sobrecompra o sobreventa.
indicator("RSI с зонами", shortTitle = "RSI", overlay = false)
len = input.int(14, "Период", minval = 2)
src = input.source(close, "Источник")
ob = input.float(70, "Перекупленность", minval = 50, maxval = 100)
os = input.float(30, "Перепроданность", minval = 0, maxval = 50)
r = ta.rsi(src, len)
hOb = hline(ob, "Перекупленность", color = color.red)
hOs = hline(os, "Перепроданность", color = color.teal)
fill(hOb, hOs, color = color.new(color.purple, 20))
plot(r, "RSI", color = r > ob ? color.red : r < os ? color.teal : color.purple, linewidth = 2)
bgcolor(r > ob ? color.new(color.red, 35) : r < os ? color.new(color.teal, 35) : na)
alertcondition(ta.crossunder(r, ob), "RSI вышел из перекупленности", "RSI опустился ниже верхнего уровня")
alertcondition(ta.crossover(r, os), "RSI вышел из перепроданности", "RSI поднялся выше нижнего уровня")Cómo funciona
hlinedevuelve una asa del nivel, yfillrellena la franja entre dos asas.- Los niveles son ajustes
input.float, por eso las líneas y la relleno se mueven con ellos. alertconditiondeclara dos alertas. Por sí solas no suenan — cómo activarlas está en la página Alertas de script.- La alfa en
color.newva de 0 (transparente) a 255 (opaco).
3. VWAP del día con bandas de desviación
Precio ponderado por volumen desde el inicio del día en UTC y una banda de ±σ alrededor.
indicator("VWAP дня с полосами", shortTitle = "VWAP", overlay = true)
src = input.source(hlc3, "Цена")
mult = input.float(1.0, "Ширина полосы, σ", minval = 0.1, step = 0.1)
anchor = session.isfirstbar
vw = ta.vwap(src, anchor)
// Сумма объёма и сумма объёма на квадрат цены с начала дня — для разброса вокруг VWAP.
var float sumV = 0.0
var float sumV2 = 0.0
if anchor {
sumV := 0.0
sumV2 := 0.0
}
if not na(volume) and not na(src) {
sumV := sumV + volume
sumV2 := sumV2 + volume * src * src
}
sigma = sumV > 0 and not na(vw) ? math.sqrt(math.max(sumV2 / sumV - vw * vw, 0)) : na
pUp = plot(vw + mult * sigma, "Верх", color = color.new(color.blue, 150))
plot(vw, "VWAP", color = color.blue, linewidth = 2)
pDn = plot(vw - mult * sigma, "Низ", color = color.new(color.blue, 150))
fill(pUp, pDn, color = color.new(color.blue, 25))Cómo funciona
ta.vwapreinicia el cálculo en la barra donde el ancla es verdadera. En cripto,session.isfirstbares la primera barra después de las 00:00 UTC.- Las variables
varsobreviven entre barras. El mismo ancla las pone a cero, por eso la banda se calcula para el mismo período que el VWAP. - La desviación es la raíz de la media ponderada del cuadrado del precio menos el cuadrado del VWAP.
math.max(…, 0)protege contra pequeños negativos por redondeo. - Tiene sentido en temporalidades intradía. Si quieres VWAP desde la última liquidación de funding, pon
anchor = funding.settled.
4. CVD diaria con divergencias
Delta acumulada que se reinicia cada día, y marcas en las barras donde el precio renovó extremo pero la delta no lo confirmó.
indicator("Дневная кумдельта с расхождениями", shortTitle = "CVD", overlay = false)
len = input.int(20, "Окно поиска максимумов", minval = 3)
var float cvd = 0.0
if session.isfirstbar {
cvd := 0.0
}
if delta.available {
cvd := cvd + delta.value
}
cvdLine = delta.available ? cvd : na
// Цена обновила максимум окна, а кумдельта — нет: покупатели не подтверждают рост.
bearish = high >= ta.highest(high, len) and cvdLine < ta.highest(cvdLine, len)
bullish = low <= ta.lowest(low, len) and cvdLine > ta.lowest(cvdLine, len)
plot(cvdLine, "Кумдельта", color = cvdLine >= 0 ? color.teal : color.red, linewidth = 2)
hline(0, "Ноль", color = color.gray)
plotshape(bearish, "Медвежье расхождение", style = shape.triangledown, location = location.top, color = color.red, size = size.tiny)
plotshape(bullish, "Бычье расхождение", style = shape.triangleup, location = location.bottom, color = color.teal, size = size.tiny)Cómo funciona
delta.valueson compras agresivas menos ventas agresivas por barra. Donde no hay cobertura,delta.availablees falso y la línea se interrumpe en vez de dibujar un cero.- El acumulador
varse reinicia al inicio del día. Si necesitas una CVD que no se reinicie en todo el histórico cargado, usa la seriedelta.cumya preparada. - Divergencia: el precio marca el máximo de la ventana, pero la CVD está por debajo de su máximo en la misma ventana. Para mínimos, el criterio es simétrico.
location.topylocation.bottomcolocan las marcas en los bordes del subpanel, no en el precio.
5. Picos de interés abierto
Cambio del interés abierto barra a barra en porcentaje y marcas donde se sale del rango habitual de variación.
indicator("Изменение открытого интереса", shortTitle = "ΔOI %", overlay = false)
len = input.int(50, "Окно для всплесков", minval = 5)
k = input.float(3.0, "Порог всплеска, σ", minval = 0.5, step = 0.5)
pct = oi.available and oi.close[1] > 0 ? 100 * (oi.close - oi.close[1]) / oi.close[1] : na
sd = ta.stdev(pct, len)
spike = not na(sd) and math.abs(pct) > k * sd
plot(pct, "ΔOI, %", style = plot.style_columns, color = pct >= 0 ? color.teal : color.red)
hline(0, "Ноль", color = color.gray)
plotshape(spike, "Всплеск", style = shape.circle, location = location.top, color = color.orange, size = size.tiny)Cómo funciona
oi.closees el interés abierto al cierre de la barra;oi.close[1]el de la barra anterior. La comprobaciónoi.availableevita calcular cambios desde datos faltantes.- Un pico es una barra donde el cambio absoluto excede
kdesviaciones estándar sobre la ventanalen. - El interés abierto llega con frecuencia minuto a minuto. En temporalidades menores al minuto las barras contiguas repiten el mismo valor y el cambio es cero — eso son datos, no un error.
6. Tasa de financiación
La tasa de financiación de un futuro perpetuo, en porcentaje por periodo o reexpresada a anual, con marcas de pago y resaltado de tasa alta.
indicator("Ставка финансирования", shortTitle = "Funding", overlay = false)
mode = input.string("За период", "Показывать", options = ["За период", "Годовых"])
thr = input.float(0.05, "Порог, %", minval = 0.0, step = 0.01)
perPeriod = funding.rate * 100
periodsPerYear = funding.interval_hours > 0 ? 24.0 / funding.interval_hours * 365 : na
value = mode == "Годовых" ? perPeriod * periodsPerYear : perPeriod
level = mode == "Годовых" ? thr * periodsPerYear : thr
plot(value, "Ставка, %", style = plot.style_columns, color = value >= 0 ? color.teal : color.red)
hline(0, "Ноль", color = color.gray)
plotshape(funding.settled, "Выплата", style = shape.circle, location = location.bottom, color = color.gray, size = size.tiny)
bgcolor(math.abs(value) > level ? color.new(color.orange, 30) : na)Cómo funciona
funding.ratees el factor, no el porcentaje: 0.0001 representa 0,01 %. Por eso la tasa se multiplica por 100.- Para anualizar, la tasa se multiplica por el número de pagos al año.
24.0está escrito con punto para evitar división entera. funding.settledes verdadero en la barra donde hubo pago; ahí se coloca un punto en la parte inferior.- El umbral se define por periodo y para las anualizadas se recalcula con el mismo multiplicador.
7. Disbalances en clústeres
Marcas en el precio donde en los clústeres hay una “escalera” de disbalances o simplemente muchos disbalances, más el nivel de volumen máximo (POC) de cada barra.
indicator("Дисбалансы кластеров", shortTitle = "Imbalance", overlay = true)
minSteps = input.int(3, "Уровней подряд", minval = 2)
minCount = input.int(5, "Дисбалансов в баре", minval = 1)
levels = cluster.available ? cluster.levels : 0
buys = 0
sells = 0
for i in 0 .. levels {
side = cluster.imbalance(i)
if side == 1 {
buys := buys + 1
} else if side == -1 {
sells := sells + 1
}
}
plot(cluster.poc, "POC", style = plot.style_circles, color = color.orange)
plotshape(cluster.stacked_buy_steps >= minSteps, "Лесенка покупок", style = shape.triangleup, location = location.belowbar, color = color.teal, size = size.small)
plotshape(cluster.stacked_sell_steps >= minSteps, "Лесенка продаж", style = shape.triangledown, location = location.abovebar, color = color.red, size = size.small)
plotshape(buys >= minCount, "Много дисбалансов покупок", style = shape.circle, location = location.belowbar, color = color.new(color.teal, 120), size = size.tiny)
plotshape(sells >= minCount, "Много дисбалансов продаж", style = shape.circle, location = location.abovebar, color = color.new(color.red, 120), size = size.tiny)Cómo funciona
cluster.imbalance(i)devuelve +1, −1 o 0 para el nivel de precioi. El umbral de disbalance lo toma la configuración de clústeres del Gráfico, así que el script ve lo mismo que tú.cluster.stacked_buy_stepses cuántos niveles consecutivos hay con disbalance de compras. El buclefor i in 0 .. levelscuenta todos los disbalances de la barra, no solo los consecutivos.- El script se suscribe a los clústeres y funciona sobre un gráfico de velas normal. En exchanges sin cobertura y en temporalidades menores a 30 segundos o mayores a un día no hay clústeres — entonces
levelses 0 y no habrá marcas.
8. Estrategia: cruce de EMA con stop basado en ATR
Entrada largo al cruce de medias, stop y objetivo en múltiplos de ATR, salida por cruce inverso.
strategy("EMA-кросс со стопом по ATR", overlay = true, initialCapital = 10000,
defaultQtyType = strategy.qty.percent_of_equity, defaultQtyValue = 10,
slippageTicks = 2)
fastLen = input.int(12, "Быстрая EMA", minval = 1)
slowLen = input.int(26, "Медленная EMA", minval = 2)
atrLen = input.int(14, "Период ATR", minval = 1)
stopK = input.float(1.5, "Стоп, в ATR", minval = 0.1, step = 0.1)
takeK = input.float(3.0, "Цель, в ATR", minval = 0.1, step = 0.1)
fast = ta.ema(close, fastLen)
slow = ta.ema(close, slowLen)
atr = ta.atr(atrLen)
// ATR запоминается в момент сигнала, чтобы стоп и цель не ползли вслед за волатильностью.
var float riskAtr = na
if ta.crossover(fast, slow) and strategy.position_size == 0 {
riskAtr := atr
strategy.entry("Long", strategy.long)
}
if ta.crossunder(fast, slow) {
strategy.close("Long", comment = "Обратный кросс")
}
if strategy.position_size > 0 {
entry = strategy.position_avg_price
strategy.exit("Стоп/цель", from_entry = "Long", stop = entry - stopK * riskAtr, limit = entry + takeK * riskAtr)
}
plot(fast, "Быстрая", color = color.teal)
plot(slow, "Медленная", color = color.orange)Cómo funciona
- Los parámetros de
strategy(…)son literales: capital 10 000, tamaño de posición 10 % del capital, deslizamiento 2 ticks. No hay comisión fijada, por eso el probador usa la tarifa por defecto: 0,02 % para ejecución límite y 0,05 % para mercado y stop. Tu propia tarifa en porcentaje se define concommissionValue. - La entrada de mercado se ejecuta en la apertura de la barra siguiente, no en el cierre de la señal: así el probador no mira al futuro.
strategy.exitcoloca stop y objetivo desde el precio medio de entrada. Si en una barra se tocan ambos, el probador por defecto considera que se ejecutó el stop.- Resultados — operaciones, curva de capital, drawdowns — aparecen en la ventana Probador de estrategias… del Editor. Más detalles en Estrategias y probador.
Más
https://docs.lootx.trade/es/loot/examples