hi,
I'm trying to test taking profits on a system using two standard contracts
(notional $1mn each contract), with an exit after 5 profitable 5 pips on the
first mn, then a trailing 10 pip stop thereafter.
I have a coding error somewhere, as long positions work fine but short
positions do not.
please help!
thx
Buy = Cross( MA( C, 10 ), MA( C, 50 ) );
Sell = 0;
short = Cross( MA( C, 50 ), MA( C, 10 ) );
Cover = 0;
FirstProfitTarget = 0.0005;
SecondProfitTarget = 0.0100;
TrailingStop = 0.0010;
priceatbuy = 0;
highsincebuy = 0;
priceatshort = 0;
lowsinceshort = 0;
exit = 0;
for ( i = 0; i < BarCount; i++ )
{
if ( priceatbuy == 0 AND Buy[ i ] )
{
priceatbuy = BuyPrice[ i ];
}
if ( priceatbuy > 0 )
{
highsincebuy = Max( High[ i ], highsincebuy );
if ( exit == 0 AND
High[ i ] >= FirstProfitTarget + priceatbuy )
{
// first profit target hit - scale-out
exit = 1;
Buy[ i ] = sigScaleOut;
}
if ( exit == 1 AND
High[ i ] >= SecondProfitTarget + priceatbuy )
{
// second profit target hit - exit
exit = 2;
SellPrice[ i ] = Max( Open[ i ], SecondProfitTarget + priceatbuy );
}
if ( Low[ i ] <= highsincebuy - TrailingStop )
{
// trailing stop hit - exit
exit = 3;
SellPrice[ i ] = Min( Open[ i ], highsincebuy - TrailingStop );
}
if ( exit >= 2 )
{
Buy[ i ] = 0;
Sell[ i ] = exit + 1; // mark appropriate exit code
exit = 0;
priceatbuy = 0; // reset price
highsincebuy = 0;
}
}
}
for ( i = 0; i < BarCount; i++ )
{
if ( priceatShort == 0 AND Short[ i ] )
{
priceatShort = ShortPrice[ i ];
}
if ( priceatShort < 0 )
{
lowsinceshort = Min( Low[ i ], lowsinceshort );
if ( exit == 0 AND
Low[ i ] <= -FirstProfitTarget + priceatShort )
{
// first profit target hit - scale-out
exit = 1;
Short[ i ] = sigScaleOut;
}
if ( exit == 1 AND
Low[ i ] <= -SecondProfitTarget + priceatShort )
{
// second profit target hit - exit
exit = 2;
SellPrice[ i ] = Min( Open[ i ], -SecondProfitTarget +
priceatShort );
}
if ( High[ i ] >= lowsinceshort + TrailingStop )
{
// trailing stop hit - exit
exit = 3;
SellPrice[ i ] = Max( Open[ i ], lowsinceshort + TrailingStop );
}
if ( exit >= 2 )
{
Short[ i ] = 0;
Cover[ i ] = exit + 1; // mark appropriate exit code
exit = 0;
priceatShort = 0; // reset price
lowsinceshort = 0;
}
}
}
SetPositionSize( 2, spsShares );
SetPositionSize( 50, spsPercentOfPosition * ( Buy == sigScaleOut ) ); // scale
out 50% of position
SetPositionSize( 50, spsPercentOfPosition * ( Short == sigScaleOut ) ); //
scale out 50% of position
PositionSize = MarginDeposit = 1;
NumContracts = 2;
PositionSize = NumContracts * MarginDeposit;