Many strategies, such as grid traders or systems with multiple algorithms, often hold opposite positions of the same asset. This
violates the NFA and FIFO compliance required by international brokers and
can cause rejection of orders. Even if orders are accepted, holding long and
short positions simultaneously increases risk, margin, and trading costs. It is
always preferable to close an open position, rather
than opening a new position in opposite direction.
Therefore scripts should take care of NFA and FIFO compliant
trading, i.e. close first opened positions first, and avoid concurrent long
and short positions. This can require lengthy and awkward coding when
several algorithms trade with the same assets. The virtual hedging
mechanism of Zorro S guarantees FIFO compliant closing of trades and prevents positions in opposite directions, even with complex portfolio
systems. This happens in a completely transparent way; the script needs no
special code and can arbitrarily open and close positions.
The virtual hedging mechanism uses two layers of trades, phantom trades and
pool trades. The pool trades hold the net amount of the phantom trades. The strategy script only handles the phantom trades, while the broker only receives
orders for the pool trades. Pool trades are opened or closed when phantom trades open or close, but not necessarily in that order. Phantom trades can be open in both directions at the same time, but
the resulting pool trades
are only open in one direction per asset, either short or long.
Systems with virtual hedging are almost always* superior to systems with 'real
hedging' that hold opposite positions. Aside from NFA and FIFO compliance,
virtual hedging systems achieve higher profit due to reduced transaction costs,
need less capital due to lower margin requirements, and have lower risk because trades are closed earlier
and less exposed to the market. Some brokers, such as Oanda,
apply virtual hedging automatically to all trades. For brokers that don't,
activate virtual hedging by setting the Hedge variable (see
below) to 5. All trades are then entered in phantom
mode. When the net amount - the difference of long and short open lots -
changes, Zorro automatically opens or closes pool trades in a way that FIFO
order is observed and market exposure is minimized.
Example: several long positions are open with a
total amount of 100 lots. Now a short trade of 40 lots is entered. The net
amount is now 60 lots (100 long lots minus 40 short lots). Zorro closes the oldest long pool trades fully or partially until the sum of open positions is at 60 lots.
If partial closing is not supported, the oldest long pool trades are fully closed until the remaining position is at or below 60 lots. If it's less than 60 lots, a new long pool trade is opened at the difference. In both cases the net amount ends up at exactly 60 lots.
Virtual hedging affects system performance parameters.
The equity curves of a system with
or without virtual hedging are rather similar, but the number of trades, the profit factor, the win rate, and the average trade duration can be very different.
Examples of the same grid trading system without and with virtual hedging:
EUR/CHF grid trader, real hedging, 402 trades, avg duration
14 weeks, win rate 95%, profit factor
total profit $15900
EUR/CHF grid trader, virtual hedging, 261 trades, avg duration
2 weeks, win rate 65%,
profit factor 3, total profit $16300
* Only exception: Systems that exploit rollover / swap arbitrage must hold
'real' opposite positions.
Hedging behavior; determines how simultaneous long and short positions with the same asset are handled.
0 = no hedging; automatically closes opposite positions with the same asset when a new position is opened (NFA
compliant; default for
1 = hedging across algos; automatically closes opposite positions with the same algo when a new position is opened (not
NFA compliant in multi-algo systems; default for non-NFA accounts).
2 = full hedging; long and short positions even with the same algo
can be open at the same time (not NFA compliant).
4 = virtual hedging without partial closing (NFA and FIFO
compliant). Enters long and short positions simultaneously, but sends only the net amount to the broker
(Zorro S required).
5 = virtual hedging with partial closing (NFA and FIFO
compliant). Open positions are partially closed to match the net amount (Zorro
- Virtual hedging is used in [Test] and [Trade] mode only. The performance statistics (Long/Short/Total) are
generated from the pool trades, not from the phantom trades. Only exception is NumPendingTotal,
which is affected by pending phantom trades (pool trades are never pending).
Phantom trades can also be manually entered for "equity curve trading"; those trades contribute to the Long/Short statistics, but do not trigger pool trades.
- Hedge = 5 is preferable to Hedge = 4 since it opens
fewer trades and thus causes less transaction costs. Hedge = 4 is
only required when partial closing is not supported by the broker or account. This is often
not documented, but you can find out with the
TradeTest script. Start a session, set Lots to 10, open a
position, then set Lots to 5 and close the position. If this fails, your
account does not support partial closing.
- All modes with Hedge >= 2 enable full hedging and thus don't
automatically close opposite positions. If this is required, do it by script.
- Dependent on open trades, closing a phantom trade can cause closing of several pool trades and/or opening of a new pool trade, especially in Hedge = 4 mode. A phantom trade can close with a loss and the subsequent pool trade with a win, or vice versa.
This is a perfectly normal consequence of virtual hedging and not a bug.
- Hedging is prohibited for US based accounts due to NFA Compliance Rule 2-43(b). Such accounts
normally require the NFA flag and
either virtual or no hedging. The NFA flag does not affect phantom trades, which can be simultaneously open in both directions.
- Pool trades have no profit target and no TMF, but - for protection against large price shocks - a very distant stop loss at about 25% difference to the current price. They are normally only controlled by opening and closing phantom trades. However they appear in trade enumeration loops and can be identified by TradeIsPool.
- The number of open net lots of pool and phantom trades can be evaluated with the LotsPool and LotsPhantom variables. They can get temporarily out of sync when pool trades are externally or manually closed. In that case the difference remains until the next phantom trade with the same asset synchronizes the variables again. When Lots is 0 and no phantom trades are opened or closed, pool trades won't be opened even when LotsPool and LotsPhantom are different.
- Pool trades that were rejected by the broker will be re-entered at every bar until LotsPool and LotsPhantom are in sync again.
- In virtual hedging mode, the result window displays only open pool trades and pending phantom trades. When algo identifiers are used, pool trades are displayed either with the identifier of the triggering trade, or with a "NET" identifier.
Hedge = 5; // virtual hedging in trade mode
Hedge = 2; // full hedging in test mode
NFA, enterLong/Short, LotsPool,
► latest version online