Stock Portfolio Organizer
The ultimate porfolio management solution.
Shares, Margin, CFD's, Futures and Forex
EOD and Realtime
Dividends and Trust Distributions
And Much More ....
WiseTrader Toolbox
#1 Selling Amibroker Plugin featuring:
Advanced Adaptive Indicators
Advanced Pattern Exploration
Neural Networks
And Much More ....
Scale Out for Amibroker (AFL)
Copy & Paste Friendly
Back
_SECTION_BEGIN("Scale Out: Futures"); SetTradeDelays(0,0,0,0); BuyPrice = Close; ShortPrice = Close; SetOption("FuturesMode", True); SetOption("InitialEquity", 10000000); Buy = Cross(MA(C, 20), MA(C,50)); Short = Cross(MA(C,50), MA(C,20)); SystemExitLong = Cross(MA(C,18), C); // This value will be adjusted according the system's exit rules SystemExitShort = Cross(C, MA(C,18)); StopAmt = 1.5; //number of points ProfitTarget = 3;//number of points TickIncrement = Param("Tick Increment", 0.25, 0.1, 1, 0.1);//ES = 0.25, NQ = 0.10, YM = 1 TickIncrement = TickIncrement * 1; //change this value according to the expected slippage when stops are tiggered //set begining value of essential variables TrailingStop = 0; // This value will be adjusted to FirstProfitTarget only after SecondProfitTarget is hit StopLoss = 0; FirstProfitTarget = 0; SecondProfitTarget = 0; //set begining values for long variables priceatbuy=0; highsincebuy = 0; Sell = 0; TradeDate = DateTime(); //set begining values for short variables priceatshort= 0; lowsincebuy = 0; Cover = 0; //set exit to zero exit = 0; PortEq = Equity(); /////////////////////////////////////////////////////////////////////////// //////////////Begin code to scale out of positions///////////////////////// /////////////////////////////////////////////////////////////////////////// for( i = 0; i < BarCount; i++ ) { if( priceatbuy == 0 AND Buy[ i ] ) { //initialize required variables priceatbuy = BuyPrice[ i ]; StopLoss = StopAmt[i]; FirstProfitTarget = StopAmt[i]; SecondProfitTarget = ProfitTarget[i]; } if( priceatshort == 0 AND Short[ i ] ) { //initialize required variables priceatshort = ShortPrice[ i ]; StopLoss = StopAmt[i]; FirstProfitTarget = StopAmt[i]; SecondProfitTarget = ProfitTarget[i]; } if( priceatbuy > 0 ) { highsincebuy = Max( High[ i ], highsincebuy ); //un-comment statement below for debuging //_TRACE("LongEntry: " + DateTimeToStr(TradeDate[i]) +"/ BuyPrice: " +BuyPrice[i] +"/ Equity in-loop: " +PortEq[i]); //check if 1st target hit and Buy not = 1 if( Buy[i] != 1 AND exit == 0 AND High[ i ] >= FirstProfitTarget + TickIncrement + priceatbuy ) { // first profit target hit - scale-out exit = 1; Buy[ i ] = sigScaleOut; BuyPrice[i] = FirstProfitTarget + priceatbuy; } //check if 2nd target hit and Buy not = 1 if( Buy[i] != 1 AND exit == 1 AND High[ i ] >= SecondProfitTarget + TickIncrement + priceatbuy ) { // second profit target hit - scale-out exit = 2; Buy[ i ] = sigScaleOut; BuyPrice[i] = SecondProfitTarget + priceatbuy; //if close of bar that sets trailing stop is higher than target 1 assume //trailing stop is not triggered on that bar. SetTrail = IIf(Close[i] > priceatbuy + FirstProfitTarget, 1, 0); //after hitting SecondProfitTarget, move //stop to FirstProfitTarget position TrailingStop = FirstProfitTarget + priceatbuy; } //check if trailing stop hit and Buy not = 1 //make sure SetTrail is not = 1 to ensure trail stop is not hit //unless close of bar where trail stop is set is lower than //trail stop if( Buy[i] != 1 AND exit == 2 AND SetTrail == 0 AND Low[ i ] <= TrailingStop - TickIncrement ) { // Trailing Stop target hit - exit trade with final contract exit = 3; SellPrice[ i ] = TrailingStop - TickIncrement ; //accounting for one tick slippage } //check if system exit hit and Buy not = 1 if( Buy[i] != 1 AND exit <= 2 AND SystemExitLong [i]) //need to substitute system exit here { // System Exit hit - exit all remaining contracts exit = 3; SellPrice[i] = Close[i]; //all three contracts would exit here } //check if stop loss hit and Buy not = 1 if(Buy[i] != 1 AND Low[ i ] <= priceatbuy - StopLoss - TickIncrement ) { // Stop Loss hit - exit exit = 3; SellPrice[ i ] = Min( Open[ i ], priceatbuy - StopLoss - TickIncrement ); //assume one tick slippage } //un-comment statement below for debuging //_TRACE("Buy = " + Buy[i] +"/ Exit: " +exit); //Reset the SetTrail variable back to zero before processing next bar SetTrail = 0; //check if exit complete if( exit >= 3 ) { Buy[ i ] = 0; Sell[ i ] = exit + 1; // mark appropriate exit code exit = 0; priceatbuy = 0; // reset price highsincebuy = 0; ThirdProfitTarget = 0; TrailingStop = 0; } } //exit: Check exits for longs if( priceatshort > 0 ) { lowsincebuy = Min( Low[ i ], lowsincebuy ); //un-comment statement below for debuging //_TRACE("ShortEntry: " + DateTimeToStr(TradeDate[i]) +"/ ShortPrice = " +priceatshort +"/ Equity in-loop: " +PortEq[i]); //check if 1st target hit and short not = 1 if( Short[i] != 1 AND exit == 0 AND Low[ i ] <= priceatshort - FirstProfitTarget - TickIncrement ) { // first profit target hit - scale-out exit = 1; Short[ i ] = sigScaleOut; ShortPrice[i] = priceatshort - FirstProfitTarget; } //check if 2nd target hit and short not = 1 if( Short[i] != 1 AND exit == 1 AND Low[ i ] <= priceatshort - SecondProfitTarget - TickIncrement ) { // second profit target hit - scale-out exit = 2; Short[ i ] = sigScaleOut; ShortPrice[i] = priceatshort - SecondProfitTarget; //if close of bar that sets trailing stop is lower than target 1 assume //trailing stop is not triggered on that bar. SetTrail = IIf(Close[i] < priceatshort - FirstProfitTarget, 1, 0); //after hitting SecondProfitTarget, move //stop to FirstProfitTarget position TrailingStop = priceatshort - FirstProfitTarget ; } //check if trailing stop hit and short not = 1 //make sure SetTrail is not = 1 to ensure trail stop is not hit //unless close of bar where trail stop is set is higher than //trail stop if( Short[i] != 1 AND exit == 2 AND SetTrail == 0 AND High[ i ] >= TrailingStop + TickIncrement ) { // Trailing Stop target hit - exit trade with final contract exit = 3; CoverPrice[ i ] = TrailingStop + TickIncrement ; } //check if system exit and short not = 1 if( Short[i] != 1 AND exit <= 2 AND SystemExitShort[i]) //need to substitute system exit here { // System Exit hit - exit all remaining contracts exit = 3; CoverPrice[i] = Close[i]; //all three contracts would exit here } //check if stop loss hit and short not = 1 if(Short[i] != 1 AND High[ i ] >= priceatshort + StopLoss + TickIncrement ) { // Stop Loss hit - exit exit = 3; CoverPrice[ i ] = Max( Open[ i ], priceatshort + StopLoss + TickIncrement ); //assume one tick slippage } //un-comment statement below for debuging //_TRACE("Short = " + Short[i] +"/ Exit: " +exit); //Reset the SetTrail variable back to zero before processing next bar SetTrail = 0; //check if exit complete if( exit >= 3 ) { Short[ i ] = 0; Cover[ i ] = exit + 1; // mark appropriate exit code exit = 0; priceatshort = 0; // reset price highsincebuy = 0; ThirdProfitTarget = 0; TrailingStop = 0; } } //exit: check exits for shorts } //exit: loop //trade three contracts with every entry signal SetPositionSize(3,spsShares); //scale out one contract at a time SetPositionSize( 1, IIf( Short == sigScaleOut OR Buy == sigScaleOut, spsShares, spsNoChange ) ); /////////////////////////////////////////////////////////////////////////// //////////////End of code to scale out of positions//////////////////////// /////////////////////////////////////////////////////////////////////////// _SECTION_END();