Move snippets and strategies folders to misc directory

This commit is contained in:
2025-02-28 15:20:34 -08:00
parent 7174c8dca2
commit 25f43bc40c
10 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
//@version=6
strategy('Hammer Candle Strategy', overlay = true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)
// Inputs for customization
hammertBodyRatio = input.float(0.3, title = 'Max Body Size Ratio', minval = 0.1, maxval = 0.5, step = 0.1)
hammerWickRatio = input.float(2.0, title = 'Min Wick to Body Ratio', minval = 1.0, maxval = 5.0, step = 0.1)
// Function to determine if a candle is bullish or bearish
is_candle_bullish(index) =>
close[index] > open[index]
is_candle_bearish(index) =>
close[index] < open[index]
// Hammer Candle Detection Function
//isHammer() =>
string dbg = ''
bodySize = math.abs(close - open)
totalRange = high - low
// Calculate upper and lower wicks
upperWick = high - math.max(close, open)
lowerWick = math.min(close, open) - low
// Check if body is small (less than 30% of total candle range)
isSmallBody = bodySize <= totalRange * hammertBodyRatio
//plotchar(isSmallBody, title="lw", char='-', location=location.abovebar, color=#40fbf5, size=size.small)
// Lower/Upper wick should be at least 2x the body size and significantly long
bool isLongUpperWick = upperWick >= totalRange * 0.5 and upperWick >= bodySize * hammerWickRatio
bool isLongLowerWick = lowerWick >= totalRange * 0.5 and lowerWick >= bodySize * hammerWickRatio
//plotchar(isLongUpperWick, title="LW", char='L', location=location.abovebar, color=color.fuchsia, size=size.small)
//plotchar(isLongLowerWick, title="lw", char='l', location=location.belowbar, color=color.fuchsia, size=size.small)
// Minimal lower/upper wick
bool isShortUpperWick = upperWick <= bodySize * 0.5 or upperWick <= totalRange * 0.2
bool isShortLowerWick = lowerWick <= bodySize * 0.5 or lowerWick <= totalRange * 0.2
//plotchar(isShortUpperWick, title="Bullish Candle", char='S', location=location.abovebar, color=color.fuchsia, size=size.small)
//plotchar(isShortLowerWick, title="Bullish Candle", char='s', location=location.belowbar, color=color.fuchsia, size=size.small)
// Bullish Hammer (Green/White)
isBullishHammer = isSmallBody and isShortUpperWick and isLongLowerWick //and is_candle_bearish(1) and is_candle_bearish(2) // and close > open
// Bearish Hammer (Red/Black)
isBearishHammer = isSmallBody and isLongUpperWick and isShortLowerWick // and is_candle_bullish(1) and is_candle_bullish(2) // and close < open
if isBearishHammer
dbg := 'TEST: ' + str.tostring(isShortUpperWick) + ' | ' + str.tostring(upperWick) + ' | ' + str.tostring(bodySize) + ' | ' + str.tostring(totalRange) + ' | '
dbg
// [isBullishHammer, isBearishHammer, dbg]
//[bullish, bearish, deb] = isHammer()
bullish = isBullishHammer
bearish = isBearishHammer
// Plot a '*' when close is above open (bullish candle)
plotchar(bullish, title = 'Bullish Candle', char = '*', location = location.belowbar, color = color.green, size = size.small)
// Plot an '*' when close is below open (bearish candle)
plotchar(bearish, title = 'Bearish Candle', char = '*', location = location.abovebar, color = color.red, size = size.small)
bullish := isBullishHammer and is_candle_bullish(1) and is_candle_bullish(2)
bearish := isBearishHammer and is_candle_bullish(1) and is_candle_bullish(2)
// Plot hammer candle markers
plotshape(bullish, title = 'Bullish Hammer', location = location.belowbar, style = shape.triangleup, size = size.small, color = color.green)
plotshape(bearish, title = 'Bearish Hammer', location = location.abovebar, style = shape.triangledown, size = size.small, color = color.red)
// Trading logic
if bullish
strategy.entry('Long', strategy.long)
if bearish
strategy.entry('Short', strategy.short)

View File

@@ -0,0 +1,18 @@
// Description: This script identifies high-volume bars that close up or down as potential indicators of bullish or bearish institutional activity, respectively. It generates buy and sell signals based on these conditions.
//@version=4
study("High Volume Bars Strategy", shorttitle="HVBS", overlay=true)
// Input parameters
length = input(14, title="Length")
multiplier = input(2, title="Multiplier")
// Calculate average volume
averageVolume = sma(volume, length)
// Generate signals
buySignal = crossover(volume, averageVolume * multiplier) and close > open
sellSignal = crossover(volume, averageVolume * multiplier) and close < open
// Plot buy and sell arrows
plotshape(buySignal, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(sellSignal, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

View File

@@ -0,0 +1,96 @@
//@version=5
strategy("Test Candle Close Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1, slippage=3)
// Input parameters for additional customization
riskPerTrade = input.float(1, title="Risk % per Trade", minval=0.1, maxval=5, step=0.1)
stopLossPercent = input.float(0.5, title="Stop Loss %", minval=0.1, maxval=2, step=0.1)
takeProfitPercent = input.float(1.5, title="Take Profit %", minval=0.5, maxval=5, step=0.1)
var string userKey = input.string("Xbwln5mblaaEBPDnFpVuTmbUqNax51CmjOEmdvuXSjc", "API Key")
var string userAccount = input.string("Sim101", "Account ID")
var string atmName = input.string("EMA_CROSS_50", "ATM Strategy Name")
var int numContracts = input.int(1, "Number of Contracts")
// Precise Start Date and Time inputs
startDateTimeX = input.time(timestamp("2024-11-21 00:01"), title="Start Date and Time")
var startDateTime = startDateTimeX + (6 * 60 * 60 * 1000) // Adjust to match 6h diff >> UTC to Chicago
startTime = input.string("00:15", title="Start Time (HH:MM)")
endTime = input.string("00:30", title="End Time (HH:MM)")
// Parse the input times
startHour = str.tonumber(str.substring(startTime, 0, 2))
startMinute = str.tonumber(str.substring(startTime, 3, 5))
endHour = str.tonumber(str.substring(endTime, 0, 2))
endMinute = str.tonumber(str.substring(endTime, 3, 5))
maxOrderCount = input.int(150, "MAX number of orders in the strategy")
// Order counting
var order_count = 0
// Time conditions and trade conditions
isWithinTimeWindow = (hour(time_close) > startHour or
(hour(time_close) == startHour and minute(time_close) >= startMinute)) and
(hour(time_close) < endHour or
(hour(time_close) == endHour and minute(time_close) <= endMinute))
isAfterStartDateTime = time_close >= startDateTime
within_trading_period = order_count <= maxOrderCount and isWithinTimeWindow and isAfterStartDateTime
// Determine candle direction
candleGreen = close > open
candleRed = close < open
// Build alerts
alertLong = "key=" + userKey + ";command=PLACE;account=" + userAccount + ";instrument=MNQ 12-24; action=BUY" + ";qty=" + str.tostring(numContracts) + ";order_type=MARKET;tif=DAY;strategy=" + atmName + ";flatten_first=true;"
alertShort = "key=" + userKey + ";command=PLACE;account=" + userAccount + ";instrument=MNQ 12-24; action=SELL" + ";qty=" + str.tostring(numContracts) + ";order_type=MARKET;tif=DAY;strategy=" + atmName + ";flatten_first=true;"
// Entry conditions - using barstate.isconfirmed to ensure we act on closed candles only
if (barstate.isconfirmed and within_trading_period)
// Close any existing positions and enter new ones based on candle color
if (candleGreen)
alert(alertLong)
order_count := order_count + 1
strategy.close_all()
strategy.entry("long", strategy.long, 1)
if (candleRed)
alert(alertShort)
order_count := order_count + 1
strategy.close_all()
strategy.entry("short", strategy.short, 1)
// Calculate stop loss and take profit levels for open positions
if (strategy.position_size != 0)
longStopPrice = strategy.position_avg_price * (1 - stopLossPercent/100)
longTakeProfit = strategy.position_avg_price * (1 + takeProfitPercent/100)
shortStopPrice = strategy.position_avg_price * (1 + stopLossPercent/100)
shortTakeProfit = strategy.position_avg_price * (1 - takeProfitPercent/100)
if (strategy.position_size > 0)
strategy.exit("Long TP/SL", "Long",
stop=longStopPrice,
limit=longTakeProfit)
if (strategy.position_size < 0)
strategy.exit("Short TP/SL", "Short",
stop=shortStopPrice,
limit=shortTakeProfit)
// Close all positions after 5000 candles
if (order_count == maxOrderCount)
strategy.close_all()
// Plotting for visual reference
plotshape(candleGreen and barstate.isconfirmed and within_trading_period, title="Long Entry", location=location.belowbar, style=shape.triangleup, size=size.small, color=color.green)
plotshape(candleRed and barstate.isconfirmed and within_trading_period, title="Short Entry", location=location.abovebar, style=shape.triangledown, size=size.small, color=color.red)
// Plot line showing where trading stops
plot(order_count == maxOrderCount ? high + (high * 0.001) : na, color=color.red, linewidth=2, style=plot.style_circles, title="Trading End Point")
// Plot line showing trading status
bgcolor(isAfterStartDateTime ? (isWithinTimeWindow ? color.new(color.green, 80) : color.new(color.red, 80)) : na)

View File

@@ -0,0 +1,20 @@
// Description: This script implements the VWAP Cross Strategy, which generates buy and sell signals when the price crosses the Volume Weighted Average Price (VWAP) line. This institutional approach is particularly relevant for intraday trading.
//@version=4
study("VWAP Cross Strategy", shorttitle="VCS", overlay=true)
// Calculate VWAP
vwap_sum = cum(close * volume)
volume_sum = cum(volume)
vwap = vwap_sum / volume_sum
// Generate buy and sell signals
buySignal = crossover(close, vwap)
sellSignal = crossunder(close, vwap)
// Plot VWAP on the chart
plot(vwap, title="VWAP", color=color.orange, linewidth=2)
// Plot buy and sell arrows
plotshape(buySignal, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(sellSignal, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)