Amibroker AFL
-
-
-
Funktioniert:)
Leider springen einige Charts immer wieder auf EURUSD zurück, zwar nur jeweils für eine Sekunde, dann wieder normal, ist trotzdem nicht ideal.
Ich habe hierbei extra verschiede Underlyings benutzt, als im Hauptfenster, sodass ich das später unabhängiger benutzen kann oder ist das ein Muss? -
-
So ist es.
Plot (Close,.....) ist dort fehl am Platz. Dafür gibt's auch ein Leckerli.
Habe den AFL aus Posting #206 etwas optimiert. Er ist jetzt ca 4x-5x schneller als vorher. Habe noch 3 Param Optionen hinzugefügt, somit kann er als Template für jeden Ticker dienen. RestorePriceArrays() muss nicht unbedingt eingefügt werden, wenn nur ein Ticker pro Pane verwendet wird. Außerdem können so einfach zusätzliche Sachen hinzugefügt werden, die auf den jeweiligen Ticker angewendet werden. -
-
Noch ein Tipp. Wie effizient man programmiert hat, kann man im Editor unter der Option "Tools -> Code Check & Profile" nachschauen.
Rechenzeitlastiger als andere Funktionen sind z.B. so Sachen wie Foreign, Timeframeset, Timeframegetprice, .... etc.
Vermeide auch ständige Neuberechnungen! Z.B. nicht zigfach etwas wie z.B. ATR(10) etc verwenden (vor allem in Loops). Stattdessen speichere den Wert in einer Variable und verweise auf diese, wenn sie gebraucht wird.
Bsp.
statt diesem Code
schreibe es z.B. so, da effizienter
Wie du siehst, ist der Aufruf für den ATR nicht mehr 3 Mal sondern nur mehr 1 Mal, obwohl dreifach verwendet. Versuche also, die Calls so niedrig wie möglich zu halten.
Auch nichts in Loops reinsetzen, dass dort nicht benötigt wird. Weitere Regel, vermeide Loops für alles, das auch mit Arrays gemacht werden kann.
Hier sind noch ein paar Bsp. Tipps.
amibroker.com/guide/x_performance.html -
Vikke schrieb:
Seltsam, ich bekomme gar nicht mehr die Quote-Einfügen Option angezeigt??
Grund: abgeschaltetes Java Script im Opera, gehe ich mal scharf davon aus."I'm a trader, baby. So, why don't you kill me?!" -
Das hat nix mit Restorepricearrays oder ob da Realtime anliegt oder nicht zu tun. Ich habe den Fehler schon gesehen. Nebenbei... du brauchst auch nicht dutzendfach Foreign zu verwenden, wenn in einem Chart Pane nur ein fremdes Underlying ist. Einmal Setforeign für ein Chart Pane reicht aus. Kostet sonst nur unnötige Rechenzeit. Auch benötigst du Foreign oder Setforeign im ersten Chart Pane nicht, wenn das Paar mit dem angewählten Hauptpaar übereinstimmt!
Aber jetzt suche erst mal den Fehler. Ich gebe dir einen Tipp. Es liegt an einem Plot. Denk mal scharf nach, wenn der Hefe verflogen ist. Es ist wiederum kein Bug sondern ein Schusselfehler."I'm a trader, baby. So, why don't you kill me?!" -
-
Hab es jetzt nochmals geändert:
_SECTION_BEGIN("trashForeign");
SetChartOptions(0, chartShowArrows | chartShowDates);
Ticker = ParamStr("Symbol", Name() );
SetForeign(Ticker);
_N(Title = StrFormat(Ticker + " - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) Vol " +
WriteVal( V, 1.0 ) +" {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 )) ));
RestorePriceArrays();
PlotForeign( Ticker, "", ParamColor("Color", colorGrey50 ), ParamStyle("Style",styleCandle, maskAll) );
_SECTION_END();
_SECTION_BEGIN("Grid_adv");
//by trash@candletalk
tick = Param("Tick", 0.0001, 0.0001, 0.01, 0.01);
tick = IIf(StrRight(Name(),3) == "JPY" OR StrLeft(Name(),3) == "XAG", 0.01, 0.0001); //alternative
space = Param("Grid Spacing", 50, 5, 100, 1); //Input options
per = Param("Period", 20, 1, 50, 1);
start = Param("Starting Point", 0, -100, 100, 1);
wd = ParamToggle("Plot Grid for current day only?","Yes|No");
gc = ParamColor("Grid Color", colorGrey40);
Gridi = Interval();
ssp = Foreign(ticker, "C") / tick; //Grid start calculations
ssp = ssp - ssp % 100 + start;
ssp = ssp * tick;
for(i = 0; i < per; i++) { //Loop starting
Temp1 = i * space * tick; //How many up and down grid lines
Temp2 = -i * space * tick;
UGrid = LastValue(ssp) + Temp1;
DGrid = LastValue(ssp) + Temp2;
if(wd == 0){ //Plot grid for current day only
Day0 = Day();
UGrid = UGrid * (Day0 == LastValue(Day0));
UGrid = IIf(UGrid, UGrid, Null);
DGrid = DGrid * (Day0 == LastValue(Day0));
DGrid = IIf(DGrid, DGrid, Null);}
if (tick == 0.0001){ //Grid text conditions (depending on tick)
p1 = StrRight( NumToStr(UGrid, 4.4 ), 2);
p2 = StrRight( NumToStr(DGrid, 4.4 ), 2); }
else if (tick == 0.01) {
p1 = StrRight( NumToStr(UGrid * tick, 4.4 ), 2);
p2 = StrRight( NumToStr(DGrid * tick, 4.4 ), 2); }
else if (tick == 1) {
p1 = StrRight( NumToStr(UGrid, 4.0 ), 2);
p2 = StrRight( NumToStr(DGrid, 4.0 ), 2); }
/*
if(Gridi >= 86400){ //don't plot grid in daily charts
Ugrid = 0;
DGrid = 0;}
*/
PlotText(p1, BarCount+15, LastValue(UGrid)-tick, gc); //Plot text
PlotText(p2, BarCount+15, LastValue(DGrid)-tick, gc);
Plot(UGrid, "", GC, styleDashed | styleNoRescale| styleNoLabel);//Plot Grid
Plot(DGrid, "", GC, styleDashed | styleNoRescale| styleNoLabel);
} //Loop ending
_SECTION_END();
_SECTION_BEGIN( "daily high low" );
Plot(Close, "", colorDefault, GetPriceStyle());
Daba = Param("Days Back", 1, 1, 10,1);
Ticker = ParamStr("Symbol", Name() );
SetForeign(Ticker);
per = inDaily;
H0 = SelectedValue(TimeFrameGetPrice("H", per, 0));
L0 = SelectedValue(TimeFrameGetPrice("L", per, 0));
H1 = SelectedValue(TimeFrameGetPrice("H", per, -Daba));
L1 = SelectedValue(TimeFrameGetPrice("L", per, -Daba));
Day0 = Day();
H0 = H0 * (Day0 == LastValue(Day0));
H0 = IIf(H0, H0, Null);
L0 = L0 * (Day0 == LastValue(Day0));
L0 = IIf(L0, L0, Null);
H1 = H1 * (Day0 == LastValue(Day0));
H1 = IIf(H1, H1, Null);
L1 = L1 * (Day0 == LastValue(Day0));
L1 = IIf(L1, L1, Null);
if(Interval() >= 86400){ //don't plot in daily
H0 = 0;
L0 = 0;
L1 = 0;
H1 = 0;}
else{
Plot(H0, "High of today", colorGreen, styleDashed|styleNoRescale);
Plot(L0, "Low of today", colorRed, styleDashed|styleNoRescale);
Plot(H1, "High of prev day", colorBlue, styleDashed|styleNoRescale);
Plot(L1, "Low of prev day", colorBlue, styleDashed|styleNoRescale);}
RestorePriceArrays();
_SECTION_END();
_SECTION_BEGIN("Bollinger Bands");
P = ParamField("Price field",-1);
Periods = Param("Periods", 15, 2, 300, 1 );
Ticker = ParamStr("Symbol", Name() );
SetForeign(Ticker);
Width = Param("Width", 2, 0, 10, 0.05 );
Color = ParamColor("Color", colorCycle );
Style = ParamStyle("Style");
Plot( BBandTop( P, Periods, Width ), "BBTop" + _PARAM_VALUES(), Color, Style );
Plot( BBandBot( P, Periods, Width ), "BBBot" + _PARAM_VALUES(), Color, Style );
RestorePriceArrays();
_SECTION_END();
Fettgedrucktes ist neu hinzu gekommen. -
-
Den Code habe ich jetzt pro Pane:
_SECTION_BEGIN("trashForeign");
SetChartOptions(0, chartShowArrows | chartShowDates);
Ticker = ParamStr("Symbol", Name() );
SetForeign(Ticker);
_N(Title = StrFormat(Ticker + " - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) Vol " +
WriteVal( V, 1.0 ) +" {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 )) ));
PlotForeign( Ticker, "", ParamColor("Color", colorGrey50 ), ParamStyle("Style",styleCandle, maskAll) );
_SECTION_END();
_SECTION_BEGIN("Grid_adv");
//by trash@candletalk
tick = Param("Tick", 0.0001, 0.0001, 0.01, 0.01);
tick = IIf(StrRight(Name(),3) == "JPY" OR StrLeft(Name(),3) == "XAG", 0.01, 0.0001); //alternative
space = Param("Grid Spacing", 50, 5, 100, 1); //Input options
per = Param("Period", 20, 1, 50, 1);
start = Param("Starting Point", 0, -100, 100, 1);
wd = ParamToggle("Plot Grid for current day only?","Yes|No");
gc = ParamColor("Grid Color", colorGrey40);
Gridi = Interval();
ssp = C / tick; //Grid start calculations
ssp = ssp - ssp % 100 + start;
ssp = ssp * tick;
for(i = 0; i < per; i++) { //Loop starting
Temp1 = i * space * tick; //How many up and down grid lines
Temp2 = -i * space * tick;
UGrid = LastValue(ssp) + Temp1;
DGrid = LastValue(ssp) + Temp2;
if(wd == 0){ //Plot grid for current day only
Day0 = Day();
UGrid = UGrid * (Day0 == LastValue(Day0));
UGrid = IIf(UGrid, UGrid, Null);
DGrid = DGrid * (Day0 == LastValue(Day0));
DGrid = IIf(DGrid, DGrid, Null);}
if (tick == 0.0001){ //Grid text conditions (depending on tick)
p1 = StrRight( NumToStr(UGrid, 4.4 ), 2);
p2 = StrRight( NumToStr(DGrid, 4.4 ), 2); }
else if (tick == 0.01) {
p1 = StrRight( NumToStr(UGrid * tick, 4.4 ), 2);
p2 = StrRight( NumToStr(DGrid * tick, 4.4 ), 2); }
else if (tick == 1) {
p1 = StrRight( NumToStr(UGrid, 4.0 ), 2);
p2 = StrRight( NumToStr(DGrid, 4.0 ), 2); }
/*
if(Gridi >= 86400){ //don't plot grid in daily charts
Ugrid = 0;
DGrid = 0;}
*/
PlotText(p1, BarCount+15, LastValue(UGrid)-tick, gc); //Plot text
PlotText(p2, BarCount+15, LastValue(DGrid)-tick, gc);
Plot(UGrid, "", GC, styleDashed | styleNoRescale| styleNoLabel);//Plot Grid
Plot(DGrid, "", GC, styleDashed | styleNoRescale| styleNoLabel);
} //Loop ending
_SECTION_END();
_SECTION_BEGIN( "daily high low" );
Plot(Close, "", colorDefault, GetPriceStyle());
Daba = Param("Days Back", 1, 1, 10,1);
per = inDaily;
H0 = SelectedValue(TimeFrameGetPrice("H", per, 0));
L0 = SelectedValue(TimeFrameGetPrice("L", per, 0));
H1 = SelectedValue(TimeFrameGetPrice("H", per, -Daba));
L1 = SelectedValue(TimeFrameGetPrice("L", per, -Daba));
Day0 = Day();
H0 = H0 * (Day0 == LastValue(Day0));
H0 = IIf(H0, H0, Null);
L0 = L0 * (Day0 == LastValue(Day0));
L0 = IIf(L0, L0, Null);
H1 = H1 * (Day0 == LastValue(Day0));
H1 = IIf(H1, H1, Null);
L1 = L1 * (Day0 == LastValue(Day0));
L1 = IIf(L1, L1, Null);
if(Interval() >= 86400){ //don't plot in daily
H0 = 0;
Seltsam, ich bekomme gar nicht mehr die Quote-Einfügen Option angezeigt?? -
-
Das Beste ist, du probierst es erst mal allein. Nur so lernt man.
Unten siehst du mal ein Bsp mit Indikatoren in Extrafenstern. EURUSD ist als Hauptunderlying eingestellt. Für die Fenster 1 und 2 waren keine Änderungen nötig, normaler Price AFL und Standard ADX AFL. In Fenster 3 und 4 befindet sich das Bsp. Foreign-Paar. Orange markiert sind die Änderungen die im Vergleich zum vorherigen AFL vorgenommen wurden. Im 3. Fenster wurde für den Grid AFL aus diesem Thread Close durch Foreign ("C" in dieser Funktion steht für Close, nur dieses Mal für den des fremden Tickers) ersetzt, sowie der Preis AFl aus Posting 191 verwendet. Für die Foreign ADX Darstellung mußte der Standard ADX AFL aus Fenster 2, wie zu sehen, so umgeändert werden, dass er auf den Foreign Ticker wie demjenigen aus Fenster 3 angewendet werden kann oder einen beliebig anderen."I'm a trader, baby. So, why don't you kill me?!" -
Vikke schrieb:
... wenn ich in diesen 3 übereinander angeordneten Charts in einem Fenster jeweils pro Chart mehrere Indikatoren reinpacke, der einzelne Chart anfängt sich zu spreizen zwischen 2 Quotierungen.
Stelle mal bitte die kompletten Codes der einzelnen Fenster rein (speichere jeden einzelnen des jeweiligen Fensters aus dem Editor als AFL ab und lade es als zip hoch), dann schaue ich mal kurz durch, was du im Code verändern musst. Sollte kein Act sein."I'm a trader, baby. So, why don't you kill me?!" -
Ich nehm alles zurück, der Bug lag eindeutig bei mir, ich habe die Anleitung tatsächlich noch nicht durch:)
Es waren nicht mehrere Symbole in einem Chart gewollt, sondern, wie Du es anfangs mit deinem Foreign Chart schon dargestellt hast, mehrere Charts in einem Fenster. Das Problem ist, wie Du schon richtig vermutest hast, wohl ein Anwenderfehler mangels Programmwissens, da wenn ich in diesen 3 übereinander angeordneten Charts in einem Fenster jeweils pro Chart mehrere Indikatoren reinpacke, der einzelne Chart anfängt sich zu spreizen zwischen 2 Quotierungen. -
Vikke schrieb:
Trotzdem, da hat AB noch Nachholbedarf:)
Worin?
Vikke schrieb:
Bekomme diese Bugs wie unten auf dem Bild, wenn ich zB bei allen 4 Charts dann auch jeweils alle Indikatoren reinlade. Mehr wir 2 Grid_adv und er zieht mir den Chart nach oben oder stellt den Grid gar nicht erst dar.
Das ist kein Bug sondern ein Anwendungsfehler von dir! Du hast einfach noch nicht die Anleitung komplett gelesen/durchgearbeitet. Desweiteren hast du unten mein Posting nicht genau gelesen.
Falls du aber zwei Paare übelagern willst in einem Chart statt jeweils untereinander, dann musst du zusätzlich für das zu überlagernde Underlying styleOwnScale verwenden. Ist doch klar, dass es stark gestaucht wird, wenn ein Wert 80 hat und ein anderer 1, .... Oder nicht? Jedenfalls sorgfältig mit dem Wort Bug umgehen. AB hat keine Bugs in den Finals, auch die Betas sind meist schon stabil. T. Janeczko ist ein Perfektionist, da wirst du kaum Bugs finden, ich jedenfalls noch keinen bisher.
Wie gesagt, wenn du stattdessen zwei Paare in einem Pane überlagern willlst, dann nimm z.B. unteren Bsp.code. Ich habe es dieses Mal nicht per Copy und Paste reingestellt. Eventuell ist abschreiben hilfreicher. Zusätzlich natürlich die Manual genau lesen. Das Programm ist mächtig und umfangreich, aber wenn man sich mit der Zeit einarbeitet, wird es mit der Zeit immer pups-einfacher bis komplett idiotensicher.
Ansonsten heißt die Devise pauken, pauken, pauken. Man wird nicht über Nacht zum König. Babyschritte, einen nach dem anderen!
Vikke schrieb:
Irgendwie schafft er es doch nicht, ständig die Spreizung zwischen 80.00 und 1.42, das in allen Fenstern.
Doch tut es. Wie oben erwähnt und unten bebildert, falls es das ist, was du zusätzlich machen willst."I'm a trader, baby. So, why don't you kill me?!" -
-
-
Teilen
- Facebook 0
- Twitter 0
- Google Plus 0
-
Reddit 0
-
Benutzer online 3
3 Besucher