Just a last question:

What happens when my common AFL code from phase 1 want's to Scale In while
my risk management want's to Scale Out.
Which one has higher priority or would both be executed, so it scale's in
and out at the same bar ?

Regards


2007/7/12, Trinolix Derry <[EMAIL PROTECTED]>:

ok, thanks a lot !
i assume i can figure it out now. I am very happy now. :-)

Regards


2007/7/12, Tomasz Janeczko <[EMAIL PROTECTED]>:
>
>    Yes you are right. As to improving the code - the biggest time
> consuming parts is calling many times Foreign() inside loops
>
> Best regards,
> Tomasz Janeczko
> amibroker.com
>
> ----- Original Message -----
> *From:* Trinolix Derry <[EMAIL PROTECTED]>
> *To:* [email protected]
>  *Sent:* Thursday, July 12, 2007 1:39 PM
> *Subject:* Re: [amibroker] Re: How to implement a simple risk management
> ? Tomasz please read it
>
>
> Hello Tomasz,
>
> thanks for your help !
>
> I think i understand it now. I thought that i don't need it because
> RiskPerContract includes my RiskAtClose which includes the foreign function
> and is symbol based. But now i understand that RiskPerContract will be
> overwritten at every bar with the value from the last symbol in the open
> trades list. Am i right ?
>
> Another question: I have seen already that the backtest speed increases
> significantly when i use the Risk Management.
> Do you maybe see clear ways to improve the code, maybe through
> FindOpenPos() or is it simply normally because AmiBroker must look at every
> bar for open trades and calculate the risk at every bar on those trades,
> etc.. ?
>
> Regards
>
>
> 2007/7/12, Tomasz Janeczko <[EMAIL PROTECTED]>:
> >
> >    Hello,
> >
> > There were examples posted in the past. You don't need custom
> > backtester to do for example
> > VanTharp-style risk management (placing stops at multiple of ATR() and
> > allocating certain percentage of equity in given trade at the time of the
> > entry).
> >
> > For more complex schemes like scaling out position if risk increases
> > during the trade and scaling in positions when risk
> > decreases during the trade you indeed need custom backtester.
> >
> > As to the code that you have used, it is easy to modify it to work
> > with multiple symbols.
> > You need to use dynamic variable names for everything. You were going
> > good path but you need to use dynamic variables
> > for remaining variables such as RiskPerContract, DiffToMaxRisk
> >
> > Best regards,
> > Tomasz Janeczko
> > amibroker.com
> >
> >  ----- Original Message -----
> > *From:* Trinolix Derry <[EMAIL PROTECTED]>
> > *To:* [email protected]
> > *Sent:* Thursday, July 12, 2007 10:14 AM
> > *Subject:* Re: [amibroker] Re: How to implement a simple risk
> > management ? Tomasz please read it
> >
> >
> > Hello Graham,
> >
> > yes i know and i have printed out and read everything that you
> > mentioned already multiple times.
> > Unfortunately none of the examples are similar to a risk management.
> > The only example which could be useful to implement a risk management was
> > the rebalance example which i used as my template.
> > I assume the main difference to my code is that the rebalance example
> > doesn't need information from previous bar open trades. I don't know why,
> > but it seems that the PositionValue that he uses already returns previous
> > bar position value, so he doesn't need to retrieve information from open
> > trades at previous bar.
> >
> > If you take a look at my previous post, about 1-2 days ago i have
> > already implemented everything and through Trace View i can see the correct
> > risk at every bar at every open trade and when the risk is to high it scales
> > out at the next bar. Works fine so far at a single symbol, but now the key
> > problem seems to be anywhere to retrieve the correct values from previous
> > bar open trades. I have used dynamic variables with the symbol name. Maybe
> > you can take a look at my code, i can't figure out the reason myself.
> >
> > Anyway i am still surprised that no one else seems to have such a
> > simple risk management already implemented.
> > Without it the trade risk could rise and rise, also with a trailing
> > stop and before you realize it you could already risk much more % of equity
> > in real life than you have expected in the backtest, because without custom
> > coding (Trace view) the backtester doesn't show the current open risk. It
> > also doesn't show the portfolio risk.
> >
> > So a nice backtest could end with a system that can't be traded in
> > real life, because no one feels comfortable if the open risk is to high and
> > even higher than expected in the backtest.
> >
> > Another example would be that the equity drops down, so the risk
> > increases also and we should scale out contracts. Without any risk
> > management we can't see such situations in the backtester. So our current
> > risk could maybe already be 90% of equity and we can't realize it in the
> > backtest. Most probably this is the time when people are saying that
> > backtests are useless, but this shouldn't be our goal. So i appreciate every
> > help !
> >
> > Regards
> >
> >
> > *
> >
> > function
> > *FindValueAtDateTime( input, dt, Value )
> >
> > {
> >
> > found = -
> > 1;
> >
> > *for*( i = 0; i < *BarCount* *AND* found == - 1; i++ )
> >
> > {
> >
> > *if*( dt[ i ] == Value ) found = i;
> >
> > }
> >
> > *return* IIf( found != -1, input[ found ], *Null* );
> >
> > }
> >
> >
> > *
> >
> > if
> > *( Status("action") == *actionPortfolio* )
> >
> > {
> >
> > AddRMultipleColumn =
> > StaticVarGet("AddRMultipleColumn");
> >
> > bo =
> > GetBacktesterObject();
> >
> > bo.PreProcess();
> >
> > dt =
> > DateTime();
> >
> > MaxTradeRisk =
> > StaticVarGet("MaxRiskPerTrade");
> >
> > MaxTradeRiskPercent = MaxTradeRisk *
> > 0.01;
> >
> > Slippage =
> > StaticVarGet("Slippage");
> >
> > UseTraceView =
> > StaticVarGet("UseTraceView");
> >
> > UseRiskManagement =
> > StaticVarGet("UseRiskManagement");
> >
> >
> >
> > EquityArray =
> > 0;
> >
> > CurrentContracts =
> > 0;
> >
> > EquityAtEntry =
> > 0;
> >
> > CurEquity =
> > 0;
> >
> > RiskAtCloseCash =
> > 0;
> >
> > RiskAtClosePercent =
> > 0;
> >
> > DiffToMaxRisk =
> > 0;
> >
> > RiskPerContract =
> > 0;
> >
> > ScaleAmountInContracts =
> > 0;
> >
> > ScaleAmountCashWithMargin =
> > 0;
> >
> >
> >
> > *for*(bar = 0; bar < *BarCount*; bar++)
> >
> > {
> >
> > bo.ProcessTradeSignals( bar );
> >
> > CurEquity[bar] = bo.Equity;
> >
> > *if*(UseRiskManagement)
> >
> > {
> >
> > // iterate through open trades
> >
> > *for*( trade = bo.GetFirstopenPos(); trade; trade = bo.GetNextopenPos()
> > )
> >
> > {
> >
> > // Store entry values in dynamic variables
> >
> > *if*(trade.BarsInTrade == 1)
> >
> > {
> >
> > VarSet("ContractsAtEntry" + trade.Symbol, trade.Shares);
> >
> > VarSet("FxRateAtEntry" + trade.Symbol, trade.EntryFxRate);
> >
> > }
> >
> > // Get values from entry bar
> >
> > EquityAtEntry = FindValueAtDateTime( EquityArray , dt,
> > trade.EntryDateTime );
> >
> > ContractsAtEntry =
> > VarGet("ContractsAtEntry" + trade.Symbol);
> >
> > FxRateAtEntry =
> > VarGet("FxRateAtEntry" + trade.Symbol);
> >
> > // Store current values in dynamic variables
> >
> > VarSet("CurrentContracts" + trade.Symbol, trade.Shares);
> >
> > // Get current values from dynamic variables
> >
> > CurrentContracts =
> > VarGet("CurrentContracts" + trade.Symbol);
> >
> > *if*(bar > 0)
> >
> > {
> >
> > *if*( DiffToMaxRisk[bar-1] > 0 )
> >
> > CurrentContracts = CurrentContracts - ScaleAmountInContracts[bar-
> > 1];
> >
> > *else*
> >
> > CurrentContracts = CurrentContracts[bar-
> > 1];
> >
> > }
> >
> > *if*(trade.IsLong)
> >
> > {
> >
> > // Get values from phase 1 -> composite indicators
> >
> > RiskAtClose =
> > Foreign("~AddValues_2" + trade.Symbol, "Open");
> >
> > ScalePrice = trade.GetPrice( bar,
> > "O" ) - Slippage ;
> >
> > }
> >
> > *else*
> >
> > {
> >
> > RiskAtClose =
> > Foreign("~AddValues_2" + trade.Symbol, "High");
> >
> > ScalePrice = trade.GetPrice( bar,
> > "O" ) + Slippage ;
> >
> > }
> >
> > // Calculate current trade risk
> >
> > RiskAtCloseCash[bar] = RiskAtClose[bar] * CurrentContracts[bar] *
> > trade.PointValue * FxRateAtEntry;
> >
> > RiskAtClosePercent[bar] = RiskAtCloseCash[bar] / (
> > 0.01 * CurEquity[bar]);
> >
> > DiffToMaxRisk[bar] = RiskAtCloseCash[bar] - MaxTradeRiskPercent *
> > CurEquity[bar];
> >
> > RiskPerContract[bar] = RiskAtClose[bar] * trade.PointValue *
> > FxRateAtEntry;
> >
> > ScaleAmountInContracts[bar] = DiffToMaxRisk[bar] /
> > RiskPerContract[bar];
> >
> > RoundValue =
> > 1 / trade.RoundLotSize;
> >
> > ScaleAmountInContracts[bar] =
> > round(ScaleAmountInContracts[bar] * RoundValue) / RoundValue;
> >
> > ScaleAmountCashWithMargin[bar] = ScaleAmountInContracts[bar] *
> > trade.MarginDeposit * FxRateAtEntry +
> > 0.01;//0.01 necessary (rounding)
> >
> > *if*(UseTraceView)
> >
> > {
> >
> > _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ", Bars In Trade
> > = " + trade.BarsInTrade + ", Symbol " + trade.Symbol );
> >
> > _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ", Contracts @
> > Entry = " + ContractsAtEntry + ", Current " + CurrentContracts[bar] );
> >
> > // _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ",
> > EquityAtEntry = " + EquityAtEntry + ", Current Equity = " + bo.Equity
> > );
> >
> > _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ", MaxTradeRisk
> > = " + MaxTradeRiskPercent * bo.Equity + "€"+ ", " + MaxTradeRisk[bar]
> > + "%" + ", DiffToMaxRisk = " + DiffToMaxRisk[bar] + " € " );
> >
> > // _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ",
> > trade.GetEntryValue() = " + trade.GetEntryValue() +" € ");
> >
> > // _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ",
> > trade.GetPositionValue() = " + trade.GetPositionValue() +" € \n\n");
> >
> > // _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ", Risk = " +
> > RiskAtClose[bar] +" Ticks, " + RiskAtCloseCash[bar] +" €, " +
> > RiskAtClosePercent[bar] +" % ");
> >
> > _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ", Current Risk
> > = " + RiskAtCloseCash[bar] + " €, " + RiskAtClosePercent[bar] +" % ");
> >
> > // _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ", FxRate @
> > Entry = " + FxRateAtEntry );
> >
> > }
> >
> > *if*(bar >= 0 *AND* DiffToMaxRisk[bar] > 0 *AND* UseTraceView)
> >
> > _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ", Scale Out,
> > Amount = " + DiffToMaxRisk[bar] + " €, Contracts = " +
> > ScaleAmountInContracts[bar] );
> >
> >
> >
> > *if*(bar > 0 *AND* DiffToMaxRisk[bar-1 ] > 0 )
> >
> > {
> >
> > bo.ScaleTrade( bar, trade.Symbol, *False*, ScalePrice,
> > ScaleAmountCashWithMargin[bar-
> > 1], trade.MarginDeposit );
> >
> > *if*(UseTraceView)
> >
> > _TRACE("bar " + bar + ", " + DateTimeToStr(dt[bar]) + ", " +
> > ScaleAmountInContracts[bar- 1] + " Contracts scaled out ");
> >
> > }
> >
> > *if*(UseTraceView)
> >
> > _TRACE("\n");
> >
> > }
> >
> > }
> >
> > }
> >
> >
> > 2007/7/12, Graham <[EMAIL PROTECTED]>:
> > >
> > >   You would need to do the risk management within the custom
> > > backtest
> > > coding. There is no other way to base values on portfolio equity
> > > There are examples available (see Ab knowledge base etc) in this and
> > > a
> > > guide written by a member of this group for advanced backtest code
> > > available I think in the files section of yahoo group?
> > >
> > > --
> > > Cheers
> > > Graham
> > > AB-Write >< Professional AFL Writing Service
> > > Yes, I write AFL code to your requirements
> > > http://www.aflwriting.com
> > >
> > > On 12/07/07, Trinolix Derry <[EMAIL PROTECTED]<trinolix%40gmail.com>>
> > > wrote:
> > > > Hello,
> > > >
> > > > i have got no reply so i am wondering how you manage the trade
> > > risk ?
> > > >
> > > > The real risk always depends on current contracts, current equity
> > > and
> > > > stop distance, therefore there is no easy way just as placing any
> > > > trailing stop.
> > > >
> > > > Can't anyone help ?
> > > >
> > > >
> > > >
> > > > 2007/7/11, Trinolix Derry < [EMAIL PROTECTED]<trinolix%40gmail.com>
> > > >:
> > > > > Hello,
> > > > >
> > > > > Can someone please tell me how to implement a simple risk
> > > management
> > > > > for futures ?
> > > > >
> > > > > Compared to the AmiBroker Rebalance example which is position
> > > size
> > > > > based, i want to use the risk amount to make rebalancing or
> > > simple
> > > > > scale out's.
> > > > > Basically whenever current trade risk is > 4% of current equity
> > > it
> > > > > should scale out to get the risk below 4%.
> > > > >
> > > > > I wasn't able to write the code successfully, see one of my
> > > previous posts.
> > > > > However a risk management is so important and really everyone
> > > who
> > > > > want's to develope a serious trading system need it. So i assume
> > > that
> > > > > anyone found the solution.
> > > > > Otherwise Tomasz: Can you please provide a example to the KB
> > > site ?
> > > > >
> > > > >
> > > > > Risk management is one of the keys to success.
> > > > > I really appreciate every help !
> > > > >
> > > > > --
> > > > > Regards
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
> > --
> > Regards
> >
> >
>
>
> --
> Regards
>
> >



--
Regards




--
Regards

Reply via email to