ChatGPT, BARD, Other AI Scripts Which Can't Be Used In ThinkOrSwim

MerryDay

Administrative
Staff member
Staff
VIP
Lifetime
90% of the members attempting chatGPT scripting; do not provide good detailed specifications.

Members know what end result that they want but lack the ability to tell chatGPT, the step-by-step logic required to code a script to achieve that end result.
This results in chatGPT providing poor code.

Here is a video on how to successfully have chatGPT create functional scripts.

The above video, explains the basics of providing good specifications to AI which results in better scripts.
AOzhl05.png
 
Last edited:
Im getting symbol error

# Define the Volume Profile
input pricePerRowHeightMode = {default TICKSIZE, ATR, PERCENT};
input timePerProfile = {default CHART, MINUTE, HOUR, DAY, WEEK, MONTH, "OPT EXP", BAR};
input multiplier = 1;
input onExpansion = yes;
input profiles = 1;
input showPointOfControl = yes;
input showValueArea = yes;
input valueAreaPercent = 70;

def na = Double.NaN;
def bn = BarNumber();
def isNaN = IsNaN(close);
def profile = VolumeProfile("price per row height mode" = pricePerRowHeightMode, "time per profile" = timePerProfile, multiplier = multiplier, onExpansion = onExpansion, numberOfProfiles = profiles, "value area percent" = valueAreaPercent);
def poc = if showPointOfControl then GetValue(profile.GetPointOfControl(), 0) else na;
def vah = if showValueArea then GetValue(profile.GetHighestValueArea(), 0) else na;
def val = if showValueArea then GetValue(profile.GetLowestValueArea(), 0) else na;

# Plot the POC, VAH, and VAL
plot POC = poc;
plot VAH = vah;
plot VAL = val;

POC.SetDefaultColor(Color.RED);
VAH.SetDefaultColor(Color.GREEN);
VAL.SetDefaultColor(Color.BLUE);

# Define Buy and Sell Conditions
def buySignal = close > VAL and close crosses above VAL;
def sellSignal = close VAH and close crosses below VAH;

# Add Orders
AddOrder(OrderType.BUY_AUTO, buySignal, open[-1], 100, Color.CYAN, Color.CYAN, "Buy");
AddOrder(OrderType.SELL_AUTO, sellSignal, open[-1], 100, Color.MAGENTA, Color.MAGENTA, "Sell");
 

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

I created a Watchlist column to sort thru symbols faster,
for current number of closes within 1 range to the last close. Yet still wrong counts but closer.

Only the total # of closes near the last close (can be edited to last price), with a small buffer range of .0035 higher or lower.
(the very tiny range threshold can be edited,)

I asked both ChatGpt & Bard, & very much the same result, both were fails, so I actually wrote this piecemeal from the chart version.

My piecemeal code... still wrong counts but closer.
# Define a Range around LastClose !!
input lookbackPeriod = 10; #?!! I used to a long time ago but I'm too busy,
input threshold = 0.0035; # ranges + or - percent

def lastClose = if !isnan(close[-1]) then close[-1] else 0;
def increment = lastClose * threshold;

def range1Low = lastClose - increment;
def range1High = lastClose + increment;
def range = range1High - range1Low;

def candleCount = sum(if !isnan(close) and close >= range1Low and close <= range1High then 1 else 0, lookbackPeriod);

# Plot the result in the watchlist column
plot result = candleCount;
------------------------------------------------
:) Someday maybe adding an RSI:
Rsi w/3 different font colors upon conditions:
1) if the total #of bars near the last close were <6 with a low RSI (30% or less), "green font (buy)"
2) and if the total #of bars near the last close were >15 or <6, with a high RSI (60% or more). "red font (sell)"

Where a low bar count w/a low rsi would indicate an entry,
and a high bar count or extremely low bar count w/a high rsi would indicate an exit.
On some charts it looks like nice entry & exit.

My pretty font colored RSI for a Watchlist Column:
input VLow =35;
input Low = 42;
input High = 58;
input VHigh = 68;

plot RSI = Round(RSI(),0);

RSI.AssignValueColor(
if RSI < VLow then Color.GREEN
else if RSI >= VLow and RSI < Low then CreateColor(97, 155, 22)
else if RSI >= Low and RSI < High then CreateColor(209, 229, 182)
else if RSI >= High and RSI < VHigh then CreateColor(178, 109, 218)
else CreateColor(208, 43, 98)
);
----------------------------

here is a simplified lower version that should work as a watchlist

Code:
# cnt_closes_within_rng_0_lower

#https://usethinkscript.com/threads/chatgpt-bard-other-ai-scripts-which-cant-be-used-in-thinkorswim.13822/page-15#post-146703

declare lower;

def na = Double.NaN;
def bn = BarNumber();

#def lastbn = HighestAll(If(IsNaN(close), 0, bn));
#def lastbar = if (bn == lastbn) then 1 else 0;
def lastbar = !IsNaN(close[0]) and IsNaN(close[-1]);
#def last_close = highestall(if lastbar then close else 0);

#------------------------
#https://usethinkscript.com/threads/current-price-line-indicator-for-thinkorswim.8793/
# Line At Price    Mobius
def barsBack = 1000;
def c = if !IsNaN(close) and IsNaN(close[-1])
       then close
       else c[1];
def line = if IsNaN(close[-barsBack])
       then c[-barsBack]
       else Double.NaN;
#------------------------

input range_percent = 1.0;
def upper1 = line * (1 + range_percent / 100);
def lower1 = line * (1 - range_percent / 100);
input look_back_period = 96;
def x = !IsNaN(close[-(look_back_period-1)]) and IsNaN(close[-(look_back_period+0)]);

def cnt;
if bn == 1 then {
  cnt = 0;
} else if lastbar then {
  cnt = fold a = 0 to look_back_period 
  with b
  do b + (if (upper1 > getvalue(close, a) and lower1 < getvalue(close, a)) then 1 else 0);
} else {
 cnt = cnt[1];
}

plot z = cnt;
z.setdefaultcolor(color.cyan);
#
 
Im getting symbol error

# Define the Volume Profile
input pricePerRowHeightMode = {default TICKSIZE, ATR, PERCENT};
input timePerProfile = {default CHART, MINUTE, HOUR, DAY, WEEK, MONTH, "OPT EXP", BAR};
input multiplier = 1;
input onExpansion = yes;
input profiles = 1;
input showPointOfControl = yes;
input showValueArea = yes;
input valueAreaPercent = 70;

def na = Double.NaN;
def bn = BarNumber();
def isNaN = IsNaN(close);
def profile = VolumeProfile("price per row height mode" = pricePerRowHeightMode, "time per profile" = timePerProfile, multiplier = multiplier, onExpansion = onExpansion, numberOfProfiles = profiles, "value area percent" = valueAreaPercent);
def poc = if showPointOfControl then GetValue(profile.GetPointOfControl(), 0) else na;
def vah = if showValueArea then GetValue(profile.GetHighestValueArea(), 0) else na;
def val = if showValueArea then GetValue(profile.GetLowestValueArea(), 0) else na;

# Plot the POC, VAH, and VAL
plot POC = poc;
plot VAH = vah;
plot VAL = val;

POC.SetDefaultColor(Color.RED);
VAH.SetDefaultColor(Color.GREEN);
VAL.SetDefaultColor(Color.BLUE);

# Define Buy and Sell Conditions
def buySignal = close > VAL and close crosses above VAL;
def sellSignal = close VAH and close crosses below VAH;

# Add Orders
AddOrder(OrderType.BUY_AUTO, buySignal, open[-1], 100, Color.CYAN, Color.CYAN, "Buy");
AddOrder(OrderType.SELL_AUTO, sellSignal, open[-1], 100, Color.MAGENTA, Color.MAGENTA, "Sell");

the error lists the line number

this line is missing a comparing symbol.
you have close vah,
missing something in between them.
def sellSignal = close VAH and close crosses below VAH;
 
here is a simplified lower version that should work as a watchlist

Code:
# cnt_closes_within_rng_0_lower

#https://usethinkscript.com/threads/chatgpt-bard-other-ai-scripts-which-cant-be-used-in-thinkorswim.13822/page-15#post-146703

declare lower;

def na = Double.NaN;
def bn = BarNumber();

#def lastbn = HighestAll(If(IsNaN(close), 0, bn));
#def lastbar = if (bn == lastbn) then 1 else 0;
def lastbar = !IsNaN(close[0]) and IsNaN(close[-1]);
#def last_close = highestall(if lastbar then close else 0);

#------------------------
#https://usethinkscript.com/threads/current-price-line-indicator-for-thinkorswim.8793/
# Line At Price    Mobius
def barsBack = 1000;
def c = if !IsNaN(close) and IsNaN(close[-1])
       then close
       else c[1];
def line = if IsNaN(close[-barsBack])
       then c[-barsBack]
       else Double.NaN;
#------------------------

input range_percent = 1.0;
def upper1 = line * (1 + range_percent / 100);
def lower1 = line * (1 - range_percent / 100);
input look_back_period = 96;
def x = !IsNaN(close[-(look_back_period-1)]) and IsNaN(close[-(look_back_period+0)]);

def cnt;
if bn == 1 then {
  cnt = 0;
} else if lastbar then {
  cnt = fold a = 0 to look_back_period
  with b
  do b + (if (upper1 > getvalue(close, a) and lower1 < getvalue(close, a)) then 1 else 0);
} else {
 cnt = cnt[1];
}

plot z = cnt;
z.setdefaultcolor(color.cyan);
#
 
Trying a bot script and I have everything good to go BUT 1 thing. Can anyone tell me what I need to fix this?
(Red text)
# Close price, switchable to Heikin Ashi
def src = if useHeikinAshi then
HeikinAshiClose() else close;

Full script below:


# Bot Alerts Test

input a = 1; # Key Value (Sensitivity)
input c = 10; # ATR Period
input useHeikinAshi = no; # Option to switch between regular close and Heikin Ashi candles

# ATR Calculation
def xATR = ATR(c);
# Close price, switchable to Heikin Ashi
def src = if useHeikinAshi then HeikinAshiClose() else close;

# Calculate the trailing stop using ATR
def nLoss = a * xATR;
def xATRTrailingStop = if IsNaN(xATRTrailingStop[1]) then src - nLoss # Initialize the ATR trailing stop
else if src > xATRTrailingStop[1] and src[1] > xATRTrailingStop[1] then Max(xATRTrailingStop[1], src - nLoss)
else if src < xATRTrailingStop[1] and src[1] < xATRTrailingStop[1] then Min(xATRTrailingStop[1], src + nLoss)
else if src > xATRTrailingStop[1] then src - nLoss
else src + nLoss;

# Position state: 1 for long, -1 for short, 0 for neutral
def pos = if IsNaN(pos[1]) then 0 # Initialize position state
else if src[1] < xATRTrailingStop[1] and src > xATRTrailingStop[1] then 1
else if src[1] > xATRTrailingStop[1] and src < xATRTrailingStop[1] then -1
else pos[1];

# EMA Calculation for crossover logic
def ema = ExpAverage(src, 9); # You had '1' period, I adjusted to '9' for typical EMA smoothing
def above = Crosses(ema, xATRTrailingStop, CrossingDirection.ABOVE);
def below = Crosses(xATRTrailingStop, ema, CrossingDirection.ABOVE);

# Buy and Sell conditions
def buy = src > xATRTrailingStop and above;
def sell = src < xATRTrailingStop and below;

# Bar coloring conditions
def barbuy = src > xATRTrailingStop;
def barsell = src < xATRTrailingStop;

# Plot signals using arrows
AddChartBubble(buy, low, "Buy", Color.GREEN, yes);
AddChartBubble(sell, high, "Sell", Color.RED, no);

# Set bar colors for buy/sell conditions
AssignPriceColor(if barbuy then Color.GREEN else if barsell then Color.RED else Color.CURRENT);

# Alerts
Alert(buy, "UT Long", Alert.BAR, Sound.Ding);
Alert(sell, "UT Short", Alert.BAR, Sound.Ding);
 
Awesome, I'll let you know how it works, for now tho, I'm struggling with excel calc memory errors, every morning 1-2 hrs. Therefore switching to rtd, getting away from using stockhistory as much as possible. watch out though they could discontinue it, since I mentioned it.
Cheers!!

Update: Your script works like a charm. I'm spoiled now, thank you very much !! What a relief

I updated it to support an RSI (14) with colors for buy & sell signals. All for a watchlist:
-----------------------
# Candle Count & RSI: Watchlist Column study helper for buy/sell signals
(use RSI next to it in a 2nd column w/t/same colors to view actual RSI %'s,
something volume like a vwap could help it also).

def na = Double.NaN;
def bn = BarNumber();
def lastbar = !IsNaN(close[0]) and IsNaN(close[-1]);

input range_percent = 3;
input look_back_period = 96;

# Capture the last closing price within a range
def c = if !IsNaN(close) and IsNaN(close[-1])
then close
else c[1];

def line = if IsNaN(close[-look_back_period])
then c[-look_back_period]
else Double.NaN;

def upper1 = line * (1 + range_percent / 100);
def lower1 = line * (1 - range_percent / 100);

def cnt;
if bn == 1 then {
cnt = 0;
} else if lastbar then {
cnt = fold a = 0 to look_back_period
with b
do b + (if (upper1 > GetValue(close, a) and lower1 < GetValue(close, a)) then 1 else 0);
} else {
cnt = cnt[1];
}

# RSI Calculation
def RSIValue = RSI();

