Thursday, September 09, 2010

Price Channel Support / Resistance [PCSR]

Descripton
Summary:
This trading system script uses Price Channel indicators to generate trading signals whenever an underlying indicator touches the channel.

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_PCLKeysUse for holding all of the PCL indicator keys indexed by symbol index.
IntegerArray_PCUKeysUse for holding all of the PCU indicator keys indexed by symbol index.
Number_hitDistanceUse for indicating the percentage distance from which the specified indicator is considered near one of the bands.
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
IndicatorindicatorKeyUse for the underlying indicator key on which to calculate the Price Channel indicators.
IntegerperiodsUse for the number of periods in the Price Channel calculations. [Default 6]
NumberhitDistanceUse for indicating the percentage distance from which the specified indicator is considered near one of the channels. [Default 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 specified indicator keys, indexed by symbol index.
	Redefine _indicatorKeys(SymbolCount() - 1)
	 ' Use for holding the PCL indicator keys based on the specified indicator key, indexed by symbol index.
	Redefine _PCLKeys(SymbolCount() - 1)
	 ' Use for holding the PCU indicator keys based on the specified indicator key, indexed by symbol index.
	Redefine _PCUKeys(SymbolCount() - 1)
	 ' Iterate over all of the account symbols.
	For i As Integer = 0 To SymbolCount() - 1
		 ' Create an indicator for each account symbol, based on the specified indicator.
		_indicatorKeys(i) = IndicatorCopy(indicatorKey, i)
		 ' Create a PCL indicator for each account symbol, based on the specified indicator.
		_PCLKeys(i) = IndicatorPCL(i, periods)
		 ' Create a PCU indicator for each account symbol, based on the specified indicator.
		_PCUKeys(i) = IndicatorPCU(i, periods)
		 ' Add the indicators to the symbol chart.
		ChartIndicator(i, 0, C_MERGE_LEFT, _indicatorKeys(i),C_LINE, 1,0)
		ChartIndicator(i, 0, C_MERGE_LEFT, _PCLKeys(i),C_LINE, 1,1)
		ChartIndicator(i, 0, C_MERGE_LEFT, _PCUKeys(i),C_LINE, 1,1)
	Next

OnSymbolBar
Function Parameters
TypeIdentifierDescription
IntegersymbolIndex
Implementation
	 ' Get the indicator value for the specified symbol index.
	Define value As Number = IndicatorValue(_indicatorKeys(symbolIndex))
	 ' Get the PCU indicator value for the specified symbol index.
	Define PCU As Number = IndicatorValue(_PCUKeys(symbolIndex))
	 ' Get the PCL indicator value for the specified symbol index.
	Define PCL As Number = IndicatorValue(_PCLKeys(symbolIndex))
	 ' Calculate the percentage distance between the PCL and the underlying indicator.
	Define PCLDistance As Number = 100 * (value - PCL) / PCL
	 ' Calculate the percentage distance between the PCU and the underlying indicator.
	Define PCUDistance As Number = 100 * (PCU - value) / value
	 ' If the indicator value is near the lower band.
	If (PCLDistance > 0 And PCLDistance < _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 indicator value is near the upper band.
	ElseIf (PCUDistance > 0 And PCUDistance < _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.