Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Vortagshoch bzw Vortagstief Ausdehnung (http://www.expert-advisor.com/forum/showthread.php?t=5749)

skynat 13.07.17 17:54

Vortagshoch bzw Vortagstief Ausdehnung
 
Guten Abend,

ich bin seit ein paar Tagen schon auf der Suche nach meinem Fehler und habe noch nichts adäquates finden können und hoffe nun auf eure Hilfe

Folgendes soll realisiert werden:

Ich möchte wie im Titel die Ausdehnungen anzeigen lassen. Allerdings stehe ich auf dem Schlauch.

Es soll das VortagsTief (gestern) vom VortagsTief (vorgestern) abgezogen werden (Beispiel Dienstag war das Tief bei 1.14887 und am Montag bei 1.14789 dann lautet die Rechnung 1.14887-1.14789 = 0.00098 ;; das Gleiche dann für Freitag,Donnerstag,Mittwoch etc)

Das Problem dabei ist, dass das Ergebnis nicht jedes mal positiv ausfällt. Jetzt soll gezählt werden, wie oft es Positiv ausfällt und damit dann der Durchschnitt errechnet werden (Es sollen beispielsweise 7 Tage angeschaut werden, dann sind von den 7 Tagen nur 4 positiv. Man rechnet also die 4 positiven Tage zusammen und teilt die dann auch nur durch 4)

das Problem liegt hauptsächlich in meiner Unerfahrenheit wie es scheint denn ich bekomme nichtmal die ersten Schritte gerechnet ohne dass Quatsch raus kommt.

vielleicht kann mir hier jemand helfen und mich mal vom Schlauch schubsen.

Mein aktueller Versuch sieht wie folgt aus:
Code:

  void calculateHighExtension()
  {
  int divider=0,difference;
  int LookBack = iBarShift(Symbol(),0,iTime(Symbol(),PERIOD_D1,DaysToLookBack),false);
  int limit =  MathMin(Bars,LookBack+1);
 
  for (int cnt=DaysToLookBack-1; cnt>=1;cnt--)
  {
  if((iHigh(Symbol(),PERIOD_D1,cnt))-iHigh(Symbol(),PERIOD_D1,cnt-1)>0)
  {
  difference=iHigh(Symbol(),PERIOD_D1,cnt)-iHigh(Symbol(),PERIOD_D1,cnt-1);
  //Print("Differenz "+difference);
  Print(iHigh(Symbol(),PERIOD_D1,cnt)-iHigh(Symbol(),PERIOD_D1,cnt+1));
  };
 
 
  //Print("Counter High "+divider);
  //Print("Difference "+difference); //Schaue 6 Tage zurück und berechne den Durchschnitt wie weit das letzte High überboten wurde
  }


nicht wundern wenn nun wirklich ein arg grober Fehler drin ist - ich habe schon ein paar Versuche durch und mir gehen echt die Ideen aus (möglicherweise ist aktuell sogar die Rechnung falsch da ich geistig am Ende bin)

next user 13.07.17 18:38

Zitat:

Zitat von skynat (Beitrag 39159)
Man rechnet also die 4 positiven Tage zusammen und teilt die dann auch nur durch 4
...
Code:

  int divider=0,difference;

1. Die Differenz zweier Gleitpunktzahlen würde ich nicht in einer Variablen vom Typ Ganzzahl speichern.
2. Um die 4 positiven Tage zu addieren und durch 4 zu Teilen, musst du die 4 Tage auch speichern.
Code:

int LookBack = iBarShift(Symbol(),0,iTime(Symbol(),PERIOD_D1,DaysToLookBack),false);
Macht nicht gerade das, was du denkst. Hier fragst du nach dem Index der Kerze, welche die Zeit von der Kerze "DaysToLookBack" hat.
Außerdem würde ich den letzten Parameter mit "true" angeben.
TRUE: Wenn Kerze mit der abgefragten Zeit nicht gefunden, so gib -1 zurück.
FALSE: Wenn Kerze mit der abgefragten Zeit nicht gefunden, so nehme die naheliegenste.
Code:

int limit =  MathMin(Bars,LookBack+1);
Hier nimmst du die Kerze von LookBack (DaysToLookBack) und vergleichst sie mit der totalen Anzahl an Kerzen. Was davon wird wohl der kleinere Wert sein?
Code:

for (int cnt=DaysToLookBack-1; cnt>=1;cnt--)
Beispiel DaysToLookBack = 5 würde wie folgt aussehen:
Code:

for(int cnt=5-1; cnt>=1; cnt--)
1. Du könntest auch das "-1" weglassen und dafür "cnt>1" schreiben.
2. Du willst doch den einen Tag mit den jeweils vorherigen vergleichen? Da muss die Schleife umgekehrt sein. So fängst du mit dem "ältesten" Tag an.
Code:

if((iHigh(Symbol(),PERIOD_D1,cnt))-iHigh(Symbol(),PERIOD_D1,cnt-1)>0)
Hier fragst du ab, ob vorgestern - gestern größer als 0 ist. Du wolltest es doch aber andersrum?

Nimm mal den Code:
Code:

void calculateHighExtension()
{
  int i, pos_count=0;
  double difference, tmp=0;
  string sym = Symbol();
  int period = Period();
 
  //Beispiel DaysToLookBack = 5;
 
  for(int i=1; i<=DaysToLookBack; i++)
  {
      if(iHigh(sym,period,i) > iHigh(sym,period,i+1))
      {
        tmp += iHigh(sym,period,i) - iHigh(sym,period,i+1);
        pos_count++;
      }
  }
 
  //Durchschnitt
  difference = tmp / pos_count;
}


skynat 13.07.17 19:29

Zitat:

1. Die Differenz zweier Gleitpunktzahlen würde ich nicht in einer Variablen vom Typ Ganzzahl speichern.
2. Um die 4 positiven Tage zu addieren und durch 4 zu Teilen, musst du die 4 Tage auch speichern.
Oh je - jetzt wo ich darauf gestoßen werde - ja es ist totaler quatsch - ist auch schon behoben :D

Zitat:

2. Du willst doch den einen Tag mit den jeweils vorherigen vergleichen? Da muss die Schleife umgekehrt sein. So fängst du mit dem "ältesten" Tag an.
Code:

if((iHigh(Symbol(),PERIOD_D1,cnt))-iHigh(Symbol(),PERIOD_D1,cnt-1)>0)
Hier fragst du ab, ob vorgestern - gestern größer als 0 ist. Du wolltest es doch aber andersrum?
Ja du hast absolut recht - wird immer peinlicher hier

Zu deinem Code:
Erstmal vielen Dank für deine Mühe :)
und...es ist so einfach und auch so logisch...WARUM KOMM ICH NICHT AUF SOWAS :eek:

next user 13.07.17 20:43

Zitat:

Zitat von skynat (Beitrag 39161)
es ist so einfach und auch so logisch...WARUM KOMM ICH NICHT AUF SOWAS :eek:

weil dir
Zitat:

Zitat von skynat (Beitrag 39159)
gehen echt die Ideen aus

und du
Zitat:

Zitat von skynat (Beitrag 39159)
geistig am Ende bist)

