Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1245

 
Artyom Trishkin:

Non tutti gli array hanno lo stesso orientamento.

Capisco, ma ho anche impostato ArraySetAsSeries(barsBuffer1 ,true); !

Beh, questo è metà del problema. Ma non riesco a capire come aggiungere una nuova candela.

Ho provato in questo modo:

.........
   else
   {
      Print("tick_count = ",++tick_count);
      if(tick_count >= 5)
      {
         Print("Добавляем свечу.");
         
         double   O[1], H[1], L[1], C[1];
         O[0]  = newCandles_Open[3];
         H[0]  = newCandles_High[3];
         L[0]  = newCandles_Low[3];
         C[0]  = newCandles_Close[3];
         
         ArrayResize(barsBuffer1,ArraySize(barsBuffer1)+1);
         ArrayResize(barsBuffer2,ArraySize(barsBuffer2)+1);
         ArrayResize(barsBuffer3,ArraySize(barsBuffer3)+1);
         ArrayResize(barsBuffer4,ArraySize(barsBuffer4)+1);
         
         ArrayInsert(barsBuffer1,O,0);
         ArrayInsert(barsBuffer2,H,0);
         ArrayInsert(barsBuffer3,L,0);
         ArrayInsert(barsBuffer4,C,0);
         
         tick_count = 0;
      }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
}

Non funziona... (((

 
Сергей Таболин:

Capisco, ma ho anche impostato ArraySetAsSeries(barsBuffer1 ,true); !

Beh, è metà del problema. Ma come aggiungere una nuova candela - non riesco a capirlo.

Ho provato in questo modo:

Non funziona... (((

Mi dispiace, ma gli array assegnati ai buffer degli indicatori non possono essere ridimensionati - il sottosistema del terminale lo fa.

   SetIndexBuffer(0, barsBuffer1, INDICATOR_DATA);
   SetIndexBuffer(1, barsBuffer2, INDICATOR_DATA);
   SetIndexBuffer(2, barsBuffer3, INDICATOR_DATA);
   SetIndexBuffer(3, barsBuffer4, INDICATOR_DATA);
         ArrayResize(barsBuffer1,ArraySize(barsBuffer1)+1);
         ArrayResize(barsBuffer2,ArraySize(barsBuffer2)+1);
         ArrayResize(barsBuffer3,ArraySize(barsBuffer3)+1);
         ArrayResize(barsBuffer4,ArraySize(barsBuffer4)+1);

Riconsidera la tua logica. Io non la conosco affatto e posso solo mostrare ciò che è clamorosamente sbagliato.

 
Artyom Trishkin:

Mi scuso naturalmente, ma gli array assegnati ai buffer degli indicatori non possono essere ridimensionati - questo è gestito dal sottosistema del terminale.

Riconsidera la tua logica. Io non la conosco affatto e posso solo mostrare ciò che è palesemente sbagliato.

È così che lo capisco anch'io, ma...

Artem, se il buffer dell'indicatore è controllato dal sottosistema, significa che anche questo sottosistema aumenta la sua dimensione? In altre parole, una nuova candela dell'indicatore non può essere disegnata nel grafico finché non appare una nuova candela?

 
Сергей Таболин:

È così che lo capisco anch'io, ma...

Artem, se il buffer dell'indicatore è gestito da un sottosistema, significa che aumenta anche la sua dimensione? In altre parole, finché non appare una nuova candela sul grafico, una nuova candela dell'indicatore non può essere disegnata sul grafico?

Cosa si intende per "disegnare una nuova candela"?

Puoi disegnarle, ma le barre non possono essere aggiunte - non sono ancora presenti.

Sì, il terminale si occupa della dimensione degli array di indicatori. Fornisce anche dati su quanti di loro erano nella chiamata precedente.

 
Artyom Trishkin:

Cosa intende per "disegnare una nuova candela"?

Si può disegnare di tutto, ma non si possono aggiungere barre - non esistono ancora.

Sì, il terminale stesso si occupa della dimensione degli array di indicatori. Fornisce anche dati su quanti di loro erano nella chiamata precedente.

Grazie, ora capisco perché non funziona.

Allora un'ultima domanda. So che possiamo visualizzare le candele di un altro timeframe nell'indicatore. Se l'indicatore mostra candele da H2 e candele da H1, significa che dovremmo disegnare 2 candele durante la durata di una candela. Come succede se il buffer viene aumentato solo dal sistema? Oppure datemi un link all'esempio, se non è troppo disturbo. Forse lo capirò ))))

 
Сергей Таболин:

Grazie, ora capisco perché non funziona per me.

Allora un'ultima domanda. So che è possibile visualizzare le candele di un altro timeframe nell'indicatore. Se l'indicatore mostra candele da H2 e visualizza candele da H1, significa che dovremmo disegnare 2 candele durante la durata di una candela. Come succede se il buffer viene aumentato solo dal sistema? Oppure datemi un link all'esempio, se non è troppo disturbo. Forse lo scoprirò)))

