Domande da un "manichino" - pagina 86

 

Renat, la domanda era teorica più che pratica.

Per non perdersi nella nebbia, vi rimando a un esempio dalla guida di iFractals. È vero che c'è un indicatore, ma semplifichiamo il compito a un solo calcolo del layout grafico da parte di uno script.

Supponiamo che io intenda scoprire i tempi di tutte le barre frattali in alto su tutta la storia (o sulla sua parte sostanziale su qualche timeframe medio dove ci saranno molti frattali). Ho capito bene che è meglio disturbare ripetutamenteCopyTime in loop a FrUpBuffer[shift]!=EMPTY_VALUE ad una profondità di 1 elemento:

handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for(int shift=0; shift<BarsCalculated(handle); shift++)
{
   if(FrUpBuffer[shift]!=EMPTY_VALUE)
   {
     CopyTime(_Symbol,PERIOD_H4, shift, 1, Arr);
     Print(Arr[0]);
   }
}

bool FillArraysFromBuffers(double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);

   return(true);
  }

e ottenere un risultato più veloce che mangiare la storia in una volta con CopyTime per profondità di FrUpBuffer:

handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for(int shift=0; shift<BarsCalculated(handle); shift++)
{
   if(FrUpBuffer[shift]!=EMPTY_VALUE)
     Print(TimeUpBuffer[shift]);
}

bool FillArraysFromBuffers(double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);
   else CopyTime(_Symbol,PERIOD_H4,0,amount,TimeUpBuffer);

   return(true);
  }
e poi nello stesso ciclo allo stesso if stampare solo i valori del tempo delle barre frattali?

Entrambi i compiti sono identici, solo le implementazioni sono leggermente diverse.

Intuitivamente capisco che è più lungo e più costoso copiare un'enorme stringa di tempi di barra (sia frattali che vuoti) in un array; d'altra parte, è dubbio tirare su CopyTime ripetutamente ad una profondità di 1 elemento.

Se la prima variante è più veloce, è un guadagno assoluto o tutto dipende dal numero totale di frattali incontrati (per esempio, ce ne sono molti di più su piccoli TF)?

 

Quihttps://www.mql5.com/ru/forum/3775/page59#comment_94865 ho fatto una domanda su come mettere la dichiarazione, il collegamento, l'inizializzazione e altre azioni su molti buffer simili in un ciclo al fine di ridurre il codice e migliorare la leggibilità e la gestibilità. Ho ricevuto una risposta con un esempio (classe, struttura) e l'ho capita.

Ora secondo lo stesso principio ho cercato di tamponare le assegnazioni multiple di tipo #proprietà:

#property indicator_label1  "FractalUp1"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen

#property indicator_label2  "FractalDown1"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrGreen
// ---
#property indicator_label3  "FractalUp2"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrBlue

#property indicator_label4  "FractalDown2"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrBlue
[...]

e ha incontrato almeno due problemi:

1. Per a livello globale è proibito, cioè il primo uso di esso non è prima che in OnInit(), ma si sa che #property è dichiarato a livello globale prima di tutte le altre funzioni;

2. Quando si cerca di assegnare le proprietà agli indicatori nel ciclo in OnInit():

// понимаю, что сочинил бред
for (int i=0; i<NUMBER; i++)
{
  #property Property_Array[i].indicator_label (string)("Fractal"+i)
  #property Property_Array[i].indicator_type  DRAW_ARROW
  #property Property_Array[i].indicator_color clrArr[i]
}
Il compilatore giura su '#' (come previsto): '#property' - token inaspettato.
Potresti dirmi se e come l'idea è fattibile in linea di principio?
 

Potete dirmi come dichiarare un array bidimensionale di array?

Qualcosa del genere:

double Buffers[6][3]={ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] };
 
tol64:

Potete dirmi se è possibile dichiarare un array bidimensionale di array?

Un array di strutture con campi come array può essere dichiarato, il compilatore salta anche gli array dinamici nella struttura:

struct arr{double arr_str[];};
arr buffers[6][3];
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
tol64:

Potete dirmi come dichiarare un array bidimensionale di array?

Qualcosa del genere:

#define DIM1_NUMBER 6
#define DIM2_NUMBER 3

struct TBuffer
{
  string Buffer[3]; // для нагляднсти поменяем double на string
};

TBuffer Buffer_Array[DIM1_NUMBER];

string prefixArr[6]={"a","b","c","d","e","f"};

int OnInit()
  {
   for (int j=0; j<DIM1_NUMBER; j++)
   {
      for (int i=0; i<DIM2_NUMBER; i++)
      {
        string t;
   
        StringConcatenate(t,prefixArr[j],i);
        Buffer_Array[j].Buffer[i]=t;
      }
   }

   Print(Buffer_Array[0].Buffer[0],", ",
         Buffer_Array[0].Buffer[1],", ",
         Buffer_Array[0].Buffer[2],"; ",

         Buffer_Array[1].Buffer[0],", ",
         Buffer_Array[1].Buffer[1],", ",
         Buffer_Array[1].Buffer[2],"; ",

         Buffer_Array[2].Buffer[0],", ",
         Buffer_Array[2].Buffer[1],", ",
         Buffer_Array[2].Buffer[2],"; ",

         Buffer_Array[3].Buffer[0],", ",
         Buffer_Array[3].Buffer[1],", ",
         Buffer_Array[3].Buffer[2],"; ",

         Buffer_Array[4].Buffer[0],", ",
         Buffer_Array[4].Buffer[1],", ",
         Buffer_Array[4].Buffer[2],"; ",

         Buffer_Array[5].Buffer[0],", ",
         Buffer_Array[5].Buffer[1],", ",
         Buffer_Array[5].Buffer[2]
   );

   return(0);
  }
[Riparato].
 

IgorM, x100intraday

Grazie per le opzioni. Penso che questo dovrebbe fare il trucco, lo proverò.

 
tol64:

IgorM, x100intraday

Grazie per le opzioni. Penso che questo dovrebbe funzionare, farò una prova.

A proposito, il nome "Buffer" può essere cambiato in "_" o in qualche altro enigma, allora la chiamata sarà completamente chiara:

Buffer_Array[0]._[0]

Buffer_Array[0].¦[0]

 
Urain:

A proposito, il nome "Buffer" può essere cambiato in "_" o qualcos'altro, in modo che la chiamata sia completamente chiara:

GrazieUrain. Anche un'aggiunta interessante. È più familiare)).
 

Ma come si fa tutto questo con #proprietà? - Mi chiedo...

Nessuna idea?

 
x100intraday:

Ma come si fa tutto questo con #proprietà? - Mi chiedo...

Nessuna idea?

decifrare