Mike Thanks for your help with my previous question.
Return to this thread. Yesterday I was testing codes. I found incidently that if removing setforeign() and RestorePriceArrays() in the codes, the backtest shows the same result. I was testing upon a group of symbols. I think as to the question of the original poster, the key answer ( which you have pointed out previously ) may be that the property sig.PosSize is the positionsize value for that bar only, thus a single number,therefor we cannot assign an array (yesterday close / ATR10) to it. (It was a coding mistake that I also made at first.) Thus we have to assgin the postionsize value in a bar-to-bar manner. best regards/huanyan --- In [email protected], "Mike" <sfclimb...@...> wrote: > > 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" <joesan99@> 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, > > > > > > > > > >
