Move snippets and strategies folders to misc directory
This commit is contained in:
74
misc/strategies/Candle_Bear-Bull_v6.pine
Executable file
74
misc/strategies/Candle_Bear-Bull_v6.pine
Executable 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)
|
||||
18
misc/strategies/High_Volume_Bars_Strategy.pine
Normal file
18
misc/strategies/High_Volume_Bars_Strategy.pine
Normal 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)
|
||||
96
misc/strategies/Strategy_Limit_DATE_TIME.pine
Executable file
96
misc/strategies/Strategy_Limit_DATE_TIME.pine
Executable 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)
|
||||
20
misc/strategies/VWAP_Cross.pine
Normal file
20
misc/strategies/VWAP_Cross.pine
Normal 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)
|
||||
|
||||
Reference in New Issue
Block a user