VolumeOscillator


Summary

The Volume Oscillator identifies trends in volume using a two moving average system. A strong trend is signaled when it is positive. Falling volume indicates trend weakness.

Syntax

public interface VolumeOscillator

Members

NameTypeSummary
Result PropertyGets or sets the time series of the Volume Oscillator indicator.

Example 1

private VolumeOscillator _volumeOscillator;
[Parameter("Short Term", DefaultValue = 9)]
public int ShortTerm { get; set; }
[Parameter("Long Term", DefaultValue = 21)]
public int LongTerm { get; set; }
protected override void Initialize()
{
   _volumeOscillator = Indicators.VolumeOscillator(ShortTerm, LongTerm);
}
public override void Calculate(int index)
{
   // Display Result of Indicator
   Result[index] = _volumeOscillator.Result[index];
}

Example 2

using cAlgo.API;
using cAlgo.API.Indicators;
namespace cAlgo.Robots
{
    // This sample cBot shows how to use the Volume Oscillator indicator
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class VolumeOscillatorSample : Robot
    {
        private double _volumeInUnits;
        private VolumeOscillator _volumeOscillator;
        private SimpleMovingAverage _priceSimpleMovingAverage;
        private SimpleMovingAverage _volumeOscillatorSimpleMovingAverage;
        [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);
            _volumeOscillator = Indicators.VolumeOscillator(9, 21);
            _volumeOscillatorSimpleMovingAverage = Indicators.SimpleMovingAverage(_volumeOscillator.Result, 14);
            _priceSimpleMovingAverage = Indicators.SimpleMovingAverage(Bars.ClosePrices, 14);
        }
        protected override void OnBar()
        {
            if (_volumeOscillator.Result.Last(1) < _volumeOscillatorSimpleMovingAverage.Result.Last(1)) return;
            if (Bars.ClosePrices.Last(1) > _priceSimpleMovingAverage.Result.Last(1) && Bars.ClosePrices.Last(2) <= _priceSimpleMovingAverage.Result.Last(2))
            {
                ClosePositions(TradeType.Sell);
                ExecuteMarketOrder(TradeType.Buy, SymbolName, _volumeInUnits, Label, StopLossInPips, TakeProfitInPips);
            }
            else if (Bars.ClosePrices.Last(1) < _priceSimpleMovingAverage.Result.Last(1) && Bars.ClosePrices.Last(2) >= _priceSimpleMovingAverage.Result.Last(2))
            {
                ClosePositions(TradeType.Buy);
                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);
            }
        }
    }
}
Reference