hast du dich wahrscheinlich so auf bestimmte Codesegmente fixiert, das du "den Wald vor lauter Bäumen" nicht siehst. :D

Zitat:

Zitat von skynat (Beitrag 39161)
Ja du hast absolut recht - wird immer peinlicher hier

Peinlich ist es nicht. Ist jedem, der etwas Programmiert hat schon passiert. Oft hilft dann einfach abschalten und später "resettet" zu starten.

Jedenfalls ist es immer besser zu fragen, als das
Zitat:

Zitat von skynat (Beitrag 39159)
geistig am Ende
Zitat:

Zitat von skynat (Beitrag 39159)
die Ideen aus(gehen)



skynat 13.07.17 20:48

Ja da hast du sicher recht - Außerdem ist Urlaubszeit - zumindest für meine Kollegen :D

Falls noch jemand vor dem selben Problem steht wie ich - hier meine aktuelle Fassung des laufenden Codes (absichtlich etwas geteilt für den Fall dass ich was ändern möchte)

Code:

void calculateHighExtension()
  {
  int pos_count=0,pos_count2=0;
  double difference_h,difference_l,tmp=0,tmp2=0;
  string sym = Symbol();
  int period = PERIOD_D1;


  for(int i=1; i<=DaysToLookBack+1; i++)
    {
      if(iHigh(sym,period,i)>iHigh(sym,period,i+1))
        {
        tmp+=iHigh(sym,period,i)-iHigh(sym,period,i+1);
        pos_count++;
        }

    }
  for(int i=1; i<=DaysToLookBack+1; i++)
    {
      if(iLow(sym,period,i+1)<iLow(sym,period,i))
        {
        tmp2+=iLow(sym,period,i+1)-iLow(sym,period,i);
        pos_count2++;
        }
    }

//Durchschnitt
  difference_h = tmp / pos_count;
  difference_l = tmp2 / pos_count2;
//Verrechnen mit gestrigem High/Low
  StBa_H = High[1]+difference_h;
  StBa_L = Low[1]+difference_l;

  DrawOnChart();

  }


