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)
-   -   wie kann ich sowas lösen? (http://www.expert-advisor.com/forum/showthread.php?t=6062)

mante 25.03.18 21:33

wie kann ich sowas lösen?
 
der Chart liefert Werte von 1 bis 5 aber leider manchmal den gleichen Wert hintereinander

1,1,1,1,4,5,4,4,4,4,4,1,1,1 wie kann ich aus dieser Reihe folgende Reihe bekommen

1,4,5,4,1....


bin am verzweifeln :rolleyes:

ich hoffe ihr könnt mir helfen

lg mante

freiri 26.03.18 00:12

Vorschlag
 
Ohne näheres zu kennen, würde ich es etwa wie unten ausgeben. Die Zufallszahl in x1 speichern und nur wenn die aktuelle Zufallszahl x ungleich x1 ist, erfolgt ein Print. Es werden nun endlos Zufallszahlen generiert, ohne dass zweimal die gleiche Zahl hintereinander ausgegeben wird.

int x=0,x1=0; // Zufallszahl x = aktuelle, x1 = vorhergehende
int c=0; // Dummy

while (c <= 1) // Endlosschleife endet nie
{
x = Zufallszahl;
if (x != x1) // != bedeutet ungleich
{ Print x; // nur ungleiche Zufallszahl wird ausgegeben
x1=x; // aktuelle Zufallszahl wird an x1 übergeben
}
}

gruss
freiri

traderdoc 26.03.18 00:12

Für Code ist es jetzt zu spät, aber vom prinzipiellen Ansatz her würde das so funktionieren.

Wenn die Endreihe feststeht, die Du erhalten willst, dann wird die Rohheihe als String betrachtet, und dann wird die Rohreihe von links nach rechts nach den einzelnen Ziffern der Endreihe durch sucht, d.h. in der Rohreihe sollen ja nicht nur die Ziffern der Endreihe enthalten sein, sondern auch in der entsprechenden, prinzipiellen Reihenfolge, auch wenn durch Doppler in die Länge gezogen.

D.h. es wird zuerst nach der 1 von links in der Rohreihe gesucht.
Ist die anwesend werden die nachfolgenden identifizierten 1 ignoriert.
D.h. ab der Stelle, wo die erste 1 gefunden wurde wird ab da nach der 4 gesucht.
Wurde die gefunden wird sofort nach der 5 gesucht.
Usw. usf.

Über die Hilfe F1 wirst Du viele String-Funktionen finden, mit denen man das relativ einfach umsetzen kann.

traderdoc

mante 26.03.18 16:40

fehler
 
hallo freri hallo traderdoc

danke für eure Hilfe - ich habe es nun so gemacht
der Compiler liefert keine Fehler aber der MT4 friert im Strategietester ein:-)




int Wert(int Range) // Range ist die Zufallszahl

{



int x = 0, x1 = 0; // Zufallszahl x = aktuelle, x1 = vorhergehende
int c=0; // Dummy

while (c <= 1) // Endlosschleife endet nie
{
x = Range;


if (x != x1) // != bedeutet ungleich

{ Print ( x); // nur ungleiche Zufallszahl wird ausgegeben
x1=x; // aktuelle Zufallszahl wird an x1 übergeben
}
}


Print ("Range sich geändert auf" + Range );


}

findet ihr da einen fehler

traderdoc 26.03.18 18:04

Ja klar! Aber erst einmal a bisserl Struktur in den Code.
Das sollte man mal als Bedingung stellen, vor der Veröffentlichung von Code.

Code:

int Wert(int Range)        // Range ist die Zufallszahl
{
  int x = 0, x1 = 0;      // Zufallszahl x = aktuelle, x1 = vorhergehende
  int c = 0;              // Dummy

  while (c <= 1)          // Endlosschleife endet nie
  {
      x = Range;
      if (x != x1)        // != bedeutet ungleich
      {
        Print(x);        // nur ungleiche Zufallszahl wird ausgegeben
        x1 = x;          // aktuelle Zufallszahl wird an x1 übergeben
      }
  }
  Print("Range sich geändert auf" + Range);
}

So und an welcher Stelle soll denn nun aus der while-Schleife gesprungen werden?
1. Da c mit 0 initialisiert wurde und in der Schleife nicht geändert wird bleibt es bei 0 und das ist nach Gauss nun mal immer <= 1!
2. Ein break für einen Ausstieg aus der Schleife existiert nicht
3. Ein return(..) existiert innerhalb der Schleife auch nicht, übrigens auch außerhalb der Schleife nicht, muss aber! wegen int Wert().

Also klarer Fall von Endlosschleife.

Eines der drei o.g. Punkte muss aber greifen.

traderdoc

next user 26.03.18 18:06

Edit: Doc war schneller :cool:

Wenn ich mir den Beitrag von Doc grad so ansehe
Zitat:

Zitat von traderdoc (Beitrag 40719)
Wenn die Endreihe feststeht, die Du erhalten willst, dann wird die Rohheihe als String betrachtet

frage ich mich @mante, war das so gemeint?

Ich habe es so verstanden, das es keine "Endreihe" gibt, du lediglich keine Zahl 2 mal hintereinander haben willst.

Zitat:

Zitat von mante (Beitrag 40741)
danke für eure Hilfe - ich habe es nun so gemacht
der Compiler liefert keine Fehler aber der MT4 friert im Strategietester ein:-)

wahrscheinlich weil
Zitat:

Zitat von mante (Beitrag 40741)
while (c <= 1) // Endlosschleife endet nie

du keinen Riegel davor setzt.
  • Eine Endlosschleife muss natürlich auch abgebrochen werden.
  • Eine "Dummyvariable" ist unnötig. Eine Endlosschleife kriegt man auch einfach mit
    Code:

    while(true)
  • Die letzte Zufallszahl "x1" ist nach dem ersten Durchgang IMMER die gleiche!
  • Wenn du die aktuelle Zuffallszahl als Parameter in deiner Funktion übergibst, brauchst du weder
    • eine Schleife.
    • eine Variable "x", die den Wert des Parameters annimmt.
    • schon GARNICHT eine in der Funktion erstellte "x1", die eben NICHT die letzte Zahl beinhaltet.
  • Überhaupt ist die Logik ein bischen verloren.

Ein Beispiel:
Code:

// Globale Variablen...
int randNumber = 0;
int lastNumber = 0;

// Test...
bool CheckNumber()
{
  if(randNumber != lastNumber)
      return true;
  else
      return false;
}

// Solange Test nicht ok, Schleife...

while(!CheckNumber())
{
  randNumber = // Neue Zufallszahl...
}

lastNumber = randNumber;


mante 26.03.18 18:47

hallo
 
hallo traderdoc undhallo next user :-)

der
HTML-Code:

nt Wert(int Range)        // Range ist die Zufallszahl
{
  int x = 0, x1 = 0;      // Zufallszahl x = aktuelle, x1 = vorhergehende
  int c = 0;              // Dummy

  while (c <= 1)          // Endlosschleife endet nie
  {
      x = Range;
      if (x != x1)        // != bedeutet ungleich
      {
        Print(x);        // nur ungleiche Zufallszahl wird ausgegeben
        x1 = x;          // aktuelle Zufallszahl wird an x1 übergeben
      }
  }
  Print("Range sich geändert auf" + Range);
}

liefert nur einen Wert - danach steht alles still :)

bei deinem Code next user
HTML-Code:

/ Globale Variablen...
int randNumber = 0;
int lastNumber = 0;

// Test...
bool CheckNumber()
{
  if(randNumber != lastNumber)
      return true;
  else
      return false;
}

// Solange Test nicht ok, Schleife...

while(!CheckNumber())
{
  randNumber = // Neue Zufallszahl...
}

lastNumber = randNumber;

ist mir nicht klar was danach kommt

HTML-Code:

{
  randNumber = // Neue Zufallszahl...
}


traderdoc 26.03.18 19:22

Ja klar, das ist ja auch derselbe Code, den Du vorher gepostet hattest,
nur habe ich den mal aufgeräumt, das schrieb ich aber auch. Und anhand des aufgeräumten Code habe ich Dir erklärt, warum das eine Endlosschleife ist und wie man die so programmiert, dass es eben keine wird.

Also demnächst, evtl. a bisserl genauer lesen.

traderdoc

next user 26.03.18 19:29

Hey Doc, auch'n Tee... :D

=== === === === === === === === === === === ===

Zitat:

Zitat von mante (Beitrag 40749)
ist mir nicht klar was danach kommt

HTML-Code:

{
  randNumber = // Neue Zufallszahl...
}


Danach kommt das, was da steht.
"randNumber" wird eine neue Zufallszahl zugewiesen. Wie du die Zahlen ermittels, hast du ja
nicht gesagt. Du sagtest nur "Der Chart liefert mir Zufallszahlen von 1-5 / 1-10".

Vielleicht so bischen verständlicher:
Code:

// Globale Variablen...
int randNumber = 0;
int lastNumber = 0;

// Test...
bool CheckNumber()
{
  if(randNumber != lastNumber)
      return true; // Zufallszahl ist anders -> Gib true zurück!
  else
      return false; // Zufallszahl ist gleich -> Gib false zurück!
}

// Solange Test nicht ok, Schleife...

while(!CheckNumber())
{
  // Solange CheckNumber() false liefert, also neue
  // Zufallszahl == letzte ist, wird mit folgender Zeile
  // eine neue Zufallszahl "randNumber" zugewiesen.
  // (wie auch immer du die Zahlen erhälst!)

  randNumber = // Neue Zufallszahl...
}

// Die while-Schleife wurde wegen ungleicher, neuer Zufallszahl
// abgebrochen. Hier jetzt die gültige Zufallszahl verarbeiten,
// was auch immer du damit machst.
// Dann noch der letzten die aktuelle Zufallszahl zuweisen und
// es kann weiter gehen...
lastNumber = randNumber;


traderdoc 26.03.18 20:00

Zitat:

Zitat von next user (Beitrag 40751)
Hey Doc, auch'n Tee... :D

=== === === === === === === === === === === ===

Willst Du mich damit aggressiv machen? :D

traderdoc


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:36 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