AutoTrading 500+ instruments

Quote from bs2167:

I don't want this to sound harsh because I really do think that tradelink looks interesting, but several times I've gone to the website and always end up bailing because the tutorial / intro material is kind of a clusterfck...it's circular in spots, looks like big chunks of data / pics are missing, and it just jumps all over the place. Am I missing the user guide somewhere that follows a logical / sequential order?

Similar experience here.

Also I don't need a "framework".

Off the shelf data connectors yes.

Someone else's idea of a platform, hell no.
 
I could trade hundreds of stocks out of the grid application in Tradestation 2000 ten years ago, maybe I had to omit the most heavily traded few, can't recall.. the DTN satellite feed was the thing, i'm not sure if any internet feed can equal that. You could probably do the same with the grid application in the current Tradestation software. I really don't think it's all that much about the processing if you leave out the very heavily traded stocks...
 
fully agree as well. Interesting concepts but the doc is almost constructed in a way to necessitate pricey consulting work. Lots of claims but when asking very detailed questions (example: Capabilities to sync tick price data of 500 symbols and replicate an index applying dynamic weights (market cap weights) forget about talking milliseconds. I tried it and it was too slow for me. Tradelink is great if you look to trade or back test couple names. I found the underlying framework a little clumsy in regards to delivering time-matched multi-symbol tick streams, especially via back tests.

Quote from Rationalize:

Similar experience here.

Also I don't need a "framework".

Off the shelf data connectors yes.

Someone else's idea of a platform, hell no.
 
sorry but what are you talking about? You measure nothing else in this code than the time it takes to build bars from randomly generated tick data. A maximum of 10,000 tick data points? That amounts to an average of about 1/25 of a day worth of fx tick data. If you could post more realistic throughput or latency results it would lend a lot more credibility to the product. Again, I laud the ideas and concepts, some of which I disagree but that is why I coded up my whole systematic architecture from scratch. I only say that the importance of documentations is hugely underestimated by developers and programmers. Realistic examples is another place where you can make your product shine rather than the time it takes to build bars.

To pick up from an earlier post of mine, can you maybe show how to merge tick data of 500 symbols whose tick data reside in 500 separate binary files and how to stream them in time stamped order to the back test engine? How fast is it? This would be a test that would make people want to work with your product and potentially hire you for additional consulting work. Nobody wants to pay for expensive programming hours in order to find out what the code is capable of.

Quote from tradelink:

from a cpu perspective this should not be difficult at all on almost any platform. The bigger issue will be whether your data feed can deliver 500 symbols of tickdata in low latency. With iqfeed or nanex you should be able to accomplish this though over decent internet pipe, or on most feeds via colocation.

here is a benchmark constructued using tradelink which demonstrates this. It computes averages at least 300 bars for 500 symbols, the average computation run for all symbols at each calc run is 8-12 milliseconds.

Even if you are doing something much more complicated it should be easy to keep it under 500ms (assuming you have low feed latency).

This is on a quad core 3ghz xeon with 3GB of ram, no threading is used. It will peak a single cpu and used no more than 0.9GB of ram when running.

Here is the benchmark measurement, constructed in tradelink :


symbols with bars: 500
bars per symbol: 1001
averages computed: 350999
average calc time (ms): 11.6068925666199


Code:
  [Test]
        public void Test1()
        {


            avgs.Clear();

            // get 500 symbols
            string[] syms = TradeLink.Research.RandomSymbol.GetSymbols(4, 500);
            // prepare to hold tickdata 
            GenericTracker<Tick[]> tickdata = new GenericTracker<Tick[]>(syms.Length);
            // process
            const int maxtickspersym = 10000;
            foreach (string sym in syms)
            {
                // get some tickdata
                var ticks = TradeLink.Research.RandomTicks.GenerateSymbol(sym, maxtickspersym);
                // timestamp it
                DateTime cur = DateTime.Now;
                int date = Util.ToTLDate(cur);
                for (int i = 0; i < ticks.Length; i++)
                {
                    ticks[i].date = date;
                    ticks[i].time = Util.ToTLTime(cur);
                    if ((i % 10) == 0)
                        cur = cur.AddMinutes(1);
                }
                
                tickdata.addindex(sym,ticks);
            }
            // prepare to track time per run
            List<double> runms = new List<double>(700);
            // prepare to hold bardata
            blt = new BarListTracker(BarInterval.Minute);
            blt.GotNewBar += new SymBarIntervalDelegate(blt_GotNewBar);
            // prepare to track time
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            // run our simulation
            string lastsym = string.Empty;
            for (int i = 0; i < maxtickspersym; i++)
            {
                // get current computation count
                int curavgcount = avgs.Count;
                // start timer
                sw.Restart();
                foreach (string sym in syms)
                {

                    // build bars
                    blt.newTick(tickdata[sym][i]);
                    lastsym = sym;
                }
                // stop
                sw.Stop();
                // if we did something, record time 
                if (avgs.Count>curavgcount)
                    runms.Add(sw.Elapsed.TotalMilliseconds);

            }

            // compute average run
            double avgrun = Calc.Avg(runms.ToArray());
            g.d("symbols with bars: " + blt.SymbolCount);
            g.d("bars per symbol: " + blt[lastsym].Count);
            g.d("averages computed: " + avgs.Count);
            g.d("average calc time (ms): " + avgrun);
            Assert.Greater(500,avgrun);
        }
        // save averages
        List<decimal> avgs = new List<decimal>();
        BarListTracker blt = new BarListTracker();
        
        void blt_GotNewBar(string symbol, int interval)
        {
            BarList bl = blt[symbol, interval];
            // if we have 300 bars compute averages
            if (bl.Has(300,(BarInterval)interval) && bl.RecentBar.isNew)
            {
                avgs.Add(Calc.Avg(bl.Close()));
            }
        }


you can construct the same benchmark using tradelink which is open source and works with 15+ brokers and data feeds.

google tradelink project or tradelink.org for more info.
 
Quote from apfx:

on a Core2, 2.1GHz, 8GB machine

This is 3 year old technology...
If you can't afford an off-the-shelf sub-$2,000 box that's 5 times faster...
Why should anyone take you seriously?
 
Quote from DeeDeeTwo:

This is 3 year old technology...
If you can't afford an off-the-shelf sub-$2,000 box that's 5 times faster...
Why should anyone take you seriously?

Why do people like you always have to hork up conversations?
 
Quote from apfx:

Does anyone know if any other retail platform besides Amibroker is capable of Autotrading 500+ symbols simultaneously .

"trade 500+ instruments" is kinda vague.

could be 50 stocks, 50 futures, 50 options, etc. etc.

could be that you want to place 500 orders at once

could be that you want to monitor 500+ names at a time

could be that you want to be in 500+ positions at a time...


What do you really want?
 
Back
Top