Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Symbol und Periode

Geschrieben

Erstmal ein freundliches hallo an die Community.

 

Ich bin neu hier im Forum daher möchte ich mich erstmal vorstellen.

 

Ich bin Werner 25J. und beschäftige mich seit ca.2 Jahren mit der schönen Welt des Handelns.

Nachdem ich mich durch einiges an Literatur geschlagen habe und einige Märkte erkundet habe.

bin ich mitlerweile zu dem Schluss gekommen das cfd´s und möglicherweise der Forex markt

speziell der automatisierte Handel mir am ehesten liegt.

Daher beschäftige ich mich seit anfang 2010 mit dem Metatrader und mql4.

 

Ich bin noch weit davon entfern von meinen Gewinnen Leben zu können und

möglicherweise komme ich nie an den Punkt aber das stört mich nicht,

mir macht einfach der Handel spaß.

 

Von Beruf bin ich Hochsee Fischer auf einem Fabrikschiff und meist im Nordatlantik unterwegs

wir haben Internet an Bord zwar langsam aber Internet

 

Es wird öfter mal vorkommen bei mir das ich mich nicht melde das liegt gelegendlich an problemen

mit dem Internet oder ganz einfach zu wenig Zeit.

Dafür möchte ich mich schon mal im vorraus entschuldigen.

 

So nun zu meinem Problem

 

Ich programiere grade einen indikator der im 5 min Chart läuft und mir den unterschied von Open und Open vor

x Tagen zeigen soll das ganze soll er mit mehreren Symbolen und auf einem Tages Chart machen.

 

Mein Problem besteht darin das er öfter mal ganz andere Werte zeigt als er eigendlich zeigen sollte zum beispiel

zeigt er für gestern + 2 an, eine Stunde später -1 und irgendwann stimmen die Werte dann mal wieder.

 

Herzlichen Dank schon mal für eure Hilfe.

 

int start()
 {
 
 int	timeframe=1440;
 int	tbar1;
 int	tbar2;
 int	tbar3;
 int	tbar4;
 int	tbar5;
 
 string symbol1="Ger30Jun10";
 string symbol2="Usa500Jun10";
 string symbol3="Euro50Jun10";
 string symbol4="UK100Jun10";
 string symbol5="Swi20Jun10";
 
 
 double trend1;
 double trend2;
 double trend3;
 double trend4;
 double trend5;
 
 int vergleich;
 
  for (int i=Bars-1;i>0;i--)
 {
 tbar1 = iBarShift(symbol1,timeframe,Time[i]);
  tbar2 = iBarShift(symbol2,timeframe,Time[i]);
  tbar3 = iBarShift(symbol3,timeframe,Time[i]);
  tbar4 = iBarShift(symbol4,timeframe,Time[i]);
  tbar5 = iBarShift(symbol5,timeframe,Time[i]);
  
  trend1 = iOpen(symbol1,timeframe,tbar1) - iOpen(symbol1,timeframe,i+10);
  trend2 = iOpen(symbol2,timeframe,tbar2) - iOpen(symbol2,timeframe,i+10);
  trend3 = iOpen(symbol3,timeframe,tbar3) - iOpen(symbol3,timeframe,i+10);
  trend4 = iOpen(symbol4,timeframe,tbar4) - iOpen(symbol4,timeframe,i+10);
  trend5 = iOpen(symbol5,timeframe,tbar5) - iOpen(symbol5,timeframe,i+10);
  
  vergleich=0;
  
  if (trend1>0) vergleich++; if (trend1<0) vergleich--;
 if (trend2>0) vergleich++; if (trend2<0) vergleich--;
 if (trend3>0) vergleich++; if (trend3<0) vergleich--;
 if (trend4>0) vergleich++; if (trend4<0) vergleich--;
 if (trend5>0) vergleich++; if (trend5<0) vergleich--;
  
 ExtMapBuffer1[i] = vergleich;
  }
 
 int lasterror = GetLastError();
 if (lasterror != 0 )Alert("Indikator Fehler ",lasterror);
 if (lasterror == 4054 )Alert("Falsches Symbol ");

 
  return(0);
 }

Bearbeitet von WernerH.

Featured Replies

Geschrieben

Hallo Werner,

 

auch von mir ein Herzliches Willkommen.

Du gehst ja gleich in die Vollen :rofl:

 

Zu deinem Code.

