Introduction to Time-Based Trade Closures in Pine Script
Traders often need precise control over when their positions are closed. Pine Script provides the tools to implement time-based exit strategies, allowing you to automatically close trades at a predetermined time. This is useful for strategies like end-of-day exits, or for traders who want to limit their exposure during specific market sessions.
Why Close Trades at a Specific Time?
- Risk Management: Limit overnight or weekend exposure.
- Strategic Execution: Implement strategies that capitalize on specific time windows.
- Consistency: Enforce rules that standardize trade durations.
- Automated Routine: Close all trades before certain events like news releases.
Overview of Pine Script’s Time-Related Functions
Pine Script offers several built-in functions to work with time:
time: Returns the current bar’s opening time in milliseconds since Unix epoch.timenow: Returns the current real-time in milliseconds since Unix epoch. Be aware that this only works in real-time alerts, not on historical bars.year,month,dayofmonth,dayofweek,hour,minute,second: Extract specific date/time components from a timestamp.timestamp: Creates a timestamp from year, month, day, hour, minute, and second components.session.time(): Returns the time of the current chart’s session.
Setting the Stage: Basic Strategy Structure
Before diving into time-based exits, let’s establish a basic strategy framework:
//@version=5
strategy("Time-Based Exit", overlay=true)
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
strategy.entry("Long", strategy.long)
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
strategy.entry("Short", strategy.short)
This strategy enters long or short positions based on moving average crossovers. We’ll now add a time-based exit.
Implementing a Time-Based Exit Strategy
Defining the Target Exit Time
First, define the desired exit time. This could be a specific hour and minute of the day.
exitHour = 16 // 4 PM
exitMinute = 0 // On the hour
Converting Time to a Usable Format (timestamp, session.time())
We will use the session.time() function. This automatically converts the provided time to the chart’s timezone.
Creating the Exit Condition: Comparing Current Time with Target Time
Now, compare the current session time to the target exit time.
targetExitTime = timestamp(year, month, dayofmonth, exitHour, exitMinute, 0)
currentTime = session.time()
shouldExit = currentTime >= targetExitTime
Submitting the Exit Order: strategy.close()
Finally, use strategy.close() to exit the position when the exit condition is met.
if (shouldExit)
strategy.close("Long", comment="Time Exit")
strategy.close("Short", comment="Time Exit")
Advanced Techniques and Considerations
Handling Different Time Zones
session.time() automatically handles time zone conversions based on your chart’s settings. If you need more precise control, consider using timestamp() function along with syminfo.timezone to handle different timezones.
Preventing Premature Closures: Ensuring the Trade is Active
Before closing the position, verify that a trade is actually open to prevent errors. Use strategy.position_size != 0 as a condition.
if (shouldExit and strategy.position_size != 0)
strategy.close("Long", comment="Time Exit")
strategy.close("Short", comment="Time Exit")
Combining Time-Based Exits with Other Exit Strategies (stop loss, take profit)
Combine time-based exits with stop-loss and take-profit orders for comprehensive risk management.
strategy.exit("Long Exit", "Long", stop = entryPrice - stopLoss, limit = entryPrice + takeProfit)
if (shouldExit and strategy.position_size != 0)
strategy.close("Long", comment="Time Exit")
Adjusting Exit Time Dynamically Based on Market Conditions
You can adjust the exit time based on volatility or other market factors using input.int() to make the exit time adjustable.
Practical Examples and Code Snippets
Simple Time-Based Exit: Closing at the End of the Trading Day
//@version=5
strategy("End of Day Exit", overlay=true)
// Entry Conditions (Replace with your own)
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
strategy.entry("Long", strategy.long)
// Exit Condition: Close at 4 PM
exitHour = 16
exitMinute = 0
targetExitTime = timestamp(year, month, dayofmonth, exitHour, exitMinute, 0)
currentTime = session.time()
shouldExit = currentTime >= targetExitTime
if (shouldExit and strategy.position_size != 0)
strategy.close("Long", comment="Time Exit")
Time-Based Exit with Stop Loss: Risk Management Integration
//@version=5
strategy("Time & Stop Loss Exit", overlay=true)
// Entry Conditions (Replace with your own)
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
strategy.entry("Long", strategy.long)
// Stop Loss
stopLossPips = 50
stopLoss = strategy.position_avg_price * (1 - stopLossPips / 10000)
// Exit Condition: Close at 4 PM or hit stop loss
exitHour = 16
exitMinute = 0
targetExitTime = timestamp(year, month, dayofmonth, exitHour, exitMinute, 0)
currentTime = session.time()
shouldExit = currentTime >= targetExitTime
if (shouldExit and strategy.position_size != 0)
strategy.close("Long", comment="Time Exit")
strategy.exit("Stop Loss Exit", "Long", stop = stopLoss)
Example: Backtesting and Optimization
To backtest and optimize your time-based exit, use the Strategy Tester in TradingView. Experiment with different exit times and stop-loss levels to find the most profitable settings. Be cautious about curve-fitting – make sure the selected parameters are still working in the current market environment.
Troubleshooting and Common Issues
Dealing with Time Zone Discrepancies
Always verify that your TradingView chart’s timezone settings match your desired timezone. When using timestamp() function, take syminfo.timezone into account, especially when the script needs to handle symbols with different timezones.
Handling Gaps in Trading Data
If your chart has gaps in the data, the target time might fall within a gap. In such cases, the exit order will be executed at the next available bar. You could implement additional logic to check for data gaps using na(close) and skip closing the trade if a gap is detected.
Debugging Time-Related Issues in Pine Script
Use plot() and label.new() functions to display time-related variables on the chart for debugging. This helps you visualize the current time, target exit time, and the shouldExit condition. For example:
plot(currentTime, title="Current Time")
plot(targetExitTime, title="Target Exit Time")
By mastering these techniques, you can effectively implement time-based exit strategies in your Pine Script trading algorithms, enhancing your control and risk management capabilities.