Fragen von einem "Dummy" - Seite 62

 
x100intraday:
Ein Beispiel wäre...

Etwa so (natürlich nicht die Struktur, sondern die Klasse):

class TBuffer
{
public:
  double  MABuffer[ ];
};

//---------------------------------------------------------------------
TBuffer*  Buffer_Array[ ];
//---------------------------------------------------------------------

//---------------------------------------------------------------------
  ArrayResize( Buffer_Array, NUMBER );
  for( int i = 0; i < NUMBER; i++ )
  {
    Buffer_Array[ i ] = new TBuffer;
    SetIndexBuffer( i, Buffer_Array[ i ].MABuffer, INDICATOR_DATA );
  }

Ich denke, es ist klar, was wo hingehört.

Vergessen Sie am Ende nicht:

  for( int i = 0; i < NUMBER; i++ )
  {
    delete( Buffer_Array[ i ] );
  }
 
Yedelkin:

Lassen Sie es mich anders ausdrücken. Sie fragen sich, ob es möglich ist, bei der Definition einer Funktion

nur eine Variable des Strukturtyps als formalen Parameter angeben und den Namen der Struktur selbst ignorieren? D.h. zum Beispiel nicht void funcName(MqlTradeRequest & req) angeben, sondern einfach void funcName(& req)?

Ja. Sie brauchen eine universelle Funktion für jede einfache Struktur --- keine Methoden, din. arrays. etc. --- lediglich eine Folge bestimmter Datentypen.

Da die Zusammensetzung des Skripts von mir vorgegeben ist, kann ich die Anzahl der zu bearbeitenden Strukturen explizit angeben.

struct Data1
  {
   double param[1000000];
  };
struct Data2
  {
   int    temp;
   double k;
  };
struct Data3
  {
   int    temp;
   double k;
  };

Aber um eine dieser Strukturen an eineFunktion mit einem Namen zu übergeben, muss ich Überladen verwenden.

void funWrite(Data1 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data2 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data3 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }

Hier gibt es einige Schwierigkeiten.

1. die Anzahl der Strukturen ist begrenzt, da die Überladung bei einer größeren Anzahl von Elementen langsamer wird.

2. Ich selbst könnte beim Kopieren der Überladungsfunktionen einen Fehler machen.

PS// Die FunktionfunWrite() führt bestimmte Berechnungen durch und führtFileWriteArray() mit einer bestimmten Sequenz und berechneten Parametern aus (von welchem Index wird geschrieben, wie viele werden gelesen).

 
rlx:

Ja. Sie brauchen eine universelle Funktion für jede einfache Struktur --- keine Methoden, din. arrays. etc. --- lediglich eine Folge bestimmter Datentypen.

Da die Zusammensetzung des Skripts von mir vorgegeben ist, kann ich die Anzahl der zu bearbeitenden Strukturen explizit angeben.

Aber um eine dieser Strukturen an eine Funktion mit einem Namen zu übergeben, muss ich Überladung verwenden.

Ich verstehe. Vor einiger Zeit stellte ich eine ähnliche Frage, nämlich ob es möglich sei, bei der Definition einer Funktion den Typ von Arrays nicht anzugeben. Gleich darunter riet Roche zur Überlastung.

So kam ich zu dem Schluss, dass "eingebaute" Funktionen wieFileWriteArray(), bei denen einige Parameter mit dem Typ void angegeben werden, selbst überladene Funktionen sind. Wir sehen nur nicht, wie sie umgesetzt werden.

 
Yedelkin:

Ich verstehe. Ich habe schon einmal eine ähnliche Frage gestellt, ob es möglich ist, bei der Definition einer Funktion den Typ von Arrays nicht anzugeben. Gleich darunter riet Roche zur Überlastung.

So kam ich zu dem Schluss, dass "eingebaute" Funktionen wieFileWriteArray(), bei denen einige Parameter mit dem Typ void angegeben werden, selbst überladene Funktionen sind. Wir können nur nicht sehen, wie sie umgesetzt werden.

Eingebaute Funktionen sind in einer vollständigen Programmiersprache geschrieben.

In C können Sie zum Beispiel eine beliebige Anzahl von Variablen übergeben und bereits in der Funktion eine Liste der übergebenen Parameter erhalten und diese untersuchen.

void fun(...)
  {
}

In MQL5 gibt es eine solche Möglichkeit nicht. Insbesondere fehlen Links und Zeiger auf einfache Datentypen und Strukturen...

 

Das muss etwas mit Sicherheit zu tun haben. Zugang zu Daten. Über den Sandkasten hinausgehen.

Ich möchte aber trotzdem, dass diese Funktionen in MQL5 implementiert werden

 
rlx:

Das muss etwas mit Sicherheit zu tun haben. Zugang zu Daten. Über den Sandkasten hinausgehen.

Ich möchte aber trotzdem, dass diese Funktionen in MQL5 implementiert werden

Es wäre besser, Ihre Anfrage an den Service Desk zu richten. Andernfalls geht sie im Forum schnell verloren.
 
Dima_S:

Etwa so (natürlich nicht die Struktur, sondern die Klasse):

Ich denke, es ist klar, was wo hineingehört.

Vergessen Sie am Ende nicht:

Das nenne ich Hilfe: real und ganz konkret. Ich danke Ihnen. Wo ist das Pluszeichen?

Übrigens... Ich habe mir überlegt, dass das für mich gut genug ist. Aber ich will kein Formalist sein... ... also beschloss ich aus Neugier, dass es nicht schaden würde, zu versuchen, ein zweidimensionales Array zu organisieren. MQL erinnert mich ein wenig an C/C++, das ich in den letzten zwölf Jahren vergessen habe. Jetzt habe ich versucht, es auf diese Weise zu machen (ohne Schleife - ich habe es absichtlich vereinfacht):

class TBuffer
{
public:
  double MABuffer[][1];
};

//---------------------------------------------------------------------
TBuffer* Buffer_Array[][1];
//---------------------------------------------------------------------
int OnInit()
  {
   ArrayResize(Buffer_Array,1);
   Buffer_Array[0][0] = new TBuffer;
   SetIndexBuffer(0,Buffer_Array[0][0].MABuffer,INDICATOR_DATA);
// --- [...]
   delete(Buffer_Array[0][0]);
   return(0);
  }

Der Compiler erzeugt die Fehlermeldung: "'MABuffer' - parameter conversion is not allowed".

Ich frage mich, was ich falsch mache. Wenn ich mich nicht irre, bei der Deklaration einer Klasse mit mehrdimensionalen Array ist es notwendig, numerisch eine der Messungen angeben, so dass es statisch?ArrayResize, inzwischen setztneue Größe für die erste Dimension.

 

x100intraday:

Ich frage mich, was ich falsch mache?

1) SetIndexBuffer arbeitet mit einem Array von Doubles der gleichen Dimension.

2) Es ist nicht klar, warum Sie TBuffer* verwenden, d.h. Dynamics verwenden, wo sie nicht benötigt werden?

3) (TIPP) Im Beispiel hätte man statt einer Klasse auch eine Struktur verwenden können, um ein wenig Speicherplatz und ein paar hundert Taktzyklen zu sparen.

 

mql5:

3) (TIPP) Im Beispiel hätte man statt einer Klasse auch eine Struktur verwenden können, um ein wenig Speicherplatz und ein paar hundert Taktzyklen zu sparen.

Ist dies überprüft worden?
 

Der Expert Advisor verwendet den Indikator in einem anderen Zeitrahmen. Bei Tests zeigt der EA falsche Daten des Indikators an.

Der EA selbst arbeitet auf M5, der Indikator auf H4. Indikatoren, die auf dem gleichen Zeitrahmen (M5) aufgerufen werden, geben die richtigen Werte zurück.

Die zurückgegebenen Werte ähneln den Indikatorwerten, unterscheiden sich aber von den tatsächlichen Werten, die sichtbar sind, wenn der Indikator auf das Preisdiagrammfenster angewendet wird.

Was ist das Problem?

Beispielcode für einen Indikatoraufruf:

int W_handle;
int OnInit()
  {
   W_handle=iCustom(NULL, PERIOD_H4, "WW");
  }

void OnNewBar() // моя функция
{
 double wave[10];
 ArraySetAsSeries(wave, true);

 CopyBuffer(W_handle,0,0,2,wave);
 if (wave[1] > 0) Buy(); 
// по замыслу в wave[1] должно лежать значение индикатора на предыдущем баре H4
// но так получается только на нескольких первых обращениях, потом результат начинает расходиться с реальностью
}
Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.