Skip to content

PositiveVolumeIndex

interface cAlgo.API.Indicators

DesktopCLICloud

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

Definition

public interface PositiveVolumeIndex

Namespace: cAlgo.API.Indicators · Group: Indicators · Implements: StandardIndicator

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.

Examples

Example 1

private PositiveVolumeIndex _positiveVolume;

protected override void Initialize()
{
   _positiveVolume = Indicators.PositiveVolumeIndex(Source);
}
public override void Calculate(int index)
{
   // Display Result of Indicator
   Result[index] = _positiveVolume.Result[index];
}
import clr
clr.AddReference("cAlgo.API")

from cAlgo.API import *

class Test():
    def initialize(self):
        self.positiveVolumeIndex = api.Indicators.PositiveVolumeIndex(api.Source)

    def calculate(self, index):
        api.Result[index] = self.positiveVolumeIndex.Result[index]
{
  "Parameters": [
    {
      "Name": "Source",
      "Type": "DataSeries"
    }
  ],
  "LineOutputs": [
    {
      "Name": "Result",
      "DisplayName": "Main"
    }
  ]
}

Example 2

using cAlgo.API;
using cAlgo.API.Indicators;

namespace cAlgo.Robots
{
    // This sample cBot shows how to use the Positive/Negative Volume Index indicators
    public partial class VolumeIndexSample : Robot
    {
        private double _volumeInUnits;

        private PositiveVolumeIndex _positiveVolumeIndex;
        private NegativeVolumeIndex _negativeVolumeIndex;

        private SimpleMovingAverage _simpleMovingAverage;

        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);
            }
        }
    }
}
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)
{
  "AccessRights": "None",
  "TimeZone": "UTC",
  "Parameters": [
    {
      "Name": "VolumeInLots",
      "DisplayName": "Volume (Lots)",
      "Type": "Double",
      "DefaultValue": 0.01
    },
    {
      "Name": "StopLossInPips",
      "DisplayName": "Stop Loss (Pips)",
      "Type": "Double",
      "DefaultValue": 10
    },
    {
      "Name": "TakeProfitInPips",
      "DisplayName": "Take Profit (Pips)",
      "Type": "Double",
      "DefaultValue": 10
    },
    {
      "Name": "Label",
      "Type": "String",
      "DefaultValue": "Sample"
    }
  ]
}

Properties

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

Inherited members

From StandardIndicator: AddToChart, Symbol, TimeFrame, Bars