Ich seh da ein Problem und eine Unschönheit.

Zum Problem. Du rechnest mit 5 verschiedenen Symbolen. Deren Kurshistorie wird vermutlich nicht gleich lange sein, so dass du wohl bei den Vergleichen Probleme bekommen wirst (wenn's denn überhaupt richtig läuft).

Probier mal lieber sowas:

...
 int nb_Bars[5];
 nb_Bars[0]=iBars(symbol1, timeframe);
 nb_Bars[1]=iBars(symbol2, timeframe); 
 nb_Bars[2]=iBars(symbol3, timeframe);
 nb_Bars[3]=iBars(symbol4, timeframe);
 nb_Bars[4]=iBars(symbol5, timeframe);  
 int minBars=0;
 for (int a=0; a<5; a++)
 {
  minBars=MathMin(minBars, nb_Bars[a]);
 }	  
 
  for (int i=minBars;i>0;i--)
  ...

Somit stellst du schon mal sicher, dass die Zeitreihe mit den wenigsten Kurswerten ausschlaggebend für die zeitliche Länge der Berechnung ist.

 

Dann noch zur Unschönheit.

Du berechnest hier die komplette Historie bei jedem Tick. Das sollte nicht nötig sein.

Du könntest beispielsweise nach der Analyse der Bars (code oben) noch über IndicatorCounted() nur die neu hinzugekommenen Bars berechnen. Dann müsstest du aber das erste Symbol (symbol1) als das Underlying aus dem aktuellen Chart definieren (Symbol()).

 

Nochwas, du schreibst dein Indikator läuft im M5-Timeframe, hast aber bei timeframe 1440, also einen Tag definiert...

 

Wenn ich später mal dazukomme schau ich mir das Problem mit den unterschiedlichen Ergebnissen mal direkt an.

Vielleicht hilft ja schon das Vereinheitlichen der Zeitreihenlänge um das Problem zu lösen. Hab leider gerade nur wenig Zeit :hmmmm:

 

Gruss,

Wogo

Geschrieben

Ähm...

 

mein Beispiel ist natürlich Unfug und kann nicht funktionieren. Man darf minBars natürlich nicht mit 0 initialisieren, da das Minimum von 0 und irgendwas positives immer 0 sein sollte... Schande über mich :rofl:

Richtig ist es so:

...
 int nb_Bars[5];
 nb_Bars[0]=iBars(symbol1, timeframe);
 nb_Bars[1]=iBars(symbol2, timeframe); 
 nb_Bars[2]=iBars(symbol3, timeframe);
 nb_Bars[3]=iBars(symbol4, timeframe);
 nb_Bars[4]=iBars(symbol5, timeframe);  
 int minBars=nb_Bars[0];   //<== geändert
 for (int a=1; a<5; a++)
 {
  minBars=MathMin(minBars, nb_Bars[a]);
 }	  
 
  for (int i=minBars;i>0;i--)
  ...

Was ich jetzt nicht so ganz versteh ist, warum du beim Vergleich von 2 um 10 Bars auseinanderliegenden Kerzen den Umweg über iBarShift gehst.

 

Mach's doch einfach so:

	  for (int i=minBars;i>=0;i--)
 {
  //tbar1 = iBarShift(symbol1,timeframe,Time[i]);
  //tbar2 = iBarShift(symbol2,timeframe,Time[i]);
  //tbar3 = iBarShift(symbol3,timeframe,Time[i]);
  //tbar4 = iBarShift(symbol4,timeframe,Time[i]);
  //tbar5 = iBarShift(symbol5,timeframe,Time[i]);
  
  trend1 = iOpen(symbol1,timeframe,i/*tbar1*/) - iOpen(symbol1,timeframe,i+10);
  trend2 = iOpen(symbol2,timeframe,i/*tbar2*/) - iOpen(symbol2,timeframe,i+10);
  trend3 = iOpen(symbol3,timeframe,i/*tbar3*/) - iOpen(symbol3,timeframe,i+10);
  trend4 = iOpen(symbol4,timeframe,i/*tbar4*/) - iOpen(symbol4,timeframe,i+10);
  trend5 = iOpen(symbol5,timeframe,i/*tbar5*/) - iOpen(symbol5,timeframe,i+10);
  
  vergleich=0;
  
 if (trend1>0) vergleich++; if (trend1<0) vergleich--;
 if (trend2>0) vergleich++; if (trend2<0) vergleich--;
 ...

i läuft durch alle Bars und du bekommst in trendX immer den Unterschied des Preises von Open und Open[i-10]. Denke darauf kommt's dir an, oder.

 

Ich hab das mal ausprobiert und das Ergebnis scheint plausible Werte zu liefern (auch wenn ichs jetzt nicht im Detail kontrolliert hab :hmmmm: ).

 

Gruss,

Wogo

Geschrieben
  • Autor

Vielen Dank für die schnelle Hilfe und dafür dass ihr mich so herzlich empfangen habt

 

Es tut mir sehr leid ich habe einen großen Fehler gemacht

und zwar hatte ich zu Versuchszwecken den Code etwas verändert

und dann wie soll es anders sein den falschen Code gepostet.

 

Nun habt ihr euch den ganzen Tag den Kopf darüber zerbrochen was

ich eigendlich will dafür möchte ich mich vielmals entschuldigen.

 

Mein Fehler war

trend1 = iOpen(symbol1,timeframe,tbar1) - iOpen(symbol1,timeframe,i+10);

 

Stehen hätte da sollen

trend1 = iOpen(symbol1,timeframe,tbar1) - iOpen(symbol1,timeframe,tbar1+10);

 

Dadurch ergibt sich natürlich ein ganz anderes Bild im Indikator und ich hoffe

es wird jetzt ein bisschen klarer was ich erreichen will.

Eigendlich soll mir der Indikator nur zeigen ob die mehrzahl der Symbole einen aufsteigenden

Trend aufweist, einen fallenden oder ob sie sich gegeneinander aufwiegen.

 

Hier nun noch einmal der richtige Code

 int start()
 {
 
 int	timeframe=1440;
 int	tbar1;
 int	tbar2;
 int	tbar3;
 int	tbar4;
 int	tbar5;
 
 string symbol1="Ger30Jun10";
 string symbol2="Usa500Jun10";
 string symbol3="Euro50Jun10";
 string symbol4="UK100Jun10";
 string symbol5="Swi20Jun10";
 
 
 double trend1;
 double trend2;
 double trend3;
 double trend4;
 double trend5;
 
 int vergleich;
 

	   
  
  for (int i=Bars;i>0;i--)
  {
  
  
  
  tbar1 = iBarShift(symbol1,timeframe,Time[i]);
  tbar2 = iBarShift(symbol2,timeframe,Time[i]);
  tbar3 = iBarShift(symbol3,timeframe,Time[i]);
  tbar4 = iBarShift(symbol4,timeframe,Time[i]);
  tbar5 = iBarShift(symbol5,timeframe,Time[i]);
  
  trend1 = iOpen(symbol1,timeframe,tbar1) - iOpen(symbol1,timeframe,tbar1+10);
  trend2 = iOpen(symbol2,timeframe,tbar2) - iOpen(symbol2,timeframe,tbar2+10);
  trend3 = iOpen(symbol3,timeframe,tbar3) - iOpen(symbol3,timeframe,tbar3+10);
  trend4 = iOpen(symbol4,timeframe,tbar4) - iOpen(symbol4,timeframe,tbar4+10);
  trend5 = iOpen(symbol5,timeframe,tbar5) - iOpen(symbol5,timeframe,tbar5+10);
  
  vergleich=0;
  
  if (trend1>0) vergleich++; if (trend1<0) vergleich--;
  if (trend2>0) vergleich++; if (trend2<0) vergleich--;
  if (trend3>0) vergleich++; if (trend3<0) vergleich--;
  if (trend4>0) vergleich++; if (trend4<0) vergleich--;
  if (trend5>0) vergleich++; if (trend5<0) vergleich--;
  
  ExtMapBuffer1[i] = vergleich;
  }
 
 int lasterror = GetLastError();
 if (lasterror != 0 )Alert("Indikator Fehler ",lasterror);
 if (lasterror == 4054 )Alert("Falsches Symbol ");

 
  return(0);
 }

Geschrieben

Herzlich willkommen! Sind die Internetverbindungen auf hoher See stabil? Für hoch gehebelte Positionen traue ich mich nochnichtmal per WLAN ins Internet - habe da schon böse Überraschungen erlebt.

 

Ich denke, dass die letztgenannte Lösung von WOGO das Ergebnis bringt, was beabsichtigt ist - ohne jetzt Gedanken lesen zu können. :ph34r:

 

Mal von dem von dir genannten Additionsfehler abgesehen, lese ich den Code wie folgt:

 

Die for-Schleife iteriert durch alle Bars des 5min-Charts (und das sogar bei jedem Tick). Die Funktion iBarShift liefert die Nummer der Kerze (Tageschart), die (zeitlich) am nächsten an der 5min-Kerze der for-Schleife liegt. Mit diesem Ergebnis bildest du dann die Differenz zur 10 Tage entfernten Kerze. Das heißt: für viele 5min-Kerzen wird iBarShift immer dieselbe Kerzennummer zurückliefern und ich kann mir sehr gut vorstellen, dass du daher andere Ergebnisse als erwartest bekommt, weil die neue 5min-Kerze vielleicht näher an einem anderen Tag liegt.

 

Ich habe hier auf dem verwendeten Computer kein MT4 installiert, daher weiß ich nicht genau, ob iBarShift nicht sogar "in die Zukunft" schauen würde (vielleicht in der Hilfe nachzulesen). Das heißt, eine weitere 5min-Kerze ist plötzlich näher am nächsten Tag dran, sodass daraus die 10-Tage-Differenz gezogen wird...

 

Daher wundert es mich, dass es anscheinend funktioniert... Egal, das Ergebnis zählt :ph34r: Die Perfomancetipps von WOGO solltest du dir allerdings nochmals anschauen.

 

RAiNWORM

Geschrieben

Erstmal willkommen an Board Werner!

 

Ist wirklich eine interessante Kombi die du da hast ;)

 

Es tut mir sehr leid ich habe einen großen Fehler gemacht

und zwar hatte ich zu Versuchszwecken den Code etwas verändert

und dann wie soll es anders sein den falschen Code gepostet.

 

*mist* ich wollte dich gerade auf den "Fehler" aufmerksam machen ;)

 