Ho dato degli esempi nei miei ultimi articoli sugli indicatori, ma sono basati su una biblioteca.

Per capire come disegnare due candele invece di una, date un'occhiata al grafico. Guarda il tempo in cui la candela era aperta su H2 e dove si trova la candela con lo stesso tempo su H1. Tutto diventerà chiaro.

 
Artyom Trishkin:

Ho dato degli esempi nei miei ultimi articoli sugli indicatori, ma sono tutti basati sulle biblioteche.

E per capire come disegnare due candele invece di una, guardate il grafico. Guarda il tempo in cui la candela è stata aperta su H2 e dove si trova la candela con lo stesso tempo su H1. Tutto diventerà chiaro.

Artem, il fatto è che non lo capisco!

Per esempio, la candela su H2 è aperta alle 12:00. Il prossimo sarà alle 14:00. Ma su H1 il prossimo sarà alle 13:00. Secondo la logica, finché la candela non si apre sul TF superiore, la matrice dell'indicatore non sarà aumentata! Significa che non sarò in grado di disegnare la seconda candela nell'indicatore? O cosa?

Spiegamelo, takomu poco chiaro..... Perché e come posso disegnare due (o in realtà n) candele su un grafico? Perché, se riempio l'indice 0 del buffer dell'indicatore con un nuovo valore (assegnazione semplice) l'indicatore non cambia?

Forse dovrei chiedere agli sviluppatori una tale possibilità? Ho aggiunto un nuovo elemento a questo buffer - è disegnato con uno spostamento di tutti i precedenti a sinistra. È il mio indicatore, dopo tutto! Lo scrivo come voglio io! Non voglio legarlo all'apertura di una nuova barra sul grafico! Quanto può essere difficile?

 

Grazie ad Artem e Vladimir! Le vostre risposte e spiegazioni mi hanno dato l'idea e l'indicatore è venuto fuori. Grazie ancora.


 

Puoi dirmi per favore cosa c'è che non va?

C'è una semplice dichiarazione di variabile:

input double   StopLoss=150.0;

Quando si esegue il debug su dati reali, la variabile StopLoss ha un valore impostato a "150". Ma se abilito il debug sui dati storici, la stessa variabile nello stesso codice ha un valore diverso. Quale può essere la ragione di questo? E come affrontare il problema?

 
Sayberix:

Puoi dirmi per favore cosa c'è che non va?

C'è una semplice dichiarazione di variabile:

Quando si esegue il debug su dati reali, la variabile StopLoss ha un valore impostato a "150". Ma se abilito il debug sui dati storici, la stessa variabile nello stesso codice ha un valore diverso. Quale può essere la ragione di questo? E come affrontare il problema?

Controlla i valori nella scheda "Parametri" del tester di strategia. Quando si abilita il debug sui dati reali, l'Expert Advisor prende i valori dalle variabili di ingresso, e se lo si abilita sulla storia, i valori vengono presi dalle impostazioni del tester.