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.

Struktogramm für Linien-Kreuzungen

Geschrieben

Hallo,

ich bin im Einstieg der MQL-Programmierung. Um das Grundprinzip zu lernen möchte ich mir gerne ein Struktogramm erstellen. Kann mir da jemand helfen?

 

//+++++ Die folgende Funktion überprüft zwei Linien jedesmal wenn sie aufgerufen wird. (Sie muss unter int start() augerufen werden.) 
//+++++ Die Richtung der beiden Variablen wird in statistischen Variablen
//+++++ gespeichert um sie mit der Richtung vom vorherigen Durchlauf vergleichen zu können.
//+++++ Sie wird eine 0 ausgeben, wenn keine Änderung gegenüber der zuletzt gespeicherten Richtung passiert ist.
//+++++ Sie wird eine 1 ausgeben, wenn die Richtung sich geändert hat (line1>line2).
//+++++ Sie wird eine 2 ausgeben, wenn die Richtung sich geändert hat (line1<line2).
//+++++ Die Crossed-Funktion verwendet zwei double-Variablen als Parameter und gibt einen Integer zurück.

 

Code:

int Crossed (double line1 , double line2)
  {
 static int last_direction = 0;  
 static int current_direction = 0;
 
 if(line1>line2)current_direction = 1; //up
 if(line1<line2)current_direction = 2; //down
 
	 if(current_direction != last_direction) //changed
	   {
	   last_direction = current_direction;
	   return (last_direction);
	   }
 else
   {
   return(0);
   }
 
  }

Bearbeitet von whipsaw
Code Tags wegen besserer Lesbarkeit hinzugefügt

Featured Replies

Geschrieben

hi Thunder_Blade,

 

herzlich Willkommen bei uns :vibration:

 

Dein Beitrag scheint untergegangen zu sein, aber ich hoffe das Dir noch geholfen werden kann.

 

Ansonsten einfach gezielte Problemfragen stellen, falls Du beim Coden nicht weiterkommst.

 

btw. was möchtest Du programmieren - Indikatoren oder automatische Handels-Systeme?

Geschrieben
  • Autor
hi Thunder_Blade,

 

herzlich Willkommen bei uns :vibration:

 

Dein Beitrag scheint untergegangen zu sein, aber ich hoffe das Dir noch geholfen werden kann.

 

Ansonsten einfach gezielte Problemfragen stellen, falls Du beim Coden nicht weiterkommst.

 

btw. was möchtest Du programmieren - Indikatoren oder automatische Handels-Systeme?

 

Ja, klasse. Das Forum ist echt super! Habe schon einige Beiträge gelesen...

Vielleicht tüftelt ja grade jemand an einem Struktogramm... :spank:

 

Ich versuche einen EA zu programmieren. Jedenfalls ist es mein Ziel... und, dafür baue ich grade EA-Vorlagen nach. Will sie natürlich genau verstehen. Und dafür ist ein Struktogramm super geeignet.

Geschrieben

Nur für mich: du willst ein Struktogramm für den von dir gebastelten Code machen? Da du von Struktogrammen redest, geh ich mal aus das du aus der Programmierwelt kommst, da dürften doch 3 if's nicht das Prob sein oder?

(sorry wenn die Frage blöd klingt)

Geschrieben
  • Autor
Nur für mich: du willst ein Struktogramm für den von dir gebastelten Code machen? Da du von Struktogrammen redest, geh ich mal aus das du aus der Programmierwelt kommst, da dürften doch 3 if's nicht das Prob sein oder?

(sorry wenn die Frage blöd klingt)

Wenn ich Programmierer wäre... bin ich aber leider nicht. Kann mich nur noch an die 7 Klasse erinnern - da war ich glaub ich 15 oder so - ich hatte EDV-Unterricht mit TurboPascal... GOTO und so Scherze...

 

Nun, ich will mir die Logiken hinter EAs verinnerlichen. Und, das geht gut mir einem Struktogramm. Ich habe mir ein C++ Buch gekauft. Und da sind auch ein paar Beispiele drin. Ich kann bisher also nicht viel... dafür bin ich sehr lernfähig und motiviert :vibration:

Kannst du mir ein Struktogramm dafür erstellen?

Geschrieben
Ich habe mir ein C++ Buch gekauft.

Falls du wirklich C/C++ lernen willst (was für MQL eine große Hilfe ist), kann ich dir (und allen die sich noch kein Buch gekauft haben) die zwei empfehlen:

Softwareentwicklung in C

Softwareentwicklung in C++

Sind beides aus den Skripten zu den Programmier-einführungsvorlesungen entstanden. Eigentlich als Bücher zu kaufen, aber (Zitat mein Prof und Autor des Buches) "Solang Springer es unbedingt in Hardcover machen muss, wo es schweinegeld kostet, stellt er die pdfs zum download rein" (darf er lt. ihm auch offiziell)

 

Kannst du mir ein Struktogramm dafür erstellen?

 

Ich hab ehrlich gesagt durch dich das erste mal von Struktogrammen gehört, und hier drin zeichnen ist ein bissl schwierig, aber ich versuchs mal textuell:

 

Im Ablauf des Codes:

if(line1>line2)current_direction = 1; //up

Wenn line1 größer als line2 setze current_direction= 1;

if(line1<line2)current_direction = 2; //down

Wenn line1 kleiner als line2 setze current_direction= 2;

(hier ist zu beachten das im Fall line1 = line2 weder im ersten noch im zweiten Block was passiert)

 

if(current_direction != last_direction) //changed
{
 last_direction = current_direction;
 return (last_direction);
}
else
{
 return(0);
}

WENN current_direction nicht den gleichen Wert hat wie last_direction

DANN setze last_direction auf den Wert von current_direction und gib den Wert als Rückgabewert der Funktion zurück

SONST gib 0 zurück

 

Kurz gesagt: Es wird überprüft welcher der Werte größer ist und current_direction dementsprechend gesetzt. gleichzeitig "merkt" sich die Funktion (durch die deklaration von last_direction als static) welche "Richtung" die Werte das letzte mal hatten und vergleicht es mit der aktuellen Richtung. bei Änderung wird der neue Wert "gemerkt" und die Richtung der Änderung zurückgegeben.

 

HTH

 

(ob die Funktion jetzt genau das tut was man will (vor allem was passiert wenn die Werte mal gleich sind) ist eine andere Frage)

Geschrieben
  • Autor

Das hat mir schonmal sehr geholfen. Vielen vielen Dank!

Also, das entscheidende ist glaube ich,

"WENN current_direction nicht den gleichen Wert hat wie last_direction

DANN setze last_direction auf den Wert von current_direction und gib den Wert als Rückgabewert der Funktion zurück

SONST gib 0 zurück"

 

Die Logik liest von rechts nach links... oder?

Als Anfänger muss man das estmal verinnerlichen!

 

Ich habe es mal als Struktogramm abgebildet. Könnt ihr das bitte noch mal kontrolle lesen? Simmt das so?

post-1719-1261556714_thumb.jpg

Bearbeitet von Thunder_Blade

Geschrieben
Die Logik liest von rechts nach links... oder?

du meinst bei der Zuweisung? ja, es ist immer links die Variable auf deren Wert geändert wird, rechts vom "=" die Variable (oder Funktion etc.) deren Wert verwendet wird.

 

Ich habe es mal als Struktogramm abgebildet. Könnt ihr das bitte noch mal kontrolle lesen? Simmt das so?

 

Wie gesagt, hab noch nit wirklich mit Struktogrammen gearbeitet, was wichtig ist: die zwei Zuweisung zu Beginn passieren nur genau einmal beim allerersten Aufruf der Funktion bei allen weiteren Aufrufen haben die ersten 2 Zeilen keine Auswirkung (liegt an der "static" Deklaration).

Die 2 if's werden eigentlich nicht parallel ausgeführt (würde das erste if einen Wert ändern auf den das zweite zugreift, dann gäbs hier ein Problem in deinem Struktogramm), aber in diesem Fall ist es das gleiche. (ich weiß auch nicht inwieweit das bei Struktogrammen wichtig ist).

 

Ansonsten schaut das struktogramm gut aus.

Geschrieben
  • Autor

@Mythos

Auf deinen Satz hin "(hier ist zu beachten das im Fall line1 = line2 weder im ersten noch im zweiten Block was passiert)" musst ich noch mal forschen. Habe mir nun ein Struktogramm-Editor geladen. Der zwingt mich sogar zu bestimmten Abfragen, weil ein Nebeneinandersetzen von IFs nicht möglich ist...

Das Programm will einen klaren Ablauf haben. Sehr gut - wie ich finde. Habe es von hier: http://www.th.schule.de/th/lfk-informatik/...al/material.htm unter dem Stichwort Struktogramm-Editor.

 

Mir macht diese Logik der doppelten if-Abfrage irgendwie Probleme.

Es müsste dann eigentlich wie folgt aussehen:

post-1719-1261565047_thumb.jpg

Geschrieben

Also ich habe dir einmal meine Variante des Struktogramms mitgebracht. Ich hab leider nocht so ein schönes Proggi

wie du. Deswegen musste Excel herhalten.

 

Das Struktogramm wird wie ein Wasserfall gelesen. Man kippt oben links das Wass rein und guckt dann wo es unten

wieder herauskommt. Je nachdem welchen Weg das Wasser genommen hat.

 

Schau dir mal meins an - da habe ich das Problem mit der If Abfrage bereits ausradiert. Soetwas merkt man nur wenn

man ein Struktogramm macht.

 

stru.jpg

Geschrieben
  • Autor

Ah ja, du löst diese doppelte if-Sache also mit TRUE und FALSE...

Jetzt wird es klarer.

 

Komisch finde ich, dass hinter diesem doppeltem if ein Semikolon sitzt. Das ist ja normalerweise bei if nicht. Hat das etwa die Bedeutung, dass nur eines von beiden ausgelöst wird und danach direkt weiter im Code gegangen wird?

 

Schon, oder?

Geschrieben

Ja also die die doppelte If Abfrage wird durch eine übergeordnete Abfrage gesplittet.

 

Welches Semikolon meinst du? Meines Wissens nach dürfte nach einer If Abfrage nirgendwo stehen das hat mit einer doppelten If-Anweisung nichts zu tun.

Geschrieben
  • Autor
Ja also die die doppelte If Abfrage wird durch eine übergeordnete Abfrage gesplittet.

 

Welches Semikolon meinst du? Meines Wissens nach dürfte nach einer If Abfrage nirgendwo stehen das hat mit einer doppelten If-Anweisung nichts zu tun.

 

int Crossed (double line1 , double line2)

{

static int last_direction = 0;

static int current_direction = 0;

 

if(line1>line2)current_direction = 1; //up

if(line1<line2)current_direction = 2; //down

 

if(current_direction != last_direction) //changed

{

last_direction = current_direction;

return (last_direction);

}

else

{

return(0);

}

 

}

 

 

Ich habe es mal ROT markiert. Bei sonstigen IFs steht nämlich nie ein Semikolon :vibration:

Bearbeitet von Thunder_Blade

Geschrieben
Das kommt nicht vom IF sondern von der Variablenzuweisung. Ausserdem fehlen die geschweiften Klammern.
Geschrieben
...

if(line1>line2)current_direction = 1; //up

if(line1

...

Ich habe es mal ROT markiert. Bei sonstigen IFs steht nämlich nie ein Semikolon :vibration:

 

sieht man gerne, wenn du als Anfänger versuchst systematisch an die Entwicklung der Logik heranzugehen :vibration:

Letztlich aber egal, ob du 'altgediente' Struktogramme oder Statecharts (Stichwort UML) nutzt, denn genau das machst

du hier, verschiedene Zustände zu handeln, die je nach Systemparameter eine Änderung derselben bewirken.

 

Obiger Code ist schon richtig, nach der Bedingung erscheint die resultierende Aktion lediglich ohne geschweifte Klammern.

Das Semikolon schliesst lediglich die Answeisung (also current_direction = 1) ab. Da die geschweiften Klammern fehlen wird damit

auch automatisch das ganze IF-Konstrukt abgeschlossen. Es werden auf jeden Fall beide IF-Bedingungen geprüft.

 

Sieh hier equivalenten Code:

 

    if(line1>line2) { current_direction = 1; } //up
    if(line1<line2) { current_direction = 2; } //down

 

Auch wenn man das leider sehr häufig sieht, dass die Klammern weggelassen werden, wenn nur eine Anweisung nach der If-Bedingung ist (wie in diesem Beispiel), sollte man sich sowas besser nicht angewöhnen.

 

Im obigem Fall empfiehlt es sich allerdings das zweite IF gegen ein ELSE zu tauschen, da entweder der erste Fall eintrifft oder der zweite Fall oder aber der dritte Fall (line1 == line2). Damit hast du eine Abprüfung weniger und der Ablauf ist performanter. Weiterhin hast du das ja in deinem Struktogramm modelliert und nicht was aktuell im Code zu sehen ist. :ph34r:

Geschrieben
  • Autor

Ah, jetzt wird mir die Logik klarer. Die beiden jetzt folgenden Codes sind also ein und dasselbe...! Richtig?

int Crossed (double line1 , double line2)
  {
 static int last_direction = 0;  
 static int current_direction = 0;
 
 if(line1>line2)
   {
   current_direction = 1; //up
   } 
 else
   {
   current_direction = 2; //down
   }
	 
 if(current_direction != last_direction) //changed
	   {
	   last_direction = current_direction;
	   return (last_direction);
	   }
 else
   {
   return(0);
   }
 
  }

 

int Crossed (double line1 , double line2)
  {
 static int last_direction = 0;  
 static int current_direction = 0;
 
 if(line1>line2)
   {
   current_direction = 1; //up
   } 
 if(line1<line2)
   {
   current_direction = 2; //down
   }
	 
 if(current_direction != last_direction) //changed
	   {
	   last_direction = current_direction;
	   return (last_direction);
	   }
 else
   {
   return(0);
   }
 
  }

 

Ich habe einfach die zweite if-Abfrage durch ein else getauscht wie Maerl vorgeschlagen hat.

Damit ergibt sich auch ein logisches Struktogramm. Ich kippe Wasser oben ins Struktogramm und schaue nun wo es unten rauskommt. :blink:

DANKE Leute!!! Darauf kann ich aufbauen...!

post-1719-1261997462_thumb.jpg

Bearbeitet von ronner
Zitat gelöscht, bitte sparsam verwenden.

Geschrieben

ja, ich hatte aber auch geschrieben, dass es einen dritten Fall gibt, wo line1 == line2 ist. Der wird im Else-Zweig bearbeitet, was für diese Untersuchungen vermutlich akzeptabel ist. Und genau an dieser Stelle wird die Tatsache deutlich, dass man sich genau überlegen muss, wie man eine Kreuzung definiert. In der Praxis kann es zu Rückkreuzungen kommen, zur Penetration der anderen Linie, ohne diese gänzlich zu schneiden, oft macht es auch Sinn eine wirklich geschehene Kreuzung nur dann als relevant einzustufen, wenn vor der Rückkreuzung eine bestimmte Anzahl an Bars aufgelaufen sind und der Abstand zwischen Linie1 und Linie2 eine Mindestmenge an Punkte Abstand haben.

 

Es dürfte somit von deiner gewünschten Logik abhängen, ob du line1 == line2 direkt im IF oder im ELSE oder auf andere Weise betrachten willst.

:blink:

Geschrieben
Ah, jetzt wird mir die Logik klarer. Die beiden jetzt folgenden Codes sind also ein und dasselbe...! Richtig?

 

Nicht ganz. wie Maerl schon gesagt hast musst du auf den Fall line1 == line2 aufpassen. (Das Gegenteil von ">" ist nicht "

 

Wenn du sagst:

WENN a größer b ist DANN ....

WENN b gröber a ist DANN ...

 

ist es was anderes als

WENN a größer b ist DANN .... SONST ....

 

im ersten Fall wird bei "a gleich b" nichts gemacht, im zweiten Fall schon.

Geschrieben
  • Autor
Nicht ganz. wie Maerl schon gesagt hast musst du auf den Fall line1 == line2 aufpassen. (Das Gegenteil von ">" ist nicht "<" sondern ("<" oder "==") also "<=".

 

Wenn du sagst:

WENN a größer b ist DANN ....

WENN b gröber a ist DANN ...

 

ist es was anderes als

WENN a größer b ist DANN .... SONST ....

 

im ersten Fall wird bei "a gleich b" nichts gemacht, im zweiten Fall schon.

 

Dein nichts bedeutet dann, dass der Computer direkt die Funktion Crossed durch return(0) beendet und sich den eingespeicherten Wert (last_direction) unverändert (weil static) im "Gedächtnis" behält?

Geschrieben
Dein nichts bedeutet dann, dass der Computer direkt die Funktion Crossed durch return(0) beendet und sich den eingespeicherten Wert (last_direction) unverändert (weil static) im "Gedächtnis" behält?

Nein, es passiert lediglich in dem Teil mit den ersten ifs nichts. Die (in dem Fall) 3. if wird auf jeden Fall abgearbeitet.

Also allgemein ist es so. Im konkreten Fall bedeutet ein "nichts" in den ersten beiden ifs genau das current_dir und last_dir gleich sind und die Funktion im 3. "if" in den else-Teil geht und damit mit return(0) beendet

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.