├── img ├── VPOC.png ├── delta_candle.png ├── ma_histogram.png ├── delta_histogram.png ├── delta_divergence.png ├── on_balance_volume.png ├── VPOC_community_share.png ├── delta_candle_community_share.png ├── ma_histogram_community_share.png ├── delta_divergence_community_share.png ├── delta_histogram_community_share.png └── on_balance_volume_community_share.png ├── script ├── deltaHistogram.js ├── onBalanceVolume.js ├── maHistogram.js ├── barVPOC.js ├── deltaDivergence.js ├── deltaCandle.js └── onBalanceVolumeModified.js └── README.md /img/VPOC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/VPOC.png -------------------------------------------------------------------------------- /img/delta_candle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/delta_candle.png -------------------------------------------------------------------------------- /img/ma_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/ma_histogram.png -------------------------------------------------------------------------------- /img/delta_histogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/delta_histogram.png -------------------------------------------------------------------------------- /img/delta_divergence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/delta_divergence.png -------------------------------------------------------------------------------- /img/on_balance_volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/on_balance_volume.png -------------------------------------------------------------------------------- /img/VPOC_community_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/VPOC_community_share.png -------------------------------------------------------------------------------- /img/delta_candle_community_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/delta_candle_community_share.png -------------------------------------------------------------------------------- /img/ma_histogram_community_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/ma_histogram_community_share.png -------------------------------------------------------------------------------- /img/delta_divergence_community_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/delta_divergence_community_share.png -------------------------------------------------------------------------------- /img/delta_histogram_community_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/delta_histogram_community_share.png -------------------------------------------------------------------------------- /img/on_balance_volume_community_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdmiami/tradovate-custom-indicators/HEAD/img/on_balance_volume_community_share.png -------------------------------------------------------------------------------- /script/deltaHistogram.js: -------------------------------------------------------------------------------- 1 | const predef = require("./tools/predef"); 2 | const meta = require("./tools/meta"); 3 | 4 | class deltaHistogram { 5 | map(d) { 6 | const deltaValue = d.offerVolume() - d.bidVolume(); 7 | const deltaColor = { color: deltaValue > 0 ? "green" : "red" }; 8 | return { 9 | value: deltaValue, 10 | style: { value: deltaColor } 11 | }; 12 | } 13 | } 14 | 15 | 16 | module.exports = { 17 | name: "Delta", 18 | description: "Delta Histogram", 19 | calculator: deltaHistogram, 20 | tags: [predef.tags.Volumes], 21 | inputType: meta.InputType.BARS, 22 | areaChoice: meta.AreaChoice.NEW, 23 | plotter: predef.plotters.histogram 24 | }; -------------------------------------------------------------------------------- /script/onBalanceVolume.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Description 4 | On Balance Volume keeps a running total of volume flowing into or out of a security. 5 | When the security closes higher than the previous close, all of the day's volume is considered up-volume. 6 | A close lower than the previous day's results in all of the day's volume considered down-volume. 7 | A rising OBV is defined as a sign of smart money flowing into a security. As the public then moves into the security, both the security and the OBV will surge ahead. 8 | If the price movement precedes the OBV movement, it is called a "non-confirmation." Non-confirmations tend to occur at bull market tops or at bear market bottoms. 9 | 10 | When the security's price closes up, the day's OBV is created by adding the day's volume to the cumulative total. 11 | The day's volume is subtracted from the cumulative total when the price closes down. 12 | 13 | Plots 14 | OBV :-> The On Balance Volume line. 15 | 16 | */ 17 | 18 | 19 | const predef = require("./tools/predef") 20 | const meta = require('./tools/meta') 21 | 22 | 23 | class onBalanceVolume { 24 | 25 | init() { 26 | 27 | this.obv = 0 28 | 29 | } 30 | 31 | map(d, i, history) { 32 | 33 | const volume = d.volume() 34 | const close = d.close() 35 | const priorClose = i > 0 ? history.prior().close() : close 36 | 37 | if (close > priorClose) { 38 | this.obv += volume 39 | }else if (close < priorClose){ 40 | this.obv += (-1 * volume) 41 | }else{ 42 | this.obv += (0 * volume) 43 | } 44 | 45 | return this.obv 46 | } 47 | } 48 | 49 | module.exports = { 50 | name: "obv", 51 | description: "On Balance Volume", 52 | calculator: onBalanceVolume, 53 | inputType: meta.InputType.BARS, 54 | areaChoice: meta.AreaChoice.NEW, 55 | tags: [predef.tags.Volumes], 56 | schemeStyles: predef.styles.solidLine("white") 57 | } -------------------------------------------------------------------------------- /script/maHistogram.js: -------------------------------------------------------------------------------- 1 | const predef = require("./tools/predef"); 2 | const meta = require("./tools/meta"); 3 | const SMA = require("./tools/SMA"); 4 | const EMA = require("./tools/EMA"); 5 | const WMA = require("./tools/WMA"); 6 | 7 | class maHistogram { 8 | init() { 9 | switch(this.props.period1type) { 10 | case "Simple": 11 | this.period1Avg = SMA(this.props.period1); 12 | break; 13 | case "Exponential": 14 | this.period1Avg = EMA(this.props.period1); 15 | break; 16 | case "Weighted": 17 | this.period1Avg = WMA(this.props.period1); 18 | break; 19 | default: 20 | this.period1Avg = SMA(this.props.period1); 21 | } 22 | switch(this.props.period2type) { 23 | case "Simple": 24 | this.period2Avg = SMA(this.props.period2); 25 | break; 26 | case "Exponential": 27 | this.period2Avg = EMA(this.props.period2); 28 | break; 29 | case "Weighted": 30 | this.period2Avg = WMA(this.props.period2); 31 | break; 32 | default: 33 | this.period2Avg = SMA(this.props.period2); 34 | } 35 | } 36 | 37 | map(d) { 38 | const value = d.value(); 39 | const diff = this.period1Avg(value) - this.period2Avg(value); 40 | const plotValue = (diff > 0) ? 100 : 99.9999; 41 | const plotColor = { color: diff > 0 ? "green" : "red" }; 42 | return { 43 | value: plotValue, 44 | style: { value: plotColor } 45 | }; 46 | } 47 | } 48 | 49 | module.exports = { 50 | name: "maHistogram", 51 | description: "maHistogram", 52 | calculator: maHistogram, 53 | params: { 54 | period1: predef.paramSpecs.period(8), 55 | period1type: predef.paramSpecs.enum({value1: "Simple", value2: "Exponential", value3: "Weighted"}), 56 | period2: predef.paramSpecs.period(35), 57 | period2type: predef.paramSpecs.enum({value1: "Simple", value2: "Exponential", value3: "Weighted"}) 58 | }, 59 | tags: [predef.tags.MovingAverage], 60 | inputType: meta.InputType.BARS, 61 | areaChoice: meta.AreaChoice.NEW, 62 | plots: { 63 | value: { displayOnly: true } 64 | }, 65 | plotter: predef.plotters.histogram 66 | }; 67 | -------------------------------------------------------------------------------- /script/barVPOC.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Description 4 | Volume point of control(VPOC), refers to the price at which the highest volume of trading occurred. 5 | This indicator will calculate VPOC in real time for each bar 6 | 7 | 8 | Parameter 9 | boxColor: The color of the box around VPOC 10 | boxWidth: Depends on your chart type, box width is adjustable for best view 11 | lineOpacity: The transparency of lines 12 | lineWidth: The thickness of lines 13 | 14 | Plot 15 | Rectangle box around VPOC for each bid/ask bar 16 | 17 | 18 | */ 19 | 20 | 21 | const predef = require("./tools/predef"); 22 | const meta = require("./tools/meta"); 23 | const p = require("./tools/plotting"); 24 | 25 | 26 | class barVPOC { 27 | 28 | map(d) { 29 | const profile = d.profile(); 30 | const VPOC = profile.reduce((result, value) => { 31 | if (value.vol > result.vol) { 32 | result = value; 33 | } 34 | return result; 35 | }, { vol: 0 }); 36 | return { 37 | VPOC: VPOC.price, 38 | tickSize: this.contractInfo.tickSize 39 | }; 40 | } 41 | } 42 | 43 | function boxPlotter(canvas, indicatorInstance, history) { 44 | 45 | const props = indicatorInstance.props; 46 | 47 | for(let i = 1; i < history.data.length; i++) { 48 | 49 | const item = history.get(i); 50 | const next = history.get(i + 1); 51 | 52 | let left = p.x.between( 53 | p.x.get(history.get(i - 1)), 54 | p.x.get(history.get(i)), 55 | 0.50); 56 | 57 | let right = p.x.between( 58 | p.x.get(history.get(i - 1)), 59 | p.x.get(history.get(i)), 60 | 1.50); 61 | 62 | // The perimeter path 63 | const path = p.createPath(); 64 | path.moveTo(left, item.VPOC + item.tickSize/props.boxWidth); 65 | path.lineTo(left, item.VPOC - item.tickSize/props.boxWidth); 66 | path.lineTo(right, item.VPOC - item.tickSize/props.boxWidth); 67 | path.lineTo(right, item.VPOC + item.tickSize/props.boxWidth); 68 | path.lineTo(left, item.VPOC + item.tickSize/props.boxWidth); 69 | 70 | // Draw the perimeter 71 | canvas.drawPath( 72 | path.end(), 73 | { 74 | color: props.boxColor, 75 | width: props.lineWidth, 76 | opacity: props.lineOpacity / 100.0 77 | }); 78 | 79 | } 80 | 81 | } 82 | 83 | module.exports = { 84 | name: "barVPOC", 85 | description: "VPOC (BAR)", 86 | calculator: barVPOC, 87 | tags: [predef.tags.Volumes], 88 | inputType: meta.InputType.BARS, 89 | params: { 90 | boxColor: predef.paramSpecs.color("#FFFF99"), 91 | boxWidth: predef.paramSpecs.percent(4, 1, 0, 10), 92 | lineOpacity: predef.paramSpecs.number(100, 1, 0), 93 | lineWidth: predef.paramSpecs.number(1, 1, 0) 94 | }, 95 | plotter: [ 96 | predef.plotters.custom(boxPlotter) 97 | ] 98 | }; -------------------------------------------------------------------------------- /script/deltaDivergence.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Description 4 | Delta is a key concept to understand when making trading decisions based upon traded volume. 5 | It’s the difference between the volume of market orders buying by lifting the offer price and the volume of market orders selling by hitting the bid price. 6 | In other words, if Delta is greater than zero, we had more buying than selling and if Delta is less than zero, we had more selling than buying. 7 | 8 | Delta gives us a broad sense for each bar of whether we have more aggressive buying or selling. 9 | We can compare Delta between bars to get a sense of whether supply and demand are rising or falling, 10 | Delta Divergence tells us when the delta across price bars is not moving in the same direction as price. 11 | 12 | Example: 13 | 1. Bearish Divergence ==> Price has made a new high but there was more selling than buying. 14 | 2. Bullish Divergence ==> Price has made a new low but there was more buying than selling. 15 | 16 | Plots 17 | Red dot above the high when price makes higher high on negative delta 18 | Green dot below the low when price makes lower low on positive delta 19 | 20 | */ 21 | 22 | 23 | const predef = require("./tools/predef"); 24 | const meta = require("./tools/meta"); 25 | 26 | class deltaDivergence { 27 | map(d, i, history) { 28 | let bearishDivergence; 29 | let bullishDivergence; 30 | const tickSize = this.contractInfo.tickSize; 31 | if(i > 0){ 32 | const deltaValue = d.offerVolume() - d.bidVolume(); 33 | const currentHigh = d.high(); 34 | const currentLow = d.low(); 35 | const prevDeltaValue = history.prior().offerVolume() - history.prior().bidVolume(); 36 | const prevHigh = history.prior().high(); 37 | const prevLow = history.prior().low(); 38 | if (currentHigh >= prevHigh && deltaValue <= 0 && prevDeltaValue >= 0){ 39 | bearishDivergence = d.high() + (tickSize * this.props.plotInTick); 40 | } 41 | if(currentLow <= prevLow && deltaValue >= 0 && prevDeltaValue <= 0){ 42 | bullishDivergence = d.low() - (tickSize * this.props.plotInTick); 43 | } 44 | } 45 | 46 | return{ 47 | bearishDivergence, 48 | bullishDivergence 49 | }; 50 | } 51 | } 52 | 53 | module.exports = { 54 | name: "deltaDivergence", 55 | title: "Delta Divergence", 56 | description: "Delta Divergence", 57 | calculator: deltaDivergence, 58 | params: { 59 | plotInTick: predef.paramSpecs.number(2) 60 | }, 61 | tags: [predef.tags.Volumes], 62 | inputType: meta.InputType.BARS, 63 | plotter: [ 64 | predef.plotters.dots('bearishDivergence'), 65 | predef.plotters.dots('bullishDivergence') 66 | ], 67 | plots: { 68 | bearishDivergence: { title: 'Bearish Divergence', displayOnly: true }, 69 | bullishDivergence: { title: 'Bullish Divergence', displayOnly: true } 70 | }, 71 | schemeStyles: { 72 | dark: { 73 | bearishDivergence: {color: "red"}, 74 | bullishDivergence: {color: "green"} 75 | } 76 | } 77 | }; -------------------------------------------------------------------------------- /script/deltaCandle.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Description 4 | Delta is a key concept to understand when making trading decisions based upon traded volume. 5 | It’s the difference between the volume of market orders buying by lifting the offer price and the volume of market orders selling by hitting the bid price. 6 | In other words, if Delta is greater than zero, we had more buying than selling and if Delta is less than zero, we had more selling than buying. 7 | 8 | Delta gives us a broad sense for each bar of whether we have more aggressive buying or selling. 9 | 10 | Plots 11 | Delta candlestick on the chart & OHLC of delta on data box 12 | 13 | Historical data doesn't contains sequence of the volumes, so you won't see high and low of delta for historical data. 14 | It's going to show candlestick delta chart only if you have it open. 15 | 16 | */ 17 | 18 | 19 | const predef = require("./tools/predef"); 20 | const meta = require("./tools/meta"); 21 | const p = require("./tools/plotting"); 22 | 23 | let parentArray; 24 | 25 | class deltaCandle { 26 | 27 | map(d, index) { 28 | 29 | if(index in parentArray){ 30 | parentArray[index].push(d.offerVolume() - d.bidVolume()) 31 | }else{ 32 | parentArray[index]=[] 33 | parentArray[index].push(d.offerVolume() - d.bidVolume()) 34 | } 35 | 36 | return { 37 | dOpen: 0, 38 | dHigh: Math.max(...parentArray[index]), 39 | dLow: Math.min(...parentArray[index]), 40 | dClose: parentArray[index][parentArray[index].length - 1], 41 | candlestick: { 42 | color: this.props.hideCandles ? "transparent" : null 43 | }, 44 | style: { 45 | value: { 46 | color: this.props.hideCandles ? "transparent" : null 47 | } 48 | }, 49 | }; 50 | } 51 | } 52 | 53 | 54 | function candlestickPlotter(canvas, indicatorInstance, history) { 55 | for(let i=0; i item.dClose ? indicatorInstance.props.fallingColor : indicatorInstance.props.risingColor, 69 | relativeWidth: 0.5, 70 | }); 71 | 72 | // candle wicks 73 | canvas.drawLine( 74 | p.offset(x, item.dHigh), 75 | p.offset(x, item.dLow), 76 | { 77 | color: item.dOpen > item.dClose ? indicatorInstance.props.fallingColor : indicatorInstance.props.risingColor, 78 | relativeWidth: 0.1, 79 | }); 80 | } 81 | } 82 | } 83 | 84 | module.exports = { 85 | name: "deltaCandle", 86 | title: "Delta Candle", 87 | description: "Delta Candle", 88 | calculator: deltaCandle, 89 | tags: [predef.tags.Volumes], 90 | params: { 91 | hideCandles: predef.paramSpecs.bool(false), 92 | risingColor: predef.paramSpecs.color("green"), 93 | fallingColor: predef.paramSpecs.color("red") 94 | }, 95 | inputType: meta.InputType.BARS, 96 | areaChoice: meta.AreaChoice.NEW, 97 | plots: { 98 | dOpen: { title: "Δ-Open" }, 99 | dHigh: { title: "Δ-High" }, 100 | dLow: { title: "Δ-Low" }, 101 | dClose: { title: "Δ-Close" } 102 | }, 103 | plotter: [ 104 | predef.plotters.custom(candlestickPlotter) 105 | ] 106 | }; -------------------------------------------------------------------------------- /script/onBalanceVolumeModified.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Description 4 | The OnBalanceVolumeModified (OBVM) study is a technical indicator introduced by Vitali Apirine. It is a variation of OnBalanceVolume (OBV). 5 | In the modified version, OBV is given a smoothing (by an exponential moving average, by default). 6 | In addition, a signal line is introduced. The signal line is a slower moving average of the smoothed-out OBV. 7 | 8 | When the main line of the OBVM is rising, the volume might be gaining positive pressure, which may further result in an increase of the price. 9 | Conversely, decreasing OBVM may signify decreasing volume pressure and a further price reduction. 10 | 11 | The main line can also be analyzed in terms of divergences from the main price plot. The signal line can be used to identify crossovers. 12 | 13 | Input Parameters 14 | obvmLength :-> The length of the moving average to smooth OnBalanceVolume with. 15 | signal length :-> The length of the moving average used in the calculation of the signal line. 16 | average type :-> The type of moving average to be used in calculations: simple, exponential(default), weighted. 17 | 18 | Plots 19 | OBVM :-> The main OnBalanceVolumeModified line. 20 | Signal :-> The signal OnBalanceVolumeModified line. 21 | 22 | */ 23 | 24 | 25 | const predef = require("./tools/predef") 26 | const meta = require('./tools/meta') 27 | const plotting = require("./tools/plotting") 28 | const SMA = require("./tools/SMA") 29 | const EMA = require("./tools/EMA") 30 | const WMA = require("./tools/WMA") 31 | 32 | class onBalanceVolumeModified { 33 | 34 | init() { 35 | 36 | switch(this.props.averageType) { 37 | case "Simple": 38 | this.obvmAverage = SMA(this.props.obvmLength) 39 | this.signalAverage = SMA(this.props.signalLength) 40 | break; 41 | case "Exponential": 42 | this.obvmAverage = EMA(this.props.obvmLength) 43 | this.signalAverage = EMA(this.props.signalLength) 44 | break; 45 | case "Weighted": 46 | this.obvmAverage = WMA(this.props.obvmLength) 47 | this.signalAverage = WMA(this.props.signalLength) 48 | break; 49 | default: 50 | this.obvmAverage = EMA(this.props.obvmLength) 51 | this.signalAverage = EMA(this.props.signalLength) 52 | } 53 | 54 | this.obv = 0 55 | this.obvm = 0 56 | this.signal = 0 57 | 58 | } 59 | 60 | map(d, i, history) { 61 | 62 | const volume = d.volume() 63 | const close = d.close() 64 | const priorClose = i > 0 ? history.prior().close() : close 65 | 66 | if (close > priorClose) { 67 | this.obv += volume 68 | }else if (close < priorClose){ 69 | this.obv += (-1 * volume) 70 | }else{ 71 | this.obv += (0 * volume) 72 | } 73 | 74 | this.obvm = this.obvmAverage(this.obv) 75 | this.signal = this.signalAverage(this.obvm) 76 | 77 | return { 78 | obvm: this.obvm, 79 | signal: this.signal 80 | } 81 | } 82 | } 83 | 84 | module.exports = { 85 | name: "onBalanceVolumeModified", 86 | description: "On Balance Volume Modified", 87 | calculator: onBalanceVolumeModified, 88 | inputType: meta.InputType.BARS, 89 | areaChoice: meta.AreaChoice.NEW, 90 | tags: [predef.tags.Volumes], 91 | params: { 92 | obvmLength: predef.paramSpecs.period(7), 93 | signalLength: predef.paramSpecs.period(10), 94 | averageType: predef.paramSpecs.enum({value1: "Simple", value2: "Exponential", value3: "Weighted"}), 95 | 96 | }, 97 | validate(obj) { 98 | if (obj.obvmLength < 1) { 99 | return meta.error("obvmLength", "OBVM length should be a positive number"); 100 | } 101 | if (obj.signalLength < 1) { 102 | return meta.error("signalLength", "Signal length should be a positive number"); 103 | } 104 | return undefined; 105 | }, 106 | plots: { 107 | obvm: { title: "obvm" }, 108 | signal: { title: "signal" } 109 | }, 110 | plotter: [ 111 | predef.plotters.singleline("obvm"), 112 | predef.plotters.singleline("signal") 113 | ], 114 | schemeStyles: { 115 | dark: { 116 | obvm: predef.styles.plot("#CC33FF"), 117 | signal: predef.styles.plot("#CC6600") 118 | } 119 | } 120 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tradovate-custom-indicators 2 | Tradovate offers a robust custom indicator solution that allows users to create/add indicators using JavaScript coding language. In addition, Tradovate offers a complete open-source library to all Tradovate indicators with the ability to save and modify any current indicators, create your own from scratch, or upload an indicator in JavaScript. [More](https://tradovate.zendesk.com/hc/en-us/articles/115011665727-How-do-I-use-custom-indicators-in-Tradovate-) 3 | 4 | ## Delta Histogram 5 | Tradovate has nice feature to view footprint chart(bid-ask volume), but currently lag features like bar delta and few more things. So I have created delta histogram indicator community can use this for now until we get that feature in chart itself. [More](https://tradovate.zendesk.com/hc/en-us/community/posts/360000855987-Order-Flow-2-0?page=1) 6 | 7 | ##### How to install 8 | Indicator -> Explore Community Indicator 9 | ![](img/delta_histogram_community_share.png) 10 | 11 | After successfully installation the indicator is located at under Volume-based --> Delta Histogram 12 | 13 | ##### Example 14 | ![](img/delta_histogram.png) 15 | 16 | ## Delta Candle 17 | Delta is a key concept to understand when making trading decisions based upon traded volume. 18 | It’s the difference between the volume of market orders buying by lifting the offer price and the volume of market orders selling by hitting the bid price. 19 | In other words, if Delta is greater than zero, we had more buying than selling and if Delta is less than zero, we had more selling than buying. 20 | 21 | ##### Plots 22 | Delta candlestick on the chart & OHLC of delta on data box 23 | 24 | Historical data doesn't contains sequence of the volumes, so you won't see high and low of delta for historical data. 25 | **It's going to show candlestick delta chart only if you have it open.** 26 | 27 | ##### How to install 28 | Indicator -> Explore Community Indicator 29 | ![](img/delta_candle_community_share.png) 30 | 31 | After successfully installation the indicator is located at under Volume-based --> Delta Candle 32 | 33 | ##### Example 34 | ![](img/delta_candle.png) 35 | 36 | ## Delta Divergence 37 | ##### Description 38 | Delta gives us a broad sense for each bar of whether we have more aggressive buying or selling. 39 | We can compare Delta between bars to get a sense of whether supply and demand are rising or falling, 40 | Delta Divergence tells us when the delta across price bars is not moving in the same direction as price. 41 | 42 | Example: 43 | 1. Bearish Divergence ==> Price has made a new high but there was more selling than buying. 44 | 2. Bullish Divergence ==> Price has made a new low but there was more buying than selling. 45 | 46 | ##### Plots 47 | Red dot above the high when price makes higher high on negative delta 48 | Green dot below the low when price makes lower low on positive delta 49 | 50 | ##### How to install 51 | Indicator -> Explore Community Indicator 52 | ![](img/delta_divergence_community_share.png) 53 | 54 | After successfully installation the indicator is located at under Volume-based --> Delta Divergence 55 | 56 | ##### Example 57 | ![](img/delta_divergence.png) 58 | 59 | 60 | ## The VPOC of each bar (the price with the highest volume) 61 | ##### Description 62 | Volume point of control(VPOC), refers to the price at which the highest volume of trading occurred. 63 | This indicator will calculate VPOC in real time for each bar 64 | 65 | ##### Parameter 66 | boxColor: The color of the box around VPOC 67 | boxWidth: Depends on your chart type, box width is adjustable for best view 68 | lineOpacity: The transparency of lines 69 | lineWidth: The thickness of lines 70 | 71 | ##### Plots 72 | Rectangle box around VPOC for each bid/ask bar 73 | **You can adjust the box width depends on the future contract you trade.** 74 | 75 | 76 | ##### How to install 77 | Indicator -> Explore Community Indicator 78 | ![](img/VPOC_community_share.png) 79 | 80 | After successfully installation the indicator is located at under Volume-based --> VPOC (BAR) 81 | 82 | ##### Example 83 | ![](img/VPOC.png) 84 | 85 | 86 | ## MA Histogram 87 | Moving average histogram indicator will plot histogram and changes color when they cross each other, base upon your strategies if correct parameter were set, this can tell you when trend is changing. 88 | 89 | ##### How to install 90 | Indicator -> Explore Community Indicator 91 | ![](img/ma_histogram_community_share.png) 92 | 93 | After successfully installation the indicator is located at under Moving Averages --> MA Histogram 94 | 95 | ##### Example 96 | ![](img/ma_histogram.png) 97 | 98 | ## On Balance Volume & On Balance Volume Modified 99 | ##### [On Balance Volume](https://tlc.thinkorswim.com/center/reference/Tech-Indicators/studies-library/O-Q/OnBalanceVolume) 100 | On Balance Volume keeps a running total of volume flowing into or out of a security. When the security closes higher than the previous close, all of the day's volume is considered up-volume. A close lower than the previous day's results in all of the day's volume considered down-volume. A rising OBV is defined as a sign of smart money flowing into a security. As the public then moves into the security, both the security and the OBV will surge ahead. If the price movement precedes the OBV movement, it is called a "non-confirmation." Non-confirmations tend to occur at bull market tops or at bear market bottoms. 101 | 102 | When the security's price closes up, the day's OBV is created by adding the day's volume to the cumulative total. The day's volume is subtracted from the cumulative total when the price closes down. 103 | 104 | ##### [On Balance Volume Modified](https://tlc.thinkorswim.com/center/reference/Tech-Indicators/studies-library/O-Q/OnBalanceVolumeModified) 105 | The OnBalanceVolumeModified (OBVM) study is a technical indicator introduced by Vitali Apirine. It is a variation of OnBalanceVolume (OBV). In the modified version, OBV is given a smoothing (by an exponential moving average, by default). In addition, a signal line is introduced. The signal line is a slower moving average of the smoothed-out OBV. 106 | 107 | When the main line of the OBVM is rising, the volume might be gaining positive pressure, which may further result in an increase of the price. Conversely, decreasing OBVM may signify decreasing volume pressure and a further price reduction. 108 | 109 | The main line can also be analyzed in terms of divergences from the main price plot. The signal line can be used to identify crossovers. 110 | 111 | ##### How to install 112 | Indicator -> Explore Community Indicator 113 | ![](img/on_balance_volume_community_share.png) 114 | 115 | After successfully installation the indicator is located at under Volume-based --> On Balance Volume/On Balance Volume Modified 116 | 117 | ##### Example 118 | ![](img/on_balance_volume.png) --------------------------------------------------------------------------------