how to do it in tradestation is explained in this book-
http://www.amazon.com/exec/obidos/A...5644552/sr=2-2/ref=sr_2_2/104-7601826-8989532
here code for this system from book above-
{ AcmePSystem
P266
Signal
Acme P System: Pairs Trading
Requirements
------------
Data1: Stock 1 Intraday
Data2: Stock 2 Intraday
Data3: Stock 1 Daily (hidden)
Data4: Stock 2 Daily (hidden)}
Inputs:
Price1(Close of Data3),
Price2(Close of Data4),
StandardDeviations(1.5),
Length(30),
{Position Sizing Parameters}
Equity(100000),
RiskModel(3),
RiskPercent(2.0),
RiskATR(1.0),
{Trade Logging}
LogTrades(False),
LogFile("Orders.txt");
Variables:
N(0),
HV1(0.0),
HV2(0.0),
CV(0.0),
VolatilityBand(0.0),
VolatilityConstant(0.0523),
UpperBand(0.0),
LowerBand(0.0),
Spread(0.0);
If Date <> Date[1] Then Begin
N = AcmeGetShares(Equity, RiskModel, RiskPercent, RiskATR)
of Data3;
HV1 = AcmeVolatility(Length) of Data3;
HV2 = AcmeVolatility(Length) of Data4;
CV = Correlation(Price1, Price2, Length);
VolatilityBand = VolatilityConstant * (HV1 + HV2) * (1 - CV);
UpperBand = StandardDeviations * VolatilityBand;
LowerBand = StandardDeviations * (-VolatilityBand);
End;
Spread = (Close of Data1 / Price1) - (close of Data2 / Price2);
If Spread crosses above LowerBand Then
Buy("Acme P LE") N Shares This Bar on Close;
If Spread crosses above 0 Then
Sell("Acme P LX +") This Bar on Close
Else If Spread <= StandardDeviations * LowerBand Then
Sell("Acme P LX -") This Bar on Close;
If Spread crosses below UpperBand Then
Sell("Acme P SE") N Shares This Bar on Close;
If Spread crosses below 0 Then
ExitShort("Acme P SX +") This Bar on Close
Else If Spread >= StandardDeviations * UpperBand Then
ExitShort("Acme P SX -") This Bar on Close;
{Log Trades for Spreadsheet Export}
Condition1 = AcmeLogTrades(LogTrades, LogFile, "P");
{***********************************************
Acme Trade Manager: Set Stops and Profit targets
**********************************************}
Inputs:
SystemID(""),
{Position Management Parameters}
ExitFactor(0.25),
StopBars(1),
ProfitTarget(True),
ProfitFactor(0.9),
HoldBars(5),
DrawTargets(True),
{Trade Logging}
LogTrades(False),
LogFile("Orders.txt");
Variables:
ATR(0.0),
ATRLength(20),
ATRFactor(0.0),
ProfitBars(0),
SellStop(0.0),
SellTarget1(0.0),
SellTarget2(0.0),
CoverStop(0.0),
CoverTarget1(0.0),
CoverTarget2(0.0);
ATR=Volatility(ATRLength);
ATRFactor=ProfitFactor * ATR;
ProfitBars=IntPortion(HoldBars / 2)+1;
SellStop=Lowest(Low,StopBars)-(ExitFactor * ATR);
ExitLong("Acme LX-") Next Bar at SellStop Stop;
If ProfitTarget Then Begin
SellTarget1=High + ATRFactor;
ExitLong("Acme LX+") CurrentContracts / 2 Shares Next Bar at
SellTarget1 Limit;
SellTarget2=high[ProfitBars] + (2 * ATRFactor);
ExitLong("Acme LX++") CurrentContracts / 2 Shares Next Bar at
SellTarget2 Limit;
End;
If BarsSinceEntry >= HoldBars -1 Then
ExitLong("Acme LX") Next Bar on Open;
CoverStop = Highest(High, StopBars) + (ExitFactor * ATR);
ExitShort("Acme SX-") Next Bar at CoverStop Stop;
If ProfitTarget Then Begin
CoverTarget1=Low - ATRFactor;
ExitShort("Acme SX+") CurrentContracts / 2 Shares Next Bar at
CoverTarget1 Limit;
CoverTarget2 = Low[ProfitBars] - (2 * ATRFactor);
ExitShort("AcmeSX++") CurrentContracts / 2 Shares Next Bar at
CoverTarget2 Limit;
End;
If BarsSinceEntry >= HoldBars -1 Then
ExitShort("Acme SX") Next Bar on Open;
{Draw Exit Targets on the Chart}
If DrawTargets Then
If MArketPosition = 1 Then
Condition1 = AcmeExitTargets(SystemID,SellStop,SellTarget1,SellTarget2)
else if MarketPosition = -1 Then
Condition1 = AcmeExitTargets(SystemID,CoverStop,CoverTarget1,CoverTarget2);
{ Log Targets for Spreadsheet Export}
Condition1=AcmeLogTrades(LogTrades,LogFile,SystemID);
{**************************************
AcmeVolatility : Calculate the Annualized historic volatility
**************************************}
Inputs:
Length(Numeric);
Variables:
DaysInYear(365),
DaysInMonth(30),
DaysInWeek(7),
TimeFactor(0.0);
AcmeVolatility= 0;
If Close > 0 And Close[1] > 0 Then Begin
If DataCompression >=2 and DataCompression < 5 Then Begin
If DataCompression = 2 Then {Daily}
TimeFactor= DaysInYear
else if DataCompression = 3 Then {Weekly}
TimeFactor=DaysInYear / DaysInWeek
else if DataCompression = 4 Then {Monthly}
TimeFactor = DaysInYear / DaysInMonth;
AcmeVolatility=StdDev(Log(Close / Close[1]),Length) * SquareRoot(TimeFactor);
End;
End;
{***********************************************************
AcmeGetShares: Calculate number of shares based on risk model
RiskModel=1, Equal Value Risk Model
RiskModel=2, Percent Risk Model
RiskModel=3, Percent Volatility Model
************************************************************}
Inputs:
Equity(Numeric),
RiskModel(Numeric),
RiskPercent(numeric),
RiskUnits(Numeric);
Variables:
MinimumShares(200),
RiskShares(0),
ERP(0.0),
Length(20);
ERP=Equity * RiskPercent / 100;
If RiskModel=1 and Close >0 then
RiskShares=MaxList(MinimumShares,100 * IntPortion(Equity /(100 * Close)));
If RiskModel=2 and RiskUnits > 0 then
RiskShares=MaxList(MinimumShares,100 * IntPortion(ERP / (100 * RiskUnits)));
If RiskModel=3 and Volatility(Length) > 0 Then
RiskShares=MaxList(MinimumShares,100 * IntPortion(ERP / (100 * Volatility(Length))));
AcmeGetShares=RiskShares;
{********************************************
AcmeLogTrades : Log Trades into a file for import into a spreadsheet
********************************************}
Inputs:
LoggingOn(TrueFalse),
LogFileName(String),
SystemID(String);
Variables:
ADXLength(14),
Length(30),
TradeString("");
AcmeLogTrades = false;
If LoggingOn and Category = 2 Then Begin
{Log Closed Positions}
If BarsSinceExit(1) = 1 Then Begin
TradeString = GetSymbolName + "," +
NumToStr(EntryDate(1),0) + "," +
NumToStr(EntryPrice(1),3) + "," +
NumToStr(ExitDate(1),3) + "," +
NumToStr(ExitPrice(1),3) + "," +
NumToStr(PositionProfit(1),3) + "," +
NumToStr(ADX(ADXLength)[BarsSinceEntry(1)],0) + "," +
NumToStr(Volatility(Length)[BarsSinceEntry(1)],2) + "," +
NumToStr(AcmeVolatility(Length)[BarsSinceEntry(1)],3) +
"," + SystemID + NewLine;
FileAppend(LogFileName,TradeString);
End;
{Log Open Positions }
If LastBarOnChart and CurrentEntries > 0 Then Begin
TradeString = GetSymbolName + "," +
NumToStr(EntryDate(0),0) + "," +
NumToStr(EntryPrice(0),3) + "," +
NumToStr(Date,0) + "," +
NumToStr(Close,3) + "," +
NumToStr(ExitPrice(1),3) + "," +
NumToStr(OpenPositionProfit,3) + "," +
NumToStr(ADX(ADXLength)[BarsSinceEntry(0)],0) + "," +
NumToStr(Volatility(Length)[BarsSinceEntry(0)],2) + "," +
NumToStr(AcmeVolatility(Length)[BarsSinceEntry(0)],3) +
"," + SystemID + NewLine;
FileAppend(LogFileName,TradeString);
End;
AcmeLogTrades = True;
End;
http://www.amazon.com/exec/obidos/A...5644552/sr=2-2/ref=sr_2_2/104-7601826-8989532
here code for this system from book above-
{ AcmePSystem
P266
Signal
Acme P System: Pairs Trading
Requirements
------------
Data1: Stock 1 Intraday
Data2: Stock 2 Intraday
Data3: Stock 1 Daily (hidden)
Data4: Stock 2 Daily (hidden)}
Inputs:
Price1(Close of Data3),
Price2(Close of Data4),
StandardDeviations(1.5),
Length(30),
{Position Sizing Parameters}
Equity(100000),
RiskModel(3),
RiskPercent(2.0),
RiskATR(1.0),
{Trade Logging}
LogTrades(False),
LogFile("Orders.txt");
Variables:
N(0),
HV1(0.0),
HV2(0.0),
CV(0.0),
VolatilityBand(0.0),
VolatilityConstant(0.0523),
UpperBand(0.0),
LowerBand(0.0),
Spread(0.0);
If Date <> Date[1] Then Begin
N = AcmeGetShares(Equity, RiskModel, RiskPercent, RiskATR)
of Data3;
HV1 = AcmeVolatility(Length) of Data3;
HV2 = AcmeVolatility(Length) of Data4;
CV = Correlation(Price1, Price2, Length);
VolatilityBand = VolatilityConstant * (HV1 + HV2) * (1 - CV);
UpperBand = StandardDeviations * VolatilityBand;
LowerBand = StandardDeviations * (-VolatilityBand);
End;
Spread = (Close of Data1 / Price1) - (close of Data2 / Price2);
If Spread crosses above LowerBand Then
Buy("Acme P LE") N Shares This Bar on Close;
If Spread crosses above 0 Then
Sell("Acme P LX +") This Bar on Close
Else If Spread <= StandardDeviations * LowerBand Then
Sell("Acme P LX -") This Bar on Close;
If Spread crosses below UpperBand Then
Sell("Acme P SE") N Shares This Bar on Close;
If Spread crosses below 0 Then
ExitShort("Acme P SX +") This Bar on Close
Else If Spread >= StandardDeviations * UpperBand Then
ExitShort("Acme P SX -") This Bar on Close;
{Log Trades for Spreadsheet Export}
Condition1 = AcmeLogTrades(LogTrades, LogFile, "P");
{***********************************************
Acme Trade Manager: Set Stops and Profit targets
**********************************************}
Inputs:
SystemID(""),
{Position Management Parameters}
ExitFactor(0.25),
StopBars(1),
ProfitTarget(True),
ProfitFactor(0.9),
HoldBars(5),
DrawTargets(True),
{Trade Logging}
LogTrades(False),
LogFile("Orders.txt");
Variables:
ATR(0.0),
ATRLength(20),
ATRFactor(0.0),
ProfitBars(0),
SellStop(0.0),
SellTarget1(0.0),
SellTarget2(0.0),
CoverStop(0.0),
CoverTarget1(0.0),
CoverTarget2(0.0);
ATR=Volatility(ATRLength);
ATRFactor=ProfitFactor * ATR;
ProfitBars=IntPortion(HoldBars / 2)+1;
SellStop=Lowest(Low,StopBars)-(ExitFactor * ATR);
ExitLong("Acme LX-") Next Bar at SellStop Stop;
If ProfitTarget Then Begin
SellTarget1=High + ATRFactor;
ExitLong("Acme LX+") CurrentContracts / 2 Shares Next Bar at
SellTarget1 Limit;
SellTarget2=high[ProfitBars] + (2 * ATRFactor);
ExitLong("Acme LX++") CurrentContracts / 2 Shares Next Bar at
SellTarget2 Limit;
End;
If BarsSinceEntry >= HoldBars -1 Then
ExitLong("Acme LX") Next Bar on Open;
CoverStop = Highest(High, StopBars) + (ExitFactor * ATR);
ExitShort("Acme SX-") Next Bar at CoverStop Stop;
If ProfitTarget Then Begin
CoverTarget1=Low - ATRFactor;
ExitShort("Acme SX+") CurrentContracts / 2 Shares Next Bar at
CoverTarget1 Limit;
CoverTarget2 = Low[ProfitBars] - (2 * ATRFactor);
ExitShort("AcmeSX++") CurrentContracts / 2 Shares Next Bar at
CoverTarget2 Limit;
End;
If BarsSinceEntry >= HoldBars -1 Then
ExitShort("Acme SX") Next Bar on Open;
{Draw Exit Targets on the Chart}
If DrawTargets Then
If MArketPosition = 1 Then
Condition1 = AcmeExitTargets(SystemID,SellStop,SellTarget1,SellTarget2)
else if MarketPosition = -1 Then
Condition1 = AcmeExitTargets(SystemID,CoverStop,CoverTarget1,CoverTarget2);
{ Log Targets for Spreadsheet Export}
Condition1=AcmeLogTrades(LogTrades,LogFile,SystemID);
{**************************************
AcmeVolatility : Calculate the Annualized historic volatility
**************************************}
Inputs:
Length(Numeric);
Variables:
DaysInYear(365),
DaysInMonth(30),
DaysInWeek(7),
TimeFactor(0.0);
AcmeVolatility= 0;
If Close > 0 And Close[1] > 0 Then Begin
If DataCompression >=2 and DataCompression < 5 Then Begin
If DataCompression = 2 Then {Daily}
TimeFactor= DaysInYear
else if DataCompression = 3 Then {Weekly}
TimeFactor=DaysInYear / DaysInWeek
else if DataCompression = 4 Then {Monthly}
TimeFactor = DaysInYear / DaysInMonth;
AcmeVolatility=StdDev(Log(Close / Close[1]),Length) * SquareRoot(TimeFactor);
End;
End;
{***********************************************************
AcmeGetShares: Calculate number of shares based on risk model
RiskModel=1, Equal Value Risk Model
RiskModel=2, Percent Risk Model
RiskModel=3, Percent Volatility Model
************************************************************}
Inputs:
Equity(Numeric),
RiskModel(Numeric),
RiskPercent(numeric),
RiskUnits(Numeric);
Variables:
MinimumShares(200),
RiskShares(0),
ERP(0.0),
Length(20);
ERP=Equity * RiskPercent / 100;
If RiskModel=1 and Close >0 then
RiskShares=MaxList(MinimumShares,100 * IntPortion(Equity /(100 * Close)));
If RiskModel=2 and RiskUnits > 0 then
RiskShares=MaxList(MinimumShares,100 * IntPortion(ERP / (100 * RiskUnits)));
If RiskModel=3 and Volatility(Length) > 0 Then
RiskShares=MaxList(MinimumShares,100 * IntPortion(ERP / (100 * Volatility(Length))));
AcmeGetShares=RiskShares;
{********************************************
AcmeLogTrades : Log Trades into a file for import into a spreadsheet
********************************************}
Inputs:
LoggingOn(TrueFalse),
LogFileName(String),
SystemID(String);
Variables:
ADXLength(14),
Length(30),
TradeString("");
AcmeLogTrades = false;
If LoggingOn and Category = 2 Then Begin
{Log Closed Positions}
If BarsSinceExit(1) = 1 Then Begin
TradeString = GetSymbolName + "," +
NumToStr(EntryDate(1),0) + "," +
NumToStr(EntryPrice(1),3) + "," +
NumToStr(ExitDate(1),3) + "," +
NumToStr(ExitPrice(1),3) + "," +
NumToStr(PositionProfit(1),3) + "," +
NumToStr(ADX(ADXLength)[BarsSinceEntry(1)],0) + "," +
NumToStr(Volatility(Length)[BarsSinceEntry(1)],2) + "," +
NumToStr(AcmeVolatility(Length)[BarsSinceEntry(1)],3) +
"," + SystemID + NewLine;
FileAppend(LogFileName,TradeString);
End;
{Log Open Positions }
If LastBarOnChart and CurrentEntries > 0 Then Begin
TradeString = GetSymbolName + "," +
NumToStr(EntryDate(0),0) + "," +
NumToStr(EntryPrice(0),3) + "," +
NumToStr(Date,0) + "," +
NumToStr(Close,3) + "," +
NumToStr(ExitPrice(1),3) + "," +
NumToStr(OpenPositionProfit,3) + "," +
NumToStr(ADX(ADXLength)[BarsSinceEntry(0)],0) + "," +
NumToStr(Volatility(Length)[BarsSinceEntry(0)],2) + "," +
NumToStr(AcmeVolatility(Length)[BarsSinceEntry(0)],3) +
"," + SystemID + NewLine;
FileAppend(LogFileName,TradeString);
End;
AcmeLogTrades = True;
End;