HighTimeframeTimingLibrary "HighTimeframeTiming"
@description Library for sampling high timeframe (HTF) historical data at an arbitrary number of HTF bars back, using a single security() call.
The data is fixed and does not alter over the course of the HTF bar. It also behaves consistently on historical and elapsed realtime bars.
‼ LIMITATIONS: This library function depends on there being a consistent number of chart timeframe bars within the HTF bar. This is almost always true in 24/7 markets like crypto.
This might not be true if the chart doesn't produce an update when expected, for example because the asset is thinly traded and there is no volume or price update from the feed at that time.
To mitigate this risk, use this function on liquid assets and at chart timeframes high enough to reliably produce updates at least once per bar period.
The consistent ratio of bars might also break down in markets with irregular sessions and hours. I'm not sure if or how one could mitigate this.
Another limitation is that because we're accessing a multiplied number of chart bars, you will run out of chart bars faster than you would HTF bars. This is only a problem if you use a large historical operator.
If you call a function from this library, you should probably reproduce these limitations in your script description.
However, all of this doesn't mean that this function might not still be the best available solution, depending what your needs are.
If a single chart bar is skipped, for example, the calculation will be off by 1 until the next HTF bar opens. This is certainly inconsistent, but potentially still usable.
@function f_offset_synch(float _HTF_X, int _HTF_H, int _openChartBarsIn, bool _updateEarly)
Returns the number of chart bars that you need to go back in order to get a stable HTF value from a given number of HTF bars ago.
@param float _HTF_X is the timeframe multiplier, i.e. how much bigger the selected timeframe is than the chart timeframe. The script shows a way to calculate this using another of my libraries without using up a security() call.
@param int _HTF_H is the historical operator on the HTF, i.e. how many bars back you want to go on the higher timeframe. If omitted, defaults to zero.
@param int _openChartBarsIn is how many chart bars have been opened within the current HTF bar. An example of calculating this is given below.
@param bool _updateEarly defines whether you want to update the value at the closing calculation of the last chart bar in the HTF bar or at the open of the first one.
@returns an integer that you can use as a historical operator to retrieve the value for the appropriate HTF bar.
🙏 Credits: This library is an attempt at a solution of the problems in using HTF data that were laid out by Pinecoders in "security() revisited" -
Thanks are due to the authors of that work for an understanding of HTF issues. In addition, the current script also includes some of its code.
Specifically, this script reuses the main function recommended in "security() revisited", for the purposes of comparison. And it extends that function to access historical data, again just for comparison.
All the rest of the code, and in particular all of the code in the exported function, is my own.
Special thanks to LucF for pointing out the limitations of my approach.
~~~~~~~~~~~~~~~~|
EXPLANATION
~~~~~~~~~~~~~~~~|
Problems with live HTF data: Many problems with using live HTF data from security() have been clearly explained by Pinecoders in "security() revisited"
In short, its behaviour is inconsistent between historical and elapsed realtime bars, and it changes in realtime, which can cause calculations and alerts to misbehave.
Various unsatisfactory solutions are discussed in "security() revisited", and understanding that script is a prerequisite to understanding this library.
PineCoders give their own solution, which is to fix the data by essentially using the previous HTF bar's data. Importantly, that solution is consistent between historical and realtime bars.
This library is an attempt to provide an alternative to that solution.
Problems with historical HTF data: In addition to the problems with live HTF data, there are different issues when trying to access historical HTF data.
Why use historical HTF data? Maybe you want to do custom calculations that involve previous HTF bars. Or to use HTF data in a function that has mutable variables and so can't be done in a security() call.
Most obviously, using the historical operator (in this description, represented using { } because the square brackets don't render) on variables already retrieved from a security() call, e.g. HTF_Close{1}, is not very useful:
it retrieves the value from the previous *chart* bar, not the previous HTF bar.
Using {1} directly in the security() call instead does get data from the previous HTF bar, but it behaves inconsistently, as we shall see.
This library addresses these concerns as well.
Housekeeping: To follow what's going on with the example and comparisons, turn line labels on: Settings > Scales > Indicator Name Label.
The following explanation assumes "close" as the source, but you can change it if you want.
To quickly see the difference between historical and realtime bars, set the HTF to something like 3 minutes on a 15s chart.
The bars at the top of the screen show the status. Historical bars are grey, elapsed realtime bars are red, and the realtime bar is green. A white vertical line shows the open of a HTF bar.
A: This library function f_offset_synch(): When supplied with an input offset of 0, it plots a stable value of the close of the *previous* HTF bar. This value is thus safe to use for calculations and alerts.
For a historical operator of {1}, it gives the close of the *last-but-one* bar. Sounds simple enough. Let's look at the other options to see its advantages.
B: Live HTF data: Represented on the line label as "security(){0}". Note: this is the source that f_offset_synch() samples.
The raw HTF data is very different on historical and realtime bars:
+ On historical bars, it uses a flat value from the end of the previous HTF bar. It updates at the close of the HTF bar.
+ On realtime bars, it varies between and within each chart bar.
There might be occasions where you want to use live data, in full knowledge of its drawbacks described above. For example, to show simple live conditions that are reversible after a chart bar close.
This library transforms live data to get the fixed data, thus giving you access to both live and fixed data with only one security() call.
C: Historical data using security(){H}: To see how this behaves, set the {H} value in the settings to 1 and show options A, B, and C.
+ On historical bars, this option matches option A, this library function, exactly. It behaves just like security(){0} but one HTF bar behind, as you would expect.
+ On realtime bars, this option takes the value of security(){0} at the end of a HTF bar, but it takes it from the previous *chart* bar, and then persists that.
The easiest way to see this inconsistency is on the first realtime bar (marked red at the top of the screen). This option suddenly jumps, even if it's in the middle of a HTF bar.
Contrast this with option A, which is always constant, until it updates, once per HTF bar.
D: PineCoders' original function: To see how this behaves, show options A, B, and D. Set the {H} value in the settings to 0, then 1.
The PineCoders' original function (D) and extended function (E) do not have the same limitations as this library, described in the Limitations section.
This option has all of the same advantages that this library function, option A, does, with the following differences:
+ It cannot access historical data. The {H} setting makes no difference.
+ It always updates at the open of the first chart bar in a new HTF bar.
By contrast, this library function, option A, is configured by default to update at the close of the last chart bar in a HTF bar.
This little frontrunning is only a few seconds but could be significant in trading. E.g. on a 1D HTF with a 4H chart, an alert that involves a HTF change set to trigger ON CLOSE would trigger 4 hours later using this method -
but use exactly the same value. It depends on the market and timeframe as to whether you could actually trade this. E.g. at the very end of a tradfi day your order won't get executed.
This behaviour mimics how security() itself updates, as is easy to see on the chart. If you don't want it, just set in_updateEarly to false. Then it matches option D exactly.
E: PineCoders' function, extended to get history: To see how this behaves, show options A and E. Set the {H} value in the settings to 0, then 1.
I modified the original function to be able to get historical values. In all other respects it is the same.
Apart from not having the option to update earlier, the only disadvantage of this method vs this library function is that it requires one security() call for each historical operator.
For example, if you wanted live data, and fixed data, and fixed data one bar back, you would need 3 security() calls. My library function requires just one.
This is the essential tradeoff: extra complexity and less robustness in certain circumstances (the PineCoders function is simple and universal by comparison) for more flexibility with fewer security() calls.
Search in scripts for "TAKE"
Market IndicatorIt shows bullish / bearish market. It takes the closing price and divide it by the last 20 periods moving average. Then, it takes the logarithm. So, if:
-Price above MA20: >0
-Price below MA20: <0
3 Candle Strike StretegyMainly developed for AMEX:SPY trading on 1 min chart. But feel free to try on other tickers.
Basic idea of this strategy is to look for 3 candle reversal pattern within trending market structure. The 3 candle reversal pattern consist of 3 consecutive bullish or bearish candles,
followed by an engulfing candle in the opposite direction. This pattern usually signals a reversal of short term trend. This strategy also uses multiple moving averages to filter long or short
entries. ie. if the 21 smoothed moving average is above the 50, only look for long (bullish) entries, and vise versa. There is option change these moving average periods to suit your needs.
I also choose to use Linear Regression to determine whether the market is ranging or trending. It seems the 3 candle pattern is more successful under trending market. Hence I use it as a filter.
There is also an option to combine this strategy with moving average crossovers. The idea is to look for 3 candle pattern right after a fast moving average crosses over a slow moving average.
By default , 21 and 50 smoothed moving averages are used. This gives additional entry opportunities and also provides better results.
This strategy aims for 1:3 risk to reward ratio. Stop losses are calculated using the closest low or high values for long or short entries, respectively, with an offset using a percentage of
the daily ATR value. This allows some price fluctuation without being stopped out prematurely. Price target is calculated by multiplying the difference between the entry price and the stop loss
by a factor of 3. When price target is reach, this strategy will set stop loss at the price target and wait for exit condition to maximize potential profit.
This strategy will exit an order if an opposing 3 candle pattern is detected, this could happen before stop loss or price target is reached, and may also happen after price target is reached.
*Note that this strategy is designed for same day SPY option scalping. I haven't determined an easy way to calculate the # of contracts to represent the equivalent option values. Plus the option
prices varies greatly depending on which strike and expiry that may suits your trading style. Therefore, please be mindful of the net profit shown. By default, each entry is approximately equal
to buying 10 of same day or 1 day expiry call or puts at strike $1 - $2 OTM. This strategy will close all open trades at 3:45pm EST on Mon, Wed, and Fri.
**Note that this strategy also takes into account of extended market data.
***Note pyramiding is set to 2 by default, so it allows for multiple entries on the way towards price target.
Remember that market conditions are always changing. This strategy was only able to be back-tested using 1 month of data. This strategy may not work the next month. Please keep that in mind.
Also, I take no credit for any of the indicators used as part of this strategy.
Enjoy~
Multi Day vWAP (Customizable) with AverageIntroducing the Multi-Day vWAP indicator that is fully customizable with average indicator option.
High level overview (default settings):
Default is 10 plots with each setting 1 day apart (1-10 day look back)
Labels for each plot are turned on by default (labels will default to your value, more below)
Use Style tab in options to change colors, plot style, and turn on/off individual plots
Average is turned off by default (style panel will show it's on-- go to Inputs panel and select "Show vWAP Average" to turn on)
Best use case is go to Visibility Panel in options and turn off for Days, Weeks, and Months
To turn off all labels at once go to Style tab and unselect "Labels" checkbox
If you want plots to be as small as possible in Inputs panel set the Plot Width to 0 (zero)
Detail Overview
This indicator will plot your custom daily vWAP values.
You can change the lookback period. If you change the lookback period the label will match your custom value.
For instance, if you change vWAP 1 value to "5", the label for this plot will be 5.
Average Notes:
The average will average all the vWAP values by the divisor. The default is to average all values by 10.
The average will always start to plot from the shortest lookback period. It is not possible to have the average plot before that point.
Trading Tips (default settings)
The simple way to use the vWAP is to treat them as magnets.
For intance,
Generally if price is trading below all the vWAP plots the chart is in a momentum short enviroment. All vWAP areas can be used for upside resistance/reaction areas.
If price is trading above the chart is in a momentum long enviroment and pullbacks can to vWAP levels can be looked as areas of support/reaction.
For instance:
Price is above the current day vWAP and looking to test the previous day vWAP value.
As it approaches the 2 value you are expecting this area to be a reaction area (good trade entry area) for a continuation short trade. Possibly to check back into the current day vWAP value.
I should share that this is a simple way to trade with the vWAP (true success with vWAP is understanding that price trades in vWAP channels).
Stacking and Strong Momentum
The other pattern you should look for is stacking.
For instance on this CL chart:
This chart is strong momentum long.
All 10 day vWAP plots are stacked on top of each other.
Previous action tested below all vWAPs. Price traded thru and came back and retested. Finally closing above all and above the vWAP avearge (red).
When the day vWAP was broke the next target you look for is the 2 vWAP. This reaction area held up and momentum long continued and continuing to trade above current day vWAP.
7 Day Rolling Example (Larger Timeframe)
Another great way to use this indicator is to customize the values for rolling 7 days (5 days for cash markets).
To do this set values to: 7, 14, 21, 28, 35, 42, 49, 56, 63, 70
For instance, this BTC chart:
This chart provides a good example of what you'll find when a chart is at a pivot point.
Price is checking in at the average to remain momentum long.
Upside longer term vWAP plots have been tested and had expected reaction.
Price is trading above the shorter term values.
Simple TA here will note if chart continues to trade above and takes out upper vWAPs long momentum is gaining ground.
On the downside if price trades thru the lower vWAP plots you would expect further downside. In this scenario you would be mindful to expect upside tests before (which could be good entry/reaction areas).
NQ example with 7 day values:
Overall chart is momentum short.
7 is above 14, 21
Maybe early sign of bottom.
If price takes out these values and holds above the buyers have quite a few challenges above.
Price Difference At ExpirationThe general idea:
When selling short options it is important to enter trades with a high probability of expiring Out Of The Money (OTM). Short options have limited upside and unlimited downside and so it is crucial to get both the direction and magnitude correct before entering a trade. However, this can be tricky to do reliably and so it's also a good idea to write options with a strike price far enough away from the underlying's price so that if you are directionally wrong, there's still a good chance of making a profitable trade.
But how far from the current price is far enough for a given underlying? How much is too much?
This indicator seeks to help short options traders answer these questions.
This script is fairly simple and is meant to work only on a daily chart. The basic idea is to show "if I had entered a trade with X days till expiration and a $Y strike, would the actual price change in the underlying have threatened my position before the option expired?"
To answer this question we take the closing price of each day and compare it with the closing price X number of days prior. If the current day closed higher than the day X days prior (Option entry), then we draw a positive bar with the value of the price change. Conversely, if the current day closed lower than the day X days prior we draw a negative bar with the value of the price change. For each bar we draw, we compare it with a given "max range" or "buffer". This buffer is how far OTM with which you are seeking to enter your options trade. If the actual price difference between the theoretical start and end of your trade is greater than the buffer you specified, the bar is drawn in red. Otherwise, if the total price change is safely within the buffer you built into your trade, the bar is drawn in gray.
Obviously, if you are really good at picking the direction of the underlying, the buffer you build into your options contract doesn't matter, you get a profitable trade no matter what! Good job, and please share your charts with me! However, for those of use a bit less clairvoyant, this indicator seeks to help options traders get a sense for whether or not their contracts have enough wiggle room to account for the price moving against them unexpectedly. This indicator gives you the ability to adjust expiration and buffer and get a sense for how well that configuration would have done historically if you had taken each contract to expiration. The assumption being: if it worked really well in the past, then it might work well for this trade. Obviously, past performance doesn't guarantee future results. Just because a particular buffer has worked well in the past doesn't mean that it will work now. Please trade at your own risk. This is just meant to help give a better sense of scale by offering historical comparisons. You can think of this as a rudimentary live backtesting tool.
How to use:
First, add the indicator to your chart and select an underlying. The example chart shown above is for RUT. In the example, I am interested in knowing whether a $200 buffer within 10DTE trades is sufficient to produce a likely winning trade even if I'm wrong about the direction of the underlying. To do this I push the settings button of the indicator and type in 10 for "Interval (days)" and 200 for "Buffer". Next I select only "Monday", "Wednesday", and "Friday" from the expiration checkboxes; leaving "Tuesday" and "Thursday" unchecked. This is because RUT has 3 expirations per week unlike most others that have just one per week (Friday). If you are looking at weekly options you should just check "Friday".
How to interpret the chart:
- Gray bars are your friends. Gray bars mean that if you had entered into a trade with the given DTE and buffer and you happen to be wrong about the direction (it happens to us all!), you would have still ended up with a winning trade. Good Job!
- Red bars indicate possible trouble. This means that your option would have likely been exercised if held till expiration given the amount of buffer you built into the contract. You might have needed to close for a loss or roll or take assignment.
How this can help:
I find it useful to adjust the DTE and buffer when I am going to enter a trade. It helps me see whether a similar trade has historically been resilient to lapses in directional judgement or not. If I'm really confident in the direction, then this won't be so useful. I could then sell closer to the money and feel like I have a winning position. But if there is less certainty and I want to dial back my risk, then this indicator helps me find the right risk/reward with regard to picking expirations and strikes.
Silen's Financials Fair ValueIt is finally here! 🔥 My 3rd and most important script in my Financial series! 🚀
Ever imagined to see all fundamentals (or many that is) combined into one indicator that is right on your chart, showing you how your favorite stock is trading compared to its fundamentals?
Well, here is your answer! 📡
____________________________________________________________________________________________
This script shows you my own personal interpretation of fair value, based solely on the financial fundamentals of a company compared to market averages.
I don't believe that certain sectors of the market should be priced higher than others. If you look at historical data you'll see that favored sectors always rotate - placing insanely high P/E multiples on some sectors. Once they are "out" and people rotate away from those sectors you're left with nothing but the naked fundamentals that matter. So, you'll see many companies, that have been doing well on paper, see their share price decline by 70-90% for no other reasons than people favoring other sectors.
That's why it's even more important to focus on fair value that is solely fundamentals-based. Know when your stock gets to expensive. 🤯
____________________________________________________________________________________________
To give you some examples:
- Most Megacaps trade at historically high valuations, several times my fair value. Those include AAPL, MSFT, NVDA, AMZN, TSLA, JPM, TSM, V and so on. And no, in the past they partially traded below (my) fair value.
- Most Cybersecurity / Cloud companies are trading at truly massive multiples of my fair value. (NET, DDOG, etc)
- Many Smallcaps & Midcaps are trading several multiples (OESX, CODX, QFIN) below my fair value. And no, in the past they partially traded above (my) fair value.
Ok, so much about the market. You ultimately decide how much you want to orientate on fair value. 👨🏫
____________________________________________________________________________________________
This fair value indicator (purple line):
Takes the P/E rate of the company and compares it to the market (50% weight)
Takes the P/S rate of the company and compares it to the market (50% weight)
Then adds boni and mali f or debt/equity rates and debt and equity itself
Also looks at past growth and calculates future P/E and P/S rates which adds , in some cases, value to the fair value (green line)
Also compares how historical valuations have behaved compared to fair value and simulates a fair value guideline (dark blue line)
____________________________________________________________________________________________
This script is part 3️⃣ of a series of indicators that work well together.
Script 1️⃣ of the series is:
P/E & P/S Rates
Script 2️⃣ of the series is:
Debt & Equity
If you use all 3 scripts together it will look like this, giving you truly deep and simple information about the fundamentals of a company:
Example 1 - AMD
Example 2 - HZO
Example 3 - APPS
I hope this script makes your investing and stock picks a lot easier! 🔆💹🕗
Disclaimer: Fair value is always subjective. There are many different approaches to fair value. This one is only my personal interpretation.
Disclaimer 2: This script works only for the Day-Timeframe.
Disclaimer 3: This script uses 17,5 P/E and 3,0 P/S as market averages. The actual average keeps changing but, historically speaking, these seemed to be good numbers.
Feel free to share your thoughts and feedback! 🙃
DOJI FU IndicatorIndicator is designed to paint a doji, the size of which can be adjusted in settings.
Provided there is a valid doji, the following candle is a 'FU candle' or an 'Institution' candle. This candle wicks above/below the doji and takes liquidity from above or below.
Colours can be changed
Red = Doji candle
Yellow = FU candle
Example shown on the 1hr chart, red doji indicating a change of trend upwards, the FU candle (yellow) takes liquidity from above and sweeps down.
Margin Zones[kryptodude]This indicator is based on the margin requirements of the CME exchange.
Zones act as support and resistance levels, which are more likely to have a price reaction.
The recommended zones for entering a position, as well as taking profits, are zones 50 and 100.
For example, you decide to open a short position on the +100 zone,
in which case it is recommended to place a stop-loss behind the zone.
Take-profit part at -50 and -100, based on the zones from the formed maximum at the +100 zone.
Settings:
Select the currency pair and the exchange on which the indicator will work, For example BINANCE:BTCUSD
"Margin" (for example,now 68280, the next day the margin will be different)
"Tick cost" for BTC = 25 or 12.5
taken from the CME exchange.
"Price max"- High yesterday (for example 44451).
"Price min"- Low yesterday (for example 41280).
Please note, with strong volatility,
it is recommended to change the Tick cost instead of 25 to put 12.5
And also, only dots " . " not commas ", " work in the indicator.
SignalsThis script allows you to calculate position size, and future profit, loses.
- You can add 3 target values and 1 stop loss
- Optionally you can display table, position it as you like, and see risk ratio
Plans:
- add profit loss to the labels
Kzx PT mod v1.0 by RX-RAYKzx Position tracker mod v1.0 by RX-RAY
Original script by K-zax
The modification was made for the USDRUB ticker (the number of digits in the values of price, interest, lot volume and profit loss for other tickers may affect the positioning of the inscription, but it is fully operative and it may be used with other tickers )
Typical label view:
74.30 - ENTRY PRICE
+/-0.16% - % of price chang ( range +/-9.99)
20 - position value (range 0-99)
(S) - position type (L) - long (S) - short
+/-0017 - actual profit/loss in cash (range +/- 9999)
(All range value for correct label position,
but script mod can be used out off range)
List of additions and changes:
1. Added display of position value, short / long position type and profit / loss value (including broker commission).
2. Positive interest change now corresponds to profit, negative change in interest to loss in accordance with the type of position ( short/long )
3. The position of the inscription and the digits of the values are fixed and now insignificantly depends on the change in the time interval and the change in the scale of the graph and the change in data values and their signs.
4. Added changing the color of the inscription in the situation positive price change, but profit < commission fee. (critical gain).
Position Size By Risk For Bar SizeThis simple script provides a way of calculating position size on a bar by bar basis for a fixed risk amount.
If you are trading a fixed risk amount (e.g. $100) per trade and your Entry and Stop is defined by a specific bar on the chart (any resolution e.g. 15 min, 5 min, 2 min etc) then this indicator will show you the position size you can take.
The user configures the risk amount per trade in the setting for the indicator, the default is 100 (e.g. $100).
It calculates each bar size (high - low) for the resolution of the chart that is being viewed.
The position size = (risk amount) / (bar size).
It then displays a "." (dot) for each bar and to see the position size hover your mouse over this dot .
The pane for this indicator can be set to the top of the chart by using the "Move pane up" option on the chart so that the indicator is easily accessible and discrete at the top of the chart.
Also, there is an option to use this indicator as a substitute for the built-in volume display.
Support Resistance Zones using confluence & Std. DeviationOverview:
This indicator takes (interactive) input from the user for support and resistance levels and plots important zones considering the other confluence levels in the indicator.
Working of indicator:
This indicator takes six input of Support/resistance level form the user
It has following 32 confluence levels
a.4 Recent positive Divergence levels (DN1, DN2, DN3, DN4)
b.4 recent negative divergence levels (DP1, DP2, DP3, DP4)
d.5 Fibonacci levels (Fib0, Fib236, Fib5, Fib618, Fib786)
e. 7 Pivot levels (P, PR1, PR2, PR3, PS1, PS2, PS3)
f.4 EMAs (E20, E200, E100, E50)
g. ATH, ATL, Weekly High, Weekly Low, two days ago high, two days ago low, previous day high , previous day low
The code checks nearest ‘n’ CONFLUENCE for each level (“Number of confluences to check”) in the indicator, after getting the nearest confluence it calculates the standard deviation of those levels WITH RESPECT TO THE MANUAL INPUT LEVELS.
If the Std. Deviation is less than the input value (“Minimum standard deviation” option) then the zone is displayed on the chart.
How to use:
Add the indicator on the chart select your important support and resistance levels.
Set standard deviation, if the confluence is less than the input standard deviation then you will see those zones on the chart.
You can display all divergence levels; you can display all fib levels. All confluences can be displayed by using the setting of the indicator
How to read the indicator values:
The zone will show all the confluence it has in its zone,
Example:
Table details:
The table shows the maximum and minimum deviation out of all six levels .To see at least one zone you have to make sure that Input value Std. Deviation must be greater than Min Std. Deviation of the table
Sources & refences :
Big thank to www.pinecoders.com and kodify.net
Standard deviation :
www.investopedia.com
function to find 'k' closest elements :
www.techiedelight.com
Interactive support resistance :
Divergence for many indicators:
Auto fib level by DGT:
www.tradingview.com
Dictionary/Object LibraryThis Library is aimed to mitigate the limitation of Pinescript having only one structured data type which is only arrays.
It lacks data types like Dictionaries(in Python) or Object (in JS) that are standard for other languages. Tuples do exist, but it hardly solves any problem.
Working only with Arrays could be overwhelming if your codebase is large. I looked for alternatives to arrays but couldn't find any library.
So I coded it myself and it's been working good for me. So I wanted to share it with you all.
What does it do:
==================
If you are familiar with Python or Javascript, this library tries to immimate Object/Dictonary like structure with Key Value Pairs.
For Example:
object= {name:"John Doe", age: 28 , org: "PineCoders"}
And then it also tries to immitate the Array of Objects (I call it Stack)
like this:
stack= Array({name:"John Doe", age: 28 , org: "PineCoders"},
{name:"Adam Smith", age: 32 , org: "PineCoders"},
{name:"Paragjyoti Deka", age: 25 , org: "PineCoders"})
So there are basically two ideas: Objects and Stacks.
But it looks whole different in Pinescript for obvious reasons.
Limitation:
The major limitation I couldn't overcome was that, for all of the values: both input and return values for properties will be of string type.
This is due to the limiation of Pinecsript that there is no way to return a value on a if-else statement dynamically with different data types.
And as the input data type must be explicitly defined when exporting the library functions, only string inputs are allowed.
Now that doesn't mean you won't be able to use integer, float or boolens, you just need to pass the string value for it using str.tostring() method.
And the output for the getter functions will be in strings as well. But I have added some type conversion methods that you could use from this library itself.
From String to Float, String To Integer and String to Boolean: these three methods are included in this library.
So basically the whole library is based on a manipulatiion of Array of strings under the hood.
///////////////
Usage
///////////////
Import the library using this statement:
import paragjyoti2012/STR_Dict_Lib/4 as DictLib
Objects
First define an object using this method:
for eample:
object1= DictLib.init("name=John,age=26,org=")
This is similar to
object1= {name:"John",age:"26", org:""} in JS or Python
Just like we did here in for "org", you can set initital value to "". But remember to pass string values, even for a numerical properties, like here in "age".
You can use "age="+str.tostring(age). If you find it tedious, you can always add properties later on using .set() method.
So it could also be initiated like this
object= DictLib.init("name=John")
and later on
DictLib.set(object1,"age", str.toString(age))
DictLib.set(object1,"org", "PineCoders")
The getter function looks like this
age= DictLib.get(object1,"age")
name=DictLib.get(object1,"name")
The first argument for all methods .get, .set, and .remove is the pointer (name of the object).
///////////////////////////
Array Of Objects (Stacks)
///////////////////////////
As I mentioned earlier, I call the array of objects as Stack.
Here's how to initialize a Stack.
stack= DictLib.initStack(object1)
The .initStack() method takes an object pointer as argument. It simply converts the array into a string and pushes it into the newly created stack.
Rest of all the methods for Stacks, takes the stack pointer as it's first arument.
For example:
DictLib.pushStack(stack,object2)
The second argument here is the object pointer. It adds the object to it's stack. Although it might feel like a two dimentional array, it's actually an one dimentional array with string values.
Under the hood, it looks like this
////////////////////
Methods
////////////////////
For Objects
-------------------
init() : Initializes the object.
params: (string) e.g
returns: The object ( )
example:
object1=DictLib.init("name=John,age=26,org=")
...................
get() : Returns the value for given property
params: (string object_pointer, string property)
returns: string
example:
age= DictLib.get(object1,"age")
.......................
set() : Adds a new property or updates an existing property
params: (string object_pointer, string property, string value)
returns: void
example:
DictLib.set(object1,"age", str.tostring(29))
........................
remove() : Removes a property from the object
params : (string object_pointer, string property)
returns: void
example:
DictLib.set(object1,"org")
........................
For Array Of Objects (Stacks)
-------------------------------
initStack() : Initializes the stack.
params: (string object_pointer) e.g
returns: The Stack
example:
stack= DictLib.initStack(object1)
...................
pushToStack() : Adds an object at at last index of the stack
params: (string stack_pointer, string object_pointer)
returns: void
example:
DictLib.pushToStack(stack,object2)
.......................
popFromStack() : Removes the last object from the stack
params: (string stack_pointer)
returns: void
example:
DictLib.popFromStack(stack)
.......................
insertToStack() : Adds an object at at the given index of the stack
params: (string stack_pointer, string object_pointer, int index)
returns: void
example:
DictLib.insertToStack(stack,object3,1)
.......................
removeFromStack() : Removes the object from the given index of the stack
params: (string stack_pointer, int index)
returns: void
example:
DictLib.removeFromStack(stack,2)
.......................
getElement () : Returns the value for given property from an object in the stack (index must be given)
params: (string stack_pointer, int index, string property)
returns: string
example:
ageFromObject1= DictLib.getElement(stack,0,"age")
.......................
setElement() : Updates an existing property of an object in the stack (index must be given)
params: (string stack_pointer, int index, string property, string value)
returns: void
example:
DictLib.setElement(stack,0,"age", str.tostring(32))
........................
includesElement() : Checks if any object exists in the stack with the given property-value pair
params : (string stack_pointer, string property, string value)
returns : Boolean
example:
doesExist= DictLib.includesElement(stack,"org","PineCoders")
........................
searchStack() : Search for a property-value pair in the stack and returns it's index
params: (stringp stack_pointer, string property, string value)
returns: int (-1 if doesn't exist)
example:
index= DictLib.searchElement(stack,"org","PineCoders")
///////////////////////
Type Conversion Methods
///////////////////////
strToFloat() : Converts String value to Float
params: (string value)
returns: float
example:
floatVal= DictLib.strToFloat("57.96")
.............................
strToInt() : Converts String value to Integer
params: (string value)
returns: int
example:
intVal= DictLib.strToFloat("45")
.............................
strToBool() : Converts String value to Boolean
params: (string value)
returns: boolean
example:
boolVal= DictLib.strToBool("true")
.............................
Points to remember
...............
1. Always pass string values as arguments.
2. The return values will be of type string, so convert them before to avoid typecasting conflict.
3. Horses can't vomit.
More Informations
====================
Yes, You can store this objects and stacks for persisting through the iterations of a script across successive bars.
You just need to set the variable using "var" keyword. Remember this objects and stacks are just arrays,
so any methods and properties an array have it pinescript, would be applicable for objects and stacks.
It can also be used in security functions without any issues for MTF Analysis.
If you have any suggestions or feedback, please comment on the thread, I would surely be happy to help.
ms hypersupertrendThis is a well-known strategy by using 3 different Supertrends and a trend-defining EMA,
feel free to play around with the settings, a backtest on 8h ETHUSDT pair brought some good results using
the 233EMA and investing 75% of a 10k start capital
the idea is to have at least 2 super trends going green above the trend-EMA to go long and exit by turning
2 super trends red (idea: 1 super trend in red could initialize a take profit)
shorts work vice versa
The EMA shows in green for uptrends and in red for downtrends, if it is blue no Signal will be taken because
the 3 super trends are not all above or below the trendline(EMA)
//-------------------------------------------------------------------------------------------------------------------------------------------------
Update 1:
- Fixed a minor input error
- Added ATR stoploss, and commented out the percentage stop loss
- Added time window to backtest
- Added exit on risk/reward is met
- This version is only buy...wait for next update adding shorts and more
As always, thanks for your ideas, likes, and support. Feel free to mess around with the settings and give me your feedback.
moonshot hypertrender (supertrend strategy)
This is a well-known strategy by using 3 different Supertrends and a trend-defining EMA,
feel free to play around with the settings, a backtest on 8h ETHUSDT pair brought some good results using
the 233EMA and investing 75% of a 10k start capital.
The idea is to have at least 2 Supertrends going green above the trend-EMA to go into a long position. The exit
will be triggered if 2 Supertrends change to red (idea: 1 super trend in red could initialize a take profit).
Taking shorts works vice versa.
The EMA shows in green for uptrends and in red for downtrends, if it is blue (ranging market) no Signal will be taken because
the 3 Supertrends are not all above or below the trendline(EMA).
I heard about this strategy on youtube but I can't get the promised 60% win-rate ;)
any suggestions to improve it are welcome
Hope you find it useful and it would be nice to get your feedback
-theasgard-
MA MTF Cross StrategyStrategy Introduction
This multi-timeframe strategy generates buy and sell entries based on two Moving Averages’ cross with an option to turn on trend direction confirmation through 3rd Moving Average selection. While all three moving averages can be selected from the following list:
SMA
EMA
DEMA
TEMA
LRC
WMA
MF
VAMA
TMA
HMA
JMA
Kijun v2
EDSMA
McGinley
Only long trades are enabled currently
Default Settings
I've set the default selection to the perfect options for 1D timeframe. You can modify all MAs selections and their lengths according to your selected timeframes.
Following default settings are used:
Heiken Ashi Candles are selected by default as source
1st Moving Average selection is set to LRC (Linear Regression Curve)
Length of 1st Moving Average is set to 50
2nd Moving Average is set to EDSMA (Ehlers Deviation-Scaled Moving Average)
Length of 2nd Moving Average is set to 30
3rd Moving Average is set to HMA (Hull Moving Average)
Length of 3rd Moving Average is set to 200
Uptrend direction confirmation through 3rd Moving Average is set to false by default
Start date is set to start from 2013
Backtesting can also be done selecting %age of equity
Suggestions for Usage
Mostly winning trades by set defaults have no prominent drawdown so losing trades can be abolished with Stoploss. Would soon add Stoploss and Takeprofit options in next version. Also, if you want an alerts version of it then just comment below and would publish it later. I’ve found this strategy useful on 1D timeframe with described default settings but multiple Mas selections can be explored further.
MZ SRSI Strategy V1.0Strategy Introduction
This strategy starts from selection of 1st Moving Average from one of following:
SMA
EMA
DEMA
TEMA
LRC
WMA
MF
VAMA
TMA
HMA
JMA
Kijun v2
EDSMA
McGinley
Then it calculates the RSI of selected 1st Moving Average
In the end it calculates Moving Average of previously calculated RSI and for this purpose 2nd Moving Average is also selected from above list.
Cross of RSI and its Moving Average generates Strategy Alerts
Only long trades are enabled currently
Default Settings
I've set the default selection to the perfect options for 1D and 4h timeframes. You can modify both MAs selection and their length according to your selected timeframe.
Following default settings are used:
Heiken Ashi Candles are selected by default as source
1st Moving Average selection is set to LRC (Linear Regression Curve)
Length of 1st Moving Average is set to 50
RSI length is set to 2 because it is supposed to be fast
2nd Moving Average of RSI is set to TMA (Triangular Moving Average)
Length of 1st Moving Average is set to 5
Start date is set to 2011
Backtesting can also be done selecting %age of equity
Suggestions for Usage
Mostly winning trades have no prominent drawdown so losing trades can be abolished with Stoploss. Would soon add Stoploss, MTF and Takeprofit options in next version. Also if you want an alerts version of it then just comment below and would publish it later. I’ve found this strategy useful on 1D and 4h timeframes with described default settings.
Outside DayThis strategy is taken from Perry Kaufman's book "Trading System and Methods".
You can enter on the direction of the candle, or opposite to it. I find that the opposite tends to yield better results in volatile assets, allowing a better reward to risk ratio. There is no stop loss in this strategy, only a fixed take profit and a time limitation.
Hull MA TimeFrame CrossOverHello traders,
Although this strategy is configured on BTCUSDT , with a changing of settings, it can be used on any trading instrument.
Here it is seen, on the 2 hour chart. With Trading Fees included in result (adjust to suit your exchange fees).
The candle crossover is set to Daily timeframe.
That means that the Candle crossover is going to see if todays price is higher than yesterdays price.
If user sets this to 4 hour timeframe, the candle crossover would be when price is higher than the the price 4 hours ago...
The rest is simple, a moving average to detect direction, and an ATR StopLoss (if activated).
There is StopLoss and Take Profit settings which work by percentage.
The periods of the moving average and the ATR can be adjusted, as can the TP % and SL %.
The price is taken from the CLOSE or the OPEN or OHLC4 etc... which can be changed in the settings. OPEN is recommended to avoid repainting.
The moving average also has selectable types (ALMA,SMA,EMA,WMA,HMA)
So if the Price is above the Moving average, and the moving average is above the alternate timeframe value, then a buy is activated
if the Price is below the Moving average, and the moving average is below the alternate timeframe value, then a sell is activated
if OPEN is selected as Price source, then the alternate timeframe value would be the OPEN of the alternate timeframes candle.
the values are all plotted on chart so user can see what is happening when what crosses over what, and then what changes when settings are adjusted.
Have FuN!
if this strategy brings you the epik win......
.... dont forget about me
seaside420 ❤️
40+ Coin Screener (workaround to 40 Security Limit Per Script) This is a far inferior method for a screener/scanner (compared to my first publication) but after looking at that script from a noobs eyes again, I could see how this form would be a lot easier to take in/understand so wanted to publish it. Everything that I could think of to mention about this is in my 1st pub so ill leave it to you to check it out...though I did include some comments in the script. It is pretty straight forward but if you have any questions don't hold them in. I'll answer them if I can. The only thing that is not in this one is setting up the alert feature so that you only have to create 1 alert per iteration of the script and it takes care of all of the coins for that iteration/set that is chosen in the settings (so please see previous script if would like to do this for your screener/scanner).
To be PERFECTLY CLEAR, the workaround is to the issue of not being able to scan but only 40 coins per script. You can scan more than 40 per script but only if you create "batches" or "sets" that the user can select within the settings which set to use for each iteration of the script on the chart. That being, you have to the script multiple times to the chart and merge them into 1 window and merge the scales (instructions in first publications). Here in this script I am scanning 72 different coins that are the Margin Coins on KUCOIN. I have split them up into 3 sets (24 coins per set). I could have made 2 sets but the script will be slower to load and to respond (like, when it comes to receiving alerts), thus I split them up the way I did. If you want to change any of this there are slightly more details in the previous script.
One great use-case that I LOVE about this particular version (and the way I use it) is right at the end of when I see a whole market dump/pump coming to an end and want to know which horse to bet on. Used to think whichever coin come out the fastest from the dump was the one to bet on but quickly learned that 1-2 (or even a few) hrs needs to go by first bc the ones that look the strongest in the beginning are NOT the ones to have performed the best when viewing the results 12 hrs later. IN FACT, many instances of using this exact script for reasons as such has taught me that the manipulators (I believe this to be the case as least) WANT everyone to bet on these that come out the gate the hardest and thus they make them move REALLY hard in the beginning then they QUICKLY become stagnant (moreso, they become WORSE than stagnant, they actually quickly retrace to put you into the negative so that you get out to get into the others now moving (to provide the market with more liquidity. They WANT you to get into a coin thats moving crazy hard so that they can then cease that movement once many fall for the trick just to then make that once strong looking coin now stagnant and make others move crazy hard. They wait for you to get out of the 1st and into the next set of movers just to do this time and time again bc hey, what are we sheep good for other than to provide the big guns with liquidity, am I right? Thats rhetorical, which you would know if you've ever had this happen to you (without a doubt MANY of you have). Let this script (above all other things) provide good evidence to back up this cynical way of viewing the markets to anyone that is questioning it.
This prolonged time between when the dump is over and when the ACTUAL movers REALLY start moving can actually be of great benefit to us sheep if used correctly, Firstly, it gives us some time to determine if when we thought was the bottom, ACTUALLY was the bottom. That bottom is easily determined if there are no (or very few) coins that went any lower than the point in time that the script began calculating on. Secondly, it allows us time to wait for the REAL movers and shakers to start moving and shaking.
One new feature that I LOVE that TV has implemented is the ability (once the script is added to the chart) to be able to click a point in time on the chart where you want the script to begin its calculations. If this point needs to be changed at any point in time then you can either go into the setting and input the time you wish or simply remove the script and add it again so that you are prompted to select another point in time. Ok, I think that everything I wanted to say. The next version that I will add will be probably my favorite and most used by yours truly...not to mention unique in a way that I have yet to see an implementation anything like it in all of TV's public library. Not to say its not there, but I have yet to come across it and I have DEFINITELY done my fair share of searching for it when I couldn't figure out how to code it for the longest time (though, I was and still am a noob so might get some great feedback on better ways to approach it, but we'll save that jabbering for the next of the publications.
I hope each and every one of ya'll (yes, Im from the South) have the GREATEST of Thanksgivings (if in the US that is...I graced my parents with the best gift anyone could have given them 35 years ago on Thanksgiving....MEEEE ;) So I will sure as hell be having a great holiday. Thanks for checking out my script...you can "like" and leave a comment if you so feel the urge to...or not. Im not doing this for me, but rather to stretch my arms out as far as possible to benefit the most people as possible and more people would see the script if it has more likes/comments/traffic pointing towards it...not to mention as other publishers have...it IS gratifying to see a few likes in my side window, which btw, I have MANY more variations and completely diff types of scanners/screeners Ill be publishing in the future and to know that they've become of use....I"VE become of use to the community is very....pleasing to me and does (as I've also seen many publishers mention as well) drive me to want to publish ones that I originally thought I would keep for myself. Peace out people.
AG FX - Pivot PointsPivot Points High Low
Definition
The Pivot Points High Low indicator is used to determine and anticipate potential changes in market price and reversals. The Highs referred to in the title are created based on the number of bars that exhibit lower highs on either side of a Pivot Point High, whereas the Lows are created based on the number of bars that exhibit higher lows on either side of a Pivot Point Low.
Calculations
As mentioned above, Pivot Point Highs are calculated by the number of bars with lower highs on either side of a Pivot Point High calculation. Similarly, Pivot Point Lows are calculated by the number of bars with higher lows on either side of a Pivot Point Low calculation.
Takeaways and what to look for
A Pivot Point is more significant or noteworthy if the trend is extended or longer than average. This can mean if a trader selects a higher period for before and after the Pivot Point, the trend could be longer and therefore prove the Pivot Point itself more notable.
Additionally, Pivot Points can help a trader assess where would be best to draw. By analyzing price changes and reversals, a trader has more of an ability to determine and predict price patterns and general price trends.
Summary
The Pivot Points High Low indicator can predict and determine price changes and potential reversals in the market. Pivot Points can also help traders identify price patterns and trends, depending on the period and significance of the Pivot Point value.
Mayer MAMayer Multiple Price Bands Explained
The Mayer Multiple Price Bands chart is a simple modification to the original Mayer Multiple chart explained here.
Summary of Mayer Multiple
The Mayer Multiple is calculated by taking the price of Bitcoin and dividing it by the 200 day moving average value. The thinking behind the multiple is that by comparing the current price of bitcoin and its longer term moving average, you get a sense of if it is overbought (overvalued) or oversold (undervalued).
Adding Bands
The addition of price bands takes the multiple a step further by attempting to tell you how overbought or oversold bitcoin is with more detail. Instead of just three labels (overbought, fairly priced, and undervalued), you are given more granular labels: Oversold, Bearish, Bullish, Bullish Extension, and Overbought.
How to Calculate Mayer Multiple Bands
The Mayer multiple is calculated by taking the price of Bitcoin and dividing it by the 200 day moving average value. We take this a step further and display various prices that represent ‘bands’ of over and undervalued Bitcoin based on the multiple. They are as follows:
>2.5x: Overbought
>1.7x and <2.5x: Bullish Overextension
>1.1x and <1.7x Bullish Channel
>0.55x and <1.1x: Bearish Channel
<0.55x: Oversold
Triple Modified Hull Moving Average Cross By <Zakaria>Triple Modified Hull Moving Average Cross By
What is this?
this is a modified formula for Hull moving average, it is more accurate and predicts the golden and death cross earlier.
How to use?
Work better in high time frames (1D,1W)
the white line vs the red and the orange lines :
1 - when the white line crosses the red and the orange lines from the bottom the price will go down . Death cross!
2 - when the white line crosses the red and the orange lines from the top the price will go up . Golden Cross!
the red line vs the orange line :
1- when the orange line crosses the red line from the bottom the price will go down . Death cross!
2 - when the orange line crosses the red line from the top the price will go up . Golden Cross!
p.s: the lag between these two lines will be very small. use it in the 1W time frame to predict where exactly the bull market will end.
You can input your personalized values if you want!






















