[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [amibroker] Re: Second thoughts on Static arrays --ATC/Foreign times



PureBytes Links

Trading Reference Links

Tomasz,

I just found problem with the SetBarsRequired() approach while trying  
to test it on my real AFL application data now.

I am running a 5 second database to generate my clean bars for volume  
based aggregation and using the TimeFrameSet() to create a smaller  
2000 bar OHLC "working" array.  However, I still need ALL the 5  
second bars loaded initially to create the smaller OHLC array.  The  
smaller arrays will not actually be smaller though --just not fully  
populated.  Saving them using ATC will not result in a fast save of a  
small number of bars.  So even though the speed of saving 2000 bars  
shown below would be useful, I would have to save a 20K-40K size  
array and the speed would not be practical.

So I think that when the user selects a timeframe, say 1 minute with  
a 5 second database, you aggregate the data into a smaller number of  
bars first, then the AFL runs with only these smaller arrays.  In  
essence I am trying to do the same thing, but all from AFL and I see  
that it is not designed to support it this way.

This may sound crazy, but perhaps I can run the 5 second bars and  
make my clean volume or time based OHLC bars in one tiny pane and  
save them with ATC to a symbol.  Then use Foreign to read a smaller  
array into my main pane that runs with a SetBarsRequired(2000,0) at  
the end.

I will experiment with this concept.  Though it seems like I am  
jumping through hoops trying to overcome these problems, I am happy  
to do it if it is the only way to proceed in the short term to give  
me a tradable system solution.  However, it takes a lot of time and  
energy to do this, and I don't want to go down a fruitless path.

I would appreciate your comments.

Best regards,
Dennis Brown


On Aug 6, 2007, at 8:25 AM, Tomasz Janeczko wrote:

> Hello,
>
> Thank you for your comments.
> And I just realized one thing that largely affects the results.
> That Foreign() funciton will process all bars anyway regardless of  
> SetBarsRequired()
> because in principle it was "general-purpose", not "chart-only" and  
> does
> not really pay any attention "required bars".
> Something to think about in the future releases....
>
> Best regards,
> Tomasz Janeczko
> amibroker.com
> ----- Original Message -----
> From: "Dennis Brown" <see3d@xxxxxxxxxxx>
> To: <amibroker@xxxxxxxxxxxxxxx>
> Sent: Monday, August 06, 2007 1:55 PM
> Subject: Re: [amibroker] Re: Second thoughts on Static arrays --ATC/ 
> Foreign times
>
>
>> Tomasz,
>>
>> Yes, I suspected it might be the case that only pointers were being
>> copied for internal arrays.  That is why I tried both in my code.
>> for the read mode:
>> myArray = C;
>> and for the write mode:
>> myArray = C + i;  (i instead of 1 just in case you did some
>> optimizing with constants)
>>
>> At the resolution of my results, the slowest results for either case
>> were between 1ms and 2ms.
>> This means that the overhead of running the short AFL code shown was
>> dominating the execution time and the array processing time was not
>> even significant enough to noticeably affect the results.  So in
>> reality, the array processing is likely faster than I claimed.
>> That is also why I also said that "static arrays" would would be very
>> fast even if they take 10 times as long to process as internal  
>> arrays.
>>
>> I was astounded at the efficiency of your code for the internal
>> arrays.  You have done a very good job.
>>
>> Best regards,
>> Dennis Brown
>>
>> On Aug 6, 2007, at 6:43 AM, Tomasz Janeczko wrote:
>>
>>> Dennis,
>>>
>>> This is NOT surprising, because internal array does NOT use memory
>>> copy at all!
>>>
>>> Internal arrays are so fast because referencing them does nothing
>>> except
>>> referncing via pointer (4 bytes always, regardless of how long is
>>> the array),
>>> while Foreign has to actually COPY memory (create new array).
>>>
>>> So if you do assignment like this:
>>> myArray = C;
>>>
>>> It effectivelly copies only 4 bytes (the pointer) and increases
>>> "reference counter".
>>> This is what makes it hyper-fast.
>>>
>>> But... as soon as you create NEW array, say by doing this:
>>>
>>> myArray = C + 1;
>>>
>>> Then timing would be much worse because of requried memory copy.
>>> Testing this would give you true estimate of how fast "static
>>> arrays" could be.
>>>
>>> Best regards,
>>> Tomasz Janeczko
>>> amibroker.com
>>> ----- Original Message -----
>>> From: "Dennis Brown" <see3d@xxxxxxxxxxx>
>>> To: <amibroker@xxxxxxxxxxxxxxx>
>>> Sent: Monday, August 06, 2007 5:03 AM
>>> Subject: Re: [amibroker] Re: Second thoughts on Static arrays --ATC/
>>> Foreign times
>>>
>>>
>>>> Tomasz,
>>>>
>>>> I ran a timing test to see what the difference would be for  
>>>> using the
>>>> ATC/Foreign functions vs internal arrays with practical values.  I
>>>> selected an array size of 2000 and generated 100 uniqueATC symbols.
>>>> Here are the AFL execution times on my machine:
>>>>
>>>> ATC Write: 780ms
>>>> Foreign Read: 310ms
>>>> Internal arrays: 1ms
>>>>
>>>> This is compared to an ATC time of 23000ms before I added the
>>>> SetBarsRequired(2000,0) at the END of the AFL  --a 30x improvement
>>>> because there are about 40K bars in the 5 second database.
>>>>
>>>> So the bottom line is that internal arrays seem to be at least 300
>>>> times as fast as ATC/Foreign.
>>>> The potential improvements in speed seem very significant --even if
>>>> static arrays as proposed were 10 times as slow as internal arrays.
>>>> Perhaps it would be possible to just add another mode to ATC/ 
>>>> Foreign
>>>> that bypassed most overhead for fast static arrays.
>>>>
>>>> Regardless of what you decide to do though, the 30x improvement  
>>>> using
>>>> SetBarsRequired(2000,0) at the END is enough to make it worthwhile
>>>> for me to save some of my more time consuming arrays between AFL
>>>> passes using ATC/Foreign to help with the UI responsiveness.
>>>>
>>>> If I had another 30x improvement in "static" array speed (which  
>>>> seems
>>>> quite possible), I would save a lot more results and gain
>>>> significantly more speed.  In either case I believe I can now move
>>>> forward from the first problem set and it only leaves the second
>>>> problem set to enable me to begin trading this system.
>>>>
>>>> Here is the simple AFL I used for the test.  I just turned on  
>>>> the AFL
>>>> chart timing for the results.
>>>>
>>>> Thank you,
>>>> Dennis Brown
>>>>
>>>> function StaticArraySet(VarName,array){AddToComposite
>>>> (array ,"~SA_"+VarName ,"C",atcFlagEnableInIndicator|
>>>> atcFlagDefaults);}
>>>> function StaticArrayGet(VarName){return Foreign 
>>>> ("~SA_"+VarName,"C");}
>>>>
>>>> TestName = ParamStr("Test Name", "Test");
>>>> Cycles = Param("Cycles",1,1,100,1);
>>>> UseATC = ParamToggle("ATC mode","No|Yes",0);
>>>> Writemode = ParamToggle("R/W mode","Read|Write",1);
>>>>
>>>> for(i=0;i<Cycles;i++)
>>>> {
>>>> if(UseATC & Writemode){StaticArraySet(TestName+i,C);}
>>>> if(UseATC & NOT Writemode){myArray = StaticArrayGet(TestName+i);}
>>>> if(NOT UseATC & Writemode){myArray = C+i;}
>>>> if(NOT UseATC & NOT Writemode){myArray = C;}
>>>> }
>>>> SetBarsRequired(2000,0);
>>>>
>>>> On Aug 5, 2007, at 5:38 PM, Dennis Brown wrote:
>>>>
>>>>> Tomasz and Daniel,
>>>>>
>>>>> Excellent points about the advantages of ATC vs hidden memory
>>>>> arrays.
>>>>>
>>>>> On the other side, when the purpose of the hidden arrays is  
>>>>> just to
>>>>> hold a temporary array value between AFL passes that have a short
>>>>> life span of perhaps a minute, and if you are creating dozens of
>>>>> them, not having a "file system" copy of data to read is of no  
>>>>> more
>>>>> consequence than not having a filesystem  copy of any other AFL
>>>>> array
>>>>> that is destroyed every pass.  There could be some debug value as
>>>>> confirmation that you are actually creating them.
>>>>>
>>>>> With the memory only "hidden" arrays, there might need to be a
>>>>> simple
>>>>> way to "flush" all the saved arrays for a "pane" from memory,  
>>>>> either
>>>>> as a logical and automatic consequence of AB, and/or via a single
>>>>> explicit AFL command.
>>>>>
>>>>> The purpose of the proposal is to speed up AFL by saving results
>>>>> that
>>>>> do not need to be recalculated.  ATC/Foreign have all the required
>>>>> functionality to do this.  With the hint by Tomasz (thank you)  
>>>>> about
>>>>> SetBarsRequired() at the END of the AFL, part of the speed  
>>>>> problems
>>>>> is solved.  The only reason to do a more limited version of ATC/
>>>>> Foreign functionality (in some form) is to cut down on the extra
>>>>> overhead to get the maximum speed improvement.  It is only worth
>>>>> doing if it can be done in a way that will make the this
>>>>> functionality at least twice as fast as regular ATC/Foreign.  I  
>>>>> need
>>>>> to test that actual difference in generating and reading a normal
>>>>> array and ATC/Foreign now to see how much could be gained.  I will
>>>>> report it soon.
>>>>>
>>>>> Best regards,
>>>>> Dennis Brown
>>>>>
>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> Foreign() is hand optimized and generally very fast - generally
>>>>>> speaking it's speed is
>>>>>> 70%..80% of memcpy() so I am afraid "signatures" would not  
>>>>>> give any
>>>>>> advantage considering
>>>>>> the fact that you need to add special bookkeeping for them.
>>>>>>
>>>>>> And your comment regarding "hidden" nature of static variables is
>>>>>> very true and that
>>>>>> is one of my concerns.
>>>>>>
>>>>>> Best regards,
>>>>>> Tomasz Janeczko
>>>>>> amibroker.com
>>>>>> ----- Original Message -----
>>>>>> From: "liberte721" <daniel.laliberte@xxxxxxxxx>
>>>>>> To: <amibroker@xxxxxxxxxxxxxxx>
>>>>>> Sent: Sunday, August 05, 2007 4:36 PM
>>>>>> Subject: [amibroker] Re: Second thoughts on Static arrays --whole
>>>>>> problem set
>>>>>>
>>>>>>
>>>>>>> Tomasz,
>>>>>>>
>>>>>>> Thanks for your reply and explanation.  I have a couple other
>>>>>>> ideas,
>>>>>>> and then I'll resume my usual silence. :)
>>>>>>>
>>>>>>> The use of Foreign to import an array might be optimized by a
>>>>>>> quick
>>>>>>> comparison of the "signature" of the array with that of the
>>>>>>> current
>>>>>>> symbol.  If they are identical, then no translation would be
>>>>>>> necessary.  By the "signature", I mean something like a
>>>>>>> combination of
>>>>>>> the barcount, date/time range and timeframe, but since internal
>>>>>>> bars
>>>>>>> might be missing, there should be a way to normalize the data  
>>>>>>> and
>>>>>>> mark
>>>>>>> it as normalized. This might be more complex than it is worth.
>>>>>>>
>>>>>>> The additional "symbol" entries that ATC creates provide one  
>>>>>>> other
>>>>>>> advantage for users - these symbols can be viewed or removed
>>>>>>> manually.
>>>>>>> In contrast, runtime memory would tend to fill up with invisible
>>>>>>> static arrays requiring some other way to view and remove them.
>>>>>>>
>>>>>>> Daniel LaLiberte
>>>>>>>
>>>>>>>
>>>>>>> --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <groups@xxx>
>>>>>>> wrote:
>>>>>>>>
>>>>>>>> Daniel,
>>>>>>>>
>>>>>>>> ATC are NOT saved to disk unless cache needs to be flushed  
>>>>>>>> to the
>>>>>>>> disk,
>>>>>>>> so disk access has nothing to do with the problem.
>>>>>>>>
>>>>>>>> There are two areas that affect speed
>>>>>>>> 1) the most important - ATC by default requires ALL bars to be
>>>>>>>> used
>>>>>>>> so your formula is not executed in QuickAFL mode
>>>>>>>> 2) Foreign needs to be done to sychronize length/date stamps  
>>>>>>>> with
>>>>>>> currently selected symbol
>>>>>>>>
>>>>>>>> First point can be easily resolved by adding
>>>>>>>> SetBarsRequired at the END of the formula.
>>>>>>>> Doing so, overrides any automatically calculated bar  
>>>>>>>> requirements
>>>>>>>> and
>>>>>>>> you will be able to shorten the number of bars used and turn on
>>>>>>> QuickAFL
>>>>>>>> even if ATC is used.
>>>>>>>>
>>>>>>>> For example adding
>>>>>>>> SetBarsRequired( 1000, 0 );
>>>>>>>> at the end will make that the formula will require 1000 prior
>>>>>>>> bars
>>>>>>> and 0 future bars.
>>>>>>>>
>>>>>>>> This should give large boost in speed if you are using many
>>>>>>> thousands of bars.
>>>>>>>>
>>>>>>>> Second point is unevitable - see my previous response.
>>>>>>>>
>>>>>>>> Best regards,
>>>>>>>> Tomasz Janeczko
>>>>>>>> amibroker.com
>>>>>>>> ----- Original Message -----
>>>>>>>> From: "liberte721" <daniel.laliberte@xxx>
>>>>>>>> To: <amibroker@xxxxxxxxxxxxxxx>
>>>>>>>> Sent: Sunday, August 05, 2007 8:09 AM
>>>>>>>> Subject: [amibroker] Re: Second thoughts on Static arrays -- 
>>>>>>>> whole
>>>>>>> problem set
>>>>>>>>
>>>>>>>>
>>>>>>>>> Dennis,
>>>>>>>>>
>>>>>>>>> I believe what you are asking for is different from the ATC  
>>>>>>>>> and
>>>>>>>>> Foreign functionality since you do not want the persistent  
>>>>>>>>> disk
>>>>>>>>> storage that ATC provides.  I think that point might have been
>>>>>>>>> missed
>>>>>>>>> in previous discussions.   You said:
>>>>>>>>>
>>>>>>>>> "Because AFL is so fast working with arrays, It seems that it
>>>>>>>>> should
>>>>>>>>> be possible to just save an array in memory in a high speed  
>>>>>>>>> way,
>>>>>>>>> then
>>>>>>>>> recall it to repopulate the array instead of recalculate the
>>>>>>>>> array if
>>>>>>>>> the AFL determines that the data would not have changed since
>>>>>>>>> the last
>>>>>>>>> pass."
>>>>>>>>>
>>>>>>>>> So you want in-memory arrays that continue to exist outside  
>>>>>>>>> of a
>>>>>>>>> single AFL script execution, but are not persistent to  
>>>>>>>>> disk. In
>>>>>>>>> other
>>>>>>>>> words, if you close the AB session and reopen, then you do not
>>>>>>>>> expect
>>>>>>>>> your static arrays to have survived.  I think the term "static
>>>>>>>>> arrays"
>>>>>>>>> is appropriate, analogous to "static variables" that are also
>>>>>>>>> not
>>>>>>>>> persistent.  I'd be happier if static variables also could  
>>>>>>>>> just
>>>>>>>>> store
>>>>>>>>> arrays as well as non-array values.
>>>>>>>>>
>>>>>>>>> It does seem that this form of static array memory should be
>>>>>>>>> nearly as
>>>>>>>>> fast as the temporary arrays that live only within a single
>>>>>>>>> script
>>>>>>>>> execution.  They should merely occupy a different part of  
>>>>>>>>> the AB
>>>>>>>>> memory space.   I agree this would be very valuable for me as
>>>>>>>>> well,
>>>>>>>>> provided they were fast.
>>>>>>>>>
>>>>>>>>> Maybe ATC and Foreign functions effectively work this way  
>>>>>>>>> by not
>>>>>>>>> saving to disk unless you actually save them explicitly (or
>>>>>>>>> implicitly
>>>>>>>>> if you enable that).  If so, then it is not clear where the  
>>>>>>>>> time
>>>>>>>>> goes.
>>>>>>>>> Maybe there is a way to optimize the use of these arrays to
>>>>>>>>> avoid
>>>>>>>>> time-frame translation, for example.
>>>>>>>>>
>>>>>>>>> Daniel LaLiberte
>>>>>>>>>
>>>>>>>>> --- In amibroker@xxxxxxxxxxxxxxx, Dennis Brown <see3d@> wrote:
>>>>>>>>>>
>>>>>>>>>> Tomasz,
>>>>>>>>>>
>>>>>>>>>> First let me thank you for your patients in explaining  
>>>>>>>>>> this one
>>>>>>> more
>>>>>>>>>> time.  It makes a very good post for the benefit of others.
>>>>>>>>>> Yes, I am aware of everything you explained because you had
>>>>>>> explained
>>>>>>>>>> it before and I listened and tried out the ideas.
>>>>>>>>>>
>>>>>>>>>> I sent you a direct email through support #39911 on May 16  
>>>>>>>>>> for
>>>>>>> which
>>>>>>>>>> I received no reply (and none was technically required).  I
>>>>>>>>>> will
>>>>>>>>>> quote it:
>>>>>>>>>>
>>>>>>>>>> "I am taking this subject off the yahoo board now because I
>>>>>>>>>> don't
>>>>>>>>>> think anyone can help but you.
>>>>>>>>>> It can go back on the board when there is a solution that  
>>>>>>>>>> will
>>>>>>>>>> work.
>>>>>>>>>>
>>>>>>>>>> I took your advice and made all the changes you suggested to
>>>>>>> speed up
>>>>>>>>>> my AFL.
>>>>>>>>>> The functionality of the AFL is working nicely, behaving just
>>>>>>>>>> as it
>>>>>>>>>> should.
>>>>>>>>>>
>>>>>>>>>> However, instead of running 10 times faster, now it runs
>>>>>>>>>> twice as
>>>>>>>>>> slow as before.
>>>>>>>>>>
>>>>>>>>>> I have narrowed the problem down to the very thing that was
>>>>>>> supposed
>>>>>>>>>> to speed it up.
>>>>>>>>>>
>>>>>>>>>> 1.  When I use the ATC & Foreign functions the number of bars
>>>>>>>>>> required goes from 3518, 0 to 1000000, 1000000.
>>>>>>>>>> This  looks like it turns off fast AFL and slows all normal
>>>>>>>>>> processing by requiring all the bars. I have 77,000 data bars
>>>>>>>>>> total.
>>>>>>>>>> I do not know if this is intentional or a bug.
>>>>>>>>>>
>>>>>>>>>> 2.  The ATC function is slow, but I only do it once per  
>>>>>>>>>> bar (1
>>>>>>> minute).
>>>>>>>>>>
>>>>>>>>>> 3.  The foreign function which is done every time is slow  
>>>>>>>>>> also
>>>>>>>>>> (relative to normal arrays).
>>>>>>>>>> It takes .04 seconds each and I need dozens to replace the
>>>>>>>>>> missing
>>>>>>>>>> static array functionality.
>>>>>>>>>> Perhaps this is also due to the 1000000 bars.
>>>>>>>>>>
>>>>>>>>>> Without being able to have persistent arrays that are as
>>>>>>>>>> fast as
>>>>>>>>>> normal arrays I will not be able to achieve my trading goals
>>>>>>>>>> for
>>>>>>> very
>>>>>>>>>> many years until computers speed up by 10x.  That is the
>>>>>>>>>> same as
>>>>>>>>>> never to me.  I wish I could just declare some variables  
>>>>>>>>>> to be
>>>>>>>>>> Persistent or Static and be done with it.  It is easy for  
>>>>>>>>>> me to
>>>>>>> say,
>>>>>>>>>> but perhaps it is not so easy for you to do.  However, being
>>>>>>>>>> able
>>>>>>> to
>>>>>>>>>> successfully use the methods discussed on the board opens  
>>>>>>>>>> up a
>>>>>>> lot of
>>>>>>>>>> extra possibilities due to the extra speed possible with AFL.
>>>>>>>>>>
>>>>>>>>>> I appreciate any help you can give in this matter."
>>>>>>>>>>
>>>>>>>>>> As I want a workable solution to my problem and want to  
>>>>>>>>>> use AB
>>>>>>> for my
>>>>>>>>>> project (I would be trading this already using my AB system
>>>>>>>>>> if I
>>>>>>> had
>>>>>>>>>> a solution), I will state the fundamental problems I face
>>>>>>>>>> clearly
>>>>>>>>>> together here (instead of disjointed posts like before) and
>>>>>>>>>> then
>>>>>>>>>> perhaps a solution might occur to you or somebody else.   
>>>>>>>>>> Please
>>>>>>>>>> forgive the length and complexity of this post.
>>>>>>>>>>
>>>>>>>>>> Background:
>>>>>>>>>>
>>>>>>>>>> My trading system is very simple in principle.  AFL
>>>>>>>>>> calculates a
>>>>>>>>>> complex indicator, I draw manual trend lines, and I place
>>>>>>>>>> manual
>>>>>>>>>> trades on a single stock or ETF at a time.  It is day  
>>>>>>>>>> trading,
>>>>>>>>>> so I
>>>>>>>>>> only have a few seconds to trigger my trade when the  
>>>>>>>>>> conditions
>>>>>>>>>> are
>>>>>>>>>> right.  My AFL allows rapid manual selection of different
>>>>>>> timeframes
>>>>>>>>>> via a parameter, and selects the proper volume bar settings
>>>>>>>>>> dynamically for different ETFs or stocks.  The program
>>>>>>> automatically
>>>>>>>>>> runs through many timeframes to select trade trigger
>>>>>>>>>> possibilities
>>>>>>>>>> for me to consider.
>>>>>>>>>> 1. There is a heavy compute environment --several seconds of
>>>>>>>>>> AFL.
>>>>>>>>>> 2. The environment is highly interactive --drawing trend  
>>>>>>>>>> lines.
>>>>>>>>>> 3.  Seconds count for placing trades.
>>>>>>>>>>
>>>>>>>>>> First Problem set:
>>>>>>>>>>
>>>>>>>>>> Under heavy compute loads (when AFL time is greater than
>>>>>>>>>> refresh
>>>>>>>>>> rate), AB stops responding to the UI.
>>>>>>>>>>
>>>>>>>>>> Workarounds:
>>>>>>>>>>
>>>>>>>>>> The only way I can get some UI functionality back is to  
>>>>>>>>>> set the
>>>>>>>>>> refresh rate to one second longer than the AFL compute time.
>>>>>>> Then I
>>>>>>>>>> can get UI functionality back, but with many delays.
>>>>>>>>>> I also have a ParamToggle() to turn off most indicator
>>>>>>>>>> processing
>>>>>>> so
>>>>>>>>>> that I can interact with the UI better at times (but I  
>>>>>>>>>> lose my
>>>>>>>>>> indicator plot references).
>>>>>>>>>> This is a partially effective workaround that I could limp
>>>>>>>>>> along
>>>>>>> with.
>>>>>>>>>>
>>>>>>>>>> Requested solution:
>>>>>>>>>>
>>>>>>>>>> Realizing that the root problem is that the UI functions
>>>>>>>>>> only run
>>>>>>> (or
>>>>>>>>>> initiate) in between AFL passes, I looked for a way to do  
>>>>>>>>>> less
>>>>>>>>>> processing on each pass.  The AFL load could be much less
>>>>>>>>>> most of
>>>>>>> the
>>>>>>>>>> time because I only need to calculate everything when a new
>>>>>>>>>> bar is
>>>>>>>>>> added.
>>>>>>>>>> I thought of two possibilities:
>>>>>>>>>>
>>>>>>>>>> 1.  Ask for an AFL function that is essentially  
>>>>>>>>>> DoUserInterface
>>>>>>>>>> ().
>>>>>>>>>> Then put AFL into an infinite loop and put these commands at
>>>>>>>>>> appropriate places.  Since this is backwards from the way
>>>>>>>>>> the AFL
>>>>>>>>>> appears to work, I did not make this suggestion.
>>>>>>>>>>
>>>>>>>>>> 2.  Ask for arrays that keep their data between AFL  
>>>>>>>>>> passes.  I
>>>>>>> tried
>>>>>>>>>> using ATC for this.  It functioned like it was supposed  
>>>>>>>>>> to, but
>>>>>>>>>> was
>>>>>>>>>> too slow to be a practical solution.  I understand the reason
>>>>>>>>>> they
>>>>>>>>>> are so slow, and that is because they are a true static
>>>>>>>>>> permanent
>>>>>>>>>> array.  However, what I wanted was only for a normal array
>>>>>>>>>> to be
>>>>>>>>>> saved between passes.  They only need to be identified by  
>>>>>>>>>> which
>>>>>>> pane
>>>>>>>>>> they are associated with (could be part of the internal  
>>>>>>>>>> name).
>>>>>>> They
>>>>>>>>>> are only valid between new bars (same array size).   
>>>>>>>>>> Changes to
>>>>>>>>>> symbol, timeframe, parameters, etc., can be detected in  
>>>>>>>>>> the AFL
>>>>>>>>>> and
>>>>>>>>>> the array updated.  I know this can be done, because I did
>>>>>>>>>> it for
>>>>>>> the
>>>>>>>>>> ATC version I wrote and everything worked perfectly (just not
>>>>>>>>>> faster).  Because AFL is so fast working with arrays, It  
>>>>>>>>>> seems
>>>>>>>>>> that
>>>>>>>>>> it should be possible to just save an array in memory in a  
>>>>>>>>>> high
>>>>>>> speed
>>>>>>>>>> way, then recall it to repopulate the array instead of
>>>>>>>>>> recalculate
>>>>>>>>>> the array if the AFL determines that the data would not have
>>>>>>> changed
>>>>>>>>>> since the last pass.
>>>>>>>>>>
>>>>>>>>>> There may be another possible solution that I have not
>>>>>>>>>> thought of
>>>>>>> and
>>>>>>>>>> I would love to hear it.
>>>>>>>>>>
>>>>>>>>>> Second Problem set:
>>>>>>>>>>
>>>>>>>>>> Because this is a realtime trading system, decisions have  
>>>>>>>>>> to be
>>>>>>> made
>>>>>>>>>> from raw data which contains bad ticks that may fool the
>>>>>>>>>> system.
>>>>>>>>>> Volume bars are used in the system, and must be able to  
>>>>>>>>>> change
>>>>>>> volume
>>>>>>>>>> per bar on different AFL passes.
>>>>>>>>>> Built-in timeframe or volume settings do not allow the
>>>>>>> flexibility to
>>>>>>>>>> address these
>>>>>>>>>>
>>>>>>>>>> Workarounds:
>>>>>>>>>>
>>>>>>>>>> A tick database is too large to have enough history for the
>>>>>>>>>> indicators.  Running a database of 5 seconds for a basic 1
>>>>>>>>>> minute
>>>>>>> bar
>>>>>>>>>> (or equivalent for volume bars) allows for reasonably  
>>>>>>>>>> effective
>>>>>>>>>> bad
>>>>>>>>>> tick removal and volume bar generation.  History can be just
>>>>>>>>>> 60K
>>>>>>>>>> bars.  Bad ticks are removed and volume bar settings are
>>>>>>>>>> determined
>>>>>>>>>> using the 5 second bars.  Arrays are built up using
>>>>>>> TimeFrameSet() to
>>>>>>>>>> get the actual bars used for indicator calculations and graph
>>>>>>> plots.
>>>>>>>>>> This approach works really well, however, there is one big
>>>>>>>>>> problem
>>>>>>>>>> with it.
>>>>>>>>>>
>>>>>>>>>> Even though I can display all my price and indicators in the
>>>>>>>>>> timeframe I desire, I can not draw studies that align to that
>>>>>>>>>> timeframe.  All studies are drawn in the pane relative to 5
>>>>>>>>>> second
>>>>>>>>>> bars.  This workaround is not acceptable for trading.
>>>>>>>>>>
>>>>>>>>>> Requested solution:
>>>>>>>>>>
>>>>>>>>>> #1117 Make an AFL way to set the timeframe of the drawing
>>>>>>>>>> studies
>>>>>>> to
>>>>>>>>>> match the OHLC array created by TimeFrameSet().
>>>>>>>>>>
>>>>>>>>>> Of course implementing this has a general benefit of  
>>>>>>>>>> giving an
>>>>>>> almost
>>>>>>>>>> infinite number of time/volume/range bars settings via AFL  
>>>>>>>>>> and
>>>>>>>>>> parameters.
>>>>>>>>>>
>>>>>>>>>> Please consider the problems (not just proposed solutions)  
>>>>>>>>>> and
>>>>>>> advise
>>>>>>>>>> if other possibilities come to mind for solutions.
>>>>>>>>>>
>>>>>>>>>> Thank you very much for your patients and consideration,
>>>>>>>>>>
>>>>>>>>>> Dennis Brown
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Aug 4, 2007, at 6:16 AM, Tomasz Janeczko wrote:
>>>>>>>>>>
>>>>>>>>>>> Dennis,
>>>>>>>>>>>
>>>>>>>>>>> I explained it many times:
>>>>>>>>>>>
>>>>>>>>>>> 1. You can not simply "KEEP" the array from previous  
>>>>>>>>>>> execution
>>>>>>> and
>>>>>>>>>>> reference it directy becase:
>>>>>>>>>>> a) previous execution may be on different symbol/different
>>>>>>>>>>> time
>>>>>>>>>>> frame/different zoom level leading
>>>>>>>>>>> to DIFFERENT NUMBER OF ELEMENTS in the array and different
>>>>>>>>>>> TIMESTAMPS of array bars.
>>>>>>>>>>>
>>>>>>>>>>> 2. Because of (1) the only way to implement "static  
>>>>>>>>>>> array" is
>>>>>>>>>>> to:
>>>>>>>>>>> a) store not only array BUT also TIMESTAMPS with every bar
>>>>>>>>>>> b) during reading perform timestamp checking and
>>>>>>> synchronization so
>>>>>>>>>>> referenced array data is aligned
>>>>>>>>>>> with current execution data
>>>>>>>>>>>
>>>>>>>>>>> If those two were not implemented you would NOT be able  
>>>>>>>>>>> to use
>>>>>>>>>>> "static arrays" at all.
>>>>>>>>>>>
>>>>>>>>>>> 3. Functionality already exists
>>>>>>>>>>> a) Point 2a - storing arrays with timestamps is exactly what
>>>>>>>>>>> AddToComposite ALREADY DOES
>>>>>>>>>>> b) Point 2b - reading arrays with timestamps and aligning is
>>>>>>>>>>> exactly what Foreign ALREADY DOES
>>>>>>>>>>>
>>>>>>>>>>> 4. Implementing dedicated "static" array functions would
>>>>>>>>>>> a) give NO SPEED ADVANTAGE over AddToComposite/Foreign
>>>>>>>>>>> b) give only "the impression" that it is something else and
>>>>>>>>>>> "faster" than ATC/Foreign while it would
>>>>>>>>>>> be FALSE impression.
>>>>>>>>>>>
>>>>>>>>>>> Summary:
>>>>>>>>>>> a) functionality already exists
>>>>>>>>>>> b) no speed advantage over existing functionality
>>>>>>>>>>>
>>>>>>>>>>> So here are the functions you are asking for:
>>>>>>>>>>>
>>>>>>>>>>> function StaticVarArraySet( Varname, array )
>>>>>>>>>>> {
>>>>>>>>>>>   AddToComposite( array, "~SA_"+VarName, "C",
>>>>>>>>>>> atcFlagDefaults |
>>>>>>>>>>> atcFlagEnableInBacktest | atcFlagEnableInExplore |
>>>>>>>>>>> atcFlagEnableInIndicator | atcFlagEnableInPortfolio );
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> function StaticVarArrayGet( VarName );
>>>>>>>>>>> {
>>>>>>>>>>>  return Foreign( "~SA_"+VarName, "C" );
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> Best regards,
>>>>>>>>>>> Tomasz Janeczko
>>>>>>>>>>> amibroker.com
>>>>>>>>>>> ----- Original Message -----
>>>>>>>>>>> From: Dennis Brown
>>>>>>>>>>> To: amibroker@xxxxxxxxxxxxxxx
>>>>>>>>>>> Sent: Saturday, August 04, 2007 5:26 AM
>>>>>>>>>>> Subject: [amibroker] Second thoughts on Static arrays
>>>>>>>>>>>
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> The more I have thought about static arrays for my AFL  
>>>>>>>>>>> needs,
>>>>>>>>>>> the
>>>>>>>>>>> more I see that what I am looking for is a quite limited
>>>>>>>>>>> implementation.
>>>>>>>>>>>
>>>>>>>>>>> Static arrays would have low overhead and give the speed
>>>>>>>>>>> needed
>>>>>>>>>>> just like regular arrays.  The primary need is to avoid re-
>>>>>>>>>>> computing complex things all the time that only need to be
>>>>>>> computed
>>>>>>>>>>> under certain conditions or perhaps once per new bar.  This
>>>>>>> allows
>>>>>>>>>>> far richer AFLs to be developed for real time trading, while
>>>>>>>>>>> improving the responsiveness of the UI interaction under  
>>>>>>>>>>> heavy
>>>>>>>>>>> compute conditions.  The life of a static array is fleeting.
>>>>>>>>>>>
>>>>>>>>>>> Static arrays are not permanent like ATC, and do not have  
>>>>>>>>>>> the
>>>>>>>>>>> big
>>>>>>>>>>> overhead.  Static arrays as I envision them, would have  
>>>>>>>>>>> to be
>>>>>>>>>>> updated via the user AFL program whenever a change in
>>>>>>>>>>> environment
>>>>>>>>>>> caused the data to become invalid --like changing the
>>>>>>>>>>> symbol or
>>>>>>> the
>>>>>>>>>>> timeframe --or even adding a new bar (which changes the  
>>>>>>>>>>> array
>>>>>>>>>>> size).  Having static arrays like this would allow breaking
>>>>>>>>>>> the
>>>>>>> AFL
>>>>>>>>>>> into two parts --the fast part that needs to run for every
>>>>>>> second,
>>>>>>>>>>> and the part that needs to run once per compressed  
>>>>>>>>>>> timeframe,
>>>>>>>>>>> volume, or range bar.
>>>>>>>>>>>
>>>>>>>>>>> I am sure there are technical issues involved, or TJ would
>>>>>>>>>>> have
>>>>>>>>>>> already provided them since they are so useful for  
>>>>>>>>>>> speeding up
>>>>>>> AFL.
>>>>>>>>>>> First rule of making programs fast is pre-compute everything
>>>>>>>>>>> possible and not inside a loop.  AFL is one big loop.
>>>>>>>>>>>
>>>>>>>>>>> Perhaps what I am looking for are not technically "static"
>>>>>>>>>>> arrays
>>>>>>>>>>> in the normal sense.  Maybe I need to call them by a  
>>>>>>>>>>> different
>>>>>>> name
>>>>>>>>>>> for the suggestion box.  Perhaps there is an even easier
>>>>>>>>>>> way to
>>>>>>>>>>> address this need with a new AFL syntax:  keep(myArray);
>>>>>>>>>>>
>>>>>>>>>>> Comments anyone?
>>>>>>>>>>>
>>>>>>>>>>> Dennis Brown
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Please note that this group is for discussion between users
>>>>>>>>> only.
>>>>>>>>>
>>>>>>>>> To get support from AmiBroker please send an e-mail  
>>>>>>>>> directly to
>>>>>>>>> SUPPORT {at} amibroker.com
>>>>>>>>>
>>>>>>>>> For NEW RELEASE ANNOUNCEMENTS and other news always check
>>>>>>>>> DEVLOG:
>>>>>>>>> http://www.amibroker.com/devlog/
>>>>>>>>>
>>>>>>>>> For other support material please check also:
>>>>>>>>> http://www.amibroker.com/support.html
>>>>>>>>>
>>>>>>>>> Yahoo! Groups Links
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Please note that this group is for discussion between users  
>>>>>>> only.
>>>>>>>
>>>>>>> To get support from AmiBroker please send an e-mail directly to
>>>>>>> SUPPORT {at} amibroker.com
>>>>>>>
>>>>>>> For NEW RELEASE ANNOUNCEMENTS and other news always check  
>>>>>>> DEVLOG:
>>>>>>> http://www.amibroker.com/devlog/
>>>>>>>
>>>>>>> For other support material please check also:
>>>>>>> http://www.amibroker.com/support.html
>>>>>>>
>>>>>>> Yahoo! Groups Links
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> Please note that this group is for discussion between users only.
>>>>>>
>>>>>> To get support from AmiBroker please send an e-mail directly to
>>>>>> SUPPORT {at} amibroker.com
>>>>>>
>>>>>> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
>>>>>> http://www.amibroker.com/devlog/
>>>>>>
>>>>>> For other support material please check also:
>>>>>> http://www.amibroker.com/support.html
>>>>>>
>>>>>> Yahoo! Groups Links
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Please note that this group is for discussion between users only.
>>>>>
>>>>> To get support from AmiBroker please send an e-mail directly to
>>>>> SUPPORT {at} amibroker.com
>>>>>
>>>>> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
>>>>> http://www.amibroker.com/devlog/
>>>>>
>>>>> For other support material please check also:
>>>>> http://www.amibroker.com/support.html
>>>>>
>>>>> Yahoo! Groups Links
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> Please note that this group is for discussion between users only.
>>>>
>>>> To get support from AmiBroker please send an e-mail directly to
>>>> SUPPORT {at} amibroker.com
>>>>
>>>> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
>>>> http://www.amibroker.com/devlog/
>>>>
>>>> For other support material please check also:
>>>> http://www.amibroker.com/support.html
>>>>
>>>> Yahoo! Groups Links
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>> Please note that this group is for discussion between users only.
>>>
>>> To get support from AmiBroker please send an e-mail directly to
>>> SUPPORT {at} amibroker.com
>>>
>>> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
>>> http://www.amibroker.com/devlog/
>>>
>>> For other support material please check also:
>>> http://www.amibroker.com/support.html
>>>
>>> Yahoo! Groups Links
>>>
>>>
>>>
>>
>>
>>
>> Please note that this group is for discussion between users only.
>>
>> To get support from AmiBroker please send an e-mail directly to
>> SUPPORT {at} amibroker.com
>>
>> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
>> http://www.amibroker.com/devlog/
>>
>> For other support material please check also:
>> http://www.amibroker.com/support.html
>>
>> Yahoo! Groups Links
>>
>>
>>
>>
>>
>
>
> Please note that this group is for discussion between users only.
>
> To get support from AmiBroker please send an e-mail directly to
> SUPPORT {at} amibroker.com
>
> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> http://www.amibroker.com/devlog/
>
> For other support material please check also:
> http://www.amibroker.com/support.html
>
> Yahoo! Groups Links
>
>
>



Please note that this group is for discussion between users only.

To get support from AmiBroker please send an e-mail directly to 
SUPPORT {at} amibroker.com

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

For other support material please check also:
http://www.amibroker.com/support.html
 
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/