BB Order BlocksUsing the Bollinger Band to mark areas of Support and Resistance
The scrip finds the highest and lowest levels of the bands to mark up futures areas of interest.
If the High/Lows are being broken on the Bollinger band, or if the look back range has expired without finding new levels, the script will stop plotting them until new levels are found
I have found many combinations which work well
Changing the band length to to levels 20,50,100 or 200 seem to give interesting results
Aswell as this changing the standard deviation to 3 instead of 2 marks up key levels.
The look back range seems to show better levels on 50,100 and 200
Let me know any changes or updates you think you could make an impact , this was just a quick basic script I wanted to share.
Cari dalam skrip untuk "order"
Pivot order block boxes [LM]Hello traders,
let me intoduce you pivot order block boxes. The idea is find the pivot point that within the right side count of candles achieved some percentage change and in that way filter out important pivots. Once the pivot point is found and matches the volatility condition then from the left side of pivot first candle that is up candle for pivot high and down candle for pivot low, could be also the pivot candle itself is selected and rendered high and low of that candle. The premise behind is that those are the levels profesional traders are buying.
It has two settings that you can change at your will, it also enables hide/show particular pivot setting
Hope you will enjoy as I enjoyed to write it.
Lukas
At Specified Time, Execute OrderSell current holdings at a specified time, then place a buy limit order at 1% the selling price. 
Strategy Test - Cancel Limit Order and Position SizingWhile working thru another project had the need to troubleshoot the canceling of a limit order syntax/process as well as work thru the code and logic to automagically set the position sizing based off two user inputs (Amount to Risk in USD and Leverage to Use) and the potential entry and stop levels for an inside bar candle pattern in this scenario. Once we find the distance between the entry and stop level we can figure out the stop percentage amount which matches up with what a user would see manually drawing using the long or short tool in tradingview. Once we have the user inputs and levels we can get an amount to be used in later qty= type of places in zeeee pine script....
Understanding order sizestype: properties manipulation, no programming needed
time required: 15minutes, at least
level: medium (need to know contracts, trading pairs)
A strategy can "appear" to work or be broken depending on the pile of cash that is working on. This amount is defined in the strat properties, under "order size". 
For noobs (like me) this is very confusing at first  :)
A strat opens/closes positions using units, a generic measure for the chart being operated on. Thes "units" can be a fixed amount of cash, a fixed amount of contracts, or a floating amount based on the last profits made. I recommend  checking my previous strat to figure the case of contracts  .
So, any trading price is the amount of "things" you get for some "cash". The things are the first unit, the "cash" is the second. Some examples: 
XAU/USD - 1 xau oz is worth x dollars
BTC/USD - 1 bitcoin is worth x dollars
GBP/EUR - 1 pound is worth x euros
To add to confusion, a lot of markets the "unit size" is different from what the strat thinks it is. An options contract is 100 shares(the unit), 1 xau contract is 10 oz(units), 1 eur/usd contract is 100k euros and so on... so, after figuring out how the sizes work in a strat, then the sizes must be adapted for the specific market in question. 
The choice os using the ETHUSD pair is because:
1 - you can buy 1eth, unlike a gold contract for example, so 1 "unit" = 1 eth, easier to get
2 - ETH is around 12 bucks, wich gives round numbers on the math, easier to wrap the brains around :)
3- is an unusual pair, so the regular contract sizes don't apply, and the brain is not conditioned to work inside the box ;)
You will have to access the script properties,  to change the values. As these values are changed you will see exactly the differences in the values of the strat. 
Text is too long, check the comments for all the cases
OB i work onorderblock i am working on (Mihai Pintilie)
in this i am aiming to make it such that it shows the orderblock after a MSS even if it's just a wick close not just a body close
Order Blocks & FVG con Mitigación CRISVASPERIdentifica Bloques de ordenes y FVG, pero muestra el porcentaje de mitigaciones
Order Size CalculatorThis script calculates the amount of stocks in a trade based on risk awareness.
The risk awarness is part of portfolio management and the book "sustainable & successfull trading" by Faik Giese.
Input is depot size (cash and stocks), risk per depot position, max. Stop-Loss and ATR.
BTC Trading RobotOverview
This Pine Script strategy is designed for trading Bitcoin (BTC) by placing pending orders (BuyStop and SellStop) based on local price extremes. The script also implements a trailing stop mechanism to protect profits once a position becomes sufficiently profitable.
________________________________________
Inputs and Parameter Setup
1.	Trading Profile:
o	The strategy is set up specifically for BTC trading.
o	The systemType input is set to 1, which means the strategy will calculate trade parameters using the BTC-specific inputs.
2.	Common Trading Inputs:
o	Risk Parameters: Although RiskPercent is defined, its actual use (e.g., for position sizing) isn’t implemented in this version.
o	Trading Hours Filter:
	SHInput and EHInput let you restrict trading to a specific hour range. If these are set (non-zero), orders will only be placed during the allowed hours.
3.	BTC-Specific Inputs:
o	Take Profit (TP) and Stop Loss (SL) Percentages:
	TPasPctBTC and SLasPctBTC are used to determine the TP and SL levels as a percentage of the current price.
o	Trailing Stop Parameters:
	TSLasPctofTPBTC and TSLTgrasPctofTPBTC determine when and by how much a trailing stop is applied, again as percentages of the TP.
4.	Other Parameters:
o	BarsN is used to define the window (number of bars) over which the local high and low are calculated.
o	OrderDistPoints acts as a buffer to prevent the entry orders from being triggered too early.
________________________________________
Trade Parameter Calculation
•	Price Reference:
o	The strategy uses the current closing price as the reference for calculations.
•	Calculation of TP and SL Levels:
o	If the systemType is set to BTC (value 1), then:
	Take Profit Points (Tppoints) are calculated by multiplying the current price by TPasPctBTC.
	Stop Loss Points (Slpoints) are calculated similarly using SLasPctBTC.
	A buffer (OrderDistPoints) is set to half of the take profit points.
	Trailing Stop Levels:
	TslPoints is calculated as a fraction of the TP (using TSLTgrasPctofTPBTC).
	TslTriggerPoints is similarly determined, which sets the profit level at which the trailing stop will start to activate.
________________________________________
Time Filtering
•	Session Control:
o	The current hour is compared against SHInput (start hour) and EHInput (end hour).
o	If the current time falls outside the allowed window, the script will not place any new orders.
________________________________________
Entry Orders
•	Local Price Extremes:
o	The strategy calculates a local high and local low using a window of BarsN * 2 + 1 bars.
•	Placing Stop Orders:
o	BuyStop Order:
	A long entry is triggered if the current price is less than the local high minus the order distance buffer.
	The BuyStop order is set to trigger at the level of the local high.
o	SellStop Order:
	A short entry is triggered if the current price is greater than the local low plus the order distance buffer.
	The SellStop order is set to trigger at the level of the local low.
Note: Orders are only placed if there is no current open position and if the session conditions are met.
________________________________________
Trailing Stop Logic
Once a position is open, the strategy monitors profit levels to protect gains:
•	For Long Positions:
o	The script calculates the profit as the difference between the current price and the average entry price.
o	If this profit exceeds the TslTriggerPoints threshold, a trailing stop is applied by placing an exit order.
o	The stop price is set at a distance below the current price, while a limit (profit target) is also defined.
•	For Short Positions:
o	The profit is calculated as the difference between the average entry price and the current price.
o	A similar trailing stop exit is applied if the profit exceeds the trigger threshold.
________________________________________
Summary
In essence, this strategy works by:
•	Defining entry levels based on recent local highs and lows.
•	Placing pending stop orders to enter the market when those levels are breached.
•	Filtering orders by time, ensuring trades are only taken during specified hours.
•	Implementing a trailing stop mechanism to secure profits once the trade moves favorably.
This approach is designed to automate BTC trading based on price action and dynamic risk management, although further enhancements (like dynamic position sizing based on RiskPercent) could be added for a more complete risk management system.
Antares_messages_publicLibrary   "Antares_messages_public" 
This library add messages for yours strategy for use in Antares trading system for binance and bybit exchanges. 
Данная библиотека позволяет формировать сообщения в алертах стратегий для Antares в более упрощенном для пользователя режиме, включая всплывающие подсказки и т.д.
 set_leverage(token, market, ticker_id, leverage) 
  Set leverage for ticker on specified market.
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     leverage (float) : (float)  leverage level. Устанавливаемое плечо.
  Returns: 'Set leverage message'.
 pause(time_pause) 
  Set pause in message.  '::' -left and  '::' -right included.
  Parameters:
     time_pause (int) 
 LongLimit(token, market, ticker_id, type_qty, quantity, price, orderId, leverageforqty) 
  Buy order with limit price and quantity. 
Лимитный ордер на покупку(в лонг).
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
     price (float) : (float) price for limit order. Цена по которой должен быть установлен лимитный ордер.
     orderId (string) : (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Limit Buy order'. Лимитный ордер на покупку (лонг).
 LongMarket(token, market, ticker_id, type_qty, quantity, leverageforqty) 
  Market Buy order with quantity. 
Рыночный ордер на покупку (в лонг).
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
     leverageforqty (int) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Market Buy order'. Маркетный ордер на покупку (лонг).
 ShortLimit(token, market, ticker_id, type_qty, quantity, price, leverageforqty, orderId) 
  Sell order with limit price and quantity.
Лимитный ордер на продажу(в шорт).
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
     price (float) : (float) price for limit order. Цена по которой должен быть установлен лимитный ордер.
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
     orderId (string) : (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
  Returns: 'Limit Sell order'. Лимитный ордер на продажу (шорт).
 ShortMarket(token, market, ticker_id, type_qty, quantity, leverageforqty) 
  Sell by market price and quantity.
Рыночный ордер на продажу(в шорт).
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
     leverageforqty (int) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Market Sell order'. Маркетный ордер на продажу (шорт).
 Cancel_by_ticker(token, market, ticker_id) 
  Cancel all orders for market and ticker in setups. Отменяет все ордера на заданной бирже и заданном токене(паре).
  Parameters:
     token (string) 
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
  Returns: 'Cancel all orders'. Отмена всех ордеров на заданной бирже и заданном токене(паре).
 Cancel_by_id(token, market, ticker_id, orderId) 
  Cancel order by Id for market and ticker in setups. Отменяет ордер по Id на заданной бирже и заданном токене(паре).
  Parameters:
     token (string) 
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     orderId (string) 
  Returns: 'Cancel order'. Отмена ордера по Id на заданной бирже и заданном токене(паре).
 Close_positions(token, market, ticker_id) 
  Close all positions for market and ticker in setups. Закрывает все позиции на заданной бирже и заданном токене(паре).
  Parameters:
     token (string) 
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
  Returns: 'Close positions'
 CloseLongLimit(token, market, ticker_id, type_qty, quantity, price, orderId, leverageforqty) 
  Close limit order for long position. (futures)
Лимитный ордер на продажу(в шорт) для закрытия лонговой позиции(reduceonly).
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
     price (float) : (float) price for limit order. Цена по которой должен быть установлен лимитный ордер.
     orderId (string) : (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Limit Sell order reduce only (close long position)'. Лимитный ордер на продажу для снижения текущего лонга(в шорт не входит).
 CloseLongMarket(token, market, ticker_id, type_qty, quantity, leverageforqty) 
  Close market order for long position.
Рыночный ордер на продажу(в шорт) для закрытия лонговой позиции(reduceonly).
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Market Sell order reduce only (close long position)'. Ордер на снижение/закрытие текущего лонга(в шорт не входит) по рыночной цене.
 CloseShortLimit(token, market, ticker_id, type_qty, quantity, price, orderId, leverageforqty) 
  Close limit order for short position.
Лимитный ордер на покупку(в лонг) для закрытия шортовой позиции(reduceonly).
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
     price (float) : (float) price for limit order. Цена по которой должен быть установлен лимитный ордер.
     orderId (string) : (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Limit Buy order reduce only (close short position)' . Лимитный ордер на покупку (лонг) для сокращения/закрытия текущего шорта.
 CloseShortMarket(token, market, ticker_id, type_qty, quantity, leverageforqty) 
  Set Close limit order for long position.
Рыночный ордер на покупку(в лонг) для сокращения/закрытия шортовой позиции(reduceonly).
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Market Buy order reduce only (close short position)'. Маркетного ордера на покупку (лонг) для сокращения/закрытия текущего шорта.
 cancel_all_close(token, market, ticker_id) 
  Parameters:
     token (string) 
     market (string) 
     ticker_id (string) 
 limit_tpsl_bybitfu(token, ticker_id, order_id, side, type_qty, quantity, price, tp_price, sl_price, leverageforqty) 
  Set multi order for Bybit : limit + takeprofit + stoploss
Выставление тройного ордера на Bybit лимитка со стоплоссом и тейкпрофитом
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     order_id (string) 
     side (bool) : (bool) "buy side" if true or "sell side" if false. true для лонга, false для шорта.
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
     price (float) : (float) price for limit order by 'side'. Цена лимитного ордера
     tp_price (float) : (float) price for take profit order. 
     sl_price (float) : (float) price for stoploss order
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: Set multi order for Bybit : limit + takeprofit + stoploss.
 replace_limit_tpsl_bybitfu(token, ticker_id, order_id, side, type_qty, quantity, price, tp_price, sl_price, leverageforqty) 
  Change multi order for Bybit : limit + takeprofit + stoploss
Изменение тройного ордера на Bybit лимитка со стоплоссом и тейкпрофитом
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     order_id (string) 
     side (bool) : (bool) "buy side" if true or "sell side" if false. true для лонга, false для шорта.
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
     price (float) : (float) price for limit order by 'side'. Цена лимитного ордера
     tp_price (float) : (float) price for take profit order. 
     sl_price (float) : (float) price for stoploss order
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: Set multi order for Bybit : limit + takeprofit + stoploss.
 long_stop(token, market, ticker_id, type_qty, quantity, l_stop, leverageforqty) 
  Stop market order for long position 
Рыночный стоп-ордер на продажу для закрытия лонговой позиции.
  Parameters:
     token (string) 
     market (string) : (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size. Размер ордера.
     l_stop (float) : (float) price for activation stop order. Цена активации стоп-ордера.
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Stop Market Sell order (close long position)'. Маркетный стоп-ордер на снижения/закрытия текущего лонга.
 short_stop(token, market, ticker_id, type_qty, quantity, s_stop, leverageforqty) 
  Stop market order for short position 
Рыночный стоп-ордер на покупку(в лонг) для закрытия шорт позиции.
  Parameters:
     token (string) 
     market (string) : (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size. Размер ордера.
     s_stop (float) : (float) price for activation stop order. Цена активации стоп-ордера.
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Stop Market Buy order (close short position)'. Маркетный стоп-ордер на снижения/закрытия текущего шорта.
 change_stop_l(token, market, ticker_id, type_qty, quantity, l_stop, leverageforqty) 
  Change Stop market order for long position 
Изменяем стоп-ордер на продажу(в шорт) для закрытия лонг позиции.
  Parameters:
     token (string) 
     market (string) : (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size. Размер ордера.
     l_stop (float) : (float) price for activation stop order. Цена активации стоп-ордера.
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Change Stop Market Buy order (close long position)'. Смещает цену активации Маркетного стоп-ордер на снижения/закрытия текущего лонга.
 change_stop_s(token, market, ticker_id, type_qty, quantity, s_stop, leverageforqty) 
  Change Stop market order for short position 
Смещает цену активации Рыночного стоп-ордера на покупку(в лонг) для закрытия шорт позиции.
  Parameters:
     token (string) 
     market (string) : (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) 
     quantity (float) : (float) orders size. Размер ордера.
     s_stop (float) : (float) price for activation stop order. Цена активации стоп-ордера.
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Change Stop Market Buy order (close short position)'. Смещает цену активации Маркетного стоп-ордер на снижения/закрытия текущего шорта.
 open_long_position(token, market, ticker_id, type_qty, quantity, l_stop, leverageforqty) 
  Cancel and close all orders and positions by ticker , then open Long position by market price with stop order
Отменяет все лимитки и закрывает все позы по тикеру, затем открывает лонг по маркету с выставлением стопа (переворот позиции, при необходимости).
  Parameters:
     token (string) 
     market (string) : (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size. Размер ордера.
     l_stop (float) : (float). Price for activation stop loss. Цена активации стоп-лосса.
     leverageforqty (int) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'command_all_close + LongMarket + long_stop.
 open_short_position(token, market, ticker_id, type_qty, quantity, s_stop, leverageforqty) 
  Cancel and close all orders and positions , then open Short position by market price with stop order 
Отменяет все лимитки и закрывает все позы по тикеру, затем открывает шорт по маркету с выставлением стопа(переворот позиции, при необходимости).
  Parameters:
     token (string) 
     market (string) : (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) orders size. Размер ордера.
     s_stop (float) : (float). Price for activation stop loss. Цена активации стоп-лосса.
     leverageforqty (int) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'command_all_close + ShortMarket + short_stop'.
 open_long_trade(token, market, ticker_id, type_qty, quantity, l_stop, qty_ex1, price_ex1, qty_ex2, price_ex2, qty_ex3, price_ex3, leverageforqty) 
  Cancell and close all orders and positions , then open Long position by market price with stop order and take 1 ,take 2, take 3
Отменяет все лимитки и закрывает все позы по тикеру, затем открывает лонг по маркету с выставлением стопа и 3 тейками (переворот позиции, при необходимости).
  Parameters:
     token (string) 
     market (string) : (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     quantity (float) : (float) enter order size, see at type_qty. Размер ордера входа, согласно type_qty.
     l_stop (float) : (float). Price for activation stop loss. Цена активации стоп-лосса.
     qty_ex1 (float) : (float). Quantity for 1th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 1го тейка, согласно type_qty.. Если 0, то строка для этого тейка не формируется
     price_ex1 (float) : (float). Price for 1th take , if = 0 string for order dont set. Цена лимитного ордера для 1го тейка. Если 0, то строка для этого тейка не формируется
     qty_ex2 (float) : (float). Quantity for 2th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 2го тейка, согласно type_qty..Если 0, то строка для этого тейка не формируется
     price_ex2 (float) : (float). Price for 2th take, if = 0 string for order dont set. Цена лимитного ордера для 2го тейка. Если 0, то строка для этого тейка не формируется
     qty_ex3 (float) : (float). Quantity for 3th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 2го тейка, согласно type_qty..Если 0, то строка для этого тейка не формируется
     price_ex3 (float) : (float). Price for 3th take, if = 0 string for order dont set. Цена лимитного ордера для 3го тейка. Если 0, то строка для этого тейка не формируется
     leverageforqty (int) 
  Returns: 'cancel_all_close + LongMarket + long_stop + CloseLongLimit1 + CloseLongLimit2+CloseLongLimit3'.
 open_short_trade(token, market, ticker_id, type_qty, quantity, s_stop, qty_ex1, price_ex1, qty_ex2, price_ex2, qty_ex3, price_ex3, leverageforqty) 
  Cancell and close all orders and positions , then open Short position by market price with stop order and take 1 and take 2 
Отменяет все лимитки и закрывает все позы по тикеру, затем открывает шорт по маркету с выставлением стопа и 3 тейками (переворот позиции, при необходимости).
  Parameters:
     token (string) 
     market (string) : (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) 
     quantity (float) 
     s_stop (float) : (float). Price for activation stop loss. Цена активации стоп-лосса.
     qty_ex1 (float) : (float). Quantity for 1th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 1го тейка, согласно type_qty.. Если 0, то строка для этого тейка не формируется
     price_ex1 (float) : (float). Price for 1th take , if = 0 string for order dont set. Цена лимитного ордера для 1го тейка. Если 0, то строка для этого тейка не формируется
     qty_ex2 (float) : (float). Quantity for 2th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 2го тейка, согласно type_qty..Если 0, то строка для этого тейка не формируется
     price_ex2 (float) : (float). Price for 2th take, if = 0 string for order dont set. Цена лимитного ордера для 2го тейка. Если 0, то строка для этого тейка не формируется
     qty_ex3 (float) : (float). Quantity for 3th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 2го тейка, согласно type_qty..Если 0, то строка для этого тейка не формируется
     price_ex3 (float) : (float). Price for 3th take, if = 0 string for order dont set. Цена лимитного ордера для 3го тейка. Если 0, то строка для этого тейка не формируется
     leverageforqty (int) 
  Returns: 'command_all_close + ShortMarket + short_stop + CloseShortLimit + CloseShortLimit(2)'.
 Multi_LongLimit(token, market, ticker_id, type_qty, qty1, price1, qty2, price2, qty3, price3, qty4, price4, qty5, price5, qty6, price6, qty7, price7, qty8, price8, leverageforqty) 
  8 or less Buy orders with limit price and quantity. 
До 8 Лимитных ордеров на покупку(в лонг).
  Parameters:
     token (string) : (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
     market (string) : (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
     ticker_id (string) : (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
     type_qty (string) : (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
     qty1 (float) 
     price1 (float) 
     qty2 (float) 
     price2 (float) 
     qty3 (float) 
     price3 (float) 
     qty4 (float) 
     price4 (float) 
     qty5 (float) 
     price5 (float) 
     qty6 (float) 
     price6 (float) 
     qty7 (float) 
     price7 (float) 
     qty8 (float) 
     price8 (float) 
     leverageforqty (bool) : (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
  Returns: 'Limit Buy order'. Лимитный ордер на покупку (лонг).
3Commas Bot DCA Backtester & Signals FREEThis is a DCA Strategy backtester + signals, built to emulate the 3Commas DCA bots. It uses your choice of 4 different buy signals, 2 of which can be adjusted in the settings. Everything is customizable so you can backtest specific settings with different buy signals and find the best performing strategy for your risk tolerance and capital. It can be used to backtest strategies on stocks as well, but just make sure your base order is larger than the share price for the entire backtesting range or it will not calculate properly.
You can use this template to code your own buy signals and then backtest them as a DCA strategy if you know some basic pine script.
The indicator shows all of your backtesting orders on the chart. The red line is your take profit level, the blue line is your average price level, the white line is your first order and the green lines are your average down orders. If you enable a stop loss in the settings your stop loss will be shown as an orange line once all of your average down orders have been hit, it will not be set until price has dipped below your covered trading range.
These levels update when things change during backtesting so you can visualize your strategy and how it would perform as well as see if your percentage deviation is large enough to cover dips. When backtesting trades are taken, the chart will show where they were taken(in backtesting) along with info on those trades such as the number each order is, the size of that order and the percentage deviation that order is from the initial buy.
 SENDING SIGNALS TO 3COMMAS 
Tradingview cannot sync this backtester to 3Commas and with the way alerts are setup for strategies on Tradingview, the best option for you to give signals to your bot would be to use this backtester to figure out what trigger you want to use and then setup that indicator separately to send alerts to your bot. All of the indicators used for signals in this backtester are available for free and can be configured to match this backtester and send alerts to 3Commas for you. Just make sure you set your alerts to once per bar close and don’t use less than a 15 second timeframe because then you could trigger the Tradingview threshold for alerts and get your alerts shut off.
You can also use this backtester with your own buy triggers if you know a little pine script. Just make copy of the script and code in your own buy signals and see how it backtests.
 INFO PANEL FOR ANALYZING YOUR STRATEGY 
The right hand side of the screen will show an info panel that shows a lot of different information so you can quickly see your bot settings and how it performed right on the screen.
In the top right corner you will see in purple your bot settings. These include your stoploss % if turned on, take profit %, average down order %, average down order % multiplier, volume multiplier, max number of orders allowed and size of your base order.
The top section of the first column “Current Trade” shows these stats: the open trade’s average price, the open trade’s take profit price, the open trade’s PNL, how far price is from your open tarde’s take profit level in percentage, your open position size and number of open orders.
The bottom section of the first column “Overall Performance” shows these stats: total number of trades taken during backtesting range, the largest amount of trades that were open at one time during backtesting, the max drawdown, the average number of bars per trade, gross profit, net profit, percent profit from your initial capital, current portfolio value and your initial capital.
 CUSTOMIZABLE OPTIONS TO FIND THE PERFECT STRATEGY 
 Stoploss On/Off 
This will turn your stoploss on or off. By default it is set to off and will not affect anything unless turned on.
 Stoploss Percentage 
This is the percentage below your final average down order price that will be set as a stoploss to keep your account from going too far in the red on big dips.
 Take Profit Percentage  - This is the percentage of profit you want the trade to hit before taking profit on your entire DCA trade. This level updates everytime you average down.
 Average Down Percentage  - This is the percentage that price has to drop from your initial order to initiate your first safety order. If the Average Down Percent Multiplier is set to 1 then this percentage will be the same for every average down order.
 Average Down Percentage Multiplier  - This multiplies your Average Down Percentage so each safety order needs a larger percentage deviation than the previous one. This keeps your buys closer together at the beginning and further apart when you hit more orders so you can extend your trading range but still be aggressive when price is going sideways.
 Volume Multiplier Per New Order  - This multiplies the size of each trade based on your base order. If you set it to a 2x multiplier then each average down order will be 2 times the size of the last one. So for example, a $100 base order with a 2x multiplier would have these values for the first 3 average down orders: 200, 400, 800.
 Size Of Base Order  - This is the size of your first position entry and will be used as a starting point for the volume multiplier. If your base order is $100 then it will buy $100 worth of whatever crypto you are backtesting this on. If you are looking at stock charts, you need to make sure your base order is higher than the share price across the entire backtesting range or it will not perform correctly.
 Max Number Of Orders  - This is the maximum number of orders the bot can take, including your base order. Adjust this to suit the amount of capital you are willing to allocate to your bot based on how much money it will require to run according to your bot settings.
 TIPS ON HOW TO USE FOR BEST RESULTS 
If you don’t have a lot of capital to work with, then use longer timeframes with a reasonable take profit percentage so that you don’t need a lot of average down orders. You can also try keeping the volume multiplier close to 1.
You can use the 3Commas dca bot settings page to see how much capital you will need for your strategy if you match it to the settings you have on this indicator. You can also check to see how much of a percentage deviation your bot is covering to make sure you have a reasonable range to trade in and orders to cover big dips. You can also check your coverage by seeing how far down the chart the green lines cover, which are your average down orders.
Make sure the initial capital in the properties tab of the settings has enough to cover all of your orders otherwise you will get unrealistic backtesting results. Also, make sure you leave the order size in the properties tab on contracts so it calculates your trades correctly. The only settings you need to touch in the properties tab is the initial capital. Unless you are trading somewhere that has lower commission fees, then you can change that to match, but leave all the other settings as is for it to function properly.
Increasing the volume multiplier will make your average price and take profit target follow the price action a lot closer as price falls, but it can also lead to having very large orders very quickly once you get into the 1.5-3x multiple range. Try using a high volume multiplier with less safety orders and you will get better results, however you need to have money on the sidelines to add on major dips to keep your bot turning a profit. Be very careful with this as greed and impatience will hurt your overall performance. This bot is meant to make money with lots of small wins so don’t get greedy and make sure you have enough money to cover large dips. If you are being aggressive with your bot, then I recommend only using 25% or less of your portfolio to trade aggressively and then use the smart trade feature on 3commas to add chunks of funds to your trades when price dips below your last safety order. Or if you want it to run without any supervision, then use lower volume multipliers and have lots of safety orders that can cover entire bear markets and still keep buying lower.
It’s a good idea to have some capital on the sidelines that you can add in when price dips quickly. This will help lower your average price and allow your bot to get out in profit quicker. 3Commas bot has a smart trade feature that will allow you to track your average price when adding extra funds and it will automatically update your other orders which is very convenient. Look at the longer timeframes when price dips and only add chunks at major areas where price is very likely to bounce. Or you can be aggressive when trading and add to your position when price dips and is at a likely bounce zone to maximize profits.
Only trade coins that have a good amount of liquidity as the larger your orders get, the harder it will be to sell if there isn’t much liquidity. Also, beware of how large your first order is as it will usually be a market order and can move the market if there is not much liquidity.
Since this bot takes a lot of trades and performs best when taking small profits consistently, you will need to factor in exchange fees. The bot is set to .5% commission(you can change this) on the buy and sell orders as most exchanges charge that amount. Some exchanges offer no fee trading on certain coins so be sure to look around for those so you can keep the commissions and maximize profits.
I strongly encourage you to try out a lot of different setting combinations across multiple different coins and do it across a few months to see how it would have performed under various market conditions. This will help you get a better idea of how much of a percentage deviation you’ll need to be able to cover to keep your bot running and making constant profits. You can also use the deep backtesting feature of the strategy panel to see how it would have done, but just beware that the info panel of the indicator will not reflect deep backtesting results, only the normal backtesting range.
 MARKETS 
This backtester can be used on any market including crypto, stocks, forex & futures. You just need to make sure your base order is larger than the share price when using this on things besides crypto.
 TIMEFRAMES 
This backtester can be used on all timeframes.
BayesStack RSI [CHE]BayesStack RSI   — Stacked RSI with Bayesian outcome stats and gradient visualization
  Summary 
BayesStack RSI builds a four-length RSI stack and evaluates it with a simple Bayesian success model over a rolling window. It highlights bull and bear stack regimes, colors price with magnitude-based gradients, and reports per-regime counts, wins, and estimated win rate in a compact table. Signals seek to be more robust through explicit ordering tolerance, optional midline gating, and outcome evaluation that waits for events to mature by a fixed horizon. The design focuses on readable structure, conservative confirmation, and actionable context rather than raw oscillator flips.
  Motivation: Why this design? 
Classical RSI signals flip frequently in volatile phases and drift in calm regimes. Pure threshold rules often misclassify shallow pullbacks and stacked momentum phases. The core idea here is ordered, spaced RSI layers combined with outcome tracking. By requiring a consistent order with a tolerance and optionally gating by the midline, regime identification becomes clearer. A horizon-based maturation check and smoothed win-rate estimate provide pragmatic feedback about how often a given stack has recently worked.
  What’s different vs. standard approaches? 
 Reference baseline: Traditional single-length RSI with overbought and oversold rules or simple crossovers.
 Architecture differences:
   Four fixed RSI lengths with strict ordering and a spacing tolerance.
   Optional requirement that all RSI values stay above or below the midline for bull or bear regimes.
   Outcome evaluation after a fixed horizon, then rolling counts and a prior-smoothed win rate.
   Dispersion measurement across the four RSIs with a percent-rank diagnostic.
   Gradient coloring of candles and wicks driven by stack magnitude.
   A last-bar statistics table with counts, wins, win rate, dispersion, and priors.
 Practical effect: Charts emphasize sustained momentum alignment instead of single-length crosses. Users see when regimes start, how strong alignment is, and how that regime has recently performed for the chosen horizon.
  How it works (technical) 
The script computes RSI on four lengths and forms a “stack” when they are strictly ordered with at least the chosen tolerance between adjacent lengths. A bull stack requires a descending set from long to short with positive spacing. A bear stack requires the opposite. Optional gating further requires all RSI values to sit above or below the midline.
For evaluation, each detected stack is checked again after the horizon has fully elapsed. A bull event is a success if price is higher than it was at event time after the horizon has passed. A bear event succeeds if price is lower under the same rule. Rolling sums over the training window track counts and successes; a pair of priors stabilizes the win-rate estimate when sample sizes are small.
Dispersion across the four RSIs is measured and converted to a percent rank over a configurable window. Gradients for bars and wicks are normalized over a lookback, then shaped by gamma controls to emphasize strong regimes. A statistics table is created once and updated on the last bar to minimize overhead. Overlay markers and wick coloring are rendered to the price chart even though the indicator runs in a separate pane.
  Parameter Guide 
 Source — Input series for RSI. Default: close. Tips: Use typical price or hlc3 for smoother behavior.
 Overbought / Oversold — Guide levels for context. Defaults: seventy and thirty. Bounds: fifty to one hundred, zero to fifty. Tips: Narrow the band for faster feedback.
 Stacking tolerance (epsilon) — Minimum spacing between adjacent RSIs to qualify as a stack. Default: zero point twenty-five RSI points. Trade-off: Higher values reduce false stacks but delay entries.
 Horizon H — Bars ahead for outcome evaluation. Default: three. Trade-off: Longer horizons reduce noise but delay success attribution.
 Rolling window — Lookback for counts and wins. Default: five hundred. Trade-off: Longer windows stabilize the win rate but adapt more slowly.
 Alpha prior / Beta prior — Priors used to stabilize the win-rate estimate. Defaults: one and one. Trade-off: Larger priors reduce variance with sparse samples.
 Show RSI 8/13/21/34 — Toggle raw RSI lines. Default: on.
 Show consensus RSI — Weighted combination of the four RSIs. Default: on.
 Show OB/OS zones — Draw overbought, oversold, and midline. Default: on.
 Background regime — Pane background tint during bull or bear stacks. Default: on.
 Overlay regime markers — Entry markers on price when a stack forms. Default: on.
 Show statistics table — Last-bar table with counts, wins, win rate, dispersion, priors, and window. Default: on.
 Bull requires all above fifty / Bear requires all below fifty — Midline gate. Defaults: both on. Trade-off: Stricter regimes, fewer but cleaner signals.
 Enable gradient barcolor / wick coloring — Gradient visuals mapped to stack magnitude. Defaults: on. Trade-off: Clearer regime strength vs. extra rendering cost.
 Collection period — Normalization window for gradients. Default: one hundred. Trade-off: Shorter values react faster but fluctuate more.
 Gamma bars and shapes / Gamma plots — Curve shaping for gradients. Defaults: zero point seven and zero point eight. Trade-off: Higher values compress weak signals and emphasize strong ones.
 Gradient and wick transparency — Visual opacity controls. Defaults: zero.
 Up/Down colors (dark and neon) — Gradient endpoints. Defaults: green and red pairs.
 Fallback neutral candles — Directional coloring when gradients are off. Default: off.
 Show last candles — Limit for gradient squares rendering. Default: three hundred thirty-three.
 Dispersion percent-rank length / High and Low thresholds — Window and cutoffs for dispersion diagnostics. Defaults: two hundred fifty, eighty, and twenty.
 Table X/Y, Dark theme, Text size — Table anchor, theme, and typography. Defaults: right, top, dark, small.
  Reading & Interpretation 
 RSI stack lines: Alignment and spacing convey regime quality. Wider spacing suggests stronger alignment.
 Consensus RSI: A single line that summarizes the four lengths; use as a smoother reference.
 Zones: Overbought, oversold, and midline provide context rather than standalone triggers.
 Background tint: Indicates active bull or bear stack.
 Markers: “Bull Stack Enter” or “Bear Stack Enter” appears when the stack first forms.
 Gradients: Brighter tones suggest stronger stack magnitude; dull tones suggest weak alignment.
 Table: Count and Wins show sample size and successes over the window. P(win) is a prior-stabilized estimate. Dispersion percent rank near the high threshold flags stretched alignment; near the low threshold flags tight clustering.
  Practical Workflows & Combinations 
 Trend following: Enter only on new stack markers aligned with structure such as higher highs and higher lows for bull, or lower lows and lower highs for bear. Use the consensus RSI to avoid chasing into overbought or oversold extremes.
 Exits and stops: Consider reducing exposure when dispersion percent rank reaches the high threshold or when the stack loses ordering. Use the table’s P(win) as a context check rather than a direct signal.
 Multi-asset and multi-timeframe: Defaults travel well on liquid assets from intraday to daily. Combine with higher-timeframe structure or moving averages for regime confirmation. The script itself does not fetch higher-timeframe data.
  Behavior, Constraints & Performance 
 Repaint and confirmation: Stack markers evaluate on the live bar and can flip until close. Alert behavior follows TradingView settings. Outcome evaluation uses matured events and does not look into the future.
 HTF and security: Not used. Repaint paths from higher-timeframe aggregation are avoided by design.
 Resources: max bars back is two thousand. The script uses rolling sums, percent rank, gradient rendering, and a last-bar table update. Shapes and colored wicks add draw overhead.
 Known limits: Lag can appear after sharp turns. Very small windows can overfit recent noise. P(win) is sensitive to sample size and priors. Dispersion normalization depends on the collection period.
  Sensible Defaults & Quick Tuning 
Start with the shipped defaults.
 Too many flips: Increase stacking tolerance, enable midline gates, or lengthen the collection period.
 Too sluggish: Reduce stacking tolerance, shorten the collection period, or relax midline gates.
 Sparse samples: Extend the rolling window or increase priors to stabilize P(win).
 Visual overload: Disable gradient squares or wick coloring, or raise transparency.
  What this indicator is—and isn’t 
This is a visualization and context layer for RSI stack regimes with simple outcome statistics. It is not a complete trading system, not predictive, and not a signal generator on its own. Use it with market structure, risk controls, and position management that fit your process.
 Metadata 
- Pine version: v6
- Overlay: false (price overlays are drawn via forced overlay where applicable)
- Primary outputs: Four RSI lines, consensus line, OB/OS guides, background tint, entry markers, gradient bars and wicks, statistics table
- Inputs with defaults: See Parameter Guide
- Metrics and functions used: RSI, rolling sums, percent rank, dispersion across RSI set, gradient color mapping, table rendering, alerts
- Special techniques: Ordered RSI stacking with tolerance, optional midline gating, horizon-based outcome maturation, prior-stabilized win rate, gradient normalization with gamma shaping
- Performance and constraints: max bars back two thousand, rendering of shapes and table on last bar, no higher-timeframe data, no security calls
- Recommended use-cases: Regime confirmation, momentum alignment, post-entry management with dispersion and recent outcome context
- Compatibility: Works across assets and timeframes that support RSI
- Limitations and risks: Sensitive to parameter choices and market regime changes; not a standalone strategy
- Diagnostics: Statistics table, dispersion percent rank, gradient intensity
 Disclaimer 
The content provided, including all code and materials, is strictly for educational and informational purposes only. It is not intended as, and should not be interpreted as, financial advice, a recommendation to buy or sell any financial instrument, or an offer of any financial product or service. All strategies, tools, and examples discussed are provided for illustrative purposes to demonstrate coding techniques and the functionality of Pine Script within a trading context.
Any results from strategies or tools provided are hypothetical, and past performance is not indicative of future results. Trading and investing involve high risk, including the potential loss of principal, and may not be suitable for all individuals. Before making any trading decisions, please consult with a qualified financial professional to understand the risks involved.
By using this script, you acknowledge and agree that any trading decisions are made solely at your discretion and risk.
Best regards and happy trading
Chervolino.
Do not use this indicator on Heikin-Ashi, Renko, Kagi, Point-and-Figure, or Range charts, as these chart types can produce unrealistic results for signal markers and alerts.
TRADINGLibrary   "TRADING" 
This library is a client script for making a webhook signal formatted string to PoABOT server.
 entry_message(password, percent, leverage, margin_mode, kis_number) 
  Create a entry message for POABOT
  Parameters:
     password (string) : (string)   The password of your bot.
     percent (float) : (float)    The percent for entry based on your wallet balance.
     leverage (int) : (int)      The leverage of entry. If not set, your levereage doesn't change.
     margin_mode (string) : (string)   The margin mode for trade(only for OKX). "cross" or "isolated"
     kis_number (int) : (int)      The number of koreainvestment account. Default 1
  Returns: (string) A json formatted string for webhook message.
 order_message(password, percent, leverage, margin_mode, kis_number) 
  Create a order message for POABOT
  Parameters:
     password (string) : (string)   The password of your bot.
     percent (float) : (float)    The percent for entry based on your wallet balance.
     leverage (int) : (int)      The leverage of entry. If not set, your levereage doesn't change.
     margin_mode (string) : (string)   The margin mode for trade(only for OKX). "cross" or "isolated"
     kis_number (int) : (int)      The number of koreainvestment account. Default 1
  Returns: (string) A json formatted string for webhook message.
 close_message(password, percent, margin_mode, kis_number) 
  Create a close message for POABOT
  Parameters:
     password (string) : (string)   The password of your bot.
     percent (float) : (float)    The percent for close based on your wallet balance.
     margin_mode (string) : (string)   The margin mode for trade(only for OKX). "cross" or "isolated"
     kis_number (int) : (int)      The number of koreainvestment account. Default 1
  Returns: (string) A json formatted string for webhook message.
 exit_message(password, percent, margin_mode, kis_number) 
  Create a exit message for POABOT
  Parameters:
     password (string) : (string)   The password of your bot.
     percent (float) : (float)    The percent for exit based on your wallet balance.
     margin_mode (string) : (string)   The margin mode for trade(only for OKX). "cross" or "isolated"
     kis_number (int) : (int)      The number of koreainvestment account. Default 1
  Returns: (string) A json formatted string for webhook message.
 manual_message(password, exchange, base, quote, side, qty, price, percent, leverage, margin_mode, kis_number, order_name) 
  Create a manual message for POABOT
  Parameters:
     password (string) : (string)   The password of your bot.
     exchange (string) : (string)   The exchange
     base (string) : (string)   The base
     quote (string) : (string)   The quote of order message
     side (string) : (string)   The side of order messsage
     qty (float) : (float)    The qty of order message
     price (float) : (float)    The price of order message
     percent (float) : (float)    The percent for order based on your wallet balance.
     leverage (int) : (int)      The leverage of entry. If not set, your levereage doesn't change.
     margin_mode (string) : (string)   The margin mode for trade(only for OKX). "cross" or "isolated"
     kis_number (int) : (int)      The number of koreainvestment account.
     order_name (string) : (string)   The name of order message
  Returns: (string) A json formatted string for webhook message.
 in_trade(start_time, end_time, hide_trade_line) 
  Create a trade start line
  Parameters:
     start_time (int) : (int)     The start of time.
     end_time (int) : (int)     The end of time.
     hide_trade_line (bool) : (bool)    if true, hide trade line. Default false.
  Returns: (bool)  Get bool for trade based on time range.
 real_qty(qty, precision, leverage, contract_size, default_qty_type, default_qty_value) 
  Get exchange specific real qty
  Parameters:
     qty (float) : (float)   qty
     precision (float) : (float)   precision
     leverage (int) : (int)     leverage
     contract_size (float) : (float)   contract_size
     default_qty_type (string) 
     default_qty_value (float) 
  Returns: (float) exchange specific qty.
 method set(this, password, start_time, end_time, leverage, initial_capital, default_qty_type, default_qty_value, margin_mode, contract_size, kis_number, entry_percent, close_percent, exit_percent, fixed_qty, fixed_cash, real, auto_alert_message, hide_trade_line) 
  Set bot object.
  Namespace types: bot
  Parameters:
     this (bot) 
     password (string) : (string)   password for poabot.
     start_time (int) : (int)      start_time timestamp.
     end_time (int) : (int)      end_time timestamp.
     leverage (int) : (int)      leverage.
     initial_capital (float) 
     default_qty_type (string) 
     default_qty_value (float) 
     margin_mode (string) : (string)   The margin mode for trade(only for OKX). "cross" or "isolated"
     contract_size (float) 
     kis_number (int) : (int)      kis_number for poabot.
     entry_percent (float) : (float)    entry_percent for poabot.
     close_percent (float) : (float)    close_percent for poabot.
     exit_percent (float) : (float)    exit_percent for poabot.
     fixed_qty (float) : (float)    fixed qty.
     fixed_cash (float) : (float)    fixed cash.
     real (bool) : (bool)     convert qty for exchange specific.
     auto_alert_message (bool) : (bool)     convert alert_message for exchange specific.
     hide_trade_line (bool) : (bool)     if true, Hide trade line. Default false.
  Returns: (void)
 method print(this, message) 
  Print message using log table.
  Namespace types: bot
  Parameters:
     this (bot) 
     message (string) 
  Returns: (void)
 method start_trade(this) 
  start trade using start_time and end_time
  Namespace types: bot
  Parameters:
     this (bot) 
  Returns: (void)
 method entry(this, id, direction, qty, limit, stop, oca_name, oca_type, comment, alert_message, when) 
  It is a command to enter market position. If an order with the same ID is already pending, it is possible to modify the order. If there is no order with the specified ID, a new order is placed. To deactivate an entry order, the command strategy.cancel or strategy.cancel_all should be used. In comparison to the function strategy.order, the function strategy.entry is affected by pyramiding and it can reverse market position correctly. If both 'limit' and 'stop' parameters are 'NaN', the order type is market order.
  Namespace types: bot
  Parameters:
     this (bot) 
     id (string) : (string)   A required parameter. The order identifier. It is possible to cancel or modify an order by referencing its identifier.
     direction (string) : (string)   A required parameter. Market position direction: 'strategy.long' is for long, 'strategy.short' is for short.
     qty (float) : (float)    An optional parameter. Number of contracts/shares/lots/units to trade. The default value is 'NaN'.
     limit (float) : (float)    An optional parameter. Limit price of the order. If it is specified, the order type is either 'limit', or 'stop-limit'. 'NaN' should be specified for any other order type.
     stop (float) : (float)    An optional parameter. Stop price of the order. If it is specified, the order type is either 'stop', or 'stop-limit'. 'NaN' should be specified for any other order type.
     oca_name (string) : (string)   An optional parameter. Name of the OCA group the order belongs to. If the order should not belong to any particular OCA group, there should be an empty string.
     oca_type (string) : (string)   An optional parameter. Type of the OCA group. The allowed values are: "strategy.oca.none" - the order should not belong to any particular OCA group; "strategy.oca.cancel" - the order should belong to an OCA group, where as soon as an order is filled, all other orders of the same group are cancelled; "strategy.oca.reduce" - the order should belong to an OCA group, where if X number of contracts of an order is filled, number of contracts for each other order of the same OCA group is decreased by X.
     comment (string) : (string)   An optional parameter. Additional notes on the order.
     alert_message (string) : (string)   An optional parameter which replaces the {{strategy.order.alert_message}} placeholder when it is used in the "Create Alert" dialog box's "Message" field.
     when (bool) : (bool)     An optional parmeter. Condition, deprecated.
  Returns: (void)
 method order(this, id, direction, qty, limit, stop, oca_name, oca_type, comment, alert_message, when) 
  It is a command to place order. If an order with the same ID is already pending, it is possible to modify the order. If there is no order with the specified ID, a new order is placed. To deactivate order, the command strategy.cancel or strategy.cancel_all should be used. In comparison to the function strategy.entry, the function strategy.order is not affected by pyramiding. If both 'limit' and 'stop' parameters are 'NaN', the order type is market order.
  Namespace types: bot
  Parameters:
     this (bot) 
     id (string) : (string)   A required parameter. The order identifier. It is possible to cancel or modify an order by referencing its identifier.
     direction (string) : (string)   A required parameter. Market position direction: 'strategy.long' is for long, 'strategy.short' is for short.
     qty (float) : (float)    An optional parameter. Number of contracts/shares/lots/units to trade. The default value is 'NaN'.
     limit (float) : (float)    An optional parameter. Limit price of the order. If it is specified, the order type is either 'limit', or 'stop-limit'. 'NaN' should be specified for any other order type.
     stop (float) : (float)    An optional parameter. Stop price of the order. If it is specified, the order type is either 'stop', or 'stop-limit'. 'NaN' should be specified for any other order type.
     oca_name (string) : (string)   An optional parameter. Name of the OCA group the order belongs to. If the order should not belong to any particular OCA group, there should be an empty string.
     oca_type (string) : (string)   An optional parameter. Type of the OCA group. The allowed values are: "strategy.oca.none" - the order should not belong to any particular OCA group; "strategy.oca.cancel" - the order should belong to an OCA group, where as soon as an order is filled, all other orders of the same group are cancelled; "strategy.oca.reduce" - the order should belong to an OCA group, where if X number of contracts of an order is filled, number of contracts for each other order of the same OCA group is decreased by X.
     comment (string) : (string)   An optional parameter. Additional notes on the order.
     alert_message (string) : (string)   An optional parameter which replaces the {{strategy.order.alert_message}} placeholder when it is used in the "Create Alert" dialog box's "Message" field.
     when (bool) : (bool)     An optional parmeter. Condition, deprecated.
  Returns: (void)
 method close_all(this, comment, alert_message, immediately, when) 
  Exits the current market position, making it flat.
  Namespace types: bot
  Parameters:
     this (bot) 
     comment (string) : (string)   An optional parameter. Additional notes on the order.
     alert_message (string) : (string)   An optional parameter which replaces the {{strategy.order.alert_message}} placeholder when it is used in the "Create Alert" dialog box's "Message" field.
     immediately (bool) : (bool)     An optional parameter. If true, the closing order will be executed on the tick where it has been placed, ignoring the strategy parameters that restrict the order execution to the open of the next bar. The default is false.
     when (bool) : (bool)     An optional parmeter. Condition, deprecated.
  Returns: (void)
 method cancel(this, id, when) 
  It is a command to cancel/deactivate pending orders by referencing their names, which were generated by the functions: strategy.order, strategy.entry and strategy.exit.
  Namespace types: bot
  Parameters:
     this (bot) 
     id (string) : (string)   A required parameter. The order identifier. It is possible to cancel an order by referencing its identifier.
     when (bool) : (bool)     An optional parmeter. Condition, deprecated.
  Returns: (void)
 method cancel_all(this, when) 
  It is a command to cancel/deactivate all pending orders, which were generated by the functions: strategy.order, strategy.entry and strategy.exit.
  Namespace types: bot
  Parameters:
     this (bot) 
     when (bool) : (bool)    An optional parmeter. Condition, deprecated.
  Returns: (void)
 method close(this, id, comment, qty, qty_percent, alert_message, immediately, when) 
  It is a command to exit from the entry with the specified ID. If there were multiple entry orders with the same ID, all of them are exited at once. If there are no open entries with the specified ID by the moment the command is triggered, the command will not come into effect. The command uses market order. Every entry is closed by a separate market order.
  Namespace types: bot
  Parameters:
     this (bot) 
     id (string) : (string)   A required parameter. The order identifier. It is possible to close an order by referencing its identifier.
     comment (string) : (string)   An optional parameter. Additional notes on the order.
     qty (float) : (float)    An optional parameter. Number of contracts/shares/lots/units to exit a trade with. The default value is 'NaN'.
     qty_percent (float) : (float)    Defines the percentage (0-100) of the position to close. Its priority is lower than that of the 'qty' parameter. Optional. The default is 100.
     alert_message (string) : (string)   An optional parameter which replaces the {{strategy.order.alert_message}} placeholder when it is used in the "Create Alert" dialog box's "Message" field.
     immediately (bool) : (bool)     An optional parameter. If true, the closing order will be executed on the tick where it has been placed, ignoring the strategy parameters that restrict the order execution to the open of the next bar. The default is false.
     when (bool) : (bool)     An optional parmeter. Condition, deprecated.
  Returns: (void)
 ticks_to_price(ticks, from) 
  Converts ticks to a price offset from the supplied price or the average entry price.
  Parameters:
     ticks (float) : (float) Ticks to convert to a price.
     from (float) : (float) A price that can be used to calculate from. Optional. The default value is `strategy.position_avg_price`.
  Returns: (float) A price level that has a distance from the entry price equal to the specified number of ticks.
 method exit(this, id, from_entry, qty, qty_percent, profit, limit, loss, stop, trail_price, trail_points, trail_offset, oca_name, comment, comment_profit, comment_loss, comment_trailing, alert_message, alert_profit, alert_loss, alert_trailing, when) 
  It is a command to exit either a specific entry, or whole market position. If an order with the same ID is already pending, it is possible to modify the order. If an entry order was not filled, but an exit order is generated, the exit order will wait till entry order is filled and then the exit order is placed. To deactivate an exit order, the command strategy.cancel or strategy.cancel_all should be used. If the function strategy.exit is called once, it exits a position only once. If you want to exit multiple times, the command strategy.exit should be called multiple times. If you use a stop loss and a trailing stop, their order type is 'stop', so only one of them is placed (the one that is supposed to be filled first). If all the following parameters 'profit', 'limit', 'loss', 'stop', 'trail_points', 'trail_offset' are 'NaN', the command will fail. To use market order to exit, the command strategy.close or strategy.close_all should be used.
  Namespace types: bot
  Parameters:
     this (bot) 
     id (string) : (string)   A required parameter. The order identifier. It is possible to cancel or modify an order by referencing its identifier.
     from_entry (string) : (string)   An optional parameter. The identifier of a specific entry order to exit from it. To exit all entries an empty string should be used. The default values is empty string.
     qty (float) : (float)    An optional parameter. Number of contracts/shares/lots/units to exit a trade with. The default value is 'NaN'.
     qty_percent (float) : (float)    Defines the percentage of (0-100) the position to close. Its priority is lower than that of the 'qty' parameter. Optional. The default is 100.
     profit (float) : (float)    An optional parameter. Profit target (specified in ticks). If it is specified, a limit order is placed to exit market position when the specified amount of profit (in ticks) is reached. The default value is 'NaN'.
     limit (float) : (float)    An optional parameter. Profit target (requires a specific price). If it is specified, a limit order is placed to exit market position at the specified price (or better). Priority of the parameter 'limit' is higher than priority of the parameter 'profit' ('limit' is used instead of 'profit', if its value is not 'NaN'). The default value is 'NaN'.
     loss (float) : (float)    An optional parameter. Stop loss (specified in ticks). If it is specified, a stop order is placed to exit market position when the specified amount of loss (in ticks) is reached. The default value is 'NaN'.
     stop (float) : (float)    An optional parameter. Stop loss (requires a specific price). If it is specified, a stop order is placed to exit market position at the specified price (or worse). Priority of the parameter 'stop' is higher than priority of the parameter 'loss' ('stop' is used instead of 'loss', if its value is not 'NaN'). The default value is 'NaN'.
     trail_price (float) : (float)    An optional parameter. Trailing stop activation level (requires a specific price). If it is specified, a trailing stop order will be placed when the specified price level is reached. The offset (in ticks) to determine initial price of the trailing stop order is specified in the 'trail_offset' parameter: X ticks lower than activation level to exit long position; X ticks higher than activation level to exit short position. The default value is 'NaN'.
     trail_points (float) : (float)    An optional parameter. Trailing stop activation level (profit specified in ticks). If it is specified, a trailing stop order will be placed when the calculated price level (specified amount of profit) is reached. The offset (in ticks) to determine initial price of the trailing stop order is specified in the 'trail_offset' parameter: X ticks lower than activation level to exit long position; X ticks higher than activation level to exit short position. The default value is 'NaN'.
     trail_offset (float) : (float)    An optional parameter. Trailing stop price (specified in ticks). The offset in ticks to determine initial price of the trailing stop order: X ticks lower than 'trail_price' or 'trail_points' to exit long position; X ticks higher than 'trail_price' or 'trail_points' to exit short position. The default value is 'NaN'.
     oca_name (string) : (string)   An optional parameter. Name of the OCA group (oca_type = strategy.oca.reduce) the profit target, the stop loss / the trailing stop orders belong to. If the name is not specified, it will be generated automatically.
     comment (string) : (string)   Additional notes on the order. If specified, displays near the order marker on the chart. Optional. The default is na.
     comment_profit (string) : (string)   Additional notes on the order if the exit was triggered by crossing `profit` or `limit` specifically. If specified, supercedes the `comment` parameter and displays near the order marker on the chart. Optional. The default is na.
     comment_loss (string) : (string)   Additional notes on the order if the exit was triggered by crossing `stop` or `loss` specifically. If specified, supercedes the `comment` parameter and displays near the order marker on the chart. Optional. The default is na.
     comment_trailing (string) : (string)   Additional notes on the order if the exit was triggered by crossing `trail_offset` specifically. If specified, supercedes the `comment` parameter and displays near the order marker on the chart. Optional. The default is na.
     alert_message (string) : (string)   Text that will replace the '{{strategy.order.alert_message}}' placeholder when one is used in the "Message" field of the "Create Alert" dialog. Optional. The default is na.
     alert_profit (string) : (string)   Text that will replace the '{{strategy.order.alert_message}}' placeholder when one is used in the "Message" field of the "Create Alert" dialog. Only replaces the text if the exit was triggered by crossing `profit` or `limit` specifically. Optional. The default is na.
     alert_loss (string) : (string)   Text that will replace the '{{strategy.order.alert_message}}' placeholder when one is used in the "Message" field of the "Create Alert" dialog. Only replaces the text if the exit was triggered by crossing `stop` or `loss` specifically. Optional. The default is na.
     alert_trailing (string) : (string)   Text that will replace the '{{strategy.order.alert_message}}' placeholder when one is used in the "Message" field of the "Create Alert" dialog. Only replaces the text if the exit was triggered by crossing `trail_offset` specifically. Optional. The default is na.
     when (bool) : (bool)     An optional parmeter. Condition, deprecated.
  Returns: (void)
 percent_to_ticks(percent, from) 
  Converts a percentage of the supplied price or the average entry price to ticks.
  Parameters:
     percent (float) : (float) The percentage of supplied price to convert to ticks. 50 is 50% of the entry price.
     from (float) : (float) A price that can be used to calculate from. Optional. The default value is `strategy.position_avg_price`.
  Returns: (float) A value in ticks.
 percent_to_price(percent, from) 
  Converts a percentage of the supplied price or the average entry price to a price.
  Parameters:
     percent (float) : (float) The percentage of the supplied price to convert to price. 50 is 50% of the supplied price.
     from (float) : (float) A price that can be used to calculate from. Optional. The default value is `strategy.position_avg_price`.
  Returns: (float) A value in the symbol's quote currency (USD for BTCUSD).
 bot 
  Fields:
     password (series__string) 
     start_time (series__integer) 
     end_time (series__integer) 
     leverage (series__integer) 
     initial_capital (series__float) 
     default_qty_type (series__string) 
     default_qty_value (series__float) 
     margin_mode (series__string) 
     contract_size (series__float) 
     kis_number (series__integer) 
     entry_percent (series__float) 
     close_percent (series__float) 
     exit_percent (series__float) 
     log_table (series__table) 
     fixed_qty (series__float) 
     fixed_cash (series__float) 
     real (series__bool) 
     auto_alert_message (series__bool) 
     hide_trade_line (series__bool)
Trading IQ - ICT LibraryLibrary   "ICTlibrary" 
Used to calculate various ICT related price levels and strategies. An ongoing project.
Hello Coders!
This library is meant for sourcing ICT related concepts. While some functions might generate more output than you require, you can specify "Lite Mode" as "true" in applicable functions to slim down necessary inputs.
 isLastBar(userTF) 
  Identifies the last bar on the chart before a timeframe change
  Parameters:
     userTF (simple int) : the timeframe you wish to calculate the last bar for, must be converted to integer using 'timeframe.in_seconds()'
  Returns: bool true if bar on chart is last bar of higher TF, dalse if bar on chart is not last bar of higher TF
 necessaryData(atrTF) 
  returns necessaryData UDT for historical data access
  Parameters:
     atrTF (float) : user-selected timeframe ATR value.
  Returns: logZ. log return Z score, used for calculating order blocks.
 method gradBoxes(gradientBoxes, idColor, timeStart, bottom, top, rightCoordinate) 
  creates neon like effect for box drawings
  Namespace types: array
  Parameters:
     gradientBoxes (array) : an array.new() to store the gradient boxes
     idColor (color) 
     timeStart (int) : left point of box
     bottom (float) : bottom of box price point
     top (float) : top of box price point
     rightCoordinate (int) : right point of box
  Returns: void
 checkIfTraded(tradeName) 
  checks if recent trade is of specific name
  Parameters:
     tradeName (string) 
  Returns: bool true if recent trade id matches target name, false otherwise
 checkIfClosed(tradeName) 
  checks if recent closed trade is of specific name
  Parameters:
     tradeName (string) 
  Returns: bool true if recent closed trade id matches target name, false otherwise
 IQZZ(atrMult, finalTF) 
  custom ZZ to quickly determine market direction.
  Parameters:
     atrMult (float) : an atr multiplier used to determine the required price move for a ZZ direction change
     finalTF (string) : the timeframe used for the atr calcuation
  Returns: dir market direction. Up => 1, down => -1
 method drawBos(id, startPoint, getKeyPointTime, getKeyPointPrice, col, showBOS, isUp) 
  calculates and draws Break Of Structure
  Namespace types: array
  Parameters:
     id (array) 
     startPoint (chart.point) 
     getKeyPointTime (int) : the actual time of startPoint, simplystartPoint.time
     getKeyPointPrice (float) : the actual time of startPoint, simplystartPoint.price
     col (color) : color of the BoS line / label
     showBOS (bool) : whether to show label/line. This function still calculates internally for other ICT related concepts even if not drawn.
     isUp (bool) : whether BoS happened during price increase or price decrease.
  Returns: void
 method drawMSS(id, startPoint, getKeyPointTime, getKeyPointPrice, col, showMSS, isUp, upRejections, dnRejections, highArr, lowArr, timeArr, closeArr, openArr, atrTFarr, upRejectionsPrices, dnRejectionsPrices) 
  calculates and draws Market Structure Shift. This data is also used to calculate Rejection Blocks.
  Namespace types: array
  Parameters:
     id (array) 
     startPoint (chart.point) 
     getKeyPointTime (int) : the actual time of startPoint, simplystartPoint.time
     getKeyPointPrice (float) : the actual time of startPoint, simplystartPoint.price
     col (color) : color of the MSS line / label
     showMSS (bool) : whether to show label/line. This function still calculates internally for other ICT related concepts even if not drawn.
     isUp (bool) : whether MSS happened during price increase or price decrease.
     upRejections (array) 
     dnRejections (array) 
     highArr (array) : array containing historical highs, should be taken from the UDT "necessaryData" defined above
     lowArr (array) : array containing historical lows, should be taken from the UDT "necessaryData" defined above
     timeArr (array) : array containing historical times, should be taken from the UDT "necessaryData" defined above
     closeArr (array) : array containing historical closes, should be taken from the UDT "necessaryData" defined above
     openArr (array) : array containing historical opens, should be taken from the UDT "necessaryData" defined above
     atrTFarr (array) : array containing historical atr values (of user-selected TF), should be taken from the UDT "necessaryData" defined above
     upRejectionsPrices (array) : array containing up rejections prices. Is sorted and used to determine selective looping for invalidations.
     dnRejectionsPrices (array) : array containing down rejections prices. Is sorted and used to determine selective looping for invalidations.
  Returns: void
 method getTime(id, compare, timeArr) 
  gets time of inputted price (compare) in an array of data
this is useful when the user-selected timeframe for ICT concepts is greater than the chart's timeframe
  Namespace types: array
  Parameters:
     id (array) : the array of data to search through, to find which index has the same value as "compare"
     compare (float) : the target data point to find in the array
     timeArr (array) : array of historical times
  Returns: the time that the data point in the array was recorded
 method OB(id, highArr, signArr, lowArr, timeArr, sign) 
  store bullish orderblock data
  Namespace types: array
  Parameters:
     id (array) 
     highArr (array) : array of historical highs
     signArr (array) : array of historical price direction "math.sign(close - open)"
     lowArr (array) : array of historical lows
     timeArr (array) : array of historical times
     sign (int) : orderblock direction, -1 => bullish, 1 => bearish
  Returns: void
 OTEstrat(OTEstart, future, closeArr, highArr, lowArr, timeArr, longOTEPT, longOTESL, longOTElevel, shortOTEPT, shortOTESL, shortOTElevel, structureDirection, oteLongs, atrTF, oteShorts) 
  executes the OTE strategy
  Parameters:
     OTEstart (chart.point) 
     future (int) : future time point for drawings
     closeArr (array) : array of historical closes
     highArr (array) : array of historical highs
     lowArr (array) : array of historical lows
     timeArr (array) : array of historical times
     longOTEPT (string) : user-selected long OTE profit target, please create an input.string() for this using the example below
     longOTESL (int) : user-selected long OTE stop loss, please create an input.string() for this using the example below
     longOTElevel (float) : long entry price of selected retracement ratio for OTE
     shortOTEPT (string) : user-selected short OTE profit target, please create an input.string() for this using the example below
     shortOTESL (int) : user-selected short OTE stop loss, please create an input.string() for this using the example below
     shortOTElevel (float) : short entry price of selected retracement ratio for OTE
     structureDirection (string) : current market structure direction, this should be "Up" or "Down". This is used to cancel pending orders if market structure changes
     oteLongs (bool) : input.bool() for whether OTE longs can be executed
     atrTF (float) : atr of the user-seleceted TF
     oteShorts (bool) : input.bool() for whether OTE shorts can be executed
@exampleInputs
oteLongs        = input.bool(defval = false, title = "OTE Longs", group = "Optimal Trade Entry")
longOTElevel    = input.float(defval = 0.79, title = "Long Entry Retracement Level", options =  , group = "Optimal Trade Entry")
longOTEPT       = input.string(defval = "-0.5", title = "Long TP", options =  , group = "Optimal Trade Entry")
longOTESL       = input.int(defval = 0, title = "How Many Ticks Below Swing Low For Stop Loss", group = "Optimal Trade Entry")
oteShorts       = input.bool(defval = false, title = "OTE Shorts", group = "Optimal Trade Entry")
shortOTElevel   = input.float(defval = 0.79, title = "Short Entry Retracement Level", options =  , group = "Optimal Trade Entry")
shortOTEPT      = input.string(defval = "-0.5", title = "Short TP", options =  , group = "Optimal Trade Entry")
shortOTESL      = input.int(defval = 0, title = "How Many Ticks Above Swing Low For Stop Loss", group = "Optimal Trade Entry")
  Returns: void (0)
 displacement(logZ, atrTFreg, highArr, timeArr, lowArr, upDispShow, dnDispShow, masterCoords, labelLevels, dispUpcol, rightCoordinate, dispDncol, noBorders) 
  calculates and draws dispacements
  Parameters:
     logZ (float) : log return of current price, used to determine a "significant price move" for a displacement
     atrTFreg (float) : atr of user-seleceted timeframe
     highArr (array) : array of historical highs
     timeArr (array) : array of historical times
     lowArr (array) : array of historical lows
     upDispShow (int) : amount of historical upside displacements to show
     dnDispShow (int) : amount of historical downside displacements to show
     masterCoords (map) : a  map to push the most recent displacement prices into, useful for having key levels in one data structure
     labelLevels (string) : used to determine label placement for the displacement, can be inside box, outside box, or none, example below
     dispUpcol (color) : upside displacement color
     rightCoordinate (int) : future time for displacement drawing, best is "last_bar_time"
     dispDncol (color) : downside displacement color
     noBorders (bool) : input.bool() to remove box borders, example below
@exampleInputs
labelLevels     = input.string(defval = "Inside" , title = "Box Label Placement", options =  )
noBorders       = input.bool(defval = false, title = "No Borders On Levels")
  Returns: void
 method getStrongLow(id, startIndex, timeArr, lowArr, strongLowPoints) 
  unshift strong low data to array id
  Namespace types: array
  Parameters:
     id (array) 
     startIndex (int) : the starting index for the timeArr array of the UDT "necessaryData".
this point should start from at least 1 pivot prior to find the low before an upside BoS
     timeArr (array) : array of historical times
     lowArr (array) : array of historical lows
     strongLowPoints (array) : array of strong low prices. Used to retrieve highest strong low price and see if need for
removal of invalidated strong lows
  Returns: void
 method getStrongHigh(id, startIndex, timeArr, highArr, strongHighPoints) 
  unshift strong high data to array id
  Namespace types: array
  Parameters:
     id (array) 
     startIndex (int) : the starting index for the timeArr array of the UDT "necessaryData".
this point should start from at least 1 pivot prior to find the high before a downside BoS
     timeArr (array) : array of historical times
     highArr (array) : array of historical highs
     strongHighPoints (array) 
  Returns: void
 equalLevels(highArr, lowArr, timeArr, rightCoordinate, equalHighsCol, equalLowsCol, liteMode) 
  used to calculate recent equal highs or equal lows
  Parameters:
     highArr (array) : array of historical highs
     lowArr (array) : array of historical lows
     timeArr (array) : array of historical times
     rightCoordinate (int) : a future time (right for boxes, x2 for lines)
     equalHighsCol (color) : user-selected color for equal highs drawings
     equalLowsCol (color) : user-selected color for equal lows drawings
     liteMode (bool) : optional for a lite mode version of an ICT strategy. For more control over drawings leave as "True", "False" will apply neon effects
  Returns: void
 quickTime(timeString) 
  used to quickly determine if a user-inputted time range is currently active in NYT time
  Parameters:
     timeString (string) : a time range
  Returns: true if session is active, false if session is inactive
 macros(showMacros, noBorders) 
  used to calculate and draw session macros
  Parameters:
     showMacros (bool) : an input.bool() or simple bool to determine whether to activate the function
     noBorders (bool) : an input.bool() to determine whether the box anchored to the session should have borders
  Returns: void
 po3(tf, left, right, show) 
  use to calculate HTF po3 candle
@tip only call this function on "barstate.islast"
  Parameters:
     tf (simple string) 
     left (int) : the left point of the candle, calculated as bar_index + left,
     right (int) : :the right point of the candle, calculated as bar_index + right,
     show (bool) : input.bool() whether to show the po3 candle or not
  Returns: void
 silverBullet(silverBulletStratLong, silverBulletStratShort, future, userTF, H, L, H2, L2, noBorders, silverBulletLongTP, historicalPoints, historicalData, silverBulletLongSL, silverBulletShortTP, silverBulletShortSL) 
  used to execute the Silver Bullet Strategy
  Parameters:
     silverBulletStratLong (simple bool) 
     silverBulletStratShort (simple bool) 
     future (int) : a future time, used for drawings, example "last_bar_time"
     userTF (simple int) 
     H (float) : the high price of the user-selected TF
     L (float) : the low price of the user-selected TF
     H2 (float) : the high  price of the user-selected TF
     L2 (float) : the low  price of the user-selected TF
     noBorders (bool) : an input.bool() used to remove the borders from box drawings
     silverBulletLongTP (series silverBulletLevels) 
     historicalPoints (array) 
     historicalData (necessaryData) 
     silverBulletLongSL (series silverBulletLevels) 
     silverBulletShortTP (series silverBulletLevels) 
     silverBulletShortSL (series silverBulletLevels) 
  Returns: void
 method invalidFVGcheck(FVGarr, upFVGpricesSorted, dnFVGpricesSorted) 
  check if existing FVGs are still valid
  Namespace types: array
  Parameters:
     FVGarr (array) 
     upFVGpricesSorted (array) : an array of bullish FVG prices, used to selective search through FVG array to remove invalidated levels
     dnFVGpricesSorted (array) : an array of bearish FVG prices, used to selective search through FVG array to remove invalidated levels
  Returns: void (0)
 method drawFVG(counter, FVGshow, FVGname, FVGcol, data, masterCoords, labelLevels, borderTransp, liteMode, rightCoordinate) 
  draws FVGs on last bar
  Namespace types: map
  Parameters:
     counter (map) : a counter, as map, keeping count of the number of FVGs drawn, makes sure that there aren't more FVGs drawn
than int FVGshow
     FVGshow (int) : the number of FVGs to show. There should be a bullish FVG show and bearish FVG show. This function "drawFVG" is used separately
for bearish FVG and bullish FVG.
     FVGname (string) : the name of the FVG, "FVG Up" or "FVG Down"
     FVGcol (color) : desired FVG color
     data (FVG) 
     masterCoords (map) : a map containing the names and price points of key levels. Used to define price ranges.
     labelLevels (string) : an input.string with options "Inside", "Outside", "Remove". Determines whether FVG labels should be inside box, outside,
or na.
     borderTransp (int) 
     liteMode (bool) 
     rightCoordinate (int) : the right coordinate of any drawings. Must be a time point.
  Returns: void
 invalidBlockCheck(bullishOBbox, bearishOBbox, userTF) 
  check if existing order blocks are still valid
  Parameters:
     bullishOBbox (array) : an array declared using the UDT orderBlock that contains bullish order block related data
     bearishOBbox (array) : an array declared using the UDT orderBlock that contains bearish order block related data
     userTF (simple int) 
  Returns: void (0)
 method lastBarRejections(id, rejectionColor, idShow, rejectionString, labelLevels, borderTransp, liteMode, rightCoordinate, masterCoords) 
  draws rejectionBlocks on last bar
  Namespace types: array
  Parameters:
     id (array) : the array, an array of rejection block data declared using the UDT rejection block
     rejectionColor (color) : the desired color of the rejection box
     idShow (int) 
     rejectionString (string) : the desired name of the rejection blocks
     labelLevels (string) : an input.string() to determine if labels for the block should be inside the box, outside, or none.
     borderTransp (int) 
     liteMode (bool) : an input.bool(). True = neon effect, false = no neon.
     rightCoordinate (int) : atime for the right coordinate of the box
     masterCoords (map) : a map  that stores the price of key levels and assigns them a name, used to determine price ranges
  Returns: void
 method OBdraw(id, OBshow, BBshow, OBcol, BBcol, bullishString, bearishString, isBullish, labelLevels, borderTransp, liteMode, rightCoordinate, masterCoords) 
  draws orderblocks and breaker blocks for data stored in UDT array()
  Namespace types: array
  Parameters:
     id (array) : the array, an array of order block data declared using the UDT orderblock
     OBshow (int) : the number of order blocks to show
     BBshow (int) : the number of breaker blocks to show
     OBcol (color) : color of order blocks
     BBcol (color) : color of breaker blocks
     bullishString (string) : the title of bullish blocks, which is a regular bullish orderblock or a bearish orderblock that's converted to breakerblock
     bearishString (string) : the title of bearish blocks, which is a regular bearish orderblock or a bullish orderblock that's converted to breakerblock
     isBullish (bool) : whether the array contains bullish orderblocks or bearish orderblocks. If bullish orderblocks,
the array will naturally contain bearish BB, and if bearish OB, the array will naturally contain bullish BB
     labelLevels (string) : an input.string() to determine if labels for the block should be inside the box, outside, or none.
     borderTransp (int) 
     liteMode (bool) : an input.bool(). True = neon effect, false = no neon.
     rightCoordinate (int) : atime for the right coordinate of the box
     masterCoords (map) : a map  that stores the price of key levels and assigns them a name, used to determine price ranges
  Returns: void
 FVG 
  UDT for FVG calcualtions
  Fields:
     H (series float) : high price of user-selected timeframe
     L (series float) : low price of user-selected timeframe
     direction (series string) : FVG direction => "Up" or "Down"
     T (series int) : => time of bar on user-selected timeframe where FVG was created
     fvgLabel (series label) : optional label for FVG
     fvgLineTop (series line) : optional line for top of FVG
     fvgLineBot (series line) : optional line for bottom of FVG
     fvgBox (series box) : optional box for FVG
 labelLine 
  quickly pair a line and label together as UDT
  Fields:
     lin (series line) : Line you wish to pair with label
     lab (series label) : Label you wish to pair with line
 orderBlock 
  UDT for order block calculations
  Fields:
     orderBlockData (array) : array containing order block x and y points
     orderBlockBox (series box) : optional order block box
     vioCount (series int) : = 0    violation count of the order block. 0 = Order Block, 1 = Breaker Block
     traded (series bool) 
     status (series string) : = "OB"   status == "OB" => Level is order block. status == "BB" => Level is breaker block.
     orderBlockLab (series label) : options label for the order block / breaker block.
 strongPoints 
  UDT for strong highs and strong lows
  Fields:
     price (series float) : price of the strong high or strong low
     timeAtprice (series int) : time of the strong high or strong low
     strongPointLabel (series label) : optional label for strong point
     strongPointLine (series line) : optional line for strong point
     overlayLine (series line) : optional lines for strong point to enhance visibility
     overlayLine2 (series line) : optional lines for strong point to enhance visibility
 displacement 
  UDT for dispacements
  Fields:
     highPrice (series float) : high price of displacement
     lowPrice (series float) : low price of displacement
     timeAtPrice (series int) : time of bar where displacement occurred
     displacementBox (series box) : optional box to draw displacement
     displacementLab (series label) : optional label for displacement
 po3data 
  UDT for po3 calculations
  Fields:
     dHigh (series float) : higher timeframe high price
     dLow (series float) : higher timeframe low price
     dOpen (series float) : higher timeframe open price
     dClose (series float) : higher timeframe close price
     po3box (series box) : box to draw po3 candle body
     po3line (array) : line array to draw po3 wicks
     po3Labels (array) : label array to label price points of po3 candle
 macros 
  UDT for session macros
  Fields:
     sessions (array) : Array of sessions, you can populate this array using the "quickTime" function located above "export macros".
     prices (matrix) : Matrix of session data -> open, high, low, close, time
     sessionTimes (array) : Array of session names. Pairs with array sessions.
     sessionLines (matrix) : Optional array for sesion drawings.
 OTEtimes 
  UDT for data storage and drawings associated with OTE strategy
  Fields:
     upTimes (array) : time of highest point before trade is taken
     dnTimes (array) : time of lowest point before trade is taken
     tpLineLong (series line) : line to mark tp level long
     tpLabelLong (series label) : label to mark tp level long
     slLineLong (series line) : line to mark sl level  long
     slLabelLong (series label) : label to mark sl level long
     tpLineShort (series line) : line to mark tp level short
     tpLabelShort (series label) : label to mark tp level short
     slLineShort (series line) : line to mark sl level  short
     slLabelShort (series label) : label to mark sl level short
 sweeps 
  UDT for data storage and drawings associated with liquidity sweeps
  Fields:
     upSweeps (matrix) : matrix containing liquidity sweep price points and time points for up sweeps
     dnSweeps (matrix) : matrix containing liquidity sweep price points and time points for down sweeps
     upSweepDrawings (array) : optional up sweep box array. Pair the size of this array with the rows or columns,
     dnSweepDrawings (array) : optional up sweep box array. Pair the size of this array with the rows or columns,
 raidExitDrawings 
  UDT for drawings associated with the Liquidity Raid Strategy
  Fields:
     tpLine (series line) : tp line for the liquidity raid entry
     tpLabel (series label) : tp label for the liquidity raid entry
     slLine (series line) : sl line for the liquidity raid entry
     slLabel (series label) : sl label for the liquidity raid entry
 m2022 
  UDT for data storage and drawings associated with the Model 2022 Strategy
  Fields:
     mTime (series int) : time of the FVG where entry limit order is placed
     mIndex (series int) : array index of FVG where entry limit order is placed. This requires an array of FVG data, which is defined above.
     mEntryDistance (series float) : the distance of the FVG to the 50% range. M2022 looks for the fvg closest to 50% mark of range.
     mEntry (series float) : the entry price for the most eligible fvg
     fvgHigh (series float) : the high point of the eligible fvg
     fvgLow (series float) : the low point of the eligible fvg
     longFVGentryBox (series box) : long FVG box, used to draw the eligible FVG
     shortFVGentryBox (series box) : short FVG box, used to draw the eligible FVG
     line50P (series line) : line used to mark 50% of the range
     line100P (series line) : line used to mark 100% (top) of the range
     line0P (series line) : line used to mark 0% (bottom) of the range
     label50P (series label) : label used to mark 50% of the range
     label100P (series label) : label used to mark 100% (top) of the range
     label0P (series label) : label used to mark 0% (bottom) of the range
     sweepData (array) 
 silverBullet 
  UDT for data storage and drawings associated with the Silver Bullet Strategy
  Fields:
     session (series bool) 
     sessionStr (series string) : name of the session for silver bullet
     sessionBias (series string) 
     sessionHigh (series float) : = high   high of session // use math.max(silverBullet.sessionHigh, high)
     sessionLow (series float) : = low    low of session  // use math.min(silverBullet.sessionLow, low)
     sessionFVG (series float) : if applicable, the FVG created during the session
     sessionFVGdraw (series box) : if applicable, draw the FVG created during the session
     traded (series bool) 
     tp (series float) : tp of trade entered at the session FVG
     sl (series float) : sl of trade entered at the session FVG
     sessionDraw (series box) : optional draw session with box
     sessionDrawLabel (series label) : optional label session with label
 silverBulletDrawings 
  UDT for trade exit drawings associated with the Silver Bullet Strategy
  Fields:
     tpLine (series line) : tp line drawing for strategy
     tpLabel (series label) : tp label drawing for strategy
     slLine (series line) : sl line drawing for strategy
     slLabel (series label) : sl label drawing for strategy
 unicornModel 
  UDT for data storage and drawings associated with the Unicorn Model Strategy
  Fields:
     hPoint (chart.point) 
     hPoint2 (chart.point) 
     hPoint3 (chart.point) 
     breakerBlock (series box) : used to draw the breaker block required for the Unicorn Model
     FVG (series box) : used to draw the FVG required for the Unicorn model
     topBlock (series float) : price of top of breaker block, can be used to detail trade entry
     botBlock (series float) : price of bottom of breaker block, can be used to detail trade entry
     startBlock (series int) : start time of the breaker block, used to set the "left = " param for the box
     includes (array) : used to store the time of the breaker block, or FVG, or the chart point sequence that setup the Unicorn Model.
     entry (series float) : // eligible entry price, for longs"math.max(topBlock, FVG.get_top())",
     tpLine (series line) : optional line to mark PT
     tpLabel (series label) : optional label to mark PT
     slLine (series line) : optional line to mark SL
     slLabel (series label) : optional label to mark SL
 rejectionBlocks 
  UDT for data storage and drawings associated with rejection blocks
  Fields:
     rejectionPoint (chart.point) 
     bodyPrice (series float) : candle body price closest to the rejection point, for "Up" rejections => math.max(open, close),
     rejectionBox (series box) : optional box drawing of the rejection block
     rejectionLabel (series label) : optional label for the rejection block
 equalLevelsDraw 
  UDT for data storage and drawings associated with equal highs / equal lows
  Fields:
     connector (series line) : single line placed at the first high or low, y = avgerage of distinguished equal highs/lows
     connectorLab (series label) : optional label to be placed at the highs or lows
     levels (array) : array containing the equal highs or lows prices
     times (array) : array containing the equal highs or lows individual times
     startTime (series int) : the time of the first high or low that forms a sequence of equal highs or lows
     radiate (array) : options label to "radiate" the label in connector lab. Can be used for anything
 necessaryData 
  UDT for data storage of historical price points.
  Fields:
     highArr (array) : array containing historical high points
     lowArr (array) : array containing historical low points
     timeArr (array) : array containing historical time points
     logArr (array) : array containing historical log returns
     signArr (array) : array containing historical price directions
     closeArr (array) : array containing historical close points
     binaryTimeArr (array) : array containing historical time points, uses "push" instead of "unshift" to allow for binary search
     binaryCloseArr (array) : array containing historical close points, uses "push" instead of "unshift" to allow the correct
     binaryOpenArr (array) : array containing historical optn points, uses "push" instead of "unshift" to allow the correct
     atrTFarr (array) : array containing historical user-selected TF atr points
     openArr (array) : array containing historical open points
ApicodeLibrary   "Apicode" 
 percentToTicks(percent, from) 
  Converts a percentage of the average entry price or a specified price to ticks when the
strategy has an open position.
  Parameters:
     percent (float) : (series int/float) The percentage of the `from` price to express in ticks, e.g.,
a value of 50 represents 50% (half) of the price.
     from (float) : (series int/float) Optional. The price from which to calculate a percentage and convert
to ticks. The default is `strategy.position_avg_price`.
  Returns: (float) The number of ticks within the specified percentage of the `from` price if
the strategy has an open position. Otherwise, it returns `na`.
 percentToPrice(percent, from) 
  Calculates the price value that is a specific percentage distance away from the average
entry price or a specified price when the strategy has an open position.
  Parameters:
     percent (float) : (series int/float) The percentage of the `from` price to use as the distance. If the value
is positive, the calculated price is above the `from` price. If negative, the result is
below the `from` price. For example, a value of 10 calculates the price 10% higher than
the `from` price.
     from (float) : (series int/float) Optional. The price from which to calculate a percentage distance.
The default is `strategy.position_avg_price`.
  Returns: (float) The price value at the specified `percentage` distance away from the `from` price
if the strategy has an open position. Otherwise, it returns `na`.
 percentToCurrency(price, percent) 
  Parameters:
     price (float) : (series int/float) The price from which to calculate the percentage.
     percent (float) : (series int/float) The percentage of the `price` to calculate.
  Returns: (float) The amount of the symbol's currency represented by the percentage of the specified
`price`.
 percentProfit(exitPrice) 
  Calculates the expected profit/loss of the open position if it were to close at the
specified `exitPrice`, expressed as a percentage of the average entry price.
NOTE: This function may not return precise values for positions with multiple open trades
because it only uses the average entry price.
  Parameters:
     exitPrice (float) : (series int/float) The position's hypothetical closing price.
  Returns: (float) The expected profit percentage from exiting the position at the `exitPrice`. If
there is no open position, it returns `na`.
 priceToTicks(price) 
  Converts a price value to ticks.
  Parameters:
     price (float) : (series int/float) The price to convert.
  Returns: (float) The value of the `price`, expressed in ticks.
 ticksToPrice(ticks, from) 
  Calculates the price value at the specified number of ticks away from the average entry
price or a specified price when the strategy has an open position.
  Parameters:
     ticks (float) : (series int/float) The number of ticks away from the `from` price. If the value is positive,
the calculated price is above the `from` price. If negative, the result is below the `from`
price.
     from (float) : (series int/float) Optional. The price to evaluate the tick distance from. The default is
`strategy.position_avg_price`.
  Returns: (float) The price value at the specified number of ticks away from the `from` price if
the strategy has an open position. Otherwise, it returns `na`.
 ticksToCurrency(ticks) 
  Converts a specified number of ticks to an amount of the symbol's currency.
  Parameters:
     ticks (float) : (series int/float) The number of ticks to convert.
  Returns: (float) The amount of the symbol's currency represented by the tick distance.
 ticksToStopLevel(ticks) 
  Calculates a stop-loss level using a specified tick distance from the position's average
entry price. A script can plot the returned value and use it as the `stop` argument in a
`strategy.exit()` call.
  Parameters:
     ticks (float) : (series int/float) The number of ticks from the position's average entry price to the
stop-loss level. If the position is long, the value represents the number of ticks *below*
the average entry price. If short, it represents the number of ticks *above* the price.
  Returns: (float) The calculated stop-loss value for the open position. If there is no open position,
it returns `na`.
 ticksToTpLevel(ticks) 
  Calculates a take-profit level using a specified tick distance from the position's average
entry price. A script can plot the returned value and use it as the `limit` argument in a
`strategy.exit()` call.
  Parameters:
     ticks (float) : (series int/float) The number of ticks from the position's average entry price to the
take-profit level. If the position is long, the value represents the number of ticks *above*
the average entry price. If short, it represents the number of ticks *below* the price.
  Returns: (float) The calculated take-profit value for the open position. If there is no open
position, it returns `na`.
 calcPositionSizeByStopLossTicks(stopLossTicks, riskPercent) 
  Calculates the entry quantity required to risk a specified percentage of the strategy's
current equity at a tick-based stop-loss level.
  Parameters:
     stopLossTicks (float) : (series int/float) The number of ticks in the stop-loss distance.
     riskPercent (float) : (series int/float) The percentage of the strategy's equity to risk if a trade moves
`stopLossTicks` away from the entry price in the unfavorable direction.
  Returns: (int) The number of contracts/shares/lots/units to use as the entry quantity to risk the
specified percentage of equity at the stop-loss level.
 calcPositionSizeByStopLossPercent(stopLossPercent, riskPercent, entryPrice) 
  Calculates the entry quantity required to risk a specified percentage of the strategy's
current equity at a percent-based stop-loss level.
  Parameters:
     stopLossPercent (float) : (series int/float) The percentage of the `entryPrice` to use as the stop-loss distance.
     riskPercent (float) : (series int/float) The percentage of the strategy's equity to risk if a trade moves
`stopLossPercent` of the `entryPrice` in the unfavorable direction.
     entryPrice (float) : (series int/float) Optional. The entry price to use in the calculation. The default is
`close`.
  Returns: (int) The number of contracts/shares/lots/units to use as the entry quantity to risk the
specified percentage of equity at the stop-loss level.
 exitPercent(id, lossPercent, profitPercent, qty, qtyPercent, comment, alertMessage) 
  A wrapper for the `strategy.exit()` function designed for creating stop-loss and
take-profit orders at percentage distances away from the position's average entry price.
NOTE: This function calls `strategy.exit()` without a `from_entry` ID, so it creates exit
orders for *every* entry in an open position until the position closes. Therefore, using
this function when the strategy has a pyramiding value greater than 1 can lead to
unexpected results. See the "Exits for multiple entries" section of our User Manual's
"Strategies" page to learn more about this behavior.
  Parameters:
     id (string) : (series string) Optional. The identifier of the stop-loss/take-profit orders, which
corresponds to an exit ID in the strategy's trades after an order fills. The default is
`"Exit"`.
     lossPercent (float) : (series int/float) The percentage of the position's average entry price to use as the
stop-loss distance. The function does not create a stop-loss order if the value is `na`.
     profitPercent (float) : (series int/float) The percentage of the position's average entry price to use as the
take-profit distance. The function does not create a take-profit order if the value is `na`.
     qty (float) : (series int/float) Optional. The number of contracts/lots/shares/units to close when an
exit order fills. If specified, the call uses this value instead of `qtyPercent` to
determine the order size. The exit orders reserve this quantity from the position, meaning
other orders from `strategy.exit()` cannot close this portion until the strategy fills or
cancels those orders. The default is `na`, which means the order size depends on the
`qtyPercent` value.
     qtyPercent (float) : (series int/float) Optional. A value between 0 and 100 representing the percentage of the
open trade quantity to close when an exit order fills. The exit orders reserve this
percentage from the open trades, meaning other calls to this command cannot close this
portion until the strategy fills or cancels those orders. The percentage calculation
depends on the total size of the applicable open trades without considering the reserved
amount from other `strategy.exit()` calls. The call ignores this parameter if the `qty`
value is not `na`. The default is 100.
     comment (string) : (series string) Optional. Additional notes on the filled order. If the value is specified
and not an empty "string", the Strategy Tester and the chart show this text for the order
instead of the specified `id`. The default is `na`.
     alertMessage (string) : (series string) Optional. Custom text for the alert that fires when an order fills. If the
value is specified and not an empty "string", and the "Message" field of the "Create Alert"
dialog box contains the `{{strategy.order.alert_message}}` placeholder, the alert message
replaces the placeholder with this text. The default is `na`.
  Returns: (void) The function does not return a usable value.
 closeAllAtEndOfSession(comment, alertMessage) 
  A wrapper for the `strategy.close_all()` function designed to close all open trades with a
market order when the last bar in the current day's session closes. It uses the command's
`immediately` parameter to exit all trades at the last bar's `close` instead of the `open`
of the next session's first bar.
  Parameters:
     comment (string) : (series string) Optional. Additional notes on the filled order. If the value is specified
and not an empty "string", the Strategy Tester and the chart show this text for the order
instead of the automatically generated exit identifier. The default is `na`.
     alertMessage (string) : (series string) Optional. Custom text for the alert that fires when an order fills. If the
value is specified and not an empty "string", and the "Message" field of the "Create Alert"
dialog box contains the `{{strategy.order.alert_message}}` placeholder, the alert message
replaces the placeholder with this text. The default is `na`.
  Returns: (void) The function does not return a usable value.
 closeAtEndOfSession(entryId, comment, alertMessage) 
  A wrapper for the `strategy.close()` function designed to close specific open trades with a
market order when the last bar in the current day's session closes. It uses the command's
`immediately` parameter to exit the trades at the last bar's `close` instead of the `open`
of the next session's first bar.
  Parameters:
     entryId (string) 
     comment (string) : (series string) Optional. Additional notes on the filled order. If the value is specified
and not an empty "string", the Strategy Tester and the chart show this text for the order
instead of the automatically generated exit identifier. The default is `na`.
     alertMessage (string) : (series string) Optional. Custom text for the alert that fires when an order fills. If the
value is specified and not an empty "string", and the "Message" field of the "Create Alert"
dialog box contains the `{{strategy.order.alert_message}}` placeholder, the alert message
replaces the placeholder with this text. The default is `na`.
  Returns: (void) The function does not return a usable value.
 sortinoRatio(interestRate, forceCalc) 
  Calculates the Sortino ratio of the strategy based on realized monthly returns.
  Parameters:
     interestRate (simple float) : (simple int/float) Optional. The *annual* "risk-free" return percentage to compare against
strategy returns. The default is 2, meaning it uses an annual benchmark of 2%.
     forceCalc (bool) : (series bool) Optional. A value of `true` forces the function to calculate the ratio on the
current bar. If the value is `false`, the function calculates the ratio only on the latest
available bar for efficiency. The default is `false`.
  Returns: (float) The Sortino ratio, which estimates the strategy's excess return per unit of
downside volatility.
 sharpeRatio(interestRate, forceCalc) 
  Calculates the Sharpe ratio of the strategy based on realized monthly returns.
  Parameters:
     interestRate (simple float) : (simple int/float) Optional. The *annual* "risk-free" return percentage to compare against
strategy returns. The default is 2, meaning it uses an annual benchmark of 2%.
     forceCalc (bool) : (series bool) Optional. A value of `true` forces the function to calculate the ratio on the
current bar. If the value is `false`, the function calculates the ratio only on the latest
available bar for efficiency. The default is `false`.
  Returns: (float) The Sortino ratio, which estimates the strategy's excess return per unit of
total volatility.
Turtle Trader StrategyTurtle Trader Strategy :  
 Introduction :  
This strategy is based on the well known « Turtle Trader Strategy », that has proven itself over the years. It sends long and short signals with pyramid orders of up to 5, meaning that the strategy can trigger up to 5 orders in the same direction. Good risk and money management.
It's important to note that the strategy combines 2 systems working together (S1 and S2). Let’s describe the specific features of this strategy.
 1/ Position size :  
Position size is very important for turtle traders to manage risk properly. This position sizing strategy adapts to market volatility and to account (gains and losses). It’s based on ATR (Average True Range) which can also be called « N ». Its length is per default 20.
 ATR(20) = (previous_atr(20)*19 + actual_true_range)/20 
The number of units to buy is :
 Unit = 1% * account/(ATR(20)*dollar_per_point) 
where  account  is the actual account value and  dollar_per_point  is the variation in dollar of the asset with a 1 point move.
Depending on your risk aversion, you can increase the percentage of your account, but turtle traders default to 1%. If you trade contracts, units must be rounded down by default.
There is also an additional rule to reduce the risk if the value of the account falls below the initial capital : in this case and only in this case,  account  in the unit formula must be replace by :
 account = actual_account*actual_account/initial capital 
 2/ Open a position : 
2 systems are working together : 
 
 System 1 : Entering a new 20 day breakout
 System 2 : Entering a new 55 day breakout
 
A breakout is a new high or new low. If it’s a new high, we open long position and vice versa if it’s a new low we enter in short position.
We add an additional rule :
 
 System 1 : Breakout is ignored if last long/short position was a winner
 System 2 : All signals are taken
 
This additional rule allows the trader to be in the major trends if the system 1 signal has been skipped. If a signal for system 1 has been skipped, and next candle is also a new 20 day breakout, S1 doesn’t give a signal. We have to wait S2 signal or wait for a candle that doesn’t make a new breakout to reactivate S1.
 3/ Pyramid orders :  
Turtle Strategy allows us to add extra units to the position if the price moves in our favor. I've configured the strategy to allow up to 5 orders to be added in the same direction. So if the price varies from  0.5*ATR(20) , we add units with the position size formula. Note that the value of  account  will be replaced by "remaining_account", i.e. the cash remaining in our account after subtracting the value of open positions.
 4/ Stop Loss :  
We set a stop loss at 1.5*ATR(20) below the entry price for longs and above the entry price for shorts. If pyramid units are added, the stop is increased/decreased by 0.5*ATR(20). Note that if SL is configured for a loss of more than 10%, we set the SL to 10% for the first entry order to avoid big losses. This configuration does not work for pyramid orders as SL moves by 0.5*ATR(20).
 5/ Exit signals :  
System 1 : 
 
 Exit long on a 10 day low
 Exit short on a 10 day high
 
System 2 : 
 
 Exit long on a 20 day low
 Exit short on a 20 day high
 
 6/ What types of orders are placed ? 
To enter in a position, stop orders are placed meaning that we place orders that will be automatically triggered by the signal at the exact breakout price. Stop loss and exit signals are also stop orders. Pyramid orders are market orders which will be triggered at the opening of the next candle to avoid repainting.
 PARAMETERS :  
 
 Risk % of capital : Percentage used in the position size formula. Default is 1%
 ATR period : ATR length used to calculate ATR. Default is 20
 Stop ATR : Parameters used to fix stop loss. Default is 1.5 meaning that stop loss will be set at : buy_price - 1.5*ATR(20) for long and buy_price + 1.5*ATR(20) for short. Turtle traders default is 2 but 1.5 is better for cryptocurrency as there is a huge volatility.
 S1 Long : System 1 breakout length for long. Default is 20
 S2 Long : System 2 breakout length for long. Default is 55
 S1 Long Exit : System 1 breakout length to exit long. Default is 10
 S2 Long Exit : System 2 breakout length to exit long. Default is 20
 S1 Short : System 1 breakout length for short. Default is 15
 S2 Short : System 2 breakout length for short. Default is 55
 S1 Short  Exit : System 1 breakout length to exit short. Default is 7
 S2 Short  Exit : System 2 breakout length to exit short. Default is 20
 Initial capital : $1000
 Fees : Interactive Broker fees apply to this strategy. They are set at 0.18% of the trade value.
 Slippage : 3 ticks or $0.03 per trade. Corresponds to the latency time between the moment the signal is received and the moment the order is executed by the broker.
 Pyramiding : Number of orders that can be passed in the same direction. Default is 5.
 Important : Turtle traders don't trade crypto. For this specific asset type, I modify some parameters such as SL and Short S1 in order to maximize return while limiting drawdown. This strategy is the most optimal on  BINANCE:BTCUSD  in 1D timeframe with the parameters set per default. If you want to use this strategy for a different crypto please adapt parameters. 
 
 NOTE :  
It's important to note that the first entry order (long or short) will be the largest. Subsequent pyramid orders will have fewer units than the first order. We've set a maximum SL for the first order of 10%, meaning that you won't lose more than 10% of the value of your first order. However, it is possible to lose more on your pyramid orders, as the SL is increased/decreased by 0.5*ATR(20), which does not secure a loss of more than 10% on your pyramid orders. The risk remains well managed because the value of these orders is less than the value of the first order. Remain vigilant to this small detail and adjust your risk according to your risk aversion. 
Enjoy the strategy and don’t forget to take the trade :)
Polynomial Regression Bands + Channel [DW]This is an experimental study designed to calculate polynomial regression for any order polynomial that TV is able to support.
This study aims to educate users on polynomial curve fitting, and the derivation process of Least Squares Moving Averages (LSMAs).
I also designed this study with the intent of showcasing some of the capabilities and potential applications of TV's fantastic new array functions.
Polynomial regression is a form of regression analysis in which the relationship between the independent variable x and the dependent variable y is modeled as a polynomial of nth degree (order).
For clarification, linear regression can also be described as a first order polynomial regression. The process of deriving linear, quadratic, cubic, and higher order polynomial relationships is all the same.
In addition, although deriving a polynomial regression equation results in a nonlinear output, the process of solving for polynomials by least squares is actually a special case of multiple linear regression.
So, just like in multiple linear regression, polynomial regression can be solved in essentially the same way through a system of linear equations.
In this study, you are first given the option to smooth the input data using the 2 pole Super Smoother Filter from John Ehlers.
I chose this specific filter because I find it provides superior smoothing with low lag and fairly clean cutoff. You can, of course, implement your own filter functions to see how they compare if you feel like experimenting.
Filtering noise prior to regression calculation can be useful for providing a more stable estimation since least squares regression can be rather sensitive to noise.
This is especially true on lower sampling lengths and higher degree polynomials since the regression output becomes more "overfit" to the sample data.
Next, data arrays are populated for the x-axis and y-axis values. These are the main datasets utilized in the rest of the calculations.
To keep the calculations more numerically stable for higher periods and orders, the x array is filled with integers 1 through the sampling period rather than using current bar numbers.
This process can be thought of as shifting the origin of the x-axis as new data emerges. 
This keeps the axis values significantly lower than the 10k+ bar values, thus maintaining more numerical stability at higher orders and sample lengths.
The data arrays are then used to create a pseudo 2D matrix of x power sums, and a vector of x power*y sums.
These matrices are a representation the system of equations that need to be solved in order to find the regression coefficients.
Below, you'll see some examples of the pattern of equations used to solve for our coefficients represented in augmented matrix form.
For example, the augmented matrix for the system equations required to solve a second order (quadratic) polynomial regression by least squares is formed like this:
(∑x^0 ∑x^1 ∑x^2 | ∑(x^0)y)
(∑x^1 ∑x^2 ∑x^3 | ∑(x^1)y)
(∑x^2 ∑x^3 ∑x^4 | ∑(x^2)y)
The augmented matrix for the third order (cubic) system is formed like this:
(∑x^0 ∑x^1 ∑x^2 ∑x^3 | ∑(x^0)y)
(∑x^1 ∑x^2 ∑x^3 ∑x^4 | ∑(x^1)y)
(∑x^2 ∑x^3 ∑x^4 ∑x^5 | ∑(x^2)y)
(∑x^3 ∑x^4 ∑x^5 ∑x^6 | ∑(x^3)y)
This pattern continues for any n ordered polynomial regression, in which the coefficient matrix is a n + 1 wide square matrix with the last term being ∑x^2n, and the last term of the result vector being ∑(x^n)y.
Thanks to this pattern, it's rather convenient to solve the for our regression coefficients of any nth degree polynomial by a number of different methods.
In this script, I utilize a process known as LU Decomposition to solve for the regression coefficients.
Lower-upper (LU) Decomposition is a neat form of matrix manipulation that expresses a 2D matrix as the product of lower and upper triangular matrices.
This decomposition method is incredibly handy for solving systems of equations, calculating determinants, and inverting matrices.
For a linear system Ax=b, where A is our coefficient matrix, x is our vector of unknowns, and b is our vector of results, LU Decomposition turns our system into LUx=b.
We can then factor this into two separate matrix equations and solve the system using these two simple steps:
 1. Solve Ly=b for y, where y is a new vector of unknowns that satisfies the equation, using forward substitution.
 2. Solve Ux=y for x using backward substitution. This gives us the values of our original unknowns - in this case, the coefficients for our regression equation.
After solving for the regression coefficients, the values are then plugged into our regression equation:
Y = a0 + a1*x + a1*x^2 + ... + an*x^n, where a() is the ()th coefficient in ascending order and n is the polynomial degree.
From here, an array of curve values for the period based on the current equation is populated, and standard deviation is added to and subtracted from the equation to calculate the channel high and low levels.
The calculated curve values can also be shifted to the left or right using the "Regression Offset" input
Changing the offset parameter will move the curve left for negative values, and right for positive values.
This offset parameter shifts the curve points within our window while using the same equation, allowing you to use offset datapoints on the regression curve to calculate the LSMA and bands.
The curve and channel's appearance is optionally approximated using Pine's v4 line tools to draw segments. 
Since there is a limitation on how many lines can be displayed per script, each curve consists of 10 segments with lengths determined by a user defined step size. In total, there are 30 lines displayed at once when active.
By default, the step size is 10, meaning each segment is 10 bars long. This is because the default sampling period is 100, so this step size will show the approximate curve for the entire period.
When adjusting your sampling period, be sure to adjust your step size accordingly when curve drawing is active if you want to see the full approximate curve for the period.
Note that when you have a larger step size, you will see more seemingly "sharp" turning points on the polynomial curve, especially on higher degree polynomials.
The polynomial functions that are calculated are continuous and differentiable across all points. The perceived sharpness is simply due to our limitation on available lines to draw them.
The approximate channel drawings also come equipped with style inputs, so you can control the type, color, and width of the regression, channel high, and channel low curves.
I also included an input to determine if the curves are updated continuously, or only upon the closing of a bar for reduced runtime demands. More about why this is important in the notes below.
For additional reference, I also included the option to display the current regression equation.
This allows you to easily track the polynomial function you're using, and to confirm that the polynomial is properly supported within Pine.
There are some cases that aren't supported properly due to Pine's limitations. More about this in the notes on the bottom.
In addition, I included a line of text beneath the equation to indicate how many bars left or right the calculated curve data is currently shifted.
The display label comes equipped with style editing inputs, so you can control the size, background color, and text color of the equation display.
The Polynomial LSMA, high band, and low band in this script are generated by tracking the current endpoints of the regression, channel high, and channel low curves respectively.
The output of these bands is similar in nature to Bollinger Bands, but with an obviously different derivation process.
By displaying the LSMA and bands in tandem with the polynomial channel, it's easy to visualize how LSMAs are derived, and how the process that goes into them is drastically different from a typical moving average.
The main difference between LSMA and other MAs is that LSMA is showing the value of the regression curve on the current bar, which is the result of a modelled relationship between x and the expected value of y.
With other MA / filter types, they are typically just averaging or frequency filtering the samples. This is an important distinction in interpretation. However, both can be applied similarly when trading.
An important distinction with the LSMA in this script is that since we can model higher degree polynomial relationships, the LSMA here is not limited to only linear as it is in TV's built in LSMA.
Bar colors are also included in this script. The color scheme is based on disparity between source and the LSMA.
This script is a great study for educating yourself on the process that goes into polynomial regression, as well as one of the many processes computers utilize to solve systems of equations.
Also, the Polynomial LSMA and bands are great components to try implementing into your own analysis setup.
I hope you all enjoy it!
--------------------------------------------------------
NOTES:
 - Even though the algorithm used in this script can be implemented to find any order polynomial relationship, TV has a limit on the significant figures for its floating point outputs.
   This means that as you increase your sampling period and / or polynomial order, some higher order coefficients will be output as 0 due to floating point round-off. 
   There is currently no viable workaround for this issue since there isn't a way to calculate more significant figures than the limit. 
   However, in my humble opinion, fitting a polynomial higher than cubic to most time series data is "overkill" due to bias-variance tradeoff.
   Although, this tradeoff is also dependent on the sampling period. Keep that in mind. A good rule of thumb is to aim for a nice "middle ground" between bias and variance.
   If TV ever chooses to expand its significant figure limits, then it will be possible to accurately calculate even higher order polynomials and periods if you feel the desire to do so.
   To test if your polynomial is properly supported within Pine's constraints, check the equation label. 
   If you see a coefficient value of 0 in front of any of the x values, reduce your period and / or polynomial order.
 - Although this algorithm has less computational complexity than most other linear system solving methods, this script itself can still be rather demanding on runtime resources - especially when drawing the curves.
   In the event you find your current configuration is throwing back an error saying that the calculation takes too long, there are a few things you can try:
   -> Refresh your chart or hide and unhide the indicator. 
      The runtime environment on TV is very dynamic and the allocation of available memory varies with collective server usage.
      By refreshing, you can often get it to process since you're basically just waiting for your allotment to increase. This method works well in a lot of cases.
   -> Change the curve update frequency to "Close Only".
      If you've tried refreshing multiple times and still have the error, your configuration may simply be too demanding of resources.
      v4 drawing objects, most notably lines, can be highly taxing on the servers. That's why Pine has a limit on how many can be displayed in the first place.
      By limiting the curve updates to only bar closes, this will significantly reduce the runtime needs of the lines since they will only be calculated once per bar.
      Note that doing this will only limit the visual output of the curve segments. It has no impact on regression calculation, equation display, or LSMA and band displays.
   -> Uncheck the display boxes for the drawing objects.
      If you still have troubles after trying the above options, then simply stop displaying the curve - unless it's important to you.
      As I mentioned, v4 drawing objects can be rather resource intensive. So a simple fix that often works when other things fail is to just stop them from being displayed.
   -> Reduce sampling period, polynomial order, or curve drawing step size.
      If you're having runtime errors and don't want to sacrifice the curve drawings, then you'll need to reduce the calculation complexity.
      If you're using a large sampling period, or high order polynomial, the operational complexity becomes significantly higher than lower periods and orders.
      When you have larger step sizes, more historical referencing is used for x-axis locations, which does have an impact as well.
      By reducing these parameters, the runtime issue will often be solved.
   Another important detail to note with this is that you may have configurations that work just fine in real time, but struggle to load properly in replay mode.
   This is because the replay framework also requires its own allotment of runtime, so that must be taken into consideration as well.
 - Please note that the line and label objects are reprinted as new data emerges. That's simply the nature of drawing objects vs standard plots.
   I do not recommend or endorse basing your trading decisions based on the drawn curve. That component is merely to serve as a visual reference of the current polynomial relationship.
   No repainting occurs with the Polynomial LSMA and bands though. Once the bar is closed, that bar's calculated values are set. 
   So when using the LSMA and bands for trading purposes, you can rest easy knowing that history won't change on you when you come back to view them.
 - For those who intend on utilizing or modifying the functions and calculations in this script for their own scripts, I included debug dialogues in the script for all of the arrays to make the process easier.
   To use the debugs, see the "Debugs" section at the bottom. All dialogues are commented out by default.
   The debugs are displayed using label objects. By default, I have them all located to the right of current price. 
   If you wish to display multiple debugs at once, it will be up to you to decide on display locations at your leisure.
   When using the debugs, I recommend commenting out the other drawing objects (or even all plots) in the script to prevent runtime issues and overlapping displays.
50 Pips A Day Strategy - Kaspricci50 Pips A Day Strategy 
This strategy is designed to work on 1 hour timeframe. It is designed to capture the early market move of major forex pairs like EURUSD or GBPUSD. It takes the high and low of the first candle (7 a.m. GMT, London Stock Exchange opens) and places to pending orders at these prices levels.
 
  High + additional gap in pips = buy stop pending order
  Low + additional gap in pips = sell stop pending order
 
For both orders a stop loss of 15 pips and a take profit of 50 pips is used as a default. As soon as price triggers one pending order, the remaining pending order is cancelled. At the end of the configured session time all open and pending orders are closed / cancelled.
 Settings 
 
  Trading Time - start and end time of session. It is configured for Monday to Friday only. At the beginning the first candle is used to define stop prices for pending orders.
  Source for Buy Stop order - Default: high. Used to calculate buy stop order. You can add additional pips as a gap.
  Source for Sell Stop order - Default: low. Used to calculate sell stop order. You can add additional pips as a gap.
  Stop Loss in Pips - Default: 15. Used for both pending orders.
  Take Profit in Pips - Default: 50. Used for both pending orders.
 
This strategy is for educational purposes only! It is not meant to be a financial recommendation.
2Mars - MA / BB / SuperTrend 
The 2Mars strategy is a trading approach that aims to improve trading efficiency by incorporating several simple order opening tactics. These tactics include moving average crossovers, Bollinger Bands, and SuperTrend.
 Entering a Position with the 2Mars Strategy: 
 
 Moving Average Crossover: This method considers the crossing of moving averages as a signal to enter a position.
 Price Crossing Bollinger Bands: If the price crosses either the upper or lower Bollinger Band, it is seen as a signal to enter a position.
 Price Crossing Moving Average: If the price crosses the moving average, it is also considered a signal to enter a position.
 
 SuperTrend and Bars confirm: 
  
The SuperTrend indicator is used to provide additional confirmation for entering positions and setting stop loss levels. "Bars confirm" is used only for entry to positions.
 Moving Average Crossover Strategy: 
  
A moving average crossover refers to the point on a chart where there is a crossover of the signal or fast moving average, above or below the basis or slow moving average. This strategy also uses moving averages for additional orders #3.
 
 Basis Moving Average Length: Ratio * Multiplier
 Signal Moving Average Length: Multiplier
 
 Bollinger Bands: 
  
Bollinger Bands consist of three bands: an upper band, a lower band, and a basis moving average. However, the 2Mars strategy incorporates multiple upper and lower levels for position entry and take profit.
 
 Basis +/- StdDev * 0.618
 Basis +/- StdDev * 1.618
 Basis +/- StdDev * 2.618
 
 Additional Orders: 
Additional Order #1 and #2: closing price crosses above or below the Bollinger Bands.
Additional Order #3: closing price crosses above or below the basis or signal moving average.
 Take Profit: 
The strategy includes three levels for taking profits, which are based on the Bollinger Bands. Additionally, a percentage of the position can be chosen to close long or short positions.
 Limit Orders: 
The strategy allows for entering a position using a limit order. The calculation for the limit order involves the Average True Range (ATR) for a specific period.
 
 For long positions: Low price - ATR * Multiplier
 For short positions: High price + ATR * Multiplier
 
 Stop Loss: 
  
To manage risk, the strategy recommends using stop loss options. The stop loss is updated with each entry order and take-profit level 3. When using the SuperTrend Confirmation, the stop loss requires confirmation of a trend change. It allows for flexible adjustment of the stop loss when the trend changes.
There are three options for setting the stop loss:
1. ATR (Average True Range):
 
 For long positions: Low price - ATR * Long multiplier
 For short positions: High price + ATR * Short multiplier
 
2. SuperTrend + ATR:
 
 For long positions: SuperTrend - ATR * Long multiplier
 For short positions: SuperTrend + ATR * Short multiplier
 
3. StdDev:
 
 For long positions: StdDev - ATR * Long multiplier
 For short positions: StdDev + ATR * Short multiplier
 
 Flexible Stop Loss: 
There is also a flexible stop loss option for the ATR and StdDev methods. It is triggered when the SuperTrend or moving average trend changes unfavorably.
 
 For long positions: Stop-loss price + (ATR * Long multiplier) * Multiplier
 For short positions: Stop-loss price - (ATR * Short multiplier) * Multiplier
 
 How configure: 
 
 Disable SuperTrend, take profit, stop loss, additional orders and begin setting up a strategy.
 Pick soucre data
 Number of bars for confirm
 Pick up the ratio of the base moving average and the signal moving average.
 Set up a SuperTrend
 Time for set up of the Bollinger Bands and the take profit
 And finaly set up of stop loss and limit orders
 
 All done! 
For OKX exchange:
 
Alert(), alertcondition() or strategy alerts?Variety of possibilities offered by PineScript, especially thanks to recent additions, created some confusion. Especially one question repeats quite often - which method to use to trigger alerts?
I'm posting this to clarify and give some syntax examples. I'll discuss these 3 methods in chronological order, meaning - in the order they were introduced to PineScript.
 ALERTCONDITION()  - it is a function call, which can be used only in study-type script. Since years ago, you could create 2 types of a script: strategy and study. First one enables creating a backtest of a strategy. Second was to develop scripts which didn't require backtesting and could trigger alerts. alertcondition() calls in strategy-type scripts were rejected by Pine compiler. On the other hand compiling study-type scripts rejected all strategy...() calls. That created difficulties, because once you had a nice and backtested strategy, you had to rip it off from all strategy...() function calls to convert your script to study-type so you could produce alerts. Maintenance of two versions of each script was necessary and it was painful.
 "STRATEGY ALERTS"  were introduced because of alertcondition() pains. To create strategy alert, you need to click "Add alert" button inside Strategy Tester (backtester) and only there. Alerts set-up this way are bound with the backtester - whenever backtester triggers an order, which is visible on the chart, alert is also fired. And you can customize alert message using some placeholders like {{strategy.order.contracts}} or {{ticker}}.
 ALERT()  was added last. This is an alerts-triggering function call, which can be run from strategy-type script. Finally it is doable! You can connect it to any event coded in PineScript and generate any alert message you want, thanks to concatenation of strings and wrapping variables into tostring() function.
Out of these three alertcondition() is obviously archaic and probably will be discontinued. There is a chance this makes strategy/study distinction not making sense anymore, so I wouldn't be surprised if "studies" are deprecated at some point.
But what are the differences between "Strategy alerts" and alert()? "Strategy alerts" seem easier to set-up with just a few clicks and probably easier to understand and verify, because they go in sync with the backtester and on-chart trade markers. It is especially important to understand how they work if you're building strategy based on pending orders (stop and limit) - events in your code might trigger placing pending order, but alert will be triggered only (and when) such order is executed.
But "Strategy Alerts" have some limitations - not every variable you'd like to include in alert message is available from PineScript. And maybe you don't need the alert fired when the trade hit a stop-loss or take-profit, because you have already forwarded info about closing conditions in entry alert to your broker/exchange.
Alert() was added to PineScript to fill all these gaps. Is allows concatenating any alert message you want, with any variable you want inside it and you can attach alert() function at any event in your PineScript code. For example - when placing orders, crossing variables, exiting trades, but not explicitly at pending orders execution.
 The Verdict 
"Strategy Alerts" might seem a better fit - easier to set-up and verify, flexible and they fire only when a trade really happens, not producing unnecessary mess when each pending order is placed. But these advantages are illusionary, because they don't give you the full-control which is needed when trading with real money. Especially when using pending orders. If an alert is fired when price actually hit a stop-order or limit-order level, and even if you are executing such alert within 1 second thanks to a tool like TradingConnector, you might already be late and you are making entry at a market price. Slippage will play a great role here. You need to send ordering alert when logical conditions are met - then it will be executed at the price you want. Even if you need to cancel all the pending orders which were not executed. Because of that I strongly recommend sticking to  ALERT()  when building your alerts system.
Below is an example strategy, showing syntax to manage placing the orders and cancelling them. Yes, this is another spin-off from my  TradingView Alerts to MT4 MT5  . As usual, please don't pay attention to backtest results, as this is educational script only. 
P.S. For the last time - farewell alertcondition(). You served us well.
PaddingThe Padding library is a comprehensive and flexible toolkit designed to extend time series data within TradingView, making it an indispensable resource for advanced signal processing tasks such as FFT, filtering, convolution, and wavelet analysis. At its core, the library addresses the common challenge of edge effects by "padding" your data—that is, by appending additional data points beyond the natural boundaries of your original dataset. This extension not only mitigates the distortions that can occur at the endpoints but also helps to maintain the integrity of various transformations and calculations performed on the series. The library accomplishes this while preserving the ordering of your data, ensuring that the most recent point always resides at index 0.
Central to the functionality of this library are two key enumerations: Direction and PaddingType. The Direction enum determines where the padding will be applied. You can choose to extend the data in the forward direction (ahead of the current values), in the backward direction (behind the current values), or in both directions simultaneously. The PaddingType enum defines the specific method used for extending the data. The library supports several methods—including symmetric, reflect, periodic, antisymmetric, antireflect, smooth, constant, and zero padding—each of which has been implemented to suit different analytical scenarios. For instance, symmetric padding mirrors the original data across its boundaries, while reflect padding continues the trend by reflecting around endpoint values. Periodic padding repeats the data, and antisymmetric padding mirrors the data with alternating signs to counterbalance it. The antireflect and smooth methods take into account the derivatives of your data, thereby extending the series in a way that preserves or smoothly continues these derivative values. Constant and zero padding simply extend the series using fixed endpoint values or zeros. Together, these enums allow you to fine-tune how your data is extended, ensuring that the padding method aligns with the specific requirements of your analysis.
The library is designed to work with both single variable inputs and array inputs. When using array-based methods—particularly with the antireflect and smooth padding types—please note that the implementation intentionally discards the last data point as a result of the delta computation process. This behavior is an important consideration when integrating the library into your TradingView studies, as it affects the overall data length of the padded series. Despite this, the library’s structure and documentation make it straightforward to incorporate into your existing scripts. You simply provide your data source, define the length of your data window, and select the desired padding type and direction, along with any optional parameters to control the extent of the padding (using both_period, forward_period, or backward_period).
In practical application, the Padding library enables you to extend historical data beyond its original range in a controlled and predictable manner. This is particularly useful when preparing datasets for further signal processing, as it helps to reduce artifacts that can otherwise compromise the results of your analytical routines. Whether you are an experienced Pine Script developer or a trader exploring advanced data analysis techniques, this library offers a robust solution that enhances the reliability and accuracy of your studies by ensuring your algorithms operate on a more complete and well-prepared dataset.
Library   "Padding" 
A comprehensive library for padding time series data with various methods. Supports both single variable and array inputs, with flexible padding directions and periods. Designed for signal processing applications including FFT, filtering, convolution, and wavelets. All methods maintain data ordering with most recent point at index 0.
 symmetric(source, series_length, direction, both_period, forward_period, backward_period) 
  Applies symmetric padding by mirroring the input data across boundaries
  Parameters:
     source (float) : Input value to pad from
     series_length (int) : Length of the data window
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to series_length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to series_length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with symmetric padding applied
 method symmetric(source, direction, both_period, forward_period, backward_period) 
  Applies symmetric padding to an array by mirroring the data across boundaries
  Namespace types: array
  Parameters:
     source (array) : Array of values to pad
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to array length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to array length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with symmetric padding applied
 reflect(source, series_length, direction, both_period, forward_period, backward_period) 
  Applies reflect padding by continuing trends through reflection around endpoint values
  Parameters:
     source (float) : Input value to pad from
     series_length (int) : Length of the data window
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to series_length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to series_length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with reflect padding applied
 method reflect(source, direction, both_period, forward_period, backward_period) 
  Applies reflect padding to an array by continuing trends through reflection around endpoint values
  Namespace types: array
  Parameters:
     source (array) : Array of values to pad
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to array length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to array length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with reflect padding applied
 periodic(source, series_length, direction, both_period, forward_period, backward_period) 
  Applies periodic padding by repeating the input data
  Parameters:
     source (float) : Input value to pad from
     series_length (int) : Length of the data window
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to series_length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to series_length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with periodic padding applied
 method periodic(source, direction, both_period, forward_period, backward_period) 
  Applies periodic padding to an array by repeating the data
  Namespace types: array
  Parameters:
     source (array) : Array of values to pad
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to array length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to array length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with periodic padding applied
 antisymmetric(source, series_length, direction, both_period, forward_period, backward_period) 
  Applies antisymmetric padding by mirroring data and alternating signs
  Parameters:
     source (float) : Input value to pad from
     series_length (int) : Length of the data window
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to series_length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to series_length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with antisymmetric padding applied
 method antisymmetric(source, direction, both_period, forward_period, backward_period) 
  Applies antisymmetric padding to an array by mirroring data and alternating signs
  Namespace types: array
  Parameters:
     source (array) : Array of values to pad
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to array length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to array length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with antisymmetric padding applied
 antireflect(source, series_length, direction, both_period, forward_period, backward_period) 
  Applies antireflect padding by reflecting around endpoints while preserving derivatives
  Parameters:
     source (float) : Input value to pad from
     series_length (int) : Length of the data window
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to series_length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to series_length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with antireflect padding applied
 method antireflect(source, direction, both_period, forward_period, backward_period) 
  Applies antireflect padding to an array by reflecting around endpoints while preserving derivatives
  Namespace types: array
  Parameters:
     source (array) : Array of values to pad
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to array length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to array length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with antireflect padding applied. Note: Last data point is lost when using array input
 smooth(source, series_length, direction, both_period, forward_period, backward_period) 
  Applies smooth padding by extending with constant derivatives from endpoints
  Parameters:
     source (float) : Input value to pad from
     series_length (int) : Length of the data window
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to series_length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to series_length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with smooth padding applied
 method smooth(source, direction, both_period, forward_period, backward_period) 
  Applies smooth padding to an array by extending with constant derivatives from endpoints
  Namespace types: array
  Parameters:
     source (array) : Array of values to pad
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to array length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to array length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with smooth padding applied. Note: Last data point is lost when using array input
 constant(source, series_length, direction, both_period, forward_period, backward_period) 
  Applies constant padding by extending endpoint values
  Parameters:
     source (float) : Input value to pad from
     series_length (int) : Length of the data window
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to series_length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to series_length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with constant padding applied
 method constant(source, direction, both_period, forward_period, backward_period) 
  Applies constant padding to an array by extending endpoint values
  Namespace types: array
  Parameters:
     source (array) : Array of values to pad
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to array length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to array length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with constant padding applied
 zero(source, series_length, direction, both_period, forward_period, backward_period) 
  Applies zero padding by extending with zeros
  Parameters:
     source (float) : Input value to pad from
     series_length (int) : Length of the data window
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to series_length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to series_length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with zero padding applied
 method zero(source, direction, both_period, forward_period, backward_period) 
  Applies zero padding to an array by extending with zeros
  Namespace types: array
  Parameters:
     source (array) : Array of values to pad
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to array length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to array length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with zero padding applied
 pad_data(source, series_length, padding_type, direction, both_period, forward_period, backward_period) 
  Generic padding function that applies specified padding type to input data
  Parameters:
     source (float) : Input value to pad from
     series_length (int) : Length of the data window
     padding_type (series PaddingType) : Type of padding to apply (see PaddingType enum)
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to series_length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to series_length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with specified padding applied
 method pad_data(source, padding_type, direction, both_period, forward_period, backward_period) 
  Generic padding function that applies specified padding type to array input
  Namespace types: array
  Parameters:
     source (array) : Array of values to pad
     padding_type (series PaddingType) : Type of padding to apply (see PaddingType enum)
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to array length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to array length if not specified
  Returns: Array ordered with most recent point at index 0, containing original data with specified padding applied. Note: Last data point is lost when using antireflect or smooth padding types
 make_padded_data(source, series_length, padding_type, direction, both_period, forward_period, backward_period) 
  Creates a window-based padded data series that updates with each new value. WARNING: Function must be called on every bar for consistency. Do not use in scopes where it may not execute on every bar.
  Parameters:
     source (float) : Input value to pad from
     series_length (int) : Length of the data window
     padding_type (series PaddingType) : Type of padding to apply (see PaddingType enum)
     direction (series Direction) : Direction to apply padding
     both_period (int) : Optional - periods to pad in both directions. Overrides forward_period and backward_period if specified
     forward_period (int) : Optional - periods to pad forward. Defaults to series_length if not specified
     backward_period (int) : Optional - periods to pad backward. Defaults to series_length if not specified
  Returns: Array ordered with most recent point at index 0, containing windowed data with specified padding applied
Milvetti_TraderPost_LibraryLibrary   "Milvetti_TraderPost_Library" 
This library has methods that provide practical signal transmission for traderpost.Developed By Milvetti
 cancelOrders(symbol) 
  This method generates a signal in JSON format that cancels all orders for the specified pair. (If you want to cancel stop loss and takeprofit orders together, use the “exitOrder” method.
  Parameters:
     symbol (string) 
 exitOrders(symbol) 
  This method generates a signal in JSON format that close all orders for the specified pair.
  Parameters:
     symbol (string) 
 createOrder(ticker, positionType, orderType, entryPrice, signalPrice, qtyType, qty, stopLoss, stopType, stopValue, takeProfit, profitType, profitValue, timeInForce) 
  This function is designed to send buy or sell orders to traderpost. It can create customized orders by flexibly specifying parameters such as order type, position type, entry price, quantity calculation method, stop-loss, and take-profit. The purpose of the function is to consolidate all necessary details for opening a position into a single structure and present it as a structured JSON output. This format can be sent to trading platforms via webhooks.
  Parameters:
     ticker (string) : The ticker symbol of the instrument. Default value is the current chart's ticker (syminfo.ticker).
     positionType (string) : Determines the type of order (e.g., "long" or "buy" for buying and "short" or "sell" for selling).
     orderType (string) : Defines the order type for execution. Options: "market", "limit", "stop". Default is "market"
     entryPrice (float) : The price level for entry orders. Only applicable for limit or stop orders. Default is 0 (market orders ignore this).
     signalPrice (float) : Optional. Only necessary when using relative take profit or stop losses, and the broker does not support fetching quotes to perform the calculation. Default is 0
     qtyType (string) : Determines how the order quantity is calculated. Options: "fixed_quantity", "dollar_amount", "percent_of_equity", "percent_of_position".
     qty (float) : Quantity value. Can represent units of shares/contracts or a dollar amount, depending on qtyType.
     stopLoss (bool) : Enable or disable stop-loss functionality. Set to `true` to activate.
     stopType (string) : Specifies the stop-loss calculation type. Options: percent, "amount", "stopPrice", "trailPercent", "trailAmount". Default is "stopPrice"
     stopValue (float) : Stop-loss value based on stopType. Can be a percentage, dollar amount, or a specific stop price. Default is "stopPrice"
     takeProfit (bool) : Enable or disable take-profit functionality. Set to `true` to activate.
     profitType (string) : Specifies the take-profit calculation type. Options: "percent", "amount", "limitPrice". Default is "limitPrice"
     profitValue (float) : Take-profit value based on profitType. Can be a percentage, dollar amount, or a specific limit price. Default is 0
     timeInForce (string) : The time in force for your order. Options: day, gtc, opg, cls, ioc and fok
  Returns: Return result in Json format.
 addTsl(symbol, stopType, stopValue, price) 
  This method adds trailing stop loss to the current position. “Price” is the trailing stop loss starting level. You can leave price blank if you want it to start immediately
  Parameters:
     symbol (string) 
     stopType (string) : Specifies the trailing stoploss calculation type. Options: "trailPercent", "trailAmount".
     stopValue (float) : Stop-loss value based on stopType. Can be a percentage, dollar amount.
     price (float) : The trailing stop loss starting level. You can leave price blank if you want it to start immediately. Default is current price.
Custom Strategy: ETH Martingale 2.0Strategic characteristics
ETH Little Martin 2.0 is a self-developed trading strategy based on the Martingale strategy, mainly used for trading ETH (Ethereum). The core idea of this strategy is to place orders in the same direction at a fixed price interval, and then use Martin's multiple investment principle to reduce losses, but this is also the main source of losses.
Parameter description:
1 Interval: The minimum spacing for taking profit, stop loss, and opening/closing of orders. Different targets have different spacing. Taking ETH as an example, it is generally recommended to have a spacing of 2% for fluctuations in the target.
2 Base Price: This is the price at which you triggered the first order. Similarly, I am using ETH as an example. If you have other targets, I suggest using the initial value of a price that can be backtesting. The Base Price is only an initial order price and has no impact on subsequent orders.
3 Initial Order Amount: Users can set an initial order amount to control the risk of each transaction. If the stop loss is reached, we will double the amount based on this value. This refers to the value of the position held, not the number of positions held.
4 Loss Multiplier: The strategy will increase the next order amount based on the set multiple after the stop loss, in order to make up for the previous losses through a larger position. Note that after taking profit, it will be reset to 1 times the Initial Order Amount.
5. Long Short Operation: The first order of the strategy is a multiple entry, and in subsequent orders, if the stop loss is reached, a reverse order will be opened. The position value of a one-way order is based on the Loss Multiplier multiple investment, so it is generally recommended that the Loss Multiplier default to 2.
Improvement direction
Although this strategy already has a certain trading logic, there are still some improvement directions that can be considered:
1. Dynamic adjustment of spacing: Currently, the spacing is fixed, and it can be considered to dynamically adjust the spacing based on market volatility to improve the adaptability of the strategy. Try using dynamic spacing, which may be more suitable for the actual market situation.
2. Filtering criteria: Orders and no orders can be optimized separately. The biggest problem with this strategy is that it will result in continuous losses during fluctuations, and eventually increase the investment amount. You can consider filtering out some fluctuations or only focusing on trend trends.
3. Risk management: Add more risk management measures, such as setting a maximum loss limit to avoid huge losses caused by continuous stop loss.
4. Optimize the stop loss multiple: Currently, the stop loss multiple is fixed, and it can be considered to dynamically adjust the multiple according to market conditions to reduce risk.






















