Jump to content
Tom Next - Daytrading Community

Programmierungsfragen- Amibroker II


oldschuren

Recommended Posts

Hallo,

bringe momentan meine Amibroker-Kenntnisse auf Fordermann. Da haben sich folgende Fragen aufgetan, bei denen mir auch google nicht weiter helfen konnte... :)

 

1.) Gibt es eine Möglichkeit, den Charttyp über AFL zu bestimmen? So was wie getChartType...

2.) dito nur in Richtung eingestelltem TimeFrame. Hintergrund ist ein Chart und TF-Abhängige Darstellung von Indis ect.

3.) Kennt jemand ein Script, mit dem ich die Kursdaten in einer Datenbank von einem TF in einen anderen konvertieren kann? Hab jetzt meine Datenbank mit MinutenDaten bis Anfang 2008 gefüllt. Insgesamt sind es ca 10 Werte. Dabei komme ich zum einen auf eine Datenbankgröße von etwa 800 MB und zum anderen ist das Charting spürbar träger geworden. Jetzt möchte ich die Daten als Bsp. der letzten drei Monate in M1 haben und den Rest in M15. Die Datenbank macht das mit. Jedoch wie konvertiere ich am sinnvollsten die Daten. Hat jemand einen Tipp?

 

Gruß

OS

Link to comment
Share on other sites

Hallo Oldschuren, kannst du 1) und 2) bitte etwas näher erläutern, vielleicht anhand eines Beispiels. Was du genau meinst, ist mir nicht ganz klar, sorry. Was genau meinst du mit "Charttyp bestimmen"? Willst du in 2) einen anderen TF im ausgewählten TF darstellen oder Indikatoren für einen anderen TF als den dargestellten?

 

Zu 3) würde ich dir vorschlagen, eine Archiv- und eine Realtime-Datenbank zu betreiben. Die Realtimedatenbank geht dann 2 Monate bis Vierteljahr zurück. Dass AB langsamer mit hoher Datenmenge umgeht, kann ich nicht wirklich bestätigen. Ich habe z.B. eine Futures Datenbank M1 mit 8 Werten die bis 1997 zurückgeht. Ist also auch ziemlich groß. Realtime habe ich nicht ausprobiert. Ich trenne das immer auf. Man benötigt halt für große Datenbanken ausreichend Arbeitsspeicher, den man heute hinterhergeschmissen bekommt, dann sollte es eigentlich wenig Probleme geben.

 

Aber um deine eigentliche Frage zu beantworten, da ich dir keine Vorschriften machen will.

 

Ja natürlich gibt es ein bzw zig Exportscripte und Scriptmöglichkeiten. Unten habe ich mal eins unter vielen Möglichkeiten eingefügt. Damit kannst du zuerst für einen gewählten Zeitraum 15 Minuten Historie exportieren, und danach exportierst du für den Rest bis zum aktuellsten Datum die 1-Minutenhistorie. Das geschieht über die Auto Analysis Umgebung. Betätigt werden muss "Scan". Das zu exportierende TF wird in den Settings des AA eingestellt. Der Ordner wird in Partition C:/ erstellt (kannst du natürlich im Script ändern). Zeitraum von/bis musst du zuerst auch auswählen im Script. Wenn du die beiden TFs exportiert hast, kannst du sie danach wieder importieren. .txt kannst du auch in .csv umändern. Wenn Werte im AA Fenster erscheinen, ist nach #ABExport fertig exportiert worden. Du musst also nichts weiter machen.

 

fmkdir( "C:\\#ABExport" );
Buy = ( (DateNum() >= 1101202) AND (DateNum() <= 1110127) );
for( i = 0; i < BarCount; i++ )
if( Buy[i] )
{
 fh = fopen( "C:\\#ABExport\\"+Name()+".txt", "a"); 
 if( fh ) 
  { 
    y = Year(); 
    m = Month(); 
    d = Day(); 
    r = Hour();
    e = Minute();
  
  for( i = 0; i < BarCount; i++ )
  if( Buy[i] )

  { 
     ds = StrFormat("%02.0f.%02.0f.%02.0f,", 
                    y[ i ], m[ i ], d[ i ] ); 
     fputs( ds, fh ); 
    
     ts = StrFormat("%02.0f:%02.0f,", 
                    r[ i ],e[ i ]); 
     fputs( ts, fh ); 

     qs = StrFormat("%.5f,%.5f,%.5f,%.5f,%.0f\n", 
                    O[ i ],H[ i ],L[ i ],C[ i ],V[ i ] ); 
     fputs( qs, fh );
  }
  fclose( fh );
  }
}

 

 

