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

mante 26.03.18 20:39

'while' - expressions are not allowed on a global scope
 
hallo next user und traderdoc


danke

habe nur noch einen fehler im Compiler

Code:

int lastNumber = 0;

bool CheckNumber(int Range)
{
  if(Range != lastNumber)
           
      return true;
 
    else
     
      return false;
}
                                                      // Solange Test nicht ok, Schleife...
while(!CheckNumber())


{
  Range = int nextuser;                                  // Neue Zufallszahl...
 
Alert(nextuser);
 
  lastNumber = Range;
}


'while' - expressions are not allowed on a global scope none


ich habe schon alle klammern geprüft
ich finde ihn nicht :-)

Ca$hDigger 26.03.18 22:39

Das muss in eine Funktion.

C$D

mante 26.03.18 22:47

Danke
 
ich dachte mir ist bool CheckNumber() ja die Funktion


lg mante:)

Ca$hDigger 26.03.18 23:58

Die Schleife muss in eine Funktion, wie soll sie sonst aufgerufen werden...

next user 27.03.18 00:02

Zitat:

Zitat von mante (Beitrag 40758)
ich dachte mir ist bool CheckNumber() ja die Funktion


lg mante:)

Code:

bool CheckNumber(int Range)
{
  if(Range != lastNumber)
           
      return true;
 
    else
     
      return false;
} <<== Schließende Klammer von CheckNumber...
                                                      // Solange Test nicht ok, Schleife...
while(!CheckNumber())
...

Die while-Schleife muss dort hin, wo du die Zufallszahl generierst, nicht außerhalb jeder Funktion, wie "CheckNumber()".

Zitat:

Zitat von mante (Beitrag 40756)
Range = int nextuser;

Das "int" ist fehl am Platz.

Zitat:

Zitat von mante (Beitrag 40756)
... habe nur noch einen fehler im Compiler...

Nicht ganz, siehe vorherigen Punkt.
Und noch ein Fehler (der Compiler kann leider auch nicht ALLES, bräuchte mal ein Update. Folgenden Fehler hat er wohl nicht erkannt):
Zitat:

Zitat von mante (Beitrag 40756)
Range = int nextuser*;
...
Alert(nextuser*);

* ===>>> declaration of 'nextuser' hides predefined variable "next_user"


mante 27.03.18 11:16

vielen dank für eure Hilfe :-)

vor allem danke nexuser
irgendwo ist noch was falsch - ich habe zwar keine fehler mehr im Compiler aber print liefert keine zahlen

habt ihr eine Ahnung was da falsch ist

lg mante
Code:


    switch(a)
     
      {
             
      case 1:
      Range = 1;
      while(!CheckNumber(true))
      {
      CheckNumber (Range);
      Print ( "Die Zahl ist" +1);
      }
      break;
     
     
      case 2:     
      Range = 2;
      while(!CheckNumber(true))
      {
      CheckNumber(Range);
      Print (" Die Zahl ist 2");                                          // Zahl 15 wird an neu erstellte Funktion wert übergeben
      }
      break;
     
     
      case 3:
      Range = 3;     
      while(!CheckNumber(true))
      {
      CheckNumber(Range);
      Print (" Die Zahl ist 3");
      }
      break;
     
     
      case 4:
      Range = 4;
      while(!CheckNumber(true))
      {
      CheckNumber(Range);
      Print (" Die Zahl ist 4");   
      }
      break;
     
     
      case 5:
      Range = 5;
      while(!CheckNumber(true))
      {
      CheckNumber(Range);
      Print (" Die Zahl ist 5");
      }
      break;
     
     
      default:
      break;
   
      } 
}
 
                                                                    // Globale Variablen...

int lastNumber = 0;

bool CheckNumber(int Range)
{
 
 
  if(Range != lastNumber)
           
    return true;
 
    else
     
      return false;

 lastNumber = Range;


next user 27.03.18 11:56

Zitat:

Zitat von mante (Beitrag 40764)
Code:


    switch(a)
     
      {
             
      case 1:
      Range = 1;
      while(!CheckNumber(true))
      {
      CheckNumber (Range);
      Print ( "Die Zahl ist" +1);
      }
      break;


Was hast du denn da jetzt gemacht? IN der while-Schleife gehört "CheckNumber()" nicht rein!
Die wird doch im Kopf der Schleife aufgerufen. Und solange die Zufallszahl GLEICH der letzten ist, wird der Block der Schleife
ausgeführt! IN der Schleife musst du "Range" daher eine NEUE Zufallszahl zuweisen!

Ich glaube, da sind bei dir noch ein paar Verständnis- und Grundlagenprobleme.

Wenn du mal den Code posten könntest, wie du die Zufallszahlen erhälst, kann ich dir auch besser helfen.

mante 27.03.18 12:25

hallo nextuser
 
ich dacht mir

wenn

while (!CheckNumber(true)) // wenn anders als vorherige Zahl


wird

CheckNumber (Range);
Print ( "Die Zahl ist" +1);
}
die zahl an CheckNumber übergeben und ausgegeben :-)



damit hast du recht - leider :(

next user 27.03.18 12:39

Zitat:

Zitat von mante (Beitrag 40766)
ich dacht mir

wenn

while (!CheckNumber(true)) // wenn anders als vorherige Zahl


wird

CheckNumber (Range);
Print ( "Die Zahl ist" +1);
}
die zahl an CheckNumber übergeben und ausgegeben :-)

Zitat:

Zitat von next user (Beitrag 40765)
Ich glaube, da sind bei dir noch ein paar Verständnis- und Grundlagenprobleme.

damit hast du recht - leider :(

Du solltest für Zitate kein NEWSBREAK verwenden. ;)

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

Gehen wir nochmal durch:
Meine gepostete Funktion war diese:
Code:

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

Du hast daraus das gemacht:
Code:

bool CheckNumber(int Range)
{
  if(Range != lastNumber)
           
      return true;
 
    else
     
      return false;
}

Beide liefern nur "true", wenn die aktuelle Zufallszahl anders als die letzte ist.
Die beiden unterscheiden sich aber. Meine nutzt
eine globale Variable, deine einen Integer als Parameter.

Dein folgender Code
Code:

while(!CheckNumber(true))
{
  CheckNumber (Range);
  Print ( "Die Zahl ist" +1);
}

nutzt im Schleifen-Kopf eher meine Funktion (obwohl mit Parameter), im Block deine.
Die Funktionen machen aber das selbe und prüfen nur die Zahlen. Es bringt nichts, bei gleichen Zahlen IMMER, IMMER und
IMMER wieder zu prüfen (dein Funktionsaufruf im Block)!

Wie gesagt, wenn
Zitat:

Zitat von next user (Beitrag 40765)
du mal den Code posten könntest, wie du die Zufallszahlen erhälst, kann ich dir auch besser helfen.


next user 27.03.18 12:44

Zitat:

Zitat von traderdoc (Beitrag 40754)
Zitat:

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

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

Willst Du mich damit aggressiv machen? :D

traderdoc

Ahh, jetzt weiß ich auch, welchen du möchtest.

https://cdn02.dm-static.com/images/m...417306_org.png

mante 27.03.18 15:31

hmm
 
es tut mir echt leid wenn ich das nicht so verstehe - ich hoffe ich nerve euch nicht schon - ich habe echt keine Erfahrung in prog schreiben

ich dachte folgendes - case1 (zufällige Zahl ist eins) wenn der Code öfters hintereinander 1 liefert - soll für weiteren Code nur einmal eins weiter gegeben werden cas1 Range 1 ist zufallszahl1 (1,1,1,1 ist schlecht :-)

bool CheckNumber(int Range) // Funktion überprüft mir ob vor der aktuellen Zahl auch eine 1 war - wenn die Zahl vorher ungleich war dann liefert sie true wenn sie gleich war liefert sie false dieses gleich oder ungleich übergebe ich in die while Schleife in der die Zufallszahl entsteht (case1 für eins damit:

while(!CheckNumber(true))

und nur wenn die Zahl ungleich ist wird der Code in der while Schleife ausgeführt
CheckNumber (Range);
Print ( "Die Zahl ist" +1);
er gibt mir die neue Zahl 1 aus weil die vorherige Zahl nicht eins war ......


ihr denkt jetzt sicher ich bin komplett bescheuert :D

aber ich beschäftige mich erst seit einer Woche mit mql4 :mad:

danke auf alle fälle für eure geduld

der Code ist erst am anfang - ich hab das gefühl ich scheitere schon an so einer Kleinigkeit - hätte nicht gedacht, dass es so kompliziert ist aus