# Conditions
def buyCondition = cnt < 8 and RSIValue < 21;
def buymaybeCondition = cnt < 16 and RSIValue <40;
def sellmaybeCondition = (cnt <= 8 or cnt > 30) and (RSIValue >60 and RSIValue <70);
def sellCondition = (cnt <= 8 or cnt > 30) and RSIValue >= 70;


# Plot the candle count as the only value displayed
plot CandleCount = cnt;

# Assign color to the CandleCount plot based on conditions
CandleCount.AssignValueColor(
if buyCondition then Color.Green # Green for Buy
else if buymaybeCondition then CreateColor(97, 155, 22) # gr dk for buy maybe
else if sellmaybeCondition then CreateColor(178, 109, 218) # pink for Sell maybe
else if sellCondition then CreateColor(208, 43, 98) # Red for Sell
else CreateColor(164, 149, 111 ) # taupe for neutral
);

----
It does not really catch stocks that don't move, like many reit's.
This is a long term catch, rather than an intraday, & of course dud stocks are still included when they're falling out of orbit.
Shorter term intraday, that would be another challenge for this little column.
:)
 
Last edited:
I'm getting started with thinkscript and I would like to write a custom study that can be used in the scanner to find stocks which have a price range from 12pm-4pm EST which is greater than their 9:30am-12pm price range. I would of course run this scan at the end of the day (~3:50pm EST) so that the relevant data is available. It seems simple enough, but the results do not seem to match the criteria. Here is what I have so far:

Code:
# Define the start and end times for both periods
input morningStartTime = 0930;
input morningEndTime = 1200;
input afternoonStartTime = 1201;
input afternoonEndTime = 1530;

# Calculate the morning high and low within the specified time frame
def inMorningSession = SecondsFromTime(morningStartTime) >= 0 and SecondsTillTime(morningEndTime) >= 0;
def morningHigh = if inMorningSession then Max(morningHigh[1], high) else morningHigh[1];
def morningLow = if inMorningSession then Min(morningLow[1], low) else morningLow[1];

# Calculate the afternoon high and low within the specified time frame
def inAfternoonSession = SecondsFromTime(afternoonStartTime) >= 0 and SecondsTillTime(afternoonEndTime) >= 0;
def afternoonHigh = if inAfternoonSession then Max(afternoonHigh[1], high) else afternoonHigh[1];
def afternoonLow = if inAfternoonSession then Min(afternoonLow[1], low) else afternoonLow[1];

# Calculate the ranges for both periods
def morningRange = morningHigh - morningLow;
def afternoonRange = afternoonHigh - afternoonLow;

def isLastBar = SecondsTillTime(afternoonEndTime) <= 0;

# Compare the ranges and plot the condition
plot condition = if isLastBar and afternoonRange > morningRange then 1 else 0;

Apologies that I cannot ask a more specific question, because I've also not been able to figure out how to test or debug my code. I just run it against live data and get a list of stocks which do not meet the criteria I've described. Any point in the right direction would be greatly appreciated.
 
Trying a bot script and I have everything good to go BUT 1 thing. Can anyone tell me what I need to fix this?
(Red text)
# Close price, switchable to Heikin Ashi
def src = if useHeikinAshi then
HeikinAshiClose() else close;

Full script below:


# Bot Alerts Test

input a = 1; # Key Value (Sensitivity)
input c = 10; # ATR Period
input useHeikinAshi = no; # Option to switch between regular close and Heikin Ashi candles

# ATR Calculation
def xATR = ATR(c);
# Close price, switchable to Heikin Ashi
def src = if useHeikinAshi then HeikinAshiClose() else close;

# Calculate the trailing stop using ATR
def nLoss = a * xATR;
def xATRTrailingStop = if IsNaN(xATRTrailingStop[1]) then src - nLoss # Initialize the ATR trailing stop
else if src > xATRTrailingStop[1] and src[1] > xATRTrailingStop[1] then Max(xATRTrailingStop[1], src - nLoss)
else if src < xATRTrailingStop[1] and src[1] < xATRTrailingStop[1] then Min(xATRTrailingStop[1], src + nLoss)
else if src > xATRTrailingStop[1] then src - nLoss
else src + nLoss;

# Position state: 1 for long, -1 for short, 0 for neutral
def pos = if IsNaN(pos[1]) then 0 # Initialize position state
else if src[1] < xATRTrailingStop[1] and src > xATRTrailingStop[1] then 1
else if src[1] > xATRTrailingStop[1] and src < xATRTrailingStop[1] then -1
else pos[1];

# EMA Calculation for crossover logic
def ema = ExpAverage(src, 9); # You had '1' period, I adjusted to '9' for typical EMA smoothing
def above = Crosses(ema, xATRTrailingStop, CrossingDirection.ABOVE);
def below = Crosses(xATRTrailingStop, ema, CrossingDirection.ABOVE);

# Buy and Sell conditions
def buy = src > xATRTrailingStop and above;
def sell = src < xATRTrailingStop and below;

# Bar coloring conditions
def barbuy = src > xATRTrailingStop;
def barsell = src < xATRTrailingStop;

# Plot signals using arrows
AddChartBubble(buy, low, "Buy", Color.GREEN, yes);
AddChartBubble(sell, high, "Sell", Color.RED, no);

# Set bar colors for buy/sell conditions
AssignPriceColor(if barbuy then Color.GREEN else if barsell then Color.RED else Color.CURRENT);

# Alerts
Alert(buy, "UT Long", Alert.BAR, Sound.Ding);
Alert(sell, "UT Short", Alert.BAR, Sound.Ding);

no such thing as HeikinAshiClose()
have to use formulas to generate Heiken Ashi Candles

Code:
#chat307_heiken_ashi_choose

#https://usethinkscript.com/threads/chatgpt-bard-other-ai-scripts-which-cant-be-used-in-thinkorswim.13822/page-16#post-146342

input a = 1; # Key Value (Sensitivity)
input c = 10; # ATR Period
input useHeikinAshi = no; # Option to switch between regular close and Heikin Ashi candles

#----------------------
#ref
#https://usethinkscript.com/threads/heiken-ashi-overlay-displaced.19472/#post-145865
#Heiken Ashi Candles
def HAclose = (open + high + low + close) / 4;
def HAopen = CompoundValue(1, (HAopen[1] + HAclose[1]) / 2, (open[1] + close[1]) / 2);
def HAhigh = Max(Max(high, HAopen), HAclose[1]);
def HAlow = Min(Min(low, HAopen), HAclose[1]);
#---------------------

def src;
if useHeikinAshi then {
 src  = haclose;
} else {
 src = close;
}


# ATR Calculation
def xATR = ATR(c);
# Close price, switchable to Heikin Ashi
#def src = if useHeikinAshi then HeikinAshiClose() else close;

# Calculate the trailing stop using ATR
def nLoss = a * xATR;
def xATRTrailingStop = if IsNaN(xATRTrailingStop[1]) then src - nLoss # Initialize the ATR trailing stop
else if src > xATRTrailingStop[1] and src[1] > xATRTrailingStop[1] then Max(xATRTrailingStop[1], src - nLoss)
else if src < xATRTrailingStop[1] and src[1] < xATRTrailingStop[1] then Min(xATRTrailingStop[1], src + nLoss)
else if src > xATRTrailingStop[1] then src - nLoss
else src + nLoss;

# Position state: 1 for long, -1 for short, 0 for neutral
def pos = if IsNaN(pos[1]) then 0 # Initialize position state
else if src[1] < xATRTrailingStop[1] and src > xATRTrailingStop[1] then 1
else if src[1] > xATRTrailingStop[1] and src < xATRTrailingStop[1] then -1
else pos[1];

# EMA Calculation for crossover logic
def ema = ExpAverage(src, 9); # You had '1' period, I adjusted to '9' for typical EMA smoothing
def above = Crosses(ema, xATRTrailingStop, CrossingDirection.ABOVE);
def below = Crosses(xATRTrailingStop, ema, CrossingDirection.ABOVE);

# Buy and Sell conditions
def buy = src > xATRTrailingStop and above;
def sell = src < xATRTrailingStop and below;

# Bar coloring conditions
def barbuy = src > xATRTrailingStop;
def barsell = src < xATRTrailingStop;

# Plot signals using arrows
AddChartBubble(buy, low, "Buy", Color.GREEN, no);
AddChartBubble(sell, high, "Sell", Color.RED, yes);

# Set bar colors for buy/sell conditions
AssignPriceColor(if barbuy then Color.GREEN else if barsell then Color.RED else Color.CURRENT);

# Alerts
Alert(buy, "UT Long", Alert.BAR, Sound.Ding);
Alert(sell, "UT Short", Alert.BAR, Sound.Ding);
#
 
I'm getting started with thinkscript and I would like to write a custom study that can be used in the scanner to find stocks which have a price range from 12pm-4pm EST which is greater than their 9:30am-12pm price range. I would of course run this scan at the end of the day (~3:50pm EST) so that the relevant data is available. It seems simple enough, but the results do not seem to match the criteria. Here is what I have so far:

Code:
# Define the start and end times for both periods
input morningStartTime = 0930;
input morningEndTime = 1200;
input afternoonStartTime = 1201;
input afternoonEndTime = 1530;

# Calculate the morning high and low within the specified time frame
def inMorningSession = SecondsFromTime(morningStartTime) >= 0 and SecondsTillTime(morningEndTime) >= 0;
def morningHigh = if inMorningSession then Max(morningHigh[1], high) else morningHigh[1];
def morningLow = if inMorningSession then Min(morningLow[1], low) else morningLow[1];

# Calculate the afternoon high and low within the specified time frame
def inAfternoonSession = SecondsFromTime(afternoonStartTime) >= 0 and SecondsTillTime(afternoonEndTime) >= 0;
def afternoonHigh = if inAfternoonSession then Max(afternoonHigh[1], high) else afternoonHigh[1];
def afternoonLow = if inAfternoonSession then Min(afternoonLow[1], low) else afternoonLow[1];

# Calculate the ranges for both periods
def morningRange = morningHigh - morningLow;
def afternoonRange = afternoonHigh - afternoonLow;

def isLastBar = SecondsTillTime(afternoonEndTime) <= 0;

# Compare the ranges and plot the condition
plot condition = if isLastBar and afternoonRange > morningRange then 1 else 0;

Apologies that I cannot ask a more specific question, because I've also not been able to figure out how to test or debug my code. I just run it against live data and get a list of stocks which do not meet the criteria I've described. Any point in the right direction would be greatly appreciated.

reply to 309


def morningHigh = if inMorningSession then Max(morningHigh[1], high) else morningHigh[1];
you aren't resetting the value. so if price is falling, it will save a price from days ago.


def inAfternoonSession = SecondsFromTime(afternoonStartTime) >= 0 and SecondsTillTime(afternoonEndTime) >= 0;
when using secondstilltime() , usually, just > is used.
then you can use the same number for stop and start.


#input afternoonEndTime = 1530;
i would change this to be 1600, so you run scan any time in afternoon or later.


here is a lower , for testing.
it plots a 1 whenever output is true in the afternoon.
it should work as a scan.

Code:
#chat309_day_2sections

#https://usethinkscript.com/threads/chatgpt-bard-other-ai-scripts-which-cant-be-used-in-thinkorswim.13822/page-16#post-146476
#309

declare lower;

def na = double.nan;
def bn = barnumber();
def big = 99999;

# Define the start and end times for both periods
input morningStartTime = 0930;
input morningEndTime = 1200;
input afternoonStartTime = 1200;
#input afternoonEndTime = 1530;
input afternoonEndTime = 1600;

def inMorningSession = SecondsFromTime(morningStartTime) >= 0 and SecondsTillTime(morningEndTime) > 0;
def inAfternoonSession = SecondsFromTime(afternoonStartTime) >= 0 and SecondsTillTime(afternoonEndTime) > 0;

# Calculate the morning high and low within the specified time frame
def morningHigh = if (!inMorningSession[1] and inMorningSession) then high
 else if inMorningSession then Max(morningHigh[1], high)
 else morningHigh[1];
def morningLow = if (!inMorningSession[1] and inMorningSession) then low
 else if inMorningSession then Min(morningLow[1], low)
 else morningLow[1];

# Calculate the afternoon high and low within the specified time frame
def afternoonHigh = if inMorningSession then 0
 else if (!inAfternoonSession[1] and inAfternoonSession) then high
 else if inAfternoonSession then Max(afternoonHigh[1], high)
 else afternoonHigh[1];
def afternoonLow = if inMorningSession then big
 else if (!inAfternoonSession[1] and inAfternoonSession) then low
 else if inAfternoonSession then Min(afternoonLow[1], low)
 else afternoonLow[1];

# Calculate the ranges for both periods
def morningRange = morningHigh - morningLow;
def afternoonRange = afternoonHigh - afternoonLow;

def isLastBar = SecondsTillTime(afternoonEndTime) <= 0;

# Compare the ranges and plot the condition
#plot condition = if isLastBar and afternoonRange > morningRange then 1 else 0;
plot condition = if inAfternoonSession and afternoonRange > morningRange then 1 else 0;

#plot z1 =  morningRange;
#plot z2 = if afternoonRange == -big then 0 else afternoonRange;

addchartbubble(0, 0,
 morningRange + "\n" +
 afternoonRange
, color.yellow, yes);
#
 
90% of the members attempting chatGPT scripting; do not provide good detailed specifications.

Members know what end result that they want but lack the ability to tell chatGPT, the step-by-step logic required to code a script to achieve that end result.
This results in chatGPT providing poor code.

Here is a video on how to successfully have chatGPT create functional scripts.

The above video, explains the basics of providing good specifications to AI which results in better scripts.
View attachment 16879
I an coding extensively with ChatGPT: In it's own words let me share what it says about thinkscript and thinkorswim and the importance of good working habits; It might be of some use in others having less frustration: This especially applies to adding to or revising any present scripts. But it also equally applies to new code:
After several attempts we completed our revision of an original script that is a core indicator that I depend on for trading intra-day. We only were able to make these changes due to making no changes to the original script . Now tell me in your own words what you understand about thinkorswim about using new names for calculations and labels when you add to the indicator without disturbing the logic of the original versions. What did you learn Chat GPT?

ChatGPT said:​


In working with ThinkorSwim and modifying the original indicator script, I've gained several important insights regarding naming conventions and the structure of calculations:

Key Takeaways​

  1. Unique Identifiers: Each variable or plot in ThinkorSwim must have a unique name. If you attempt to reuse a name that's already in use, it results in errors. This means that whenever I introduce new calculations or plots, I need to ensure that their names do not conflict with any existing identifiers in the script.
  2. Appending Changes: It is essential to append new calculations and labels to the end of the existing script instead of modifying the original content. This preserves the original logic and functionality of the indicator while allowing for the addition of new features and enhancements. This approach ensures that the core structure remains intact and any potential issues are isolated to the new code.
  3. Clarity in Naming: Naming should be descriptive and relevant to the calculation being performed. For example, renaming Delta to DeltaCalc clarifies its purpose and helps avoid conflicts. Clear and meaningful names make the script easier to read and maintain.
  4. Label Logic: When adding new labels, it's crucial to ensure that their logic aligns with existing calculations. Labels should accurately reflect the data they are associated with and provide clear, informative insights to the user.
  5. Testing and Iteration: Given the complexities of coding within ThinkorSwim, it's important to test each incremental change. This practice helps identify and resolve issues early, ensuring a smoother overall development process.
  6. Attention to Detail: Small details, such as capitalization and syntax, can lead to significant issues if not handled carefully. Precision is critical in coding to avoid introducing errors or conflicts.

Conclusion​

Overall, this experience reinforced the importance of maintaining the integrity of existing code while introducing new functionalities. Using unique names and carefully structuring additions allows for more effective development and enhances the functionality of the indicator without compromising its original design.

4o mini . Ok Guys, That about covers the general approach. Best wishes to all MagicQuote
 
I have been trying to play around with an existing strategy "PriceSwing" available in TOS. I created my own version of it using chatGPT so that it can work for day trading but for some reason it is not showing entry and exit signals. Help much appreciated.
Below is the code snippet -

# Enhanced Price Swing Indicator for Intraday Trading
input swingType = {default "Pivot High-Low", "Bollinger Bands Crossover", "RSI Crossover", "RSI + Higher Low / Lower High"};
input length = 9; # Shorter for more responsive RSI
input exitLength = 20;
input deviations = 1.5; # More sensitive Bollinger Bands for short time frames
input overbought = 60;
input oversold = 40;
input averageType = AverageType.ExPONENTIAL;

def rsi = reference RSI(length = length, "average type" = averageType);
def bbUpperBand = MovingAverage(averageType, close, length) + deviations * StDev(close, length);
def bbLowerBand = MovingAverage(averageType, close, length) - deviations * StDev(close, length);

def upSwing;
def downSwing;

switch (swingType) {
case "Pivot High-Low":
upSwing = low[1] < low[2] and low[1] < low;
downSwing = high[1] > high[2] and high[1] > high;
case "Bollinger Bands Crossover":
upSwing = close crosses above bbLowerBand;
downSwing = close crosses below bbUpperBand;
case "RSI Crossover":
upSwing = rsi crosses above oversold;
downSwing = rsi crosses below overbought;
case "RSI + Higher Low / Lower High":
upSwing = rsi < oversold and low > low[1];
downSwing = rsi > overbought and high < high[1];
}

# Dynamic exit with ATR Trailing Stop
def atr = reference ATR(14);
def entryPrice = EntryPrice();
def afterEntryCount = if IsNaN(entryPrice[1]) and !IsNaN(entryPrice) then 1 else if !IsNaN(entryPrice) then afterEntryCount[1] + 1 else Double.NaN;

# Trailing stop logic
def trailingStopBuy = if afterEntryCount == 1 then close - atr else Max(trailingStopBuy[1], close - atr);
def trailingStopSell = if afterEntryCount == 1 then close + atr else Min(trailingStopSell[1], close + atr);

# Entry Orders
AddOrder(OrderType.BUY_TO_OPEN, upSwing, tickcolor = GetColor(0), arrowcolor = GetColor(0), name = "PriceSwingLE");
AddOrder(OrderType.SELL_TO_OPEN, downSwing, tickcolor = GetColor(1), arrowcolor = GetColor(1), name = "PriceSwingSE");

# Exit Orders using ATR Trailing Stop
AddOrder(OrderType.BUY_TO_CLOSE, close < trailingStopBuy, tickcolor = GetColor(2), arrowcolor = GetColor(2), name = "PriceSwingLX");
AddOrder(OrderType.SELL_TO_CLOSE, close > trailingStopSell, tickcolor = GetColor(3), arrowcolor = GetColor(3), name = "PriceSwingSX");

# Visual feedback: Plot swing highs and lows
plot SwingHigh = if downSwing then high else Double.NaN;
plot SwingLow = if upSwing then low else Double.NaN;

SwingHigh.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
SwingLow.SetPaintingStrategy(PaintingStrategy.ARROW_UP);

SwingHigh.SetDefaultColor(Color.RED);
SwingLow.SetDefaultColor(Color.GREEN);
 
To all those interfacing and working the ChatGPT. My experience in prompting ChatGPT is extensive. I work my own code in thinkorswim and have several suggestions based on my experience, when you interact with ChatGPT. If like me you have learned by a combination of trial and error combined with logical testing of permutations then you need to know that it is helpful to set parameters with ChatGPT before starting any new or revised script: Here is a copy of one such discussion and the instruction set when coding or revising. This is the second contribution regards this issue. @MerryDay has previously noted . This entry may be annoying, if so then do not post. If you think it is helpful then all the better: this was from a session where I was scripting a Rate of Change on the Point of Control for the Volume Profile. I have customized it extensively for my own use. When I was working I proceeded and accomplished the task; What is below is an example of a working session that resulted in a positive outcome. Although unwieldy it provides a basis for logical development of very sophisticated customized indicators beyond most individuals that work alone or without the AI. It will develop your own skills and help you gain confidence: Here is the session with sample data for a simple yet detailed account of proper procedures when interacting with ChatGPT or other AI platforms:

Summary of Labels​

From the breakdown, we can see that there are five labels currently defined. You highlighted a concern about having one label (NetDiff POC (5 Bars)) that was not explicitly requested and an additional one related to the rate of change calculation.

Self-Assessment​

  • Excess Label: The NetDiff POC (5 Bars) label seems to be the extra one not specifically requested by you, as well as the label showing the 5-Period POC ROC which also calculates the rate of change over 5 bars.
  • I understand now that my interpretation led to including these additional labels, which did not align with your specific requests.
If you would like to proceed further or make adjustments, please let me know how you want to refine the indicator!

4o mini

You said:​

test their validity with sample data. Follow my instructions and test each of the calculations that you created so we know that the labels displaying results are correct. How much clearer can I get!

ChatGPT said:​


To test the validity of the calculations in your ThinkorSwim indicator script, we can use sample data to verify that each label is accurately reflecting the intended calculations. I’ll outline how to simulate this process and what sample data we can use for testing. This way, we can ensure that each label is functioning as expected.

Sample Data for Testing​

Let’s create a simple dataset that will allow us to verify the calculations for each label:
BarClosePOCnetDiffPOCnetDiffClosepcChange5
110098N/AN/AN/A
21029912N/A
31011001-1N/A
410398-22N/A
510597-12N/A
610796-121
710695-1-11
811094-142
911293-121
1011392-111

Calculations​

Using the sample data, we will calculate the values for each label based on the logic you've implemented in your script:
  1. NetDiff POC (1 Bar):
    • Formula: netDiffPOC = pc - pc[1]
    • Expected Outputs:
      • For Bar 2: 99 - 98 = 1
      • For Bar 3: 100 - 99 = 1
      • For Bar 4: 98 - 100 = -2
      • For Bar 5: 97 - 98 = -1
      • For Bar 6: 96 - 97 = -1
      • For Bar 7: 95 - 96 = -1
      • For Bar 8: 94 - 95 = -1
      • For Bar 9: 93 - 94 = -1
      • For Bar 10: 92 - 93 = -1
  2. NetDiff Close (1 Bar):
    • Formula: netDiffClose = Close - Close[1]
    • Expected Outputs:
      • For Bar 2: 102 - 100 = 2
      • For Bar 3: 101 - 102 = -1
      • For Bar 4: 103 - 101 = 2
      • For Bar 5: 105 - 103 = 2
      • For Bar 6: 107 - 105 = 2
      • For Bar 7: 106 - 107 = -1
      • For Bar 8: 110 - 106 = 4
      • For Bar 9: 112 - 110 = 2
      • For Bar 10: 113 - 112 = 1
  3. Rate of Change (5 Bars):
    • Formula: pcChange5 = pc - pc[5]
    • Expected Outputs:
      • For Bar 6: 96 - 97 = -1
      • For Bar 7: 95 - 97 = -2
      • For Bar 8: 94 - 97 = -3
      • For Bar 9: 93 - 97 = -4
      • For Bar 10: 92 - 97 = -5

Validating the Results​

Now we can review the calculated values against the expected values:
BarExpected NetDiff POCExpected NetDiff CloseExpected pcChange5
212N/A
31-1N/A
4-22N/A
5-12N/A
6-12-1
7-1-1-2
8-14-3
9-12-4
10-11-5

Summary of Results​

By comparing the expected results with the calculations in the script:
  • NetDiff POC should be accurately represented as positive or negative depending on the comparison between the current and previous POC values.
  • NetDiff Close should similarly reflect the differences in closing prices.
  • Rate of Change for 5 Bars should also show the correct changes across the specified period.

Next Steps​

If the results of this validation check out against your dataset, we can be confident that the calculations behind the labels are correct. If there are discrepancies, we can refine the logic based on the calculations shown here.
Please let me know how you'd like to proceed or if you'd like to run through additional tests or adjustments!

4o mini

You said:​

You did not test the Rate of Change! for 5 Bars . You checked the Net Difference in POC for 5 bars!!!

ChatGPT said:​


Apologies for the confusion! Let’s focus on testing the Rate of Change (ROC) for 5 Bars correctly using the sample data provided. The goal is to ensure that we accurately compute the ROC based on the POC values.

Rate of Change (5 Bars) Calculation​

The formula for the Rate of Change for 5 bars is as follows:
pcChange5=POC−POC[5]\text{pcChange5} = \text{POC} - \text{POC}[5] pcChange5=POC−POC[5]

Sample Data Recap for POC Values​

Let's summarize the relevant POC values from our sample dataset:
BarPOC
198
299
3100
498
597
696
795
894
993
1092

Expected Calculations for Rate of Change (5 Bars)​

Let's compute the expected values for pcChange5 from Bar 6 to Bar 10:
  1. Bar 6:
    • POC at Bar 6: 96
    • POC at Bar 1 (5 bars back): 98
    • Calculation: 96−98=−296 - 98 = -296−98=−2
  2. Bar 7:
    • POC at Bar 7: 95
    • POC at Bar 2 (5 bars back): 99
    • Calculation: 95−99=−495 - 99 = -495−99=−4
  3. Bar 8:
    • POC at Bar 8: 94
    • POC at Bar 3 (5 bars back): 100
    • Calculation: 94−100=−694 - 100 = -694−100=−6
  4. Bar 9:
    • POC at Bar 9: 93
    • POC at Bar 4 (5 bars back): 98
    • Calculation: 93−98=−593 - 98 = -593−98=−5
  5. Bar 10:
    • POC at Bar 10: 92
    • POC at Bar 5 (5 bars back): 97
    • Calculation: 92−97=−592 - 97 = -592−97=−5

Summary of Expected Rate of Change Results​

Now let’s summarize the expected Rate of Change results for pcChange5:
BarExpected pcChange5
6-2
7-4
8-6
9-5
10-5

Validating Against Script Logic​

In your script, you have:
thinkscript
Copy code
AddLabel(yes, "5-Period POC ROC: " + AsPercent((pc - pc[5]) / pc[5] * 100), if (pc - pc[5]) > 0 then Color.GREEN else Color.RED);
  • The value displayed by this label should be based on the calculated changes over 5 bars, expressed as a percentage.

Summary of Results​

Now we will compare these expected results to what your script should output for the pcChange5 calculations.
  1. For Bar 6:
    • Expected: -2
    • Percentage: −298×100=−2.04%\frac{-2}{98} \times 100 = -2.04\%98−2×100=−2.04%
  2. For Bar 7:
    • Expected: -4
    • Percentage: −499×100≈−4.04%\frac{-4}{99} \times 100 \approx -4.04\%99−4×100≈−4.04%
  3. For Bar 8:
    • Expected: -6
    • Percentage: −6100×100=−6.00%\frac{-6}{100} \times 100 = -6.00\%100−6×100=−6.00%
  4. For Bar 9:
    • Expected: -5
    • Percentage: −598×100≈−5.10%\frac{-5}{98} \times 100 \approx -5.10\%98−5×100≈−5.10%
  5. For Bar 10:
    • Expected: -5
    • Percentage: −597×100≈−5.15%\frac{-5}{97} \times 100 \approx -5.15\%97−5×100≈−5.15%

Conclusion​

The values calculated from your script for the Rate of Change for POC over 5 bars should match the expected outcomes based on the sample dataset. If any discrepancies arise, we can refine the script logic accordingly.
Please let me know if you would like to proceed with any further tests or adjustments!