Buy = ( (DateNum() >= 1101202) AND (DateNum() <= 1110131) );

 

bedeutet, dass vom 02.12.10 bis 31.01.11 exportiert werrden soll. Vor dem Datum muss immer eine zusätzliche 1 stehen.

Also 1101202 -> auseinandergezwirbelt meint 1 (Zusatzeins) 10 (Jahr) 12 (Monat) 02 (Tag)

 

bei "qs = " lassen sich die Nachkommastellen angeben. Derzeit is .5 eingestellt, also 5 Nachkommastellen. Für das Volumen - %.0f = Null Nachkommastellen

  • Upvote 3
Link to comment
Share on other sites

Danke für das Script. Schaue ich mir mal an. Die Überlegungen mit den zwei Datenbanken hatte ich auch. Ist wohl sinnvoller eine Datenbank optimiert auf Geschwindigkeit zu fahren und eine mit langer M1-Historie für Backtesting. Die Datenmenge ist mir egal. Was sind schon 800MB. Obwohl meine SSL - auf dem das Betriebssystem installiert ist - ist mit 32GB nicht besonders groß. Da muß man sich schon Gedanken machen das man die nicht so schnell vollmüllt.

 

Jedenfalls ist mir dieses Laging erst mit der Datenbestand bis 2005 (eben nachgesehen) aufgefallen. Arbeit an einem ChartTemplate mit Bedingungen für unterschiedlich farbliche Bars. Die Bedingungen will ich aber Performance bedingt nur mit der internen Funktion IIF() realisieren. Indis mit Schleifen kommen ja später erfahrungsgemäß mehr als genug dazu. Mit jeder Schleifen singt aber die Performance. Da will ich dieses Basic-Template autark fertig programmieren. Was fürs Archiv... :)

 

In diesem Sinne brauche ich aber noch eine Prüfmöglichkeit, die mir die Unterscheidung zwischen den Charttypen (den ich selber einstelle) Line, Bar und Candle bietet und auch eine, die mir in AFL den TF (den ich im Chart einstelle) ermittelt. Abhängig vom Charttype sollen andere Farben für das Template verwendet werden und abhängig vom TF andere INDIS. So z.B. soll ein GrindINDI im M1 und M5 Bereich horizontal Linien mit Abstand von 10 Pips zeichnen. Auf Tageschart macht das wenig Sinn.

 

P.S.

Wenns fertig ist werde ich die Sachen hier präsentieren. Sind schon hübsche Sachen bei. Hab schon ein schickes LinienTemplate fertig. Na Vola, bist schon interessiert...? :)

Link to comment
Share on other sites

Ok, jetzt ist es klarer. Die Festlegung, wann dein Grid nicht gezeichnet werden soll, geht z.B. so:

 

Gridi = Interval();
if(Gridi >= 86400){                                    
Grid = 0;}   

 

86400 wären Sekunden, also Timeframe größergleich 1 Tag. Wenn du es nur bis zum 5er machen willst, dann if(Gridi > 300)

 

Die Auswahl von Line, Bar und Candle könntest du doch über Paramlist und die daraus folgende Unterscheidung machen, oder?

Link to comment
Share on other sites

Oldschuren, mir fiel gerade noch eine andere Funktion ein.

Versuche mal Getpricestyle()

 

Also in etwa wie

 

gps = GetPriceStyle(); 
choose = ParamToggle("Charttypabhängigkeit?", "Yes|No");
if(choose == 0){
if(gps == styleBar){
Blablabla; }
else if (gps == styleCandle){
Blablablubb; }
else if (gps == styleLine) {
blablaschubidu; }
}

Link to comment
Share on other sites

  • 2 weeks later...

3.) Kennt jemand ein Script, mit dem ich die Kursdaten in einer Datenbank von einem TF in einen anderen konvertieren kann? Hab jetzt meine Datenbank mit MinutenDaten bis Anfang 2008 gefüllt. Insgesamt sind es ca 10 Werte. Dabei komme ich zum einen auf eine Datenbankgröße von etwa 800 MB und zum anderen ist das Charting spürbar träger geworden. Jetzt möchte ich die Daten als Bsp. der letzten drei Monate in M1 haben und den Rest in M15. Die Datenbank macht das mit. Jedoch wie konvertiere ich am sinnvollsten die Daten. Hat jemand einen Tipp?

Ich habe die Datenbank kopiert und auf meine SSD gespeichert. Auf dieser liegt auch mein Betriebssystem. Die Zugriffszeiten sind ja hervorragend. Leider hat sich die Performance nicht besonders verbessert. Also muß es an was amibrokerinternes liegen. Zu meinen Rechner: Prozessor ist ein Intel Core 2 Duo E6750, der ja mit 2,6GHz nicht so langsam ist. Betriebssystem WinXP Pro 32bit mit 4 GB ARbeitsspeicher. Also stehen ca. 3,3 GB zu Verfügung. Trotzdem zickt Amibroker rum.

 

Die Datenbank wurde mit einer DatensatzMaximalgröße von -glaube ich - 500.000 Datensätze pro Wert aufgesetzt. Liegt evt. daran. Die Performanceverschlechterung macht sich z.B. beim öffnen und schließen der Datenbank bemerkbar. Mit "kleineren" DBs gibs keine spürbaren Verzögerungen. Mit der jetzigen schon. Ach das Charting ist betroffen. Wechsel der Basiswerte erfolgt deutlich träger und das setzten des CursorKreuzes von einer Kerze auf ein andere erfolgt auch verzögert, warum auch immer...

 

So, ich bleib dran. Als nächstes steht das verkleinern der DB an.

Link to comment
Share on other sites

Ich habe die Datenbank kopiert und auf meine SSD gespeichert. Auf dieser liegt auch mein Betriebssystem. Die Zugriffszeiten sind ja hervorragend. Leider hat sich die Performance nicht besonders verbessert. Also muß es an was amibrokerinternes liegen. Zu meinen Rechner: Prozessor ist ein Intel Core 2 Duo E6750, der ja mit 2,6GHz nicht so langsam ist. Betriebssystem WinXP Pro 32bit mit 4 GB ARbeitsspeicher. Also stehen ca. 3,3 GB zu Verfügung. Trotzdem zickt Amibroker rum.

 

Die Datenbank wurde mit einer DatensatzMaximalgröße von -glaube ich - 500.000 Datensätze pro Wert aufgesetzt. Liegt evt. daran. Die Performanceverschlechterung macht sich z.B. beim öffnen und schließen der Datenbank bemerkbar. Mit "kleineren" DBs gibs keine spürbaren Verzögerungen. Mit der jetzigen schon. Ach das Charting ist betroffen. Wechsel der Basiswerte erfolgt deutlich träger und das setzten des CursorKreuzes von einer Kerze auf ein andere erfolgt auch verzögert, warum auch immer...

 

So, ich bleib dran. Als nächstes steht das verkleinern der DB an.

 

Da stimmt irgendetwas bei dir nicht. Ich habe pro Underlying 1 min Daten, die schon mal 14 Jahre zurückgehen.

Bedeutet 900 - 1440 Datensätze pro Tag pro Underlying mal 250 Tage mal 14 gleich 3 - 5 Mill. pro Datensatz.

Nehmen wir das Mittel 4 Mill mal 6 Underlyings gleich 24 Mill Datzensätze mit dieser Datenmenge. Dann habe ich noch Underlyings in der Datenbank, deren Historie nicht so weit zurückgehen.

 

Trotz der Datenmengen läßt sich sehr gut arbeiten. Ich verwende die Final 5.3 nicht die Beta.

Dass bei dir was nicht stimmt, zeigt mir deine Beschreibung vom Setzen des Cursorkreuzes. Du meinst den Button Crosshair, sicherlich? Funktioniert bei mir flüssig wie sonst bei kleinen Datenbanken auch. Dass beim erstmaligen Laden eines Underlyings minimal langsamer aufgerufen wird, ist zu verstehen. Ich weiß nicht, wie lange es bei dir dauert. Bei mir sind es beim ersten Mal so ca 1 - 2 Sekunden, wenn überhaupt. Beim zweiten Mal aufrufen ist es dann schneller im Millisekundenbereich.

 

Auch der Scrollvorgang im Chart funktioniert trotz der Größe flüssig.

 

Was hast du in den Database Settings bei Number of Bars eingestellt? Desweiteren, wenn Berechnungen von Indikatoren im Spiel sind, gibt es die Funktion Setbarsrequired für Skripte und DLLs. Schau mal in der Hilfe.

Link to comment
Share on other sites

Könnte auch an IB liegen. In der Dokumentation vom IB-Plugin steht ja folgendes:

 

INTERACTIVE BROKERS DATA PLUGIN

AmiBroker Now supports Real-Time streaming quotes from Interactive Brokers TWS

 

FEATURES SUMMARY:

 

supports upto 100 streaming symbols in real time (equal to IB TWS limit)

supports all base time intervals: 15-,5-,1-minute, 15-,5-second, tick

automatic connection (no need to manually "accept incoming connection" in TWS)

supports upto 30 (180*) DAYS intraday data BACKFILL in 1-minute bar interval

upto 2000 bars backfill using 1-sec/5-sec/15-second bar intervals

works on all 32-bit Windows versions

 

* 180 days backfill may be slow due to IB throttling the backfill requests

NOTE ABOUT IB/TWS PERFORMANCE:

 

IB / TWS backfill is very limited (1 symbol at a time) and VERY VERY slow. IB throttles backfills and you can not send more than 60 requests within 5 minutes (it equals to one month of 1-minute data for 12 symbols only).

 

For much faster backfills we recommend eSignal or IQFeed.

 

Ist die Frage wie das mit den 180 Tagen zu verstehen ist. Bei mir hat er beim ersten mal nicht 180 Tag in M1 gezogen...

Link to comment
Share on other sites

Du brauchst doch nicht jedes Mal 180 Tage laden. Schau mal recht's unten im Connect Bereich. Mach dort mal einen Rechtsklick, und dann kannst du die Backfillmenge auswählen. Wenn du bereits 180 Tage geladen hast, reicht doch für zukünftiges Nachladen 1 Tag aus, wenn du einen Tag den PC ausgeschalten hattest. 180 Tage gehen bei mir auch problemlos. Wenn man viele Underlyings hat, kann der Download schon mal etwas dauern. Wenn es lädt geht das Connect Zeichen auf Farbe Aqua über, oder was auch immer für eine Farbe es ist. Wenn es fertig geladen hat, geht es auf Grün zurück.

Naja und wenn die 180 Tage drinnen sind, schaltet man wie gesagt runter.

 

Du hattest doch aber oben geschrieben, dass du eine Data base mit Daten bis 2008 hast. Was hat das denn mit IB zu tun?

Link to comment
Share on other sites

Du hattest doch aber oben geschrieben, dass du eine Data base mit Daten bis 2008 hast. Was hat das denn mit IB zu tun?

Die Daten kommen vorwiegend aus einer externen Quelle. Link kann ich raussuchen. Die daten habe ich über den ASCII-Manager eigelesen.

 

Du brauchst doch nicht jedes Mal 180 Tage laden. Schau mal recht's unten im Connect Bereich. Mach dort mal einen Rechtsklick, und dann kannst du die Backfillmenge auswählen.

Man lernt nicht aus. Was hat eigentlich die Prozentangabe zu bedeuten? Bei mir Stand zum Anfang 20-30 Prozent. Jetzt sind die Werte dreistellig...

 

Beim Starten der TWS-Amibroker-Combo wird bei mir nur das gerade aktuelle Pair geladen. Kann man einstellen, dass alle Pairs nacheinader geladen werden? Muß jedes einzelne Pair aufrufen und warten, bis der Stauts von Aqua(Marin) :) auf Grün wechselt.

Link to comment
Share on other sites

Um mehrere Paare gleichzeitig zu laden könntest du das verwenden http://www.tom-next.com/community/topic/58207-marktuberlick-in-einem-fenster/ oder es so machen

 

_SECTION_BEGIN("UpdateTickers");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorGrey40 ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() ); 

AUDUSD = Foreign ("AUD.USD-IDEALPRO-CASH", "Close");
AUDJPY = Foreign ("AUD.JPY-IDEALPRO-CASH", "Close");
CHFJPY = Foreign ("CHF.JPY-IDEALPRO-CASH", "Close");
EURAUD = Foreign ("EUR.AUD-IDEALPRO-CASH", "Close");
EURCHF = Foreign ("EUR.CHF-IDEALPRO-CASH", "Close");
EURCAD = Foreign ("EUR.CAD-IDEALPRO-CASH", "Close");
EURGBP = Foreign ("EUR.GBP-IDEALPRO-CASH", "Close");
EURJPY = Foreign ("EUR.JPY-IDEALPRO-CASH", "Close");
EURUSD = Foreign ("EUR.USD-IDEALPRO-CASH", "Close");
GBPUSD = Foreign ("GBP.USD-IDEALPRO-CASH", "Close");
GBPJPY = Foreign ("GBP.JPY-IDEALPRO-CASH", "Close");
GBPCHF = Foreign ("GBP.CHF-IDEALPRO-CASH", "Close");
NZDJPY = Foreign ("NZD.JPY-IDEALPRO-CASH", "Close");
NZDUSD = Foreign ("NZD.USD-IDEALPRO-CASH", "Close");
USDCAD = Foreign ("USD.CAD-IDEALPRO-CASH", "Close");
USDCHF = Foreign ("USD.CHF-IDEALPRO-CASH", "Close");
USDJPY = Foreign ("USD.JPY-IDEALPRO-CASH", "Close");
_SECTION_END();

 

Zu deiner anderen Sache. Die Prozente zeigen Zitat "AmiBroker % load is a measure of responsiveness."

Hast du viele Indikatoren geladen? Müssen für diese Indikatoren zeitintensive Berechnungen durchgeführt werden? Eventuell Berechnungen für viele Bars zurück, siehe Setbarsrequired().

 

Du kannst auch mal einen Rechtsklick im Chart machen und Edit Formula auswählen. Im Editor gehst du dann zu Tools>Code Check & Profile. Dort siehst du dann die Ladezeiten für die jeweiligen Funktionen. Wenn dort ab zweistellige MS (Millisekunden) aufgelistet sind pro Funktion, dann ist der Code eventuell nicht optimal programmiert.

 

Funktionen, arrays die mehrmals genutzt werden, am besten immer durch Variablen ersetzen. Das schraubt die ms mit herunter und macht den Code schneller.

 

z.B. MyClose = Close;

 

Oder Day0 = Day();

 

usw usf.

  • Upvote 1
Link to comment
Share on other sites

Bei mir Stand zum Anfang 20-30 Prozent. Jetzt sind die Werte dreistellig...

 

Was heißt am Anfang? Heute oder früher? Hattest du die selben Profiles? Oder ist was dazugekommen? War es eine kleinere Datenbank?

 

Für Realtime würde ich wie schon erwähnt immer eine kleinere Datenbank (Monate) verwenden und keine, die mit Minuten- oder Tickdaten z.B. 5 Jahre zurückgeht.

Link to comment
Share on other sites

:) ich habs eingrenzen können. Lag an meinem Layout. Ich verwende floating Charts und habe einen weiten Monitor mit zugepflastert. Hauptchart und zusätzlich vier floating Charts. Die habe ich per SymbolLink auf den Hauptchart verlinkt. Da ja jetzt der Fokus ebenfalls auf den anderen Charts - abhängig vom Hauptchart - verändert werden muß, kommt es zu diesen Verzögerungen... :) Schade, Schade... Muß ich wohl mit leben...

 