1,1,1,4,4,4,4,3,5, sowas zu bekommen 1,4,3,5

lg mante





Code:

switch(a)
     
      {
             
      case 1:
      Range = 1;
      while(!CheckNumber(true))
      {
      CheckNumber (Range);
      Print ( "Die Zahl ist" +1);
      }
      break;
     
     
      case 2:     
      Range = 2;
      while(!CheckNumber(true))
      {
      CheckNumber(Range);
      Print (" Die Zahl ist 2");                                          // Zahl 15 wird an neu erstellte Funktion wert übergeben
      }
      break;
     
     
      case 3:
      Range = 3;     
      while(!CheckNumber(true))
      {
      CheckNumber(Range);
      Print (" Die Zahl ist 3");
      }
      break;
     
     
      case 4:
      Range = 4;
      while(!CheckNumber(true))
      {
      CheckNumber(Range);
      Print (" Die Zahl ist 4");   
      }
      break;
     
     
      case 5:
      Range = 5;
      while(!CheckNumber(true))
      {
      CheckNumber(Range);
      Print (" Die Zahl ist 5");
      }
      break;
     
     
      default:
      break;
   
      } 
}
 
                                                                    // Globale Variablen...

int lastNumber = 0;

bool CheckNumber(int Range)
{
 
 
  if(Range != lastNumber)
           
    return true;
 
    else
     
      return false;

 lastNumber = Range;]


traderdoc 27.03.18 16:13

Das ist schon mal nicht richtig:

Code:

bool CheckNumber(int Range)
{
  if(Range != lastNumber)       
      return true;
  else
      return false;

 lastNumber = Range;
}

weil definitiv das lastNumber = Range; gar nicht erreicht wird und somit
findet auch nie eine Aktualisierung von lastNumber statt.

Und bei den Zeilen
while(!CheckNumber(true))
wird dann der Funktion CheckNumber() nicht der Wert der Variablen Range übergeben, sondern immer eine 1 (die für true steht). Nur wenn auch Range 1 wäre, würde das gehen. Aber das ergibt ja keinen Sinn.

traderdoc

mante 27.03.18 16:35

hab es jetzt geändert
 
funktioniert leider noch immer nicht

Code:

/ Zufallszahl a=1,2,3,4,5
    switch(a)
     
      {
             
      case 1:
      randNumber= 1;
      while(!CheckNumber())
      {
      Print (randNumber);
      }
      lastNumber = randNumber;
      break;
     
     
      case 2:     
      randNumber = 2;
      while(!CheckNumber())
      {
      Print (randNumber);
      }
      lastNumber = randNumber;
      break;
     
     
      case 3:
      randNumber = 3;     
      while(!CheckNumber())
      {
      Print (randNumber);
      }
      lastNumber = randNumber;
      break;
     
     
      case 3:
      randNumber = 4;     
      while(!CheckNumber())
      {
      Print (randNumber);
      }
      lastNumber = randNumber;
      break;
     
     
      case 3:
      randNumber = 5;     
      while(!CheckNumber())
      {
      Print (randNumber);
      }
      lastNumber = randNumber;
      break;
     
     
      default:
      break;
     
     
      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!
      }


traderdoc 27.03.18 17:41

Das ist mir ein wenig zuviel Probiererei.
Kann auch nicht funktionieren, weil

Code:

  case 1:
  randNumber= 1;
  while(!CheckNumber())
  {
      Print (randNumber);
  }
  lastNumber = randNumber;
  break;

Bei diesem Code und dem Fall, dass die Zufallszahl = 1 ist und nach Sprung
in die Funktion CheckNumber() der bool-Wert false zurückgegeben wird, dann läuft das Programm in eine Endlosschleife.

traderdoc

next user 27.03.18 18:33

Zitat:

Zitat von mante (Beitrag 40773)
es tut mir echt leid wenn ich das nicht so verstehe - ich hoffe ich nerve euch nicht schon

Solange wir antworten sind wir nicht genervt genug.
Ich mit meiner Kanne und Doc mit seinem speziellen Tee, wir haben uns etwas Geduld angetrunken... :D

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

Zitat:

Zitat von mante (Beitrag 40773)
ich dachte folgendes - case1 (zufällige Zahl ist eins) wenn der Code öfters hintereinander 1 liefert - soll für weiteren Code nur einmal eins weiter gegeben werden cas1 Range 1 ist zufallszahl1 (1,1,1,1 ist schlecht :-)

Der Gedanke ist ja nicht verwerflich, lediglich nicht richtig umgesetzt. Aber es geht auch deutlich einfacher.

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

Zitat:

Zitat von mante (Beitrag 40773)
bool CheckNumber(int Range) // Funktion überprüft mir ob vor der aktuellen Zahl auch eine 1 war - wenn die Zahl vorher ungleich war dann liefert sie true wenn sie gleich war liefert sie false dieses gleich oder ungleich übergebe ich in die while Schleife in der die Zufallszahl entsteht (case1 für eins damit:

while(!CheckNumber(true))

und nur wenn die Zahl ungleich ist wird der Code in der while Schleife ausgeführt
CheckNumber (Range);
Print ( "Die Zahl ist" +1);

Richtig verstanden, verkehrt umgesetzt. Das "true" gehört, wenn es denn sein muss, neben den Funktionsaufruf. Dazu dann
aber kein Ausrufezeichen! Zum besseren Verständnis:
Code:

(CheckNumber() == true) => ist GLEICH wie (CheckNumber())
(CheckNumber() == false) => ist GLEICH wie (!CheckNumber())

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

Zitat:

Zitat von mante (Beitrag 40773)
ihr denkt jetzt sicher ich bin komplett bescheuert :D

War das ne Frage, oder outest du dich grad?
Spaß beiseite, quatsch! Jeder Anfänger wird Fragen haben, die er später belächeln kann.

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

Gehen wir das ganze mal ausführlich durch:
(Ich beschreibe es anhand meiner ursprünglichen Funktion)
Code:

// Globale Variablen => überall im Code nutzbar
// Also außerhalb jeglicher Funktion erstellen
int randNumber = 0, lastNumber = 0;

// Die Funktion zum überprüfen, natürlich auch außerhalb
// jeglicher Funktion erstellen
bool CheckNumber()
{
  if(randNumber != lastNumber)
      return true;  // Zahlen sind unterschiedlich
  else
      return false;  // Zahlen sind identisch
}

// Den folgenden Code dann dort, wo du die Zufallszahlen
// erhälst. Ein switch ist überhaupt nicht notwendig!
randNumber = // Dein ..., welches die Zufallszahl liefert!

while(!CheckNumber()) // Also, solange false (Zahlen gleich) geliefert wird...
{
  // Die geprüfte Zahl ist mit der letzten identisch, daher
  // muss randNumber jetzt eine neue Zufallszahl erhalten,
  // welche im nächsten Schleifendurchlauf durch den
  // Schleifenkopf geprüft wird. Das geht so lange weiter,
  // bis die Zahlen ungleich sind. Dann wird die Schleife abgebrochen!
  randNumber = // Neue Zufallszahl...
}

// Nach der Schleife hat randNumber jetzt eine Zahl
// ungleich lastNumber. Diese kannst du nun für was
// auch immer weiter verarbeiten...

Ich hatte diese Funktion erstellt, da du den Thread mit eben einer Überprüfungsfunktion gestartet hast.
Bei einer so simplen Prüfung könnte man aber auch die Funktion weglassen und die Schleife mit
Code:

while(randNumber == lastNumber)
erstellen.

mante 27.03.18 19:50

mahhh danke
 
für all die Infos von euch:confused:

[QUOTE// Ein switch ist überhaupt nicht notwendig!
randNumber = // Dein ..., welches die Zufallszahl liefert!
][/QUOTE]


der Switch macht aber meine Zufallszahl :D

case 1 zufallszahl ist eins

case2 zufallszahl ist zwei

next user 27.03.18 21:18

Zitat:

Zitat von mante (Beitrag 40782)
der Switch macht aber meine Zufallszahl :D

case 1 zufallszahl ist eins

case2 zufallszahl ist zwei

Nö! Beim switch gehst du nur die Werte durch. Die Zufallszahl an sich ist doch das, womit du dein switch fütterst!
Und DIE erhälst du ja durch was anderes.

"case 1" VON WAS?? DAS IST DEINE ZUFALLSZAHL !!!

mante 27.03.18 22:28

hi next user
 
Die Zufallszahl entsteht wenn der Basiswert einen bestimmten Preis erreicht.

zb 1100 = case 1 - 1200 ist case 2 ....- die Funktion soll einen Wert liefern-da der Preis jedoch die 1100 erreicht und danach wieder bei 1101 oder 1105 danach wieder bei 1099 ist kommt der wert 1,1,1,1,2,2,2 zustande -eigentlich ist mein erster ea ein Projekt bei dem Orders erstellt werden bei preisen die ich vorher festlegen kann :)

ich wollte es so programmieren: wenn der preis die 1100 erreicht - mir ein Signal gibt wenn er dort ist -danach pause (keine weiteren Signale durch Schwankungen bei 1100 - nächste Signal erst wieder bei 1200

klingt einfach - dachte ich jedenfalls - aber ich wollte noch nix kompliziertes programieren für den Anfang

im switch habe ich die preise festgelegt - dh preis erreicht wert 1 - case 1....

zufällig sind die werte deshalb weil vorher nicht feststeht welchen Wert der Kurs als nächstes erreicht.

lg mante

lg mante

AVT 27.03.18 23:04

Ich bin an Dein ursprüngliches Problem mal ganz anders ran gegangen. Du sagtest ja, die "Zufallszahl" kommt aus dem Chart. Damit es auch öfter gleiche Zahlen gibt, hole ich meine Zufallszahl über den Spread. Mein Testscript läuft auf Eur/Usd im M1, ich habe die Durchläufe aber auf 5 begrenzt, damit die Ausgabe nicht zu lang wird.
Code:

// test script auf Eur/Usd
#property strict

void OnStart()
{
  int Zahleingabe;
 
  for(int i=0; i<5; i++) // Durchläufe
  {
     
      int Zufallszahl=FunktionHoleZahl();
      Print("habe Zahl gekriegt: ",Zufallszahl);

      if( FunktionHoleZahl()!=Zahleingabe ) // unterscheidet sich ->benutzen
      { 
        FunktionMachWasMitZahl(Zufallszahl);
        Zahleingabe=Zufallszahl;          // merken, das ist Zahleingabe (gewesen)

        Print("die hier ist erst mal nicht mehr zu gebrauchen: ",Zahleingabe);
      }
      else ;                                // ist gleich -> also mach nix

      Sleep(375);                          // für Tests abends
 
 
  }
}

// Funktion, die eine Zahl findet/holt
int FunktionHoleZahl()
{
  int Zahl=(int)MarketInfo(NULL,MODE_SPREAD);
  return(Zahl);
}

// Funktion, die eine Zahl weiterverarbeitet
void FunktionMachWasMitZahl(int Zahleingabe)
{
  // Code, der die Zahleingabe benutzt
  Print("FunktionMachWasMitZahl ",Zahleingabe,"! Ok,verbrauchen wir sie ",Zahleingabe);
}

Der Code funktioniert, vielleicht kannst Du ihn bei Dir so einbauen. AVT

mante 28.03.18 14:53

danke avt
 
ich habe es versucht aber es hat nicht geklappt - jetzt versuche ich es mal mit dem Code :p
Code:

int start()
{
    static bool first = true;
    static int pre_OrdersTotal = 0;
    int _OrdersTotal = OrdersTotal();
 
    // Wenn der Experte zum ersten Mal gestartet wird, ist die Zahl der Orders beim vorherigen Tick nicht bekannt.
    // Deswegen ihn einfach speichern, den ersten Start anmerken und beenden.
    if ( first )
    {
        pre_OrdersTotal = _OrdersTotal;
        first = false;
        return(0);
    }
 
    // Die Zahl der Positionen beim vorherigen Tick mit der laufenden Zahl vergleichen
    // Wenn sich die Zahl verändert hat, die Meldung anzeigen
    if ( _OrdersTotal > pre_OrdersTotal )
        Alert( "Die Zahl der Positionen ist gestiegen! früher - ", pre_OrdersTotal,
                                                        ", jetzt - ", _OrdersTotal );
 
    if ( _OrdersTotal < pre_OrdersTotal )
        Alert( "Die Zahl der Positionen ist gesunken! früher - ", pre_OrdersTotal,
                                                        ", jetzt - ", _OrdersTotal );
 
    // Die Zahl der Positionen speichern
    pre_OrdersTotal = _OrdersTotal;
 
return(0);
}]



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