O U C H !!! That looks much better! Thanks Graham! d
_____ From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Graham Sent: Wednesday, February 14, 2007 5:07 PM To: [email protected] Subject: Re: [amibroker] Scale In problems - need some help Dingo I think this may be something, if not then obviously it is something else :-) You have the trade delays set at 1 bar delay, but the calculations for position sizing are set on the bar of the signal Try this to find the size SetPositionSize( valuewhen(buy,ScaleInSize), spsPercentOfEquity ); -- Cheers Graham AB-Write >< Professional AFL Writing Service Yes, I write AFL code to your requirements http://www.aflwriting.com On 15/02/07, dingo <[EMAIL PROTECTED]> wrote: Duudes! I'm working on a scale in problem and have hit a wall. I've included the afl below. The problem I'm having is figuring out why the trade list doesn't seem to jive with the _Trace output. The trace seems to be showing that the routines are working but the position sizes in the trade list don't seem to match. Plus I'm getting some funky exit prices?? I've been running it on a single stock with a date range of a few years just to see if I have the mechanics are right. I'd appreciate any and all comments on this. Thanks! d /* Here is what we want to try and do. On the first buy signal we take 10% of the 10% position, so 1% If it closes down anytime while in position we take 20% of the 10% position, so 2% If it closes down again anytime while in position we take 30% of the 10% position, so 3% If it closes down again anytime while in position we take 40% of the 10% position, so 4% So any position can have up to 4 scale ins. You could have up to 10% of total equity in a position. */ /*========================================================================== ==== Global Settings ============================================================================ ==*/ SetFormulaName("Scale In Test"); SetOption("ActivateStopsImmediately", False); SetOption("AllowPositionShrinking", True); SetOption("AllowSameBarExit", False); SetOption("CommissionAmount", 0); SetOption("CommissionMode", 2); //$$ per trade SetOption("InitialEquity", 10000); SetOption("InterestRate",0.00); SetOption("MarginRequirement", 100); SetOption("MaxOpenPositions", 10); SetOption("MinShares", 0); SetOption("NoDefaultColumns", False); SetOption("PriceBoundChecking", False); SetOption("ReverseSignalForcesExit", False); SetOption("UseCustomBacktestProc", False ); SetOption("UsePrevBarEquityForPosSizing", False); SetTradeDelays(1, 1, 1, 1); MaxOpenTrades = GetOption("MaxOpenPositions"); if (Status("stocknum") == 0) { _TRACE("DBGVIEWCLEAR"); } // Simple buy and sell rules Buy = Cross( EMA( C, 10 ), EMA( C, 50 ) ); Sell = Cross( EMA( C, 50 ), EMA( C, 10 ) ); TotalPosition = 10; //Max Pct of Equity of all scaleins FirstScaleIn = 10; //Pct of Total Position SecondScaleIn = 20; ThirdScaleIn = 30; FourthScaleIn = 40; FirstScaleInPctOfEqty = ( FirstScaleIn * TotalPosition ) / 100; SecondScaleInPctOfEqty = ( SecondScaleIn * TotalPosition ) / 100; ThirdScaleInPctOfEqty = ( ThirdScaleIn * TotalPosition ) / 100; FourthScaleInPctOfEqty = ( FourthScaleIn * TotalPosition ) / 100; ScaleInSize = Open - Open; ScaleInCount = 0; Dte = DateNum(); PositionScore = 1; for( i = 0; i < BarCount; i++ ) { if( Buy[ i ] AND ScaleInCount == 0 ) { ScaleInCount = 1; Buy[ i ] = True; ScaleInSize[ i ] = FirstScaleInPctOfEqty; _TRACE(" "); _TRACE("Buy" + " Date: " + DateTimeToStr( DateTimeConvert( 2, Dte[ i ] ) ) + " Buy = " + WriteVal( Buy[ i ], 1.0, 0 ) + " Size: " + WriteVal( ScaleInSize[ i ], 1.2, 0 ) + " CLose[i] " + Writeval( Close[ i ], 1.2, 0 ) + " CLose[i-1] " + Writeval( Close[ i-1 ], 1.2, 0 ) ); } if( ScaleInCount == 2 AND ( Close[ i ] < Close[ i -1 ] ) AND Sell[ i ] == 0 ) { Buy[ i ] = sigScaleIn; ScaleInSize[ i ] = SecondScaleInPctOfEqty; _TRACE("SI2" + " Date: " + DateTimeToStr( DateTimeConvert( 2, Dte[ i ] ) ) + " Buy = " + WriteVal( Buy[ i ], 1.0, 0 ) + " Size: " + WriteVal( ScaleInSize[ i ], 1.2, 0 ) + " CLose[i] " + Writeval( Close[ i ], 1.2, 0 ) + " CLose[i-1] " + Writeval( Close[ i-1 ], 1.2, 0 ) ); } if( ScaleInCount == 3 AND ( Close[ i ] < Close[ i -1 ] ) AND Sell[ i ] == 0 ) { Buy[ i ] = sigScaleIn; ScaleInSize[ i ] = ThirdScaleInPctOfEqty; _TRACE("SI3" + " Date: " + DateTimeToStr( DateTimeConvert( 2, Dte[ i ] ) ) + " Buy = " + WriteVal( Buy[ i ], 1.0, 0 ) + " Size: " + WriteVal( ScaleInSize[ i ], 1.2, 0 ) + " CLose[i] " + Writeval( Close[ i ], 1.2, 0 ) + " CLose[i-1] " + Writeval( Close[ i-1 ], 1.2, 0 ) ); } if( ScaleInCount == 4 AND ( Close[ i ] < Close[ i -1 ] ) AND Sell[ i ] == 0 ) { Buy[ i ] = sigScaleIn; ScaleInSize[ i ] = FourthScaleInPctOfEqty; _TRACE("SI4" + " Date: " + DateTimeToStr( DateTimeConvert( 2, Dte[ i ] ) ) + " Buy = " + WriteVal( Buy[ i ], 1.0, 0 ) + " Size: " + WriteVal( ScaleInSize[ i ], 1.2, 0 ) + " CLose[i] " + Writeval( Close[ i ], 1.2, 0 ) + " CLose[i-1] " + Writeval( Close[ i-1 ], 1.2, 0 ) ); } if( ScaleInCount > 4 OR Sell[ i ] ) { Buy[ i ] = 0; ScaleInCount = 0; } if( Buy[ i ] ) ScaleInCount = ScaleInCount + 1; If ( Sell[ i ] ) _TRACE("Sale On Date: " + DateTimeToStr( DateTimeConvert( 2, Dte[ i ] ))); } SetPositionSize( ScaleInSize, spsPercentOfEquity ); Filter = 1; AddColumn(Buy, "Buy", 1.0); AddColumn(Sell, "Sell", 1.0); AddColumn(Close, "Close", 1.2); AddColumn(ScaleInSize, "ScaleInSize", 1.2); AddColumn(BuyPrice, "BuyPrice", 1.2); AddColumn(PositionSize, "PositionSize", 1.2);