Danke joshsmi für Deine Typs. Die werde ich trotzdem durchgehen... :)

Link to comment
Share on other sites

  • 2 weeks later...
Kann es sein, dass die H2 Kerzen von 7-9 Uhr , 9-11 Uhr ect. abgesteckt sind? Spiele gerade mit Amibroker rum. Da ist mir das aufgefallen. Liegt das an der Zeitverschiebung? Da manchmal scharfe Richtungswechsel beim Übergang einer H2 zur nächsten auftreten können, sollte man sich vielleicht darüber Gedanken machen.
Link to comment
Share on other sites

Die Frage ist aber, was ist allgemein gültig? Sonst währe ja ein ZweiStundenRasta für den Arsch. Sagen wir die aktive FX-Zeit ist von 8:00 bis 12:00. Jedoch von 13:00 bis XXX??? (US-Börsen sind zwar bis 22:00 offen, bei FX ist aber nix mehr großartig los, jedenfalls EURO und Cable)

 

Überlegung:

Startzeit 8:00 10:00 würde Vormittag Sinn machen...

Startzeit 13:00 15:00 würde Nachmittag Sinn machen...

Link to comment
Share on other sites

Die Frage ist aber, was ist allgemein gültig? Sonst währe ja ein ZweiStundenRasta für den Ar...

Ich denke es gibt kein allgemein gültig.

Das ist der gleiche Unterschied, als wenn der eine Scalper den 144iger Tickchart nutzt und der andere den 277iger, beide

kommen zu anderen Einstiegen. Manchmal hat der eine bessere Ergebnisse als der andere - und umgekehrt.

 

Eigentlich verschieben sich zu den Einstiegen dann logischerweise auch die Stops,

das muss aber nicht zwingend heißen das der größere TF immer den teueren Stop beinhaltet, das ist eher

vom Chartbild und dessen Marken abhängig.

So wie du ja auch unterschiedliche Einstiege und Stops, bei unterschiedlichen Box Größen im P&F Chart hast.

 

Überlegung:

Startzeit 8:00 10:00 würde Vormittag Sinn machen...

Startzeit 13:00 15:00 würde Nachmittag Sinn machen...

 

Antesten ist diese Idee schon wert, habe da lange mit rumexperimentiert.

Du wirst nach einiger Zeit dann vllt. wie ich feststellen, das sich das ganze in den Zeitrahmen aber irgendwann verschiebt,

dann funktioniert der H3 oder H5 Chart auf einmal besser als der ehemals favorisierte H2.

Zumindest ist es das, was ich da subjektiv so empfunden habe.

Link to comment
Share on other sites

Verstehe ich jetzt nicht. Du wolltest doch wie auch im Trader's Talk Thread zu lesen ist, gerade Kerzen haben, also von 00:00-02:00, 02:00-04:00, .... usw. Desweiteren hast du in den Data Base Settings 24h eingestellt. Die Einstellung bei Start gibt dann nur an, ob mit geraden oder ungeraden hantiert werden soll. Du kannst dort statt 08:00 auch 06:00, 04:00, 00:00, 12:00, 10:00 etc einstellen, es wird das selbe Ergebnis herauskommen, nämlich 2h-Kerzen mit geraden Uhrzeiten.

 

Ist das zweite Posting jetzt ein Evolutionsgedanke des ersten Problems? Du möchtest gerade Kerzen bis 12:00 z.B. und danach ungerade? Wie soll das gehen? Du hättest ja dann dazwischen auch eine 1h Kerze als Übergang. Oder willst du einen Autoumschalter, der zwischen geraden und ungeraden Kerzen schaltet?

Link to comment
Share on other sites

Vielleicht schauen wir doch alle auf den selben Chart (...oder in etwa).

Denke schon - nur das sich Einstiege und Stops verschieben,

die projizierten Ziele ebenfalls.

 

Ist das zweite Posting jetzt ein Evolutionsgedanke des ersten Problems ?

Schöner Satz :laugh: habe ich gleich festgehalten !

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...