Skip to content

HullMovingAverage

interface cAlgo.API.Indicators

DesktopCLICloud

The Hull Moving Average (HMA) is a directional trend indicator. It captures the current state of the market and uses recent price action to determine if conditions are bullish or bearish relative to historical data.

Definition

public interface HullMovingAverage

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

Examples

Example 1

var hullMovingAverage = Indicators.HullMovingAverage(Bars.ClosePrices, 9);
Print("Hull Moving Average: {0}", hullMovingAverage.Result.Last(1));
hullMovingAverage = api.Indicators.HullMovingAverage(api.Bars.ClosePrices, 9)
api.Print(f"Hull Moving Average: {hullMovingAverage.Result.Last(1)}")

Example 2

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

namespace cAlgo.Robots
{
    // This sample cBot shows how to use the Hull Moving Average indicator
    public partial class HullMovingAverageSample : Robot
    {
        private double _volumeInUnits;

        private HullMovingAverage _fastHull;

        private HullMovingAverage _slowHull;

        public Position[] BotPositions
        {
            get
            {
                return Positions.FindAll(Label);
            }
        }

        protected override void OnStart()
        {
            _volumeInUnits = Symbol.QuantityToVolumeInUnits(VolumeInLots);

            _fastHull = Indicators.HullMovingAverage(FastMaSource, FastMaPeriod);
            _slowHull = Indicators.HullMovingAverage(SlowMaSource, SlowMaPeriod);
        }

        protected override void OnBar()
        {
            if (_fastHull.Result.HasCrossedAbove(_slowHull.Result, 0))
            {
                ClosePositions(TradeType.Sell);

                ExecuteMarketOrder(TradeType.Buy, SymbolName, _volumeInUnits, Label, StopLossInPips, TakeProfitInPips);
            }
            else if (_fastHull.Result.HasCrossedBelow(_slowHull.Result, 0))
            {
                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);
            }
        }
    }
}
import clr

clr.AddReference("cAlgo.API")

# Import cAlgo API types
from cAlgo.API import *

# Import trading wrapper functions
from robot_wrapper import *

class HullMovingAverageSample():
    def on_start(self):
        self.volumeInUnits = api.Symbol.QuantityToVolumeInUnits(api.VolumeInLots)
        self.fastHull = api.Indicators.HullMovingAverage(api.FastMaSource, api.FastMaPeriod)
        self.slowHull = api.Indicators.HullMovingAverage(api.SlowMaSource, api.SlowMaPeriod)

    def on_bar_closed(self):
        if Functions.HasCrossedAbove(self.fastHull.Result, self.slowHull.Result, 0):
            self.close_positions(TradeType.Sell)
            api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, self.volumeInUnits, api.Label, api.StopLossInPips, api.TakeProfitInPips)
        elif Functions.HasCrossedBelow(self.fastHull.Result, self.slowHull.Result, 0):
            self.close_positions(TradeType.Buy)
            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": "FastMaSource",
      "DisplayName": "Source",
      "Type": "DataSeries",
      "Group": "Fast MA"
    },
    {
      "Name": "FastMaPeriod",
      "DisplayName": "Period",
      "Type": "Integer",
      "DefaultValue": 9,
      "Group": "Fast MA"
    },
    {
      "Name": "SlowMaSource",
      "DisplayName": "Source",
      "Type": "DataSeries",
      "Group": "Slow MA"
    },
    {
      "Name": "SlowMaPeriod",
      "DisplayName": "Period",
      "Type": "Integer",
      "DefaultValue": 20,
      "Group": "Slow MA"
    },
    {
      "Name": "VolumeInLots",
      "DisplayName": "Volume (Lots)",
      "Type": "Double",
      "DefaultValue": 0.01,
      "Group": "Trade"
    },
    {
      "Name": "StopLossInPips",
      "DisplayName": "Stop Loss (Pips)",
      "Type": "Double",
      "DefaultValue": 10,
      "Group": "Trade"
    },
    {
      "Name": "TakeProfitInPips",
      "DisplayName": "Take Profit (Pips)",
      "Type": "Double",
      "DefaultValue": 10,
      "Group": "Trade"
    },
    {
      "Name": "Label",
      "Type": "String",
      "DefaultValue": "Sample",
      "Group": "Trade"
    }
  ]
}

Inherited members

From MovingAverage: Result

From StandardIndicator: AddToChart, Symbol, TimeFrame, Bars