Skip to main content

Algo Strategy — Footprint Imbalance

Demonstrates an Algo.Strategy that uses FootprintImbalanceSignal to detect footprint imbalances, with trading time windows, risk management, and a custom strategy subclass that tracks entry bar indices.

Source: [INSTALL PATH]/API/Samples/MZpackAlgoStrategy_Imbalance.cs Class: MZpackAlgoStrategy_Imbalance : MZpackStrategyBase

What It Covers

  • Custom AlgoStrategy_Imbalance subclass with OnPositionOpenFilter override
  • OnOrderUpdate tracking entry bar index
  • StrategyFootprintIndicator configured for imbalance detection
  • FootprintImbalanceSignal with MinCount and PartiallyVisibleMode
  • TradingTimes with two configurable windows
  • RiskManagement with daily loss, profit, and trades limits
  • Footprint visual customization (values brush, font)

Architecture

MZpackAlgoStrategy_Imbalance : MZpackStrategyBase
├── StrategyFootprintIndicator "Imbalance"
│ └── IsPartiallyVisible (configurable)
└── AlgoStrategy_Imbalance : Algo.Strategy
├── TradingTimes[] (two configurable windows)
├── RiskManagement (daily limits)
└── Entry Pattern (AND root, short-circuit)
└── FootprintImbalanceSignal "Imbalance"

Custom Strategy Subclass

The AlgoStrategy_Imbalance subclass overrides OnPositionOpenFilter and tracks the entry bar index via OnOrderUpdate:

class AlgoStrategy_Imbalance : MZpack.NT8.Algo.Strategy
{
int entryBarIdx = -1;

public AlgoStrategy_Imbalance(string name, MZpackAlgoStrategy_Imbalance strategy)
: base(name, strategy) { }

public override bool OnPositionOpenFilter(DateTime time)
{
return true; // No double entries logic available (commented out)
}

public override void OnOrderUpdate(Order order, OrderState orderState)
{
base.OnOrderUpdate(order, orderState);
if (orderState == OrderState.Filled && order.Name == ENTRY_NAME)
entryBarIdx = MZpackStrategy.CurrentBar;
}
}

Creating the Algo.Strategy

Trading times and risk management are configured on the strategy instance:

AlgoStrategy_Imbalance strategy = new AlgoStrategy_Imbalance(
@"MZpack Algo Strategy - Imbalance", this)
{
OppositePatternAction = OppositePatternAction.None,
LogLevel = LogLevel, LogTarget = LogTarget, LogTime = LogTime
};

if (Time1_Enable)
strategy.TradingTimes.Add(new TradingTime()
{ Begin = tryParseDateTime(Time1_Begin), End = tryParseDateTime(Time1_End) });

strategy.RiskManagement = new MZpack.NT8.Algo.RiskManagement(strategy)
{
Currency = Currency.UsDollar,
EntryName = ENTRY_NAME,
DailyLossLimitEnable = Risk_DailyLossLimit_Enable,
DailyLossLimit = Risk_DailyLossLimit,
DailyProfitLimitEnable = Risk_DailyProfitLimit_Enable,
DailyProfitLimit = Risk_DailyProfitLimit,
DailyTradesLimitEnable = Risk_DailyTradesLimit_Enable,
DailyTradesLimit = Risk_DailyTradesLimit
};

Footprint Indicator Setup

footprintIndicator = new StrategyFootprintIndicator(this, @"Imbalance")
{
ShowBarVolume = false,
ShowBarDelta = true,
ShowImbalance = true,
ImbalanceMarker = FootprintImbalanceMarker.Always,
ImbalanceHighlightValues = true,
ShowBarPOC = true,
ShowVersionInfo = false
};

Signal Setup

A single FootprintImbalanceSignal is added to an AND-root pattern:

pattern.Signals.Root.AddChild(new FootprintImbalanceSignal(Strategy, footprintIndicator)
{
Name = "Imbalance",
IsReset = true,
MinCount = Strategy_Footprint_BarImbalanceMinCount,
PartiallyVisibleMode = SignalPartiallyVisibleMode.OnPatternValidated
});

Strategy.Initialize(pattern, null, entries);

Configurable Properties

Strategy

PropertyDefaultDescription
Strategy_Footprint_TicksPerLevel1Ticks per level
Strategy_Footprint_ImbalancePercentage100Imbalance percentage
Strategy_Footprint_ImbalanceFilter1Imbalance volume filter
Strategy_Footprint_BarImbalanceMinCount1Min imbalances in bar

Position

PropertyDefaultDescription
Position_DirectionAnyAllowed direction
Position_Quantity2Contracts
Position_StopLoss18Stop loss ticks
Position_ProfitTarget35Profit target ticks
Position_IsBEfalseEnable breakeven
Position_IsTrailtrueEnable trailing
Position_TrailAfter20Trail after ticks
Position_TrailDistance10Trail distance ticks
Position_TrailStep2Trail step ticks

Trading Time

PropertyDefaultDescription
Time1_EnablefalseEnable first window
Time1_Begin"08:30:00"Start time
Time1_End"15:15:00"End time
Time2_EnablefalseEnable second window

Risk Management

PropertyDefaultDescription
Risk_DailyLossLimit_EnabletrueEnable daily loss limit
Risk_DailyLossLimit500Daily loss limit (USD)
Risk_DailyProfitLimit_EnabletrueEnable daily profit limit
Risk_DailyProfitLimit2500Daily profit limit (USD)
Risk_DailyTradesLimit_EnablefalseEnable daily trades limit
Risk_DailyTradesLimit5Max trades per day

Footprint

PropertyDefaultDescription
VisibleFootprintIndicatortrueShow footprint indicator
PartiallyVisibleFootprintIndicatorfalsePartially visible mode

See Also