This tutorial expands on the AutoTrader functionality introduced in Tutorial 5 and adds an live charting and an indicator to decide when to enter into a position. This is basically a very crude replication of an "Expert Advisor" in MetaTrader, or a strategy in MultiCharts. The basic idea is to take any instrument, plot a indicator on it's candle stick chart, start tracking it with every price update, and send trades automatically when certain conditions are met.
We will reuse the Bollinger Band live chart built in Tutorial 6.1 because it's a great indicator for visual representation and will clearly show us when the current instrument price breaks through one of the bands. The trading rule implemented in this sheet is:
- Start 'from 0' without any open positions.
- When the current price of the instrument breaks into the Bollinger Bands for above, go short. Trade amount is predefined.
- Keep the short position active until the price breaks out on the low side. Close position.
- When the price breaks back into the band from below, go long and keep the position until it hits the top of the band again.
This way, the strategy attempts to profit from small fluctuations in and out of the Bollinger Band. The spreadsheet logs all actions from the Bollinger Band analysis and reports when it goes long/short:
VBA implementation
This auto trader requires quite a bit of VBA, although most of it has been covered before in Tutorial 5 and 6.1.
The new functionality specific to this sheet concerns the logic to compute whether the price has broken in or out of the Bollinger Bands, as shown below.
Private Sub CheckTradeState()
If [pricest] <> "Breakout Low" And [curp] < [boll] Then
[pricest] = "Breakout Low"
If [pos] = "Short" Then
Call CloseShort
End If
End If
If [pricest] <> "Breakout High" And [curp] > [bolh] Then
[pricest] = "Breakout High"
If [pos] = "Long" Then
Call CloseLong
End If
End If
If [pricest] = "Breakout Low" And [curp] > [boll] Then
[pricest] = "Re-entry Low"
If [pos] = "None" Then
Call EnterLong
End If
End If
If [pricest] = "Breakout High" And [curp] < [bolh] Then
[pricest] = "Re-entry High"
If [pos] = "None" Then
Call EnterShort
End If
End If
If Range("B" & logcounter - 1) <> [pricest] Then
Call WriteLog
End If
End Sub
Additionally, a lot of VBA is included to automatically update the chart and align the price markers:
'load data into chart
ActiveSheet.ChartObjects("CandleChart").Activate
ActiveChart.SetSourceData Source:=chartdata
'some complex calls to format the data labels after each refresh
ActiveChart.FullSeriesCollection(5).DataLabels.Delete
ActiveChart.FullSeriesCollection(5).Points(dmax).ApplyDataLabels
ActiveChart.FullSeriesCollection(5).Points(dmax).DataLabel.Select
Selection.Left = ActiveChart.FullSeriesCollection(5).Points(dmax).DataLabel.Left + 70
Selection.Format.TextFrame2.TextRange.Font.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground1
ActiveChart.FullSeriesCollection(5).Points(dmax).DataLabel.Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent1
ActiveChart.FullSeriesCollection(7).DataLabels.Delete
ActiveChart.FullSeriesCollection(7).Points(dmax).ApplyDataLabels
ActiveChart.FullSeriesCollection(7).Points(dmax).DataLabel.Select
Selection.Left = ActiveChart.FullSeriesCollection(7).Points(dmax).DataLabel.Left + 30
Selection.Format.TextFrame2.TextRange.Font.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground1
ActiveChart.FullSeriesCollection(7).Points(dmax).DataLabel.Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent2
ActiveChart.FullSeriesCollection(8).DataLabels.Delete
ActiveChart.FullSeriesCollection(8).Points(dmax).ApplyDataLabels
ActiveChart.FullSeriesCollection(8).Points(dmax).DataLabel.Select
Selection.Left = ActiveChart.FullSeriesCollection(8).Points(dmax).DataLabel.Left + 30
Selection.Format.TextFrame2.TextRange.Font.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground1
ActiveChart.FullSeriesCollection(8).Points(dmax).DataLabel.Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent6
