Thursday, September 09, 2010

Donchian Channels Support / Resistance [DCSR]

Descripton
Summary:
This trading system script uses Donchian Channels indicators to generate trading signals whenever an underlying indicator touches the channels.

Rules:
1. Buy Market - When the underlying indicator touces the lower channel.
2. Sell Market - When the underlying indicator touches the upper channel.
3. Sell Short Market - When the underlying indicator touches the upper channel.
4. Buy To Cover Market - When the underlying indicator touches the lower channel.


Variables
TypeIdentifierDescription
IntegerArray_indicatorKeysUse for holding all of the specified indicator keys indexed by symbol index.
IntegerArray_DCLKeysUse for holding all of the DCL indicator keys indexed by symbol index.
IntegerArray_DCUKeysUse for holding all of the DCU indicator keys indexed by symbol index.
Number_hitDistanceUse for indicating the percentage distance from which the specified indicator is considered near one of the channels.
Boolean_enableShortingUse for indicating whether to enable the trading system script to short symbols. [Default False]
Number_stopLossUse for the percent distance from the current price in which to place a stop order which would limit the maximum loss.
Number_takeProfitUse for the percent distance from the current price in which to place a limit order which would take profit after a specified gain.
Number_trailingStopUse for placing a trailing stop order which would limit the maximum trailing loss.
Boolean_isPercentUse for indicating whether the trailing stop is measured in percent or absolute value.

OnInitialize
Function Parameters
TypeIdentifierDescription
IntegerperiodsUse for the number of periods in the Donchian Channels calculations. [Default 10]
NumberhitDistanceUse for indicating the percentage distance from which the specified indicator is considered near one of the channels. [Default 0.2]
BooleanenableShortingUse for indicating whether to enable the trading system script to short symbols. [Default False]
NumberstopLossUse for the percent distance from the current price in which to place a stop order which would limit the maximum loss. [Default 0] (0 to ignore).
NumbertakeProfitUse for the percent distance from the current price in which to place a limit order which would take profit after a specified gain. [Default 0] (0 to ignore).
NumbertrailingStopUse for placing a trailing stop order which would limit the maximum trailing loss. [Default 0] (0 to ignore).
BooleanisPercentUse for indicating whether the trailing stop is measured in percent or absolute value. [Default True]
Implementation
	 ' Assign the script parameters to script variables.
	_hitDistance = hitDistance
	_enableShorting = enableShorting
	_stopLoss = stopLoss
	_takeProfit = takeProfit
	_trailingStop = trailingStop
	_isPercent = isPercent

	 ' Use for holding the DCL indicator keys based on the specified indicator key, indexed by symbol index.
	Redefine _DCLKeys(SymbolCount() - 1)
	 ' Use for holding the DCU indicator keys based on the specified indicator key, indexed by symbol index.
	Redefine _DCUKeys(SymbolCount() - 1)
	 ' Iterate over all of the account symbols.
	For i As Integer = 0 To SymbolCount() - 1
		 ' Create a DCL indicator for each account symbol, based on the specified indicator.
		_DCLKeys(i) = IndicatorDCL(i ,periods)
		 ' Create a DCU indicator for each account symbol, based on the specified indicator.
		_DCUKeys(i) = IndicatorDCU(i ,periods)
		 ' Add the indicators to the symbol chart.
		ChartIndicator(i, 0, C_MERGE_LEFT, _DCLKeys(i),C_LINE, 1,1)
		ChartIndicator(i, 0, C_MERGE_LEFT, _DCUKeys(i),C_LINE, 1,1)
	Next

OnSymbolBar
Function Parameters
TypeIdentifierDescription
IntegersymbolIndex
Implementation
	 ' Get the bar close value.
	Define value As Number = BarClose(symbolIndex)
	 ' Get the DCL indicator value for the specified symbol index.
	Define DCL As Number = IndicatorValue(_DCLKeys(symbolIndex))
	 ' Get the DCU indicator value for the specified symbol index.
	Define DCU As Number = IndicatorValue(_DCUKeys(symbolIndex))
	 ' Calculate the percentage distance between the DCL and the underlying indicator.
	Define DCLDistance As Number = 100 * (value - DCL) / DCL
	 ' Calculate the percentage distance between the DCU and the underlying indicator.
	Define DCUDistance As Number = 100 * (DCU - value) / value
	 ' If the bar close is near the lower channel.
	If (DCLDistance > 0 And DCLDistance < _hitDistance) Then
		 ' If a short position exists then generate a buy to cover order.
		If (_enableShorting And PositionExists(C_OPEN, symbolIndex, C_SHORT)) Then
			 ' Generate a buy to cover market order.
			BrokerMarket(C_BUY_TO_COVER,symbolIndex, 0, C_DAY, "Near lower channel.")
		End If
		 ' If no long open positions exist.
		If (Not PositionExists(C_OPEN, symbolIndex, C_LONG))
			 ' Generate a buy market order.
			Define orderIndex As Number = BrokerMarket(C_BUY,symbolIndex, 0, C_DAY, "Near lower channel.")
			 ' Set a stop loss on the order.
			BrokerSetStopLossPercent(orderIndex, _stopLoss, True)
			 ' Set a take profit on the order.
			BrokerSetTakeProfitPercent(orderIndex, _takeProfit, True)
			 ' Set a trailing stop loss on the order.
			BrokerSetTrailingStopLoss(orderIndex, _isPercent, _trailingStop)
		End If
	 ' If the bar close is near the upper channel.
	ElseIf (DCUDistance > 0 And DCUDistance < _hitDistance) Then
		 ' If a long open position exists.
		If (PositionExists(C_OPEN, symbolIndex, C_LONG))
			 ' Generate a sell market order.
			BrokerMarket(C_SELL,symbolIndex, 0, C_DAY, "Near upper channel.")
		End If
		 ' If no short open positions exist.
		If (_enableShorting And Not PositionExists(C_OPEN, symbolIndex, C_SHORT)) Then
			 ' Generate a sell short market order.
			Define orderIndex As Number = BrokerMarket(C_SELL_SHORT,symbolIndex, 0, C_DAY, "Near upper channel.")
			 ' Set a stop loss on the order.
			BrokerSetStopLossPercent(orderIndex, _stopLoss, True)
			 ' Set a take profit on the order.
			BrokerSetTakeProfitPercent(orderIndex, _takeProfit, True)
			 ' Set a trailing stop loss on the order.
			BrokerSetTrailingStopLoss(orderIndex, _isPercent, _trailingStop)
		End If
	End If
	
	

OnExchangeBar
Function Parameters
TypeIdentifierDescription
IntegerArraysymbolIndexes
Implementation

Copyright © 2010 IQBroker, LLC. All rights reserved.