Wie plotte ich werte aus einem Array (ohne unübersichtliches Indikator getechtel möglich?)?

 

Hey liebe MQLer,

Hab ein 2d array und will den ersten und den zweiten wert ähnlich einer Moving Average linie im Chart plotten. Mein Problem: Trotz der dutzenden Artikel über indikatoren weiß ich nicht wie ich das ganze auf meinen Fall bezogen angehen kann, denn hier soll nichts berechnet sondern lediglich geplottet werden :( (Hinweis: das array importiert seine daten aus einer csv-> die import funktion getPredictions() klappt leider nicht in der OnInit(), daher bisher immer in der OnTick gemacht.

Hoffe das das möglich ist, habe den ganzen indikator stuff so aus einem thread übernommen aber nicht richtig implementieren können.

#property indicator_chart_window

#property indicator_buffers 1
#property indicator_plots   1 
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
double    longPred[],shortPred[];


#define colAmountMain 2*6
input string mainPredictionCSV_Name = "main_Preds.csv";
string mainPredHeader[]; 
string mainPredIndex[];
string mainPredArr[][colAmountMain];   // [Labels * Ratios]
string mainDateArr[];

input int colToTradeMain=1; // first Column of symbolToTrade in mainPredArr[][] (= loc of First Label for this Symbol)


input bool useMetaPredictions = false;

#define colAmountMeta 4*6
input string  metaPredictionCSV_Name = "meta_Preds.csv";
string metaPredHeader[]; 
string metaPredIndex[];
string metaPredArr[][colAmountMeta];    // [Labels * Ratios]
string metaDateArr[];

input int colToTradeMeta=1; // first Column of symbolToTrade in mainPredArr[][] (= loc of First Label for this Symbol)
static string symbolToTrade;
static ENUM_TIMEFRAMES timeFrameToTrade;
static datetime oldbar;
static bool gotPredictions   = false;
//static int  colAmountMain,colAmountMeta;
static int  currTimeIndexRow = 0;

int OnInit() {

   ArrayResize(mainPredArr,(ArraySize(mainPredArr)+1));
   //colAmountMain = ArraySize(MainPredArr);
   ArrayResize(mainPredHeader,colAmountMain);
   
   ArrayResize(metaPredArr,(ArraySize(metaPredArr)+1));
   //colAmountMeta = ArraySize(MetaPredArr);
   ArrayResize(metaPredHeader,colAmountMeta);
   
   symbolToTrade     = _Symbol;
   timeFrameToTrade = PERIOD_CURRENT;
   
   oldbar = iTime(symbolToTrade,timeFrameToTrade,0);

  SetIndexBuffer(0, longPred, INDICATOR_DATA);
  SetIndexBuffer(0, shortPred, INDICATOR_DATA);
  ArraySetAsSeries(longPred,true);
  ArraySetAsSeries(shortPred,true);
  

  
  return(INIT_SUCCEEDED);
}

void OnTick() {
    
      
    if (!gotPredictions)
      {
      if (getPredictions(mainPredArr,metaPredArr,mainPredHeader,mainPredIndex,metaPredHeader,metaPredIndex))
         {Print("successfully imported predictions.");
         gotPredictions = true;
         }
      else
         {Print("ERROR while importing predictions!");
         }
      }          

    if (oldbar != iTime(symbolToTrade,timeFrameToTrade,0))
       {
       if (TimeToString(oldbar)==TimeToString(mainPredIndex[currTimeIndexRow]) && currTimeIndexRow<ArrayRange(mainPredArr,0)-1 )
               {
               double open_price = iOpen(symbolToTrade,timeFrameToTrade,0);
               
               
               mainPredArr[currTimeIndexRow][colToTradeMain] +=open_price;
               mainPredArr[currTimeIndexRow][colToTradeMain+1]+=open_price;
       
                longPred[0]  = mainPredArr[currTimeIndexRow][colToTradeMain] +=open_price;
                shortPred[0] = mainPredArr[currTimeIndexRow][colToTradeMain+1]+=open_price;
                ChartRedraw();
       
               currTimeIndexRow++;
               }
            //errorcase wäre Überlegung wert
            oldbar = iTime(symbolToTrade,timeFrameToTrade,0);
       }
   }  

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return (rates_total);
}





bool getPredictions (string& MainPredArr[][colAmountMain], string& MetaPredArr[][colAmountMeta], string & MainPredHeader[],string & MainPredIndex[], string & MetaPredHeader[],string &MetaPredIndex[])
   {
   //====== Import Main Predictions   
      //   int  mainHandle = FileOpen(mainPredictionCSV_Name,FILE_READ|FILE_CSV,CP_UTF8);
      int  mainHandle = FileOpen(mainPredictionCSV_Name,FILE_READ|FILE_CSV|FILE_ANSI,',');
   
      if(mainHandle >0)
        {
         Print("Main-Predictions File successfully opened.");
      
         MainPredHeader[0]=FileReadString( mainHandle); //einfach wert loswerden
         for(int col=0; col<colAmountMain; col++){ 
             MainPredHeader[col]= FileReadString(mainHandle);
                  Print("MainPredHeader [",col,"] = ",MainPredHeader[col]);
                  }
         
         int row =0;
         while(!FileIsEnding(mainHandle))
           {
            ArrayResize(MainPredIndex,(ArraySize(MainPredArr)+1));
            ArrayResize(MainPredArr,(ArraySize(MainPredArr)/colAmountMain+1));
            
            //StrTorSplit.slice(3,-3);
            MainPredIndex[row] =  StringToTime(StringSubstr(FileReadString( mainHandle),3,19)); //FileReadString( mainHandle);
            Print(TimeToString(MainPredIndex[row]));
            Print(MainPredIndex[row]);
            string nix=  FileReadString( mainHandle);
            

            for(int col=0; col<colAmountMain; col++){ // schreibe csv col 1-13 in array (wobei 0 der TimeIndex ist)
                  MainPredArr[row][col]= FileReadString(mainHandle);
                  Print("MainPredArr [",row,"][",col,"] = ",MainPredArr[row][col]);
                  }
            row++;
            }        
         Print("Tick Started");     
         FileClose(mainHandle); //ExpertRemove();
         if(!useMetaPredictions)
            {return true;}
        }
      else
        {Print("File "+mainPredictionCSV_Name+" not found, the last error is ", GetLastError());
         ExpertRemove();
        }
     
     
   //====== Import Meta Predictions  
      int  metaHandle = FileOpen(metaPredictionCSV_Name,FILE_READ|FILE_CSV|FILE_ANSI,',');
   
      if(metaHandle >0)
        {
         Print("Meta-Predictions File successfully opened.");
         
         MetaPredHeader[0]=FileReadString( metaHandle); //einfach wert loswerden
         for(int col=0; col<colAmountMeta; col++){ 
             MetaPredHeader[col]= FileReadString(metaHandle);
                  Print("MetaPredHeader [",col,"] = ",MetaPredHeader[col]);
                  }
         int row =0;
         while(!FileIsEnding(metaHandle))
           {
            ArrayResize(MetaPredIndex,(ArraySize(MetaPredArr)+1));
            ArrayResize(MetaPredArr,(ArraySize(MetaPredArr)/colAmountMeta+1));
            MetaPredIndex[row]= FileReadString( metaHandle);     string nix = FileReadString( metaHandle);
            
            for(int col=0; col<colAmountMeta; col++){ // schreibe csv col 1-13 in array (wobei 0 der TimeIndex ist)
                  MetaPredArr[row][col]= FileReadString(metaHandle);
                  Print("MetaPredArr [",row,"][",col,"] = ",MetaPredArr[row][col]);
                  }
            row++;
            }       
         Print("Tick Started");     
         FileClose(metaHandle); //ExpertRemove();
         return true;
        }
      else
        {
         Print("File "+metaPredictionCSV_Name+" not found, the last error is ", GetLastError());
         ExpertRemove();
        }
   return false;
   }
 

Schau dir das hier an.

https://www.mql5.com/de/articles/2866

Das einzigste was ohne dlls auskommt. Sollte genügen für deine Zwecke

Visualisierung! Eine grafische MQL5 Bibliothek ähnlich 'plot' der Sprache R
Visualisierung! Eine grafische MQL5 Bibliothek ähnlich 'plot' der Sprache R
  • www.mql5.com
Der wesentliche Vorteil der 'plot'-Funktion ist, dass Sie nur ein paar Codezeilen zum Zeichnen beliebiger Grafiken benötigen. Die Daten werden einfach in Form eines Arrays übergeben und der Grafiktyp angegeben, das war's! Die 'plot'-Funktion berechnet alles Notwendige wie den Maßstab, die Achsen, die Auswahl der Farben etc. In MQL5 werden alle...
 

"Hab ein 2d array und will den ersten und den zweiten wert ähnlich einer Moving Average linie im Chart plotten. Mein Problem: Trotz der dutzenden Artikel über ..."

Irgendwo in der Doc steht (sicherlich), dass 'plottable' Indikatorpuffer IMMER eindimensional sein müssen. Du brauchst also zwei Puffer für Deine zwei Indiaktorlinien.

 

Dass ich die werte aus dem 2d array in seperaten speichern kann ist weniger die frage.

Benötige vielmehr sowas:(verlinkung auf post 74)

https://www.mql5.com/en/forum/319316/page8#comment_13055294

(@Christian die libary aus deinem link sieht auf den ersten blick nicht ganz danach aus etwas als chartlinie plotten zu können (korrigier mich wenn doch) vllt habe ich mit "plotten" auch nur das falsche Wort verwendet)

Also so wie im verlinkten beitrag, wie ist das möglich?

Taking Neural Networks to the next level
Taking Neural Networks to the next level
  • 2019.09.01
  • www.mql5.com
This thread won't be about a question or problem, but rather about the anouncement of the presentation and documentation of an exciting trading con...
 
Bayne:

Dass ich die werte aus dem 2d array in seperaten speichern kann ist weniger die frage.

Benötige vielmehr sowas:(verlinkung auf post 74)

https://www.mql5.com/en/forum/319316/page8#comment_13055294

..

Also so wie im verlinkten beitrag, wie ist das möglich?

Jetzt bin ich ratlos?

  1. In der verlinkten Version gibt es drei  Puffer für die Werte der Linien: a) Magenta kontinuierlich b) Magenta gepunktet b) Türkis.
  2. Ohne die Berechnung zu kennen, die zu den beiden Linien in Magenta führen, habe ich den starken Verdacht, dass die "polynomial regression" 're-painting' ist!
  3. Re-painting heißt: mit jedem neuen Wert ändern sich die Linien in Magenta! Konkret könnte es sein dass nach den nächsten zwei neuen Bars, die wieder nach unten drehen plötzlich aus dem so schönen Ausbruch nach oben dann ein Abwärtstrend entstanden ist.
 
Bayne:

(@Christian die libary aus deinem link sieht auf den ersten blick nicht ganz danach aus etwas als chartlinie plotten zu können (korrigier mich wenn doch) vllt habe ich mit "plotten" auch nur das falsche Wort verwendet)

Ähm .. stimmt . War zu schnell mit antworten.Der Rest des Textes hätte mich davon abhalten sollen.

Ja , plotten war Schlüsselwort.

 

Was willst Du haben einen EA (=> OnTick()) oder einen Indicator (=> OnCalculate())?

In Deinem Code verwendest Du beides - motz da der Compiler nicht oder als was sieh er es an?

 
Carl Schreiber:

Was willst Du haben einen EA (=> OnTick()) oder einen Indicator (=> OnCalculate())?

In Deinem Code verwendest Du beides - motz da der Compiler nicht oder als was sieh er es an?

Will einen EA,


Das Bild oben (Türkis) hat eine traceline, also gibt die hinterlassene Spur an (die magenta war weniger gemeint sry)

(Die oncalculated funktion habe ich implementiert da ich dachte dass sie eine funktion wäre um etwas auf den chart zu plotten, misverstädnlich versteht sich).


Habe eine Matrix mit Predictions. (aus einem Python csv) und würde die preise gerne plotten um sie mit dem tatsächlich eintretenden preis zu vergleich (optisch). Wie geht das am besten?

 
Bayne:

Will einen EA,

...

Habe eine Matrix mit Predictions. (aus einem Python csv) und würde die preise gerne plotten um sie mit dem tatsächlich eintretenden preis zu vergleich (optisch). Wie geht das am besten?

Plotten geht am besten mit einem Indikator.

 
Carl Schreiber:

Plotten geht am besten mit einem Indikator.

Grob nh idee wie ich das am besten anstellen kann?

Evtl einen Indicator pullPredictionCSV() schreiben in dessen OnInit() die CSV eingelesen wird und danach bei jeder neuen bar eins aufrücken. Keine idee wie ich letzteres anstellen kann... (also nur wenn neue Bar eins aufrücken)

 
Bayne:

Grob nh idee wie ich das am besten anstellen kann?

Evtl einen Indicator pullPredictionCSV() schreiben in dessen OnInit() die CSV eingelesen wird und danach bei jeder neuen bar eins aufrücken. Keine idee wie ich letzteres anstellen kann... (also nur wenn neue Bar eins aufrücken)

Hmm - Du kannst hier nicht im Forum quasi Programmieraufträge erteilen - dafür gibt es die Freelancer!

Wenn Du das aber nicht willst, musst Du das lernen, am besten mit Beispielen aus der Codebase.

Grund der Beschwerde: