Grundsatzfrage Zugriff via iCustom auf Buffer

 
Hallo,

ich habe eine grundsatzfrage. Wenn ich mangels Dokumentaion keine Beschreibung der vom Indicator zur Verfügung gestellten Buffer/Rückgabewerte habe, kann ich dann im Zweifel IMMER einfach nach dem Datenfeld gehen.

Bsp. im Datenfeld und sind dann die Zuordnungen von 0 bis Ende fortlaufend?
 
ReLor2:
Hallo,

ich habe eine grundsatzfrage. Wenn ich mangels Dokumentaion keine Beschreibung der vom Indicator zur Verfügung gestellten Buffer/Rückgabewerte habe, kann ich dann im Zweifel IMMER einfach nach dem Datenfeld gehen.

Bsp. im Datenfeld und sind dann die Zuordnungen von 0 bis Ende fortlaufend?
Nicht zwingend fortlaufend.

Es kann sein, dass zwischen den "öffentlichen" Werten aus dem Datenfenster Farbpuffer oder auch Berechnungspuffer sind.

Was du machen kannst ist mit einer Schleife den "DRAW_TYPE" abfragen um zu checken welche Puffer tatsächlich relevante Werte enthalten.

Solltest du an das Ende der gültigen Menge an Puffern ankommen, wird _LastError einen Fehlercode enthalten. Damit kannst du die Schleife dann beenden.


 
Dominik Egert #:
Nicht zwingend fortlaufend.

Es kann sein, dass zwischen den "öffentlichen" Werten aus dem Datenfenster Farbpuffer oder auch Berechnungspuffer sind.

Was du machen kannst ist mit einer Schleife den "DRAW_TYPE" abfragen um zu checken welche Puffer tatsächlich relevante Werte enthalten.

Solltest du an das Ende der gültigen Menge an Puffern ankommen, wird _LastError einen Fehlercode enthalten. Damit kannst du die Schleife dann beenden.


Ah ok, danke,  DRAW_TYPE ist in der Doku nicht verlinkt. Welche Art Schleife meinst du genau?

Würde das dann so in etwa ausshen

//Versuche solange Feld für Feld Daten zu Kopieren bis keine mehr geliefert werden
int result;
int buffer_pos=0;
while(result!=-1 && !IsStopped())
  {
        if (CopyBuffer(my_handle,buffer_pos,1,1,ZIELVARIABLE) < 0) {Print("ENDE > CopyBuffer  error =",GetLastError()); break;}
        buffer_pos++;
  }

//"Zielvariable" ->  Soweit ich weiß, können keine Mehrdimensionalen Arrays hier verwendet werden, ich müsste also x-statische Variablen auf gut Glück definieren?



Kann ich den erwarten am Ende also immer zugriff auf alle im Datenfenster auch angezeigten werte zu bekommen oder kann es sein, dass mir manche verwert bleiben und die Suche danach Zeitverschwendung ist?

 
ReLor #:

Ah ok, danke,  DRAW_TYPE ist in der Doku nicht verlinkt. Welche Art Schleife meinst du genau?

Würde das dann so in etwa ausshen



Kann ich den erwarten am Ende also immer zugriff auf alle im Datenfenster auch angezeigten werte zu bekommen oder kann es sein, dass mir manche verwert bleiben und die Suche danach Zeitverschwendung ist?

Jo, da habe ich einen Denkfehler gehabt, das klappt natürlich nur im "eigenen" Indikator, nicht aber für "unbekannte".


Hier ist mein Gedanke zu einer Lösung für externe Indikatoren:

    // Get handle to indicator

        indicator_shortname = ::MQLInfoString(MQL_PROGRAM_NAME);
        const int wnd_count  = (int)ChartGetInteger(ChartID(), CHART_WINDOWS_TOTAL);        
        for(int wndptr = NULL; (wndptr < wnd_count) && (indicator_handle == INVALID_HANDLE); wndptr++)
        {
            for(int ind_cnt = ChartIndicatorsTotal(ChartID(), wndptr) - 1; (ind_cnt >= NULL) && (indicator_handle == INVALID_HANDLE); ind_cnt--)
            { indicator_handle = (ChartIndicatorName(ChartID(), wndptr, ind_cnt) == indicator_shortname) ? ChartIndicatorGet(ChartID(), wndptr, indicator_shortname) : indicator_handle; }
            indicator_subwnd_id = (indicator_handle != INVALID_HANDLE) ? wndptr : indicator_subwnd_id;
        }
        printf("Indicator handle: %i", indicator_handle);
        ResetLastError();


    // Get all buffers from an indicator

        bool err = false;
        int buffer_num = NULL;
        double tmp_value[];
        while(!err)
        {
            err |= (!err) && ((CopyBuffer(indicator_handle, buffer_num, 0, 1, tmp_value) < 1) || (_LastError != ERR_SUCCESS));            
            printf("Indicator: %s; Buffer No: %i; Value: %f", indicator_shortname, (err) ? -1 : buffer_num, (err) ? NULL : tmp_value[0]);
            buffer_num++;
        }
        ResetLastError();


    // Release the indicators handle

        IndicatorRelease(indicator_handle);



Dies alles müsste jetzt noch in einer weitere Schleife gepackt werden, um alle auf dem Chart befindlichen Indikatoren zu addressieren, statt eine Version von sich selbst auf dem aktuellen Chart zu suchen. - Das betrifft den ersten Abschnitt des Beispiels.

Allgemein sollte das allerdings eine Idee geben, wie du dich diesem Problem nähern kannst.

 
string StringCommentArray(double &array[])
  {
   string str_comment = "";
   int    size = ArraySize(array);
   for(int i = 0; i < size; i++)
     {
      str_comment += StringFormat("\n array[%d] = %g", i, array[i]);
     }
   return(str_comment);
  }


Hey, lass dir mal die letzten zehn/zwanzig Werte über Comment ausgeben, dann siehst du was in dem Buffer drin ist. Mache Screenshots und poste sie hier, man kann wahrscheinlich die ArrowBuffers von den TradingSignalBuffern unterscheiden.

Dazu einen EA erstellen mit diesem Indikator in icustom und dann von allen Buffern die letzten zehn/zwanzig Werte mit Copybuffer auslesen. Die Funktion von oben unter OnTick kopieren und aus Comment innerhalb OnTick aufrufen:

Comment(StringCommentArray(IndicatorArray));

Der StringComment wird dann übersichtlich aus den Werten des als Parameter angegebenen Arrays zusammengestellt.

Die ArrowBuffers werden hauptsächlich aus Nullen bestehen, mit Preisen, da wo die Pfeile sind. Und die Long/Short-SignalBuffer haben möglicherweise nur Einsen und Nullen gespeichert.

Es wird dann möglich sein, mit Hilfe der Buffernummern aus dem Datenfeld zu sehen, ob diese stimmen.
Grund der Beschwerde: