Huanyan, The backtester code is only run after all symbols have been processed. In custom backtester code there is no "current" symbol (actually there is, it's ~~~Equity).
The list of signals contains all the signals on a bar by bar basis. So, if 4 different symbols all resulted in a signal for a given bar, then the signal list of the custom backtester will contain a signal for each of them at that bar. Therefore, in order to access the arrays for each respective symbol, you must use Foreign or SetForeign using the symbol name held by that signal. Mike --- In [email protected], "huanyanlu" <joesa...@...> wrote: > > > Hi, Mike > Sorry for my silly question, but why do you use setforeign() function > here. There is no other symbol here. The only symbol is the one that > yielded the previous trading signals here. > > thanks/ huanyan > > > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > Hi, > > > > Sorry, the SetForeign advice was good. But, my example propogated > > another error in your original code. sig.PosSize is a scaler, not > an > > array. As such, you cannot pass the result of an array calculation > as > > value. Instead, you must calculate the value for the given bar. > Your > > original example thus becomes: > > > > SetCustomBacktestProc(""); > > > > if ( Status( "action" ) == actionPortfolio ) > > { > > bo = GetBacktesterObject(); > > bo.PreProcess(); > > > > for ( bar = 0; bar < BarCount; bar++ ) > > { > > CurrentEquity = bo.Equity; > > > > for ( sig = bo.GetFirstSignal( bar ); sig; sig = > > bo.GetNextSignal( bar ) ) > > { > > SetForeign( sig.Symbol ); > > YesterdayClose = Ref(C, -1); > > YesterdayATR = Ref(ATR(10), -1); > > sig.PosSize = CurrentEquity * YesterdayClose[bar] / > > YesterdayATR[bar]; > > RestorePriceArrays(); > > } > > > > bo.ProcessTradeSignals( bar ); > > } > > > > bo.PostProcess(); > > } > > > > Note also that you should be calling bo.PostProcess instead of > > bo.ListTrades. > > > > Mike > > > > --- In [email protected], "ezbentley" <ezbentley@> wrote: > > > > > > Hi Mike, > > > > > > Thanks for the attempt to help. However, I still get an error > with > > the following code: > > > > > > SetForeign(sig.Symbol); > > > sig.PosSize = CurrentEquity * AccountRiskPercent * ref(C, -1) / > 100; > > > RestorePriceArrays(); > > > > > > Error 19. COM method/function 'PosSize' call failed. > > > > > > Thanks, > > > > > >
