March 29, 2011
Logging and displaying trades
In real trading it is desirable to use a persistent trade record so that trades for multiple sessions be analyzed using the Backtester. The easiest way to do this is to save the trades in a composite. The code shown below is a simplified version of what will be used in the TDash system, however, it can be used with any trading system. This code requires you set Preferences -> Intraday -> “Time of first tick inside bar” or “START time of interval”. Apply the code to an empty pane, start Bar-Replay, and open the Parameter window. After placing some trades you can send the code to the Backtester for analysis. You can perform the following actions:
I use small solid triangles for Buy and Sell signals, and hollow triangles for Short and Cover signals. This allows me to overlay the Buy and Cover signals, and the Sell and Short signals, to display trade reversals. The triangles are placed at the actual trading price (the Close in this example). This is what the arrows look like:
_SECTION_BEGIN( "USING A TRADE COMPOSITE" ); function DeleteComposite( CompositeName ) { global Ticker; oAB = CreateObject( "Broker.Application" ); oStocks = oAB.Stocks(); oStocks.Remove( CompositeName ); oAB.RefreshAll(); } function AddTradeToComposite( Ticker, Action, LMTPrice ) { global Ticker; BI = BarIndex(); LBI = LastValue( BI ); if ( Action != "" ) { SignalArray = Nz( Foreign( Ticker + "~SignalArrays", "V", False ) ); BuyPriceArray = Nz( Foreign( Ticker + "~SignalArrays", "O", False ) ); SellPriceArray = Nz( Foreign( Ticker + "~SignalArrays", "H", False ) ); ShortPriceArray = Nz( Foreign( Ticker + "~SignalArrays", "L", False ) ); CoverPriceArray = Nz( Foreign( Ticker + "~SignalArrays", "C", False ) ); switch ( Action ) { case "BUY": SignalArray[LBI] = SignalArray[LBI] | 1; BuyPriceArray[LBI] = LMTPrice; break; case "SELL": SignalArray[LBI] = SignalArray[LBI] | 2; SellPriceArray[LBI] = LMTPrice; break; case "SHORT": SignalArray[LBI] = SignalArray[LBI] | 4; ShortPriceArray[LBI] = LMTPrice; break; case "COVER": SignalArray[LBI] = SignalArray[LBI] | 8; CoverPriceArray[LBI] = LMTPrice; break; case "REVLONG": SignalArray[LBI] = SignalArray[LBI] | 8 | 1; CoverPriceArray[LBI] = BuyPriceArray[LBI] = LMTPrice; break; case "REVSHORT": SignalArray[LBI] = SignalArray[LBI] | 2 | 4; SellPriceArray[LBI] = ShortPriceArray[LBI] = LMTPrice; break; } AddToComposite( SignalArray, Ticker + "~SignalArrays", "V", 7 | atcFlagEnableInIndicator ); AddToComposite( BuyPriceArray, Ticker + "~SignalArrays", "O", 7 | atcFlagEnableInIndicator ); AddToComposite( SellPriceArray, Ticker + "~SignalArrays", "H", 7 | atcFlagEnableInIndicator ); AddToComposite( ShortPriceArray, Ticker + "~SignalArrays", "L", 7 | atcFlagEnableInIndicator ); AddToComposite( CoverPriceArray, Ticker + "~SignalArrays", "C", 7 | atcFlagEnableInIndicator ); } } Ticker = Name(); Action = ""; if ( ParamTrigger( "Buy", "BUY" ) ) Action = "BUY"; if ( ParamTrigger( "Sell", "SELL" ) ) Action = "SELL"; if ( ParamTrigger( "Short", "SHORT" ) ) Action = "SHORT"; if ( ParamTrigger( "Cover", "COVER" ) ) Action = "COVER"; if ( ParamTrigger( "Reverse to Long", "REVLONG" ) ) Action = "REVLONG"; if ( ParamTrigger( "Reverse to Short", "REVSHORT" ) ) Action = "REVSHORT"; if ( ParamTrigger( "Delete Signal Compoiste", "DELETE" ) ) DeleteComposite( Ticker + "~SignalArrays" ); AddTradeToComposite( Ticker, Action, LastValue( Close ) ); RequestTimedRefresh( 0.1 ); if ( SetForeign( Ticker + "~SignalArrays" ) ) { SignalArray = Nz( Foreign( Ticker + "~SignalArrays", "V", False ) ); Buy = IIf( SignalArray & 1, 1, 0 ); Sell = IIf( SignalArray & 2, 1, 0 ); Short = IIf( SignalArray & 4, 1, 0 ); Cover = IIf( SignalArray & 8, 1, 0 ); BuyPrice = Nz( Foreign( Ticker + "~SignalArrays", "O" ) ); SellPrice = Nz( Foreign( Ticker + "~SignalArrays", "H" ) ); ShortPrice = Nz( Foreign( Ticker + "~SignalArrays", "L" ) ); CoverPrice = Nz( Foreign( Ticker + "~SignalArrays", "C" ) ); PlotShapes( IIf( Buy, shapeSmallUpTriangle, shapeNone ), 5, 0, BuyPrice, 0 ); PlotShapes( IIf( Sell, shapeSmallDownTriangle, shapeNone ), 4, 0, SellPrice, 0 ); PlotShapes( IIf( Short, shapeHollowDownTriangle, shapeNone ), 4, 0, ShortPrice, 0 ); PlotShapes( IIf( Cover, shapeHollowUpTriangle, shapeNone ), 5, 0, CoverPrice, 0 ); } RestorePriceArrays(); Plot( C, "", 1, 128 ); _SECTION_END();
Filed by Herman at 7:26 pm under Developing a RT Trading Dashboard
Comments Off on Logging and displaying trades