Skip to content

PositiveVolumeIndex

Summary

The positive volume index measures the trend of the stock prices for days when volume increases from previous day's volume.

Remarks

Assumes that the smart money is active on days when volume decreases (measured by the Negative Volume Index) and the not-so-smart money is active on days when volume increases.

Signature

1
public abstract interface PositiveVolumeIndex

Namespace

cAlgo.API.Indicators

Examples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 private PositiveVolumeIndex _positiveVolume;
 [Parameter]
 public DataSeries Source { get; set; }
 [Output("Main")]
 public IndicatorDataSeries Result { get; set; }
 protected override void Initialize()
 {
    _positiveVolume = Indicators.PositiveVolumeIndex(Source);
 }
 public override void Calculate(int index)
 {
    // Display Result of Indicator
    Result[index] = _positiveVolume.Result[index];
 }
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 using cAlgo.API;
 using cAlgo.API.Indicators;
 namespace cAlgo.Robots
 {
     // This sample cBot shows how to use the Positive/Negative Volume Index indicators
     [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
     public class VolumeIndexSample : Robot
     {
         private double _volumeInUnits;
         private PositiveVolumeIndex _positiveVolumeIndex;
         private NegativeVolumeIndex _negativeVolumeIndex;
         private SimpleMovingAverage _simpleMovingAverage;
         [Parameter("Volume (Lots)", DefaultValue = 0.01)]
         public double VolumeInLots { get; set; }
         [Parameter("Stop Loss (Pips)", DefaultValue = 10)]
         public double StopLossInPips { get; set; }
         [Parameter("Take Profit (Pips)", DefaultValue = 10)]
         public double TakeProfitInPips { get; set; }
         [Parameter("Label", DefaultValue = "Sample")]
         public string Label { get; set; }
         public Position[] BotPositions
         {
             get
             {
                 return Positions.FindAll(Label);
             }
         }
         protected override void OnStart()
         {
             _volumeInUnits = Symbol.QuantityToVolumeInUnits(VolumeInLots);
             _positiveVolumeIndex = Indicators.PositiveVolumeIndex(Bars.ClosePrices);
             _negativeVolumeIndex = Indicators.NegativeVolumeIndex(Bars.ClosePrices);
             _simpleMovingAverage = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
         }
         protected override void OnBar()
         {
             if (Bars.ClosePrices.Last(1) > _simpleMovingAverage.Result.Last(1))
             {
                 ClosePositions(TradeType.Sell);
                 if (BotPositions.Length == 0 && _negativeVolumeIndex.Result.Last(1) > _positiveVolumeIndex.Result.Last(1))
                 {
                     ExecuteMarketOrder(TradeType.Buy, SymbolName, _volumeInUnits, Label, StopLossInPips, TakeProfitInPips);
                 }
             }
             else if (Bars.ClosePrices.Last(1) < _simpleMovingAverage.Result.Last(1))
             {
                 ClosePositions(TradeType.Buy);
                 if (BotPositions.Length == 0 && _negativeVolumeIndex.Result.Last(1) > _positiveVolumeIndex.Result.Last(1))
                 {
                     ExecuteMarketOrder(TradeType.Sell, SymbolName, _volumeInUnits, Label, StopLossInPips, TakeProfitInPips);
                 }
             }
         }
         private void ClosePositions(TradeType tradeType)
         {
             foreach (var position in BotPositions)
             {
                 if (position.TradeType != tradeType) continue;
                 ClosePosition(position);
             }
         }
     }
 }
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 import clr
 clr.AddReference("cAlgo.API")
 from cAlgo.API import *
 class Test():    
     def initialize(self):
         # Source is a parameter defined in C# file of indicator
         self.positiveVolumeIndex = api.Indicators.PositiveVolumeIndex(api.Source)
     def calculate(self, index):
         # Result is an indicator output defined in C# file of indicator
         # Display Result of Indicator
         api.Result[index] = self.positiveVolumeIndex.Result[index]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 import clr
 clr.AddReference("cAlgo.API")
 # Import cAlgo API types
 from cAlgo.API import *
 # Import trading wrapper functions
 from robot_wrapper import *
 class Test():
     def on_start(self):
         self.volumeInUnits = api.Symbol.QuantityToVolumeInUnits(api.VolumeInLots)
         self.positiveVolumeIndex = api.Indicators.PositiveVolumeIndex(api.Bars.ClosePrices)
         self.negativeVolumeIndex = api.Indicators.NegativeVolumeIndex(api.Bars.ClosePrices)
         self.simpleMovingAverage = api.Indicators.SimpleMovingAverage(api.Bars.ClosePrices, 20)
     def on_bar(self):
         if api.Bars.ClosePrices.Last(1) > self.simpleMovingAverage.Result.Last(1):
             self.close_positions(TradeType.Sell)
             if len(self.get_bot_positions()) == 0 and self.negativeVolumeIndex.Result.Last(1) > self.positiveVolumeIndex.Result.Last(1):
                 api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, self.volumeInUnits, api.Label, api.StopLossInPips, api.TakeProfitInPips)
         elif api.Bars.ClosePrices.Last(1) < self.simpleMovingAverage.Result.Last(1):
             self.close_positions(TradeType.Buy)
             if len(self.get_bot_positions()) == 0 and self.negativeVolumeIndex.Result.Last(1) > self.positiveVolumeIndex.Result.Last(1):
                 api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, self.volumeInUnits, api.Label, api.StopLossInPips, api.TakeProfitInPips)
     def get_bot_positions(self):
         return api.Positions.FindAll(api.Label)
     def close_positions(self, tradeType):
         for position in self.get_bot_positions():
             if position.TradeType != tradeType:
                 continue
             api.ClosePosition(position)

Properties

Result

Summary

Gets or sets the time series result of the Positive Volume Index indicator instance.

Signature

1
public abstract IndicatorDataSeries Result {get; set;}

Return Value

IndicatorDataSeries

Examples

1
2
3
4
5
 protected override void OnBar()
 {
     var currentValue = _positiveVolume.Result.LastValue;
     //...
 }
1
2
 def on_bar(self):
     currentValue = self.positiveVolumeIndex.Result.LastValue