Yes, as a general programming rule, when you have to search through a very large vector to find occurrences for when you have to calculate something else, you will be wasting to much time looping through vectors to find things. Either build a smaller array containing the specific time/date of bars only when Buy=1, or use a hashtable with keys and values, and read the hashtable in dictionary mode.
When arrays get large (long) and you end up looking too much you are wasting time -- so the solution is to only store cases when what you want is true. --- In [email protected], "pipadder" <pipad...@...> wrote: > > > > > > > > > > > > > > > > --- In [email protected], "pipadder" <pipadder@> wrote: > > > > Hi, > > > > I am a systematic mechanical trader (almost exclusively forex). For the > > last couple of years [...] > > Ok, it appears that trying to think in "array mode" is giving me a lot more > trouble than I expected. One of the main problems I am finding is the fact > that conditional execution of code (do/calculate stuff which needs to happen > only for some bars, but not for some others) doesn't seem obvious now, and I > am stuck. Or at least, the ways I can come up with to do things don't seem > efficient to me. > > Perhaps the best way is to give a concrete example... I am trying to code a > system that is just a variation of your usual breakout box. I am working with > a 1-minute bar database. So, the program is going to process these bars and > determine when to place the orders. This will happen once a day, for a given > bar (on a given minute, of course) which I can identify. Let's assume I am at > the point where my program has already determined which bars those are and I > have a nicely populated "buy" array with a few "1" here and there. The > problem comes now: to use volatility-adjusted stops, once a "buy bar" is > known the program needs to run some calculations that use a certain number of > prior bars (several hundreds of them, actually) to determine stop placement > (sellprice), order size, etc. So I am thinking about two possible options to > do this: > > 1) Brute force. I run these calculations and determine the > volatility-adjusted stuff for every bar, whether it is a "buy" bar or not, so > that I have those numbers available in an appropriately created array when > needed. This could be done in AFL array style, but seems like total overkill: > in a 1M database and to place only one order a day, I would only need to run > this calculation once every 1440 bars. So running the calculation for every > single bar looks quite inefficient. > > 2) Conditional execution... Call a function that will perform the calculation > only for those bars which are tagged as "buy bars". Now... the only way I can > think of to do this is to just run a loop through the whole database and > perform the appropriate calculations only for the bars that require them. > This of course looks more efficient than the solution before, but I am not > using the advantages of simultaneous array operation anymore, and not having > a good idea of the speed advantage of array vs. loop operation I cannot > really know whether it is a better solution. > > I suppose many of you have gone through this kind of problem, so do you guys > know which solution is better, or perhaps even have suggestions on how to do > this in a cleaner and more efficient way? > > Thanks again for your continued patience! >
