Great, glad to hear that it is now working for you. However, you should not have had to use C[entryBar]. It is OK to use it, but you should not have had to. When passing "true" as the last argument to the SetForeign(...) function, BuyPrice should have been converted to be the array of the foreign symbol.
Mike --- In [email protected], "asitasu" <asit...@...> wrote: > > dear mike, > > 10000 thank you for clarifing my concept. with your idea with small > change as follow i got the desired result. > > if ( trade.IsLong() ) > { > SetForeign( trade.Symbol, True, True ); > pw = TimeFrameGetPrice( "l", inWeekly, -1 ); > qw = TimeFrameGetPrice( "l", inWeekly, -2 ); > wqs = Min( pw, qw ); > Buypr = C[entrybar] ; > bstopamount = Buypr - ( wqs - 1 ); > Buystop = bstopamount[entrybar] ; > risk = bstopamount[entryBar] * 100; > RestorePriceArrays(True); > } > else > { > SetForeign( trade.Symbol, True, True ); > yw = TimeFrameGetPrice( "h", inWeekly, -1 ); > zw = TimeFrameGetPrice( "h", inWeekly, -2 ); > wzs = Max( yw, zw ); > shrtpr = C[entrybar] ; > sstopamount = ( wzs + 1 ) - shrtpr; > Shortstop = sstopamount[entrybar] ; > risk = sstopamount[entryBar] * 100; > RestorePriceArrays(True); > } > > thank you again. > > asit > > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > > > Hi, > > > > I ran the code on symbol AAV from 1/1/07 to 12/31/08 and it generated > > the extra columns with values. I have not made any attempt to validate > > the values, but there are definately values being generated. The > > complete code (taken from what you originally posted) is below. I have > > not made any attempt to clean it up or get rid of the duplication > > resulting from copying the calculations in the loop. I am only trying to > > show the concept: > > > > Capital = 100000; > > SetOption( "InitialEquity", Capital ); > > RoundLotSize = 1; > > xb = IIf( C > EMA( C, 7 ), 20, 0 ); > > xs = IIf( C < EMA( C, 7 ), -20, 0 ); > > y = TimeFrameGetPrice( "h", inMonthly, -1 ); > > z = TimeFrameGetPrice( "h", inMonthly, -2 ); > > p = TimeFrameGetPrice( "l", inMonthly, -1 ); > > q = TimeFrameGetPrice( "l", inMonthly, -2 ); > > r = TimeFrameGetPrice( "h", inMonthly ); > > s = TimeFrameGetPrice( "l", inMonthly ); > > wz = Max( y, z ); > > zb = IIf( r > wz , 30, 0 ); > > wq = Min( p, q ); > > zs = IIf( s < wq, -30, 0 ); > > yw = TimeFrameGetPrice( "h", inWeekly, -1 ); > > zw = TimeFrameGetPrice( "h", inWeekly, -2 ); > > pw = TimeFrameGetPrice( "l", inWeekly, -1 ); > > qw = TimeFrameGetPrice( "l", inWeekly, -2 ); > > rw = TimeFrameGetPrice( "h", inWeekly ); > > sw = TimeFrameGetPrice( "l", inWeekly ); > > wzs = Max( yw, zw ); > > yb = IIf( rw > wzs , 25, 0 ); > > wqs = Min( pw, qw ); > > ys = IIf( sw < wqs, -25, 0 ); > > score = xb + yb + zb + xs + ys + zs; > > avrage = MA( V, 30 ); > > diffvol = ( V - avrage ) / avrage; > > Buy = C > Ref( HHV( H, 2 ), -1 ) AND C > O AND score > 70 ; > > BuyPrice = C; > > bstopamount = BuyPrice - ( wqs - 1 ); > > Sell = L < wqs; > > SellPrice = wqs - 1; > > ExRem( Buy, Sell ); > > Short = C < Ref( LLV( L, 2 ), -1 ) AND C < O AND score < -70 ; > > ShortPrice = C ; > > sstopamount = ( wzs + 1 ) - ShortPrice; > > Cover = rw > wzs ; > > CoverPrice = wzs + 1; > > SetPositionSize( 100, spsShares ) ; > > ExRem( Short, Cover ); > > /* calling custom backtest*/ > > SetCustomBacktestProc( "" ); > > > > if ( Status( "action" ) == actionPortfolio ) > > { > > bo = GetBacktesterObject(); > > bo.backtest( 1 ); > > Sumprofitperrisk = 0; > > numtrades = 0; > > bars = BarIndex(); > > dates = DateTime(); > > > > for ( trade = bo.getfirsttrade(); trade; trade = bo.getnexttrade() ) > > { > > entryBar = LastValue( ValueWhen( trade.EntryDateTime == dates, > > bars ) ); > > > > if ( trade.IsLong() ) > > { > > SetForeign( trade.Symbol, true, true ); > > pw = TimeFrameGetPrice( "l", inWeekly, -1 ); > > qw = TimeFrameGetPrice( "l", inWeekly, -2 ); > > wqs = Min( pw, qw ); > > bstopamount = BuyPrice - ( wqs - 1 ); > > risk = bstopamount[entryBar] * BuyPrice[entryBar]; > > RestorePriceArrays(true); > > } > > else > > { > > SetForeign( trade.Symbol, true, true ); > > yw = TimeFrameGetPrice( "h", inWeekly, -1 ); > > zw = TimeFrameGetPrice( "h", inWeekly, -2 ); > > wzs = Max( yw, zw ); > > sstopamount = ( wzs + 1 ) - ShortPrice; > > risk = sstopamount[entryBar] * ShortPrice[entryBar]; > > RestorePriceArrays(true); > > } > > > > rmultiple = trade.getprofit() / risk; > > > > trade.addcustommetric( "initial risk $" , risk ); > > trade.addcustommetric( "R-multiple" , rmultiple ); > > Sumprofitperrisk = Sumprofitperrisk + rmultiple ; > > numtrades++; > > } > > > > expectancy3 = Sumprofitperrisk / numtrades ; > > > > bo.addcustommetric( "Expectancy (per risk)", expectancy3 ); > > bo.listtrades(); > > } > > > > Note that it will only provide values for completed trades. Trades that > > are still open after the backtest will not have any values set. > > > > If you are still getting blank columns, try adding custom metrics for > > all the values used in the calculation to see what they are (e.g. > > entryBar, pw[entryBar], qw[entryBar], etc.) > > > > Mike > > > > > > --- In [email protected], "asitasu" <asitasu@> wrote: > > > > > > dear mike, > > > > > > thank you for your help to clarify the matter. > > > but still i am getting blank colom in bactest report. > > > i am tring it for single symbol only. > > > help me. > > > > > > asit. > > > > > > --- In [email protected], "Mike" sfclimbers@ wrote: > > > > > > > > > > > > Hi, > > > > > > > > There are a few errors with your second example. > > > > > > > > The first error is that in your second example "risk" is an array. > > When > > > > calling "trade.addcustommetric(...)", you must pass a scaler (i.e. a > > > > single value) not an array. Notice that in your first example risk > > was a > > > > scaler. > > > > > > > > The second error is that in your second example "risk" gets > > recalculated > > > > for every symbol. So, when referring to "risk" in your custom > > backtester > > > > code, which symbol's "risk" are you expecting to get? The active > > symbol > > > > during custom backtesting is "~~~Equity", so you will be getting the > > > > "risk" for ~~~~Equity, which is not what you want. Notice that in > > your > > > > first example "risk" was a fixed value. > > > > > > > > To solve both problems, you must recalculate risk for each trade > > using > > > > the symbol of that trade, and using the values from the entry bar of > > > > that trade (i.e. calculate using scalers instead of entire array). > > > > > > > > Your custom backtester code would then look something like this: > > > > > > > > SetCustomBacktestProc( "" ); > > > > > > > > if ( Status( "action" ) == actionPortfolio ) > > > > { > > > > bo = GetBacktesterObject(); > > > > bo.backtest( 1 ); > > > > Sumprofitperrisk = 0; > > > > numtrades = 0; > > > > bars = BarIndex(); > > > > dates = DateTime(); > > > > > > > > for ( trade = bo.getfirsttrade(); trade; trade = bo.getnexttrade() ) > > > > { > > > > entryBar = LastValue( ValueWhen( trade.EntryDateTime == dates, > > > > bars ) ); > > > > > > > > if (trade.IsLong()) { > > > > SetForeign(trade.Symbol, true, true); > > > > pw = TimeFrameGetPrice( "l", inWeekly, -1 ); > > > > qw = TimeFrameGetPrice( "l", inWeekly, -2 ); > > > > wqs = Min( pw, qw ); > > > > bstopamount = BuyPrice - ( wqs - 1 ); > > > > risk = bstopamount[entryBar] * BuyPrice[entryBar]; > > > > RestorePriceArrays(true); > > > > } else { > > > > SetForeign(trade.Symbol, true, true); > > > > yw = TimeFrameGetPrice( "h", inWeekly, -1 ); > > > > zw = TimeFrameGetPrice( "h", inWeekly, -2 ); > > > > wzs = Max( yw, zw ); > > > > sstopamount = ( wzs + 1 ) - ShortPrice; > > > > risk = sstopamount[entryBar] * ShortPrice[entryBar]; > > > > RestorePriceArrays(true); > > > > } > > > > > > > > rmultiple = trade.getprofit() / risk; > > > > trade.addcustommetric( "initial risk $" , risk ); > > > > trade.addcustommetric( "R-multiple" , rmultiple ); > > > > Sumprofitperrisk = Sumprofitperrisk + rmultiple ; > > > > numtrades++; > > > > } > > > > > > > > expectancy3 = Sumprofitperrisk / numtrades ; > > > > > > > > bo.addcustommetric( "Expectancy (per risk)", expectancy3 ); > > > > bo.listtrades(); > > > > } > > > > > > > > > > > > I have not tested the code above, so make sure to test it out before > > > > accepting it. Also, I have not tried to verify whether or not your > > > > calculations are valid. I just copied what you already had and moved > > the > > > > calculation of "risk" to inside the backtester. > > > > > > > > Mike > > > > > > > > > > > > --- In [email protected], "asitasu" <asitasu@> wrote: > > > > > > > > > > dear mike, > > > > > > > > > > i understood where you want me to direct. for you reference i am > > > > giving full afl for my system which works fine giving me two extra > > > > coloms of initial risk & expectancy/trade coloumwise. but when i try > > to > > > > change risk perameter as shown in following afl i get blnak colom of > > > > initial risk & expectancy/trade. so i wnt to know how to get initial > > > > risk coloum when using risk = enty - stop value. > > > > > > > > > > afl. > > > > > Capital = 100000; > > > > > SetOption("InitialEquity", Capital ); > > > > > RoundLotSize = 1; > > > > > possize = 0.8*Capital; > > > > > allocationrisk = 0.8; // max capital employed per trade > > > > > risk = 0.05*Capital; // % max risk per trade > > > > > /* calling custom backtest*/ > > > > > SetCustomBacktestProc(""); > > > > > if( Status("action") == actionPortfolio ) > > > > > { > > > > > bo = GetBacktesterObject(); > > > > > bo.backtest(1); > > > > > Sumprofitperrisk = 0; > > > > > numtrades = 0; > > > > > // iterate for closed trades > > > > > for( trade = bo.getfirsttrade(); trade; trade = bo.getnexttrade() > > ) > > > > > { > > > > > rmultiple = trade.getprofit()/risk; > > > > > trade.addcustommetric("initial risk $" , risk ); > > > > > trade.addcustommetric("R-multiple" , rmultiple ); > > > > > Sumprofitperrisk = Sumprofitperrisk + rmultiple ; > > > > > numtrades++; > > > > > } > > > > > expectancy3 = Sumprofitperrisk / numtrades ; > > > > > bo.addcustommetric( "Expectancy (per risk)", expectancy3 ); > > > > > bo.listtrades(); > > > > > } > > > > > > > > > > xb = IIf(C > EMA(C,7),20,0); > > > > > xs = IIf(C < EMA(C,7),-20,0); > > > > > y = TimeFrameGetPrice("h",inMonthly,-1); > > > > > z = TimeFrameGetPrice("h",inMonthly,-2); > > > > > p = TimeFrameGetPrice("l",inMonthly,-1); > > > > > q = TimeFrameGetPrice("l",inMonthly,-2); > > > > > r = TimeFrameGetPrice("h",inMonthly); > > > > > s = TimeFrameGetPrice("l",inMonthly); > > > > > wz = Max(y,z); > > > > > zb = IIf(r > wz ,30,0); > > > > > wq = Min(p,q); > > > > > zs = IIf(s < wq,-30,0); > > > > > yw = TimeFrameGetPrice("h",inWeekly,-1); > > > > > zw = TimeFrameGetPrice("h",inWeekly,-2); > > > > > pw = TimeFrameGetPrice("l",inWeekly,-1); > > > > > qw = TimeFrameGetPrice("l",inWeekly,-2); > > > > > rw = TimeFrameGetPrice("h",inWeekly); > > > > > sw = TimeFrameGetPrice("l",inWeekly); > > > > > wzs = Max(yw,zw); > > > > > yb = IIf(rw > wzs ,25,0); > > > > > wqs = Min(pw,qw); > > > > > ys = IIf(sw < wqs,-25,0); > > > > > score = xb+yb+zb+xs+ys+zs; > > > > > avrage = MA(V,30); > > > > > diffvol = (V-avrage)/avrage; > > > > > Buy = C > Ref(HHV(H,2),-1) AND C>O AND score > 70 ; > > > > > BuyPrice = C; > > > > > bstopamount = BuyPrice-(wqs - 1); > > > > > Sell = L < wqs; > > > > > SellPrice = wqs - 1; > > > > > ExRem(Buy,Sell); > > > > > Short = C < Ref(LLV(L,2),-1) AND C<O AND score < -70 ; > > > > > ShortPrice = C ; > > > > > sstopamount = (wzs +1) - ShortPrice; > > > > > Cover = rw > wzs ; > > > > > CoverPrice = wzs + 1; > > > > > SetPositionSize( 100, spsShares ) ; > > > > > ExRem(Short,Cover); > > > > > //PositionSize =IIf(Buy, > > > > > > Min((risk/bstopamount)*BuyPrice,possize),Min((risk/sstopamount)*ShortPri\ > > \ > > > > ce,possize)); > > > > > //PositionScore = PositionSize ; //(V- MA(V,7))/MA(V,7) ; OR > > > > ma(v,5)/ma(v,20); prefer stocks that High vol thrust; > > > > > //ApplyStop(0,1,4,1); > > > > > > > > > > thisk works fine. > > > > > > > > > > but following chane gives blank coloum. > > > > > > > > > > Capital = 100000; > > > > > SetOption("InitialEquity", Capital ); > > > > > RoundLotSize = 1; > > > > > xb = IIf(C > EMA(C,7),20,0); > > > > > xs = IIf(C < EMA(C,7),-20,0); > > > > > y = TimeFrameGetPrice("h",inMonthly,-1); > > > > > z = TimeFrameGetPrice("h",inMonthly,-2); > > > > > p = TimeFrameGetPrice("l",inMonthly,-1); > > > > > q = TimeFrameGetPrice("l",inMonthly,-2); > > > > > r = TimeFrameGetPrice("h",inMonthly); > > > > > s = TimeFrameGetPrice("l",inMonthly); > > > > > wz = Max(y,z); > > > > > zb = IIf(r > wz ,30,0); > > > > > wq = Min(p,q); > > > > > zs = IIf(s < wq,-30,0); > > > > > yw = TimeFrameGetPrice("h",inWeekly,-1); > > > > > zw = TimeFrameGetPrice("h",inWeekly,-2); > > > > > pw = TimeFrameGetPrice("l",inWeekly,-1); > > > > > qw = TimeFrameGetPrice("l",inWeekly,-2); > > > > > rw = TimeFrameGetPrice("h",inWeekly); > > > > > sw = TimeFrameGetPrice("l",inWeekly); > > > > > wzs = Max(yw,zw); > > > > > yb = IIf(rw > wzs ,25,0); > > > > > wqs = Min(pw,qw); > > > > > ys = IIf(sw < wqs,-25,0); > > > > > score = xb+yb+zb+xs+ys+zs; > > > > > avrage = MA(V,30); > > > > > diffvol = (V-avrage)/avrage; > > > > > Buy = C > Ref(HHV(H,2),-1) AND C>O AND score > 70 ; > > > > > BuyPrice = C; > > > > > bstopamount = BuyPrice-(wqs - 1); > > > > > Sell = L < wqs; > > > > > SellPrice = wqs - 1; > > > > > ExRem(Buy,Sell); > > > > > Short = C < Ref(LLV(L,2),-1) AND C<O AND score < -70 ; > > > > > ShortPrice = C ; > > > > > sstopamount = (wzs +1) - ShortPrice; > > > > > Cover = rw > wzs ; > > > > > CoverPrice = wzs + 1; > > > > > SetPositionSize( 100, spsShares ) ; > > > > > ExRem(Short,Cover); > > > > > risk = IIf(Buy, bstopamount*BuyPrice,sstopamount*ShortPrice); // > > max > > > > risk per trade > > > > > /* calling custom backtest*/ > > > > > SetCustomBacktestProc(""); > > > > > if( Status("action") == actionPortfolio ) > > > > > { > > > > > bo = GetBacktesterObject(); > > > > > bo.backtest(1); > > > > > Sumprofitperrisk = 0; > > > > > numtrades = 0; > > > > > // iterate for closed trades > > > > > for( trade = bo.getfirsttrade(); trade; trade = bo.getnexttrade() > > ) > > > > > { > > > > > rmultiple = trade.getprofit()/risk; > > > > > trade.addcustommetric("initial risk $" , risk ); > > > > > trade.addcustommetric("R-multiple" , rmultiple ); > > > > > Sumprofitperrisk = Sumprofitperrisk + rmultiple ; > > > > > numtrades++; > > > > > } > > > > > expectancy3 = Sumprofitperrisk / numtrades ; > > > > > bo.addcustommetric( "Expectancy (per risk)", expectancy3 ); > > > > > bo.listtrades(); > > > > > } > > > > > > > > > > can any one help. > > > > > > > > > > asit. > > > > > > > > > > --- In [email protected], "Mike" sfclimbers@ wrote: > > > > > > > > > > > > See "custom metrics" in the user guide: > > > > > > > > > > > > http://www.amibroker.com/guide/a_custommetrics.html > > > > > > > > > > > > Mike > > > > > > > > > > > > --- In [email protected], "asitasu" <asitasu@> wrote: > > > > > > > > > > > > > > dear frieds, > > > > > > > > > > > > > > i want to add extra collume of risk(no % risk) in backtest > > report > > > > how to add this by use of afl? i want risk to be calculated on base > > of > > > > trade > > > > > > > entry & stop loss price. say for example i enter at Rs 2515 > > and at > > > > time of entry my stop loss is Rs 2375.50, than risk per unit is > > 139.5(ie > > > > 2515 - 2375.50). > > > > > > > > > > > > > > help me. > > > > > > > > > > > > > > asit. > > > > > > > > > > > > > > > > > > > > > > > > > > > >
