Tuesday, September 07, 2010

Absolute Price Oscillator Crossovers [APOS]

Descripton
Summary:
This trading system script uses an Absolute Price Oscillator indicator to generate trading signals whenever the oscillator crosses above or below zero.

Rules:
1. Buy Market - When the Absolute Price Oscillator crosses over zero.
2. Sell Market - When the Absolute Price Oscillator crosses under zero.
3. Sell Short Market -  When the Absolute Price Oscillator crosses under zero.
4. Buy To Cover Market - When the Absolute Price Oscillator crosses over zero.


Variables
TypeIdentifierDescription
IntegerArray_APOKeysUse for holding all of the APO indicator keys indexed by symbol index.
Boolean_enableShortingUse for indicating whether to enable the trading system script to short symbols.
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 Absolute Price Oscillator indicator.
IntegershortPeriodsUse for the number of periods in the short / fast exponential moving average used to calculate the Absolute Price Oscillator indicator. [Default 10]
IntegerlongPeriodsUse for the number of periods in the long / slow exponential moving average used to calculate the Absolute Price Oscillator indicator. [Default 20]
IntegerfirstPeriodsUse for the number of periods to include in the calculation of the first value of the exponential moving averages used by the Absolute Price Oscillator indicator. [Default 0]
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.
	_enableShorting = enableShorting
	_stopLoss = stopLoss
	_takeProfit = takeProfit
	_trailingStop = trailingStop
	_isPercent = isPercent
	
	 ' Use for holding indicator keys based on the specified indicator key, indexed by symbol index.
	Redefine _APOKeys(SymbolCount() - 1)
	 ' Iterate over all of the account symbols.
	For i As Integer = 0 To SymbolCount() - 1
		 ' Create an APO indicator for each account symbol, based on the specified indicator.
		_APOKeys(i) = IndicatorAPO(IndicatorCopy(indicatorKey, i),shortPeriods, longPeriods, firstPeriods)
		 ' Add the indicator to the symbol chart.
		ChartIndicator(i, 0, C_MERGE_LEFT, _APOKeys(i),C_LINE, 1,0)
	Next

OnSymbolBar
Function Parameters
TypeIdentifierDescription
IntegersymbolIndex
Implementation
	 ' Get the indicator value for the specified symbol index.
	Define values() As Number = IndicatorValues(_APOKeys(symbolIndex),0, 2)
	
	 ' If the indicator value crosses over zero, generate a buy order.
	If (values(0) > 0 And values(1) < 0) 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 sell market order.
			BrokerMarket(C_BUY_TO_COVER,symbolIndex, 0, C_DAY, "Positive crossover.")
		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, "Positive crossover.")
			 ' 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 crosses under zero, generate a sell order.
	ElseIf (values(0) < 0 And values(1) > 0) 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, "Negative crossover.")
		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, "Negative crossover.")
			 ' 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.