Zu deinem Problem: ehrlich gesagt seh ich so auf die Schnelle nicht warum es falsch sein sollte (abgesehen davon das du, wie schon erwähnt, bei jedem Tick alles unnötig neu berechnest).

 

kannst du genauer beschreiben welche Fehler auftreten? Treten die Fehler nur beim laufenden Bar auf oder auch in der Historie?

Geschrieben
  • Autor

Wiedermal ein wenig Zeit gefunden um den aktuellen Vortschritt zu posten

 

Herzlich willkommen! Sind die Internetverbindungen auf hoher See stabil? Für hoch gehebelte Positionen traue ich mich nochnichtmal per WLAN ins Internet - habe da schon böse Überraschungen erlebt.

 

Die Internet Verbindung hier ist leider so unzuverlässig das es wirklich unverantwortlich währe

hier ein System laufen zu lassen und so langsam wie zu Zeiten als man den PC noch in die Telefondose

gesteckt hat.

 

Ich habe zu Hause einen Rechner laufen auf den ich via Remote Control zugreife das funktioniert ganz gut.

 

Wogo hat meinen fehler auch entdeckt und sich wohl gefragt was soll der quatsch

 

Der letzte Lösungsweg lässt dann nur noch die Tages Bars berechnen und zwar ab dem kürzesten Chart

er hat mit der Berechnung iopen - iopen genau das getroffen was ich wollte und die Performance stark

verbessert. Allerdings läuft der Indicator im 5 min Chart und füllt grade einen Tag aus weil er denkt

eine Tagesbar = eine 5 min. Bar. Das wollte ich vermeiden daher der ganze aufwand über ibarshift.

 

Aber ich lasse es erstmal eine Zeit so laufen um zu testen ob so der Fehler verschwindet.

 

Mir erscheint noch die Ausführung von RAiNWORM möglich.

 

Das heißt: für viele 5min-Kerzen wird iBarShift immer dieselbe Kerzennummer zurückliefern und ich kann mir sehr gut vorstellen, dass du daher andere Ergebnisse als erwartest bekommt, weil die neue 5min-Kerze vielleicht näher an einem anderen Tag liegt.

 

Und dann werde ich das Gefühl nicht los das es möglicherweise mit iOpen und dem Symbol zusammen hängt

vieleicht kann er nicht immer auf jedes Symbol zugreifen und verursacht dadurch fehler in der Historie

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.