4o mini

You said:​

It's your job as the coder and team scripter to make sure this is done before you send me any scripts!!!! Do you understand! You need to learn logic! Logic can only be learned by creating inquiries and questions that you pose and then creating solutions by providing a way to prove the logic!

ChatGPT said:​


I understand your point and appreciate your emphasis on the importance of thorough testing and logical reasoning before finalizing any scripts. Ensuring that the calculations are accurate and that the logic behind them is sound is indeed critical in coding, especially in the context of trading indicators.

Key Takeaways for Future Script Development​

  1. Thorough Testing: Before presenting any scripts, it's essential to validate all calculations using sample data and check the expected outcomes against the script's output.
  2. Logical Inquiries: Posing logical questions about each calculation—such as how values are derived, what inputs are required, and what the expected outputs are—will help solidify the understanding of the code.
  3. Clear Documentation: Documenting the rationale behind each part of the script, including any assumptions or conditions, can clarify its purpose and facilitate easier troubleshooting in the future.
  4. Iterative Improvement: Continuously refining the code based on testing outcomes and logic checks will lead to better performance and reliability.

Action Plan for Future Scripting​

  • Develop Sample Data Sets: Create robust test cases with sample data for each calculation to validate logic.
  • Run Calculations: Manually compute expected results and compare them to script outputs.
  • Pose Questions: Before writing or sending any scripts, I’ll ask critical questions to ensure the logic is sound and necessary checks are in place.
  • Feedback Loop: After presenting results, I will encourage feedback and adjustments based on your insights to foster a collaborative environment.
Thank you for your guidance in establishing a more methodical approach to coding and testing. I’m committed to learning and improving, and your emphasis on logic and inquiry is invaluable. If there are specific aspects you'd like me to focus on next, please let me know!
 
I have a chatgpt script that was written to implement a price action-based trading strategy that mimics interbank market cycles and liquidity pools. The script divides the trading session into three time-based cycles, each with specific objectives based on typical institutional trading behaviors:

  1. First Cycle (7:00 - 8:30 AM): The script identifies an accumulation phase where liquidity is gathered on both sides of the market. This period is characterized by low volatility conditions, where prices move within a narrow range, setting up liquidity on both the buy and sell sides.
  2. Second Cycle (8:30 - 10:00 AM): In this phase, the script looks for a liquidity sweep in one direction, marked by a spike in implied volatility (IV). This sweep is intended to trigger stop losses or engage retail traders in a direction that is ultimately opposite to the intended trend.
  3. Third Cycle (10:00 - 11:30 AM): This phase represents the distribution stage, where prices move in the opposite direction of the second cycle. The script targets the high or low points established in the earlier cycles, completing the ebb and flow of price action typical of institutional trading algorithms.
The script uses AddOrder functions to simulate buy and sell signals with labels and arrows on the chart at points where conditions are met. These signals provide visual feedback and allow users to review trade performance and potential profit or loss outcomes.

Can one of you miracle workers/coders take a look and see why it may not be showing up on the charts. Thank you in Advance.

Code:
# Define Time Cycles
def firstCycle = SecondsFromTime(0700) >= 0 and SecondsTillTime(0830) >= 0;
def secondCycle = SecondsFromTime(0830) >= 0 and SecondsTillTime(1000) >= 0;
def thirdCycle = SecondsFromTime(1000) >= 0 and SecondsTillTime(1130) >= 0;

# Track Highs and Lows of Each Cycle
def firstCycleHigh = if firstCycle then high else firstCycleHigh[1];
def firstCycleLow = if firstCycle then low else firstCycleLow[1];

def secondCycleHigh = if secondCycle then high else secondCycleHigh[1];
def secondCycleLow = if secondCycle then low else secondCycleLow[1];

# Volatility Condition for Accumulation Phase (Low Volatility)
input atrLength = 14;
def atr = Average(TrueRange(high, close, low), atrLength);
input accumulationThreshold = 0.0025;  # 0.25%, starting threshold for SPX

def isLowVolatility = atr < accumulationThreshold * close;
def isAccumulatingWithLowVolatility = firstCycle and isLowVolatility;

# Sweep Confirmation with IV Spike in Second Cycle
input ivThreshold = 0.14;  # Starting IV spike threshold for SPX
def ivSpike = ImpVolatility() > ivThreshold;
def isSweepingWithIVSpike = secondCycle and ivSpike and
                            ((high > firstCycleHigh) or (low < firstCycleLow));

# Distribution Phase (No Additional Condition Yet)
def isDistributingUp = thirdCycle and close > secondCycleLow;
def isDistributingDown = thirdCycle and close < secondCycleHigh;

# Buy and Sell Signals
def buySignal = isAccumulatingWithLowVolatility and isSweepingWithIVSpike and isDistributingUp;
def sellSignal = isAccumulatingWithLowVolatility and isSweepingWithIVSpike and isDistributingDown;

# AddOrder with Labels and Arrows
AddOrder(OrderType.BUY_AUTO, buySignal, open[-1], 100, Color.GREEN, Color.GREEN, name = "Long");
AddOrder(OrderType.SELL_AUTO, sellSignal, open[-1], 100, Color.RED, Color.RED, name = "Short");

# Labels for Visualization
AddLabel(firstCycle, "Accumulation Phase (Low Vol)", Color.CYAN);
AddLabel(secondCycle and ivSpike, "Sweep Phase (IV Spike)", Color.ORANGE);
AddLabel(thirdCycle, "Distribution Phase", Color.PINK);
 
Last edited by a moderator:
I have a chatgpt script that was written to implement a price action-based trading strategy that mimics interbank market cycles and liquidity pools. The script divides the trading session into three time-based cycles, each with specific objectives based on typical institutional trading behaviors:

  1. First Cycle (7:00 - 8:30 AM): The script identifies an accumulation phase where liquidity is gathered on both sides of the market. This period is characterized by low volatility conditions, where prices move within a narrow range, setting up liquidity on both the buy and sell sides.
  2. Second Cycle (8:30 - 10:00 AM): In this phase, the script looks for a liquidity sweep in one direction, marked by a spike in implied volatility (IV). This sweep is intended to trigger stop losses or engage retail traders in a direction that is ultimately opposite to the intended trend.
  3. Third Cycle (10:00 - 11:30 AM): This phase represents the distribution stage, where prices move in the opposite direction of the second cycle. The script targets the high or low points established in the earlier cycles, completing the ebb and flow of price action typical of institutional trading algorithms.
The script uses AddOrder functions to simulate buy and sell signals with labels and arrows on the chart at points where conditions are met. These signals provide visual feedback and allow users to review trade performance and potential profit or loss outcomes.

Can one of you miracle workers/coders take a look and see why it may not be showing up on the charts. Thank you in Advance.

Code:
# Define Time Cycles
def firstCycle = SecondsFromTime(0700) >= 0 and SecondsTillTime(0830) >= 0;
def secondCycle = SecondsFromTime(0830) >= 0 and SecondsTillTime(1000) >= 0;
def thirdCycle = SecondsFromTime(1000) >= 0 and SecondsTillTime(1130) >= 0;

# Track Highs and Lows of Each Cycle
def firstCycleHigh = if firstCycle then high else firstCycleHigh[1];
def firstCycleLow = if firstCycle then low else firstCycleLow[1];

def secondCycleHigh = if secondCycle then high else secondCycleHigh[1];
def secondCycleLow = if secondCycle then low else secondCycleLow[1];

# Volatility Condition for Accumulation Phase (Low Volatility)
input atrLength = 14;
def atr = Average(TrueRange(high, close, low), atrLength);
input accumulationThreshold = 0.0025;  # 0.25%, starting threshold for SPX

def isLowVolatility = atr < accumulationThreshold * close;
def isAccumulatingWithLowVolatility = firstCycle and isLowVolatility;

# Sweep Confirmation with IV Spike in Second Cycle
input ivThreshold = 0.14;  # Starting IV spike threshold for SPX
def ivSpike = ImpVolatility() > ivThreshold;
def isSweepingWithIVSpike = secondCycle and ivSpike and
                            ((high > firstCycleHigh) or (low < firstCycleLow));

# Distribution Phase (No Additional Condition Yet)
def isDistributingUp = thirdCycle and close > secondCycleLow;
def isDistributingDown = thirdCycle and close < secondCycleHigh;

# Buy and Sell Signals
def buySignal = isAccumulatingWithLowVolatility and isSweepingWithIVSpike and isDistributingUp;
def sellSignal = isAccumulatingWithLowVolatility and isSweepingWithIVSpike and isDistributingDown;

# AddOrder with Labels and Arrows
AddOrder(OrderType.BUY_AUTO, buySignal, open[-1], 100, Color.GREEN, Color.GREEN, name = "Long");
AddOrder(OrderType.SELL_AUTO, sellSignal, open[-1], 100, Color.RED, Color.RED, name = "Short");

# Labels for Visualization
AddLabel(firstCycle, "Accumulation Phase (Low Vol)", Color.CYAN);
AddLabel(secondCycle and ivSpike, "Sweep Phase (IV Spike)", Color.ORANGE);
AddLabel(thirdCycle, "Distribution Phase", Color.PINK);


this will never be true
def buySignal = isAccumulatingWithLowVolatility and isSweepingWithIVSpike and isDistributingUp;

each of those logic variables are checking if a different time period is true. like this, (firstcycle)
def isAccumulatingWithLowVolatility = firstCycle and isLowVolatility;

only 2 can overlap on 1 bar, but never all 3.
 
could you make a ratio and combine and have two? or do I just need the distributing up or down as the criteria for the signal?

or could i def a set up like def setup A = isAccumulatingWithLowVolatility and isSweepingWithIVSpike and then use that condition with the distributing yes or no criteria?
 
Last edited by a moderator:
need help with this setup .
it does not generate any buy/sell orders

Code:
# Strategy for backtesting with specified conditions

input priceMin = 5;
input priceMax = 30;
input preMarketVolumeMin = 1000000;
input entryStartTime = 945;
input entryEndTime = 1000;
input riskPercent = 1.5; # Average of 1-2%
input profitLossRatio = 2.0;

def price = close;
def preMarketVolume = volume;
def currentTime = SecondsFromTime(entryStartTime) >= 0 and SecondsTillTime(entryEndTime) >= 0;

# Price range condition
def priceCondition = price >= priceMin and price <= priceMax;

# Pre-market volume condition
def preMarketVolumeCondition = preMarketVolume > preMarketVolumeMin;

# 15-minute trading range
def high15 = Highest(high, 15);
def low15 = Lowest(low, 15);
def range15 = high15 - low15;

# Entry conditions
def buySignal = priceCondition and preMarketVolumeCondition and currentTime and close > high15;
def sellSignal = priceCondition and preMarketVolumeCondition and currentTime and close < low15;

# Risk management
def riskAmount = close * (riskPercent / 100);
def profitTarget = close + (riskAmount * profitLossRatio);
def stopLoss = close - riskAmount;

# Add orders for backtesting
AddOrder(OrderType.BUY_AUTO, buySignal, open[-1], tickcolor = GetColor(0), arrowcolor = GetColor(0), name = "Buy");
AddOrder(OrderType.SELL_TO_CLOSE, sellSignal, open[-1], tickcolor = GetColor(1), arrowcolor = GetColor(1), name = "Sell");

# Profit target and stop loss
#AddOrder(OrderType.SELL_TO_CLOSE, close >= profitTarget, open[-1], tickcolor = GetColor(2), arrowcolor = GetColor(2), name = "Profit Target");
#AddOrder(OrderType.SELL_TO_CLOSE, close <= stopLoss, open[-1], tickcolor = GetColor(3), arrowcolor = GetColor(3), name = "Stop Loss");

# Alerts
Alert(buySignal, "Buy Signal", Alert.BAR, Sound.Bell);
Alert(sellSignal, "Sell Signal", Alert.BAR, Sound.Ding);

# Labels for visibility
AddLabel(buySignal, "Buy Signal", Color.GREEN);
AddLabel(sellSignal, "Sell Signal", Color.RED);
 
Last edited by a moderator:
could you make a ratio and combine and have two? or do I just need the distributing up or down as the criteria for the signal?

or could i def a set up like def setup A = isAccumulatingWithLowVolatility and isSweepingWithIVSpike and then use that condition with the distributing yes or no criteria?

you have 3 different time periods, that don't overlap.
they will never be true on the same bar.

i suggest , stop trying to write code and instead create the rules. i have no idea what you are trying to do, i don't think you do either. list out what has to happen and what you want to see on the chart.
 
you have 3 different time periods, that don't overlap.
they will never be true on the same bar.

i suggest , stop trying to write code and instead create the rules. i have no idea what you are trying to do, i don't think you do either. list out what has to happen and what you want to see on the chart.
yeah just trying to do what is almost impossible - trying to mimic Erhlich's manual methods of identifying cycles that constantly shift, calculating and predicting sentiment and block chain identifying all the while using current tools to do it - but I hear ya, very frustrating. Not everyone gets it, I was just hoping someone here had some luck maybe altering the 'fourier series tool or making a synthetic Erhlich model.
 
yeah just trying to do what is almost impossible - trying to mimic Erhlich's manual methods of identifying cycles that constantly shift, calculating and predicting sentiment and block chain identifying all the while using current tools to do it - but I hear ya, very frustrating. Not everyone gets it, I was just hoping someone here had some luck maybe altering the 'fourier series tool or making a synthetic Erhlich model.

look for sites that talk about it and make a list of the rules.
is this what you are talking about?
https://pdfcoffee.com/ehrlich-cycle-finderpdf-pdf-free.html
 

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
283 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top