Einzelnen Beitrag anzeigen
  #6 (permalink)  
Alt 18.03.20
TogoTiger TogoTiger ist offline
Mitglied
 
Registriert seit: Dec 2015
Beiträge: 85
TogoTiger befindet sich auf einem aufstrebenden Ast
Standard

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?