Domande da un "manichino" - pagina 62

 
x100intraday:
Un esempio potrebbe essere...

Come questo (non la struttura, ma la classe, ovviamente):

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 );
  }

Cosa mettere dove, credo sia chiaro.

Non dimenticare alla fine:

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

Permettetemi di riformulare. Vi state chiedendo se è possibile, quando si definisce una funzione

specificare solo una variabile del tipo di struttura come suo parametro formale, ignorando il nome della struttura stessa? Cioè specificare, per esempio, non void funcName(MqlTradeRequest & req), ma solo void funcName(& req)?

Sì. Avete bisogno di una funzione universale per qualsiasi struttura semplice --- Nessun metodo, din. array. ecc. --- puramente una sequenza di tipi di dati specifici.

Poiché la composizione dello script è predeterminata da me, posso specificare esplicitamente il numero di strutture da trattare.

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

Ma per passare una qualsiasi di queste strutture inuna funzione con un nome, devo usare l'overloading.

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

Ci sono alcune difficoltà qui.

1. Il numero di strutture è limitato, perché il sovraccarico rallenta se si hanno più elementi.

2. Io stesso posso fare un errore quando copio le funzioni di sovraccarico.

PS// La funzionefunWrite() esegue certi calcoli ed esegueFileWriteArray() con una certa sequenza e parametri calcolati (da quale indice scrivere, quanti leggere).

 
rlx:

Sì. Avete bisogno di una funzione universale per qualsiasi struttura semplice --- Nessun metodo, din. array. ecc. --- puramente una sequenza di tipi di dati specifici.

Poiché la composizione dello script è predeterminata da me, posso specificare esplicitamente il numero di strutture da trattare.

Ma per passare una qualsiasi di queste strutture a una funzione con un nome, devo usare l'overloading.

Capisco. Qualche tempo fa ho fatto una domanda simile sulla possibilità di non specificare il tipo di array quando si definisce una funzione. Appena sotto, Roche ha consigliato il sovraccarico.

Così sono arrivato alla conclusione che le funzioni "built-in" comeFileWriteArray(), chehanno alcuni parametri specificati con tipo void, sono esse stesse funzioni sovraccaricate. Solo che non vediamo la loro attuazione.

 
Yedelkin:

Capisco. Ho già fatto una domanda simile una volta per sapere se era possibile non specificare il tipo di array quando si definisce una funzione. Appena sotto, Roche ha consigliato il sovraccarico.

Così sono arrivato alla conclusione che le funzioni "built-in" comeFileWriteArray(), chehanno alcuni parametri specificati con tipo void, sono esse stesse funzioni sovraccaricate. Solo che non possiamo vedere la loro attuazione.

Le funzioni integrate sono scritte in un linguaggio di programmazione completo.

In C, per esempio, si può passare qualsiasi numero di variabili, e già nella funzione ottenere una lista di parametri passati ed esaminarli.

void fun(...)
  {
}

In MQL5, non c'è questa possibilità. In particolare, mancano collegamenti e puntatori a tipi di dati e strutture semplici...

 

Deve avere qualcosa a che fare con la sicurezza. Accesso ai dati. Uscire dalla scatola di sabbia.

Ma voglio ancora che queste caratteristiche siano implementate in MQL5

 
rlx:

Deve avere qualcosa a che fare con la sicurezza. Accesso ai dati. Uscire dalla scatola di sabbia.

Ma vorrei ancora che queste caratteristiche fossero implementate in MQL5

Sarebbe meglio scrivere la vostra richiesta al Service Desk. Altrimenti, si perderà rapidamente nel forum.
 
Dima_S:

Come questo (non la struttura, ma la classe, ovviamente):

Penso che sia chiaro cosa mettere dove.

Alla fine, non dimenticare:

Questo è quello che io chiamo aiuto: reale e abbastanza concreto. Grazie. Dov'è il segno più?

A proposito... Ho pensato che per me va bene così. Ma non voglio rimanere formalista... ... così per curiosità ho deciso che non sarebbe stato male provare a organizzare un array bidimensionale. MQL mi ricorda qualcosa di C/C++, che ho dimenticato negli ultimi dodici anni circa. Ora ho provato a farlo in questo modo (senza loop - l'ho intenzionalmente semplificato):

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);
  }

Il compilatore genera l'errore: "'MABuffer' - la conversione dei parametri non è consentita".

Mi chiedo cosa sto sbagliando. Se non mi sbaglio, quando si dichiara una classe con array multidimensionale è necessario specificare numericamente una delle misure, rendendola statica?ArrayResize, nel frattempo, impostala nuova dimensione per la prima dimensione.

 

x100intraday:

Mi chiedo cosa sto sbagliando?

1) SetIndexBuffer funziona con un array di doppi della stessa dimensione.

2) Non è chiaro perché stai usando TBuffer*, cioè usi la dinamica dove non è necessaria?

3) (CONSIGLIO) Nell'esempio, si sarebbe potuto fare con una struttura invece di una classe, per risparmiare un po' di memoria e un paio di centinaia di cicli di clock.

 

mql5:

3) (CONSIGLIO) Nell'esempio, si sarebbe potuto fare con una struttura piuttosto che una classe, per risparmiare un po' di memoria e un paio di centinaia di cicli di clock.

Questo è stato controllato?
 

L'expert advisor usa l'indicatore su un diverso timeframe. Sui test l'EA mostra dati errati dall'indicatore.

L'EA stesso funziona su M5, e l'indicatore su H4. Gli indicatori chiamati sullo stesso timeframe (M5) restituiscono i valori corretti.

I valori restituiti sono simili ai valori dell'indicatore, ma sono diversi dai valori reali che sono visibili quando l'indicatore è applicato alla finestra del grafico dei prezzi.

Qual è il problema?

Esempio di codice di chiamata dell'indicatore:

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, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.
Motivazione: