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)
-   -   Werte aus for schleife berechnen (http://www.expert-advisor.com/forum/showthread.php?t=6613)

WD2 15.03.20 20:29

Werte aus for schleife berechnen
 
Hallo zusammen,

Ich möchte gerne die Daten, die ich in einer For Schleife gesammelt habe, berechnen und dann auswerten z.b.

Von Close[1000] bis Close[24] wie oft wurde dort ein Preis getroffen? Der Preis der am häufigsten getroffen wurde, soll angezeigt werden. Also Preis 100 3x (zwischen den Kerzen). Welcher Preis am zweit häufigsten usw. Bis jetzt habe ich folgendes funktionieren tut dies leider nicht.

Code:

void OnTick()
  {
      //--
      for(i = FirstBar; i <= LastBar; i++ )
      {CFB = Close[i];}
        //---
        for(j = i+FirstBar; j <= LastBar; j++ )
        {CLB = Close[j];}
     
      //--
      if(CFB == CLB)
      {counter++;}
     
      //--
      Comment("Hits: ",counter);
     
  }


MA-EA 16.03.20 14:36

Jetzt mal schnell geraten:
Code:

i <= LastBar;
Nicht <= sondern nur <


Poste mal den ganzen Code.

WD2 16.03.20 15:00

Hab ich versuch hat leider nichts gebracht. Hier den ganzen Code:

Code:

int i,j;
double CFB,CLB;

int counter = 0;

extern int FirstBar  = 1;
extern int LastBar    = 100;
extern int MaxHit    = 2;

//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
 
//---
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
  {
      //--
      for(i = FirstBar; i <= LastBar; i++ )
      {CFB = Close[i];}
        //---
        for(j = i+FirstBar; j <= LastBar; j++ )
        {CLB = Close[j];}
     
      //--
      if(CFB == CLB)
      {counter++;}
     
      //--
      Comment("Hits: ",counter);
     
  }
//+------------------------------------------------------------------+


WD2 17.03.20 20:35

Hat niemand eine Idee?

MA-EA 18.03.20 00:55

Nicht wirklich. :confused:

Mein (theoretischer) Weg wäre:

Mit ner for Schleife, so wie es anscheinend beabsichtigt ist, die ganzen Preise in nen Array packen.

Dann dieses mit ner Extra-Schleife durchsuchen. Wobei man dann wohl einen Wert nach dem Anderen nacheinander mit allen Anderen vergleichen müsste.

Aber ich versteh weder viel von Schleifen noch von Arrays. :rolleyes:

Was ist eigentlich close[i] ?

TogoTiger 18.03.20 09:05

Dein Problem kannst z.B. mit einem zweidimensionalen Array lösen:
Hier mit fixem Array, kannst natürlich auch dynamisch machen.

Ich denke nicht, dass du das bei jedem Tick berechnen willst, also mach das so, dass dein Array nur bei jeder neuen Kerze gefüllt wird.

Der Code ist bewusst sehr einfach gestrickt. Du kannst z.B. die Performance verbessern, wenn du die Tabelle nur beim OnInit erstellst und danach jede neue Kerze einfügst und nicht bei jeder Kerze die ganze Tabelle neu berechnest.

Code:

int      i,j;
int      FirstBar=1, LastBar=1000;
double  Kurse[1000][2];
int      max_j = -1;

datetime TimeOld;

//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit()
{
//---
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
{
  if(Time[0] != TimeOld)        // Nur ausführen, wenn neue Kerze
  {

      for (j=0;j<1000;j++)
      {
        Kurse[j,0] = 0;
        Kurse[j,1] = 0;
      }
      max_j = -1;
     
      for (i=FirstBar;i<=LastBar;i++)
      {
        for (j=0;j<=(max_j+1);j++)
        {
            if (Kurse[j,1] == Close[i])
            {
              Kurse[j,0]++;
              break;
            }
            if (Kurse[j,1] == 0)
            {
              max_j++;
              Kurse[max_j,0] = 1;
              Kurse[max_j,1] = Close[i];
              break;
            }
        }
      }

      for (j=0;j<max_j;j++)
      {
        Print ("j: ",j," Kurs: ",DoubleToString(Kurse[j,1],3)," getroffen: ",Kurse[j,0]);
      }
  }

  TimeOld = Time[0];
}

Bei jedem Tick püfst jetzt, ob dein Kurs im Array vorkommt und wie oft. Damit du aber keine Performanceprobleme kriegst solltest die relevanten Werte (mehr als z.B.2 Treffer) in ein neues Array übertagen und dann damit prüfen.

Ich habe das mit USDJPY getestet, also 3 Nachkommastellen. Das gibt logischerweise nur sehr wenige Treffer. Bei Paaren mit mehr Nachkommastellen solltest du runden, sonst kriegst immer nur 1 als Treffer. Auch beim DAX hast nur im 1 Min. Chart ein paar auswertbare Teffer.

@MA-EA Close[i] ist der Schlusskurs der Kerze i. Wenn i=0, dann ist das der jetzige Kurs, i=1 ist die letzte fertige Kerze, i=2 die vorletzte etc.
äh, wieviele Jahre versuchst jetzt schon zu programmieren?

traderdoc 18.03.20 10:20

Zitat:

Zitat von MA-EA (Beitrag 43423)
Nicht wirklich. :confused:

Mein (theoretischer) Weg wäre:

Mit ner for Schleife, so wie es anscheinend beabsichtigt ist, die ganzen Preise in nen Array packen.

Dann dieses mit ner Extra-Schleife durchsuchen. Wobei man dann wohl einen Wert nach dem Anderen nacheinander mit allen Anderen vergleichen müsste.

Aber ich versteh weder viel von Schleifen noch von Arrays. :rolleyes:

Was ist eigentlich close[i] ?

Lieber @MA-EA,
sorry, ich staune immer wieder, mit welcher Beharrlichkleit Du hier Ratschläge und Hinweise gibst, als wäre es Dein täglich Brot. Ja, Du könntest jetzt sagen,
"ich habe wenigstens etwas dazu beigetragen". Ok, ich habe nichts dazu beigetragen, was aber bisher nur daran lag, dass ich mich mit der Problematik aus Zeitgründen nicht beschäftigt habe.
Nur wenn Du von for-Schleifen und Arrays schreibst und alle wissen hier durch Deine eigenen Aussagen, dass Du von Beidem keine Ahnung hast, dann frage ich wieder sehr besorgt, warum tut er dies?
Ich empfehle auch nicht Dinge, von denen ich keine Ahnung habe. Das geht doch eher nach hinten los, streut unnötig Fehlinformatioen und verwässert und verkompliziert doch nur die Threads, ohne Mehrwert zu generieren.

Daher meine inständige Bitte, lass es bitte sein.

traderdoc

WD2 19.03.20 10:37

TogoTiger

Erstmal vielen Dank, ich habe soweit deinen Code durch gelesen und Verstanden, bis auf eins nicht ganz.

Code:

Kurse[j,0]
Die 0 bzw. 1 hinter dem i welche genau Funktion hat sie?

TogoTiger 19.03.20 10:43

Kurse[1000][2] ist ein zweidimensionales Array mit 1000 Plätzen. Der erste Index enthält in meinem Beispiel die Anzahl Treffer, der 2. Index den Kurs.
Schau den Print-Befehl an und schau im MT4 Terminal bei Experten was der Befehl ausgibt, dann wirst das verstehen.


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