mod note:
This script uses future bars. It does not update in real time. It repaints retrospectively.
Because of the repainting, it is not possible to have scans or watchlists with this study

Author Message:
The Daily Single Trade Indicator by SMRT Algo is a powerful yet simple tool designed for traders who value precision, discipline, and a focus on high-quality trade setups. With a unique approach, this indicator identifies just one signal daily, making it ideal for traders who prefer a structured and stress-free trading routine.
More Details: https://www.tradingview.com/v/wbYd0P34/
Update - Code Fix - 02/2025
CSS:
#// Indicator for TOS
#// © SMRTAlgo
#indicator('Daily Single Trade [SMRT Algo]', shorttitle='Daily Single Trade [SMRT Algo]', overlay=true)
# Converted by Sam4Cok@Samer800 - 01/2025
# code fix by Sam4Cok@Samer800 - 02/2025
input resetSignalPeriod = AggregationPeriod.DAY;
input startTradingTime = 930; # "Market Open Time Hour"
input signalShape = {Default "Bubbles", "Arrows", "Don't Show"};
input ShowExitPoints = yes; # "Show Exit Point"
input showTradingLines = yes;
input RiskRewardRatio = 1.75; # "Risk-Reward Ratio"
input shareSize = 10;
def na = Double.NaN;
def last = isNaN(close);
def arrow = signalShape==signalShape."Arrows";
def bubble = signalShape==signalShape."Bubbles";
def cap = GetAggregationPeriod();
def Day = GetYYYYMMDD();
def restTf = Max(cap, resetSignalPeriod);
def reset = if !last then close(Period = restTf) else reset[1];
def specificTime = if Day!=Day[1] then yes else if (SecondsFromTime(startTradingTime) <=0) then yes else no;
def newDay = reset!=reset[1];
def Pip = atr(Length = 300) * 0.35;
def myLong; def myShort;
def candle1High; def candle1Low;
def stop_loss; def take_profit;
def tradeExecuted; def entryPrice;
def tradeExecuted1; def entryPrice1;
def tradeDirection; def tradeDirection1; def tradeDirection2;
if newDay {
tradeExecuted1 = no;
tradeDirection2 = 0;
entryPrice1 = na;
} else {
tradeExecuted1 = tradeExecuted[1];
tradeDirection2 = tradeDirection[1];
entryPrice1 = entryPrice[1];
}
if specificTime and !tradeExecuted1 {
#if (Day!=Day[1] or specificTime <= 0) and !tradeExecuted1 {
stop_loss = na;
take_profit = na;
entryPrice = entryPrice1;
tradeDirection1 = 0;
tradeExecuted = no;
candle1High = high;
candle1Low = low;
myLong = no;
myShort = no;
} else if !specificTime and !tradeExecuted1 {
#} else if specificTime > 0 and !tradeExecuted1 {
candle1High = if isNaN(entryPrice1) then high[1] else candle1High[1];
candle1Low = if isNaN(entryPrice1) then low[1] else candle1Low[1];
if close > candle1High {
entryPrice = open[-1]; #close;
stop_loss = candle1Low - Pip;
take_profit = entryPrice + (entryPrice - stop_loss) * RiskRewardRatio;
tradeDirection1 = 1;
tradeExecuted = yes;
myLong = entryPrice;
myShort = no;
} else if close < candle1Low {
entryPrice = open[-1];
stop_loss = candle1High + Pip;
take_profit = entryPrice - (stop_loss - entryPrice) * RiskRewardRatio;
tradeDirection1 = -1;
tradeExecuted = yes;
myLong = no;
myShort = entryPrice;
} else {
entryPrice = entryPrice1;
stop_loss = stop_loss[1];
take_profit = take_profit[1];
tradeDirection1 = tradeDirection2;
tradeExecuted = tradeExecuted1;
myLong = no;
myShort = no;
}
} else {
entryPrice = entryPrice1;
candle1High = candle1High[1];
candle1Low = candle1Low[1];
stop_loss = stop_loss[1];
take_profit = take_profit[1];
tradeDirection1 = tradeDirection2;
tradeExecuted = tradeExecuted1;
myLong = no;
myShort = no;
}
def win;
def earn;
def ExLong; def ExShort;
if tradeDirection1 == 1 {
ExShort = no;
if newDay[-1] {
ExLong = close;
tradeDirection = 0;
win = if ExLong > entryPrice then win[1] + 1 else win[1];
earn = earn[1] + (ExLong - entryPrice) * shareSize;
} else if high > take_profit {
ExLong = take_profit;
tradeDirection = 0;
win = win[1] + 1;
earn = earn[1] + (ExLong - entryPrice) * shareSize;
} else if close < stop_loss {
ExLong = close;
tradeDirection = 0;
win = win[1];
earn = earn[1] + (ExLong - entryPrice) * shareSize;
} else {
ExLong = no;
tradeDirection = tradeDirection1;
win = win[1];
earn = earn[1];
}
} else if tradeDirection1 == -1 {
ExLong = no;
if newDay[-1] {
ExShort = close;
tradeDirection = 0;
win = if ExShort < entryPrice then win[1] + 1 else win[1];
earn = earn[1] + (entryPrice - ExShort) * shareSize;
} else if low < take_profit {
ExShort = take_profit;
tradeDirection = 0;
win = win[1] + 1;
earn = earn[1] + (entryPrice - ExShort) * shareSize;
} else if close > stop_loss {
ExShort = close;
tradeDirection = 0;
win = win[1];
earn = earn[1] + (entryPrice - ExShort) * shareSize;
} else {
ExShort = no;
tradeDirection = tradeDirection1;
win = win[1];
earn = earn[1];
}
} else {
ExLong = no;
ExShort = no;
tradeDirection = tradeDirection1;
win = win[1];
earn = earn[1];
}
plot sl = if !last and showTradingLines and tradeDirection[1] and stop_loss[1] then stop_loss[1] else na;
plot tp = if !last and showTradingLines and tradeDirection[1] and take_profit[1] then take_profit[1] else na;
plot ep = if !last and showTradingLines and tradeDirection[1] and entryPrice[1] then entryPrice[1] else na;
ep.SetDefaultColor(Color.GRAY);
sl.SetDefaultColor(Color.RED);
tp.SetDefaultColor(Color.GREEN);
AddCloud(tp, ep, Color.DARK_GREEN, Color.DARK_GREEN);
AddCloud(sl, ep, Color.DARK_RED, Color.DARK_RED);
#-- Signals
plot exitLong = if ShowExitPoints and ExLong then ExLong else na;
plot exitShort = if ShowExitPoints and ExShort then ExShort else na;
plot enterLong = if Arrow and myLong[1] then low else na;
plot enterShort = if Arrow and myShort[1] then high else na;
exitLong.SetPaintingStrategy(PaintingStrategy.VALUES_ABOVE);
exitShort.SetPaintingStrategy(PaintingStrategy.VALUES_BELOW);
enterLong.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
enterShort.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
exitLong.AssignValueColor(if win!=win[1] then Color.CYAN else Color.MAGENTA);
exitShort.AssignValueColor(if win!=win[1] then Color.CYAN else Color.MAGENTA);
enterLong.SetDefaultColor(Color.CYAN);
enterShort.SetDefaultColor(Color.MAGENTA);
AddChartBubble(bubble and myLong[1], low, AsDollars(myLong[1]), Color.GREEN, no);
AddChartBubble(bubble and myShort[1], high, AsDollars(myShort[1]), Color.RED);
#--
def trades = if myLong then trades[1] + 1 else
if myShort then trades[1] + 1 else trades[1];
def winPer = win / trades;
AddLabel(1, "Trade(" + trades + ")", Color.WHITE);
AddLabel(1, "WinRate(" + AsPercent(winPer) + ")", if winPer > 0.5 then Color.GREEN else Color.RED);
AddLabel(1, "P/L(" + AsDollars(earn) + ")", if earn > 0 then Color.GREEN else Color.RED);
#-- END of CODE
Last edited by a moderator: