From 173efa460471b6df724da901a246516a5acdf519 Mon Sep 17 00:00:00 2001 From: jpwysocz Date: Fri, 13 Dec 2024 15:13:25 -0800 Subject: [PATCH] Update strategies/Strategy_Limit_DATE_TIME.pine --- ...tes.pine => Strategy_Limit_DATE_TIME.pine} | 192 +++++++++--------- 1 file changed, 96 insertions(+), 96 deletions(-) rename strategies/{Strategy_EveryBar_LimitOrders_and_Dates.pine => Strategy_Limit_DATE_TIME.pine} (98%) diff --git a/strategies/Strategy_EveryBar_LimitOrders_and_Dates.pine b/strategies/Strategy_Limit_DATE_TIME.pine similarity index 98% rename from strategies/Strategy_EveryBar_LimitOrders_and_Dates.pine rename to strategies/Strategy_Limit_DATE_TIME.pine index d8178ac..bffc908 100755 --- a/strategies/Strategy_EveryBar_LimitOrders_and_Dates.pine +++ b/strategies/Strategy_Limit_DATE_TIME.pine @@ -1,96 +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) +//@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)