next user 13.07.17 20:55

Jetzt machste für die LOW-FOR-Schleife ja doch wieder andersrum.
Code:

  for(int i=1; i<=DaysToLookBack+1; i++)
    {
      if(iLow(sym,period,i+1)<iLow(sym,period,i))
        {
        tmp2+=iLow(sym,period,i+1)-iLow(sym,period,i);
        pos_count2++;
        }
    }

Und sollte bei folgendem
Code:

  StBa_H = High[1]+difference_h;
  StBa_L = Low[1]+difference_l;

bei Low nicht ein minus?

skynat 13.07.17 20:57

Ich traue meiner Verwirrung nicht - gut möglich dass ich schon bei der Beschreibung im ersten Post gepennt habe.

Fakt ist aber, dass ich eine Excel Tabelle habe (schon vor längerer Zeit erstellt als der Kopf frisch war in der auch die Referenzwerte passen)

und die Werte so genau überein stimmen. Auch über mehrere Tage.

Bei dem StBa_L steht ein Plus, da der Wert bei Low negativ ist - und - wird + und das sollte so nicht sein - als ich ein + draus machte, änderte sich das vorzeichen (verstanden wieso habe ich das nicht wirklich da es mathematisch ja eigentlich nicht korrekt ist, oder?)

next user 13.07.17 21:02

Zitat:

Zitat von skynat (Beitrag 39165)
Fakt ist aber, dass ich eine Excel Tabelle habe...
...und die Werte so genau überein stimmen. Auch über mehrere Tage.

Entweder dein Excel hat eine tiefgreifende Autokorrektur, oder du hast dich im ersten Post selbst verwirrt, oder du hast mich angesteckt. :D

next user 14.07.17 12:16

Zitat:

Zitat von skynat (Beitrag 39165)
Bei dem StBa_L steht ein Plus, da der Wert bei Low negativ ist - und - wird + und das sollte so nicht sein - als ich ein + draus machte, änderte sich das vorzeichen (verstanden wieso habe ich das nicht wirklich da es mathematisch ja eigentlich nicht korrekt ist, oder?)

Habs gestern vielleicht auch einfach nur falsch verstanden.
Soll StBa_L einfach nur die "Range" zwischen gestrigem Tief und dem Durchschnitt der letzten x Kerzen sein? So eine Art Support-Zone?

skynat 14.07.17 13:28

Zitat:

Zitat von next user (Beitrag 39168)
Habs gestern vielleicht auch einfach nur falsch verstanden.
Soll StBa_L einfach nur die "Range" zwischen gestrigem Tief und dem Durchschnitt der letzten x Kerzen sein? So eine Art Support-Zone?

So ähnlich. Die Frage dahinter lautet "wenn ein tief gebrochen wird, um wie weit im Durchschnitt der Periode x?"
Diesen Durchschnittswert addiere bzw subtrahiere ich vom gestrigen tief und bekomme (hoffentlich) einen Anhaltspunkt wohin der Kurs laufen könnte wenn er das gestrige tief bricht

Gesendet von meinem SM-G930F mit Tapatalk


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:14 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum