Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 318

 
muzzletop:
Pomeriggio. Ho un EA, funziona bene nello strategy tester (apre gli ordini e tutto). Ma quando lo metto solo su un grafico, non succede niente. L'EA non funziona. Ho anche notato una croce accanto al nome dell'EA sul grafico. Come risolvere il problema?


Quando metti l'EA sul grafico si apre una finestra con i parametri, ci sono diverse schede - nella prima "Generale" devi mettere un segno di spunta davanti a "Consenti all'EA di commerciare".

Se l'EA è già sul grafico e viene visualizzato con una croce - sulla barra degli strumenti, clicca sul pulsante "EAs" (cubo giallo in un cappello con un cerchio rosso e un quadrato bianco all'interno del cerchio).

 

Buon pomeriggio. Aiutami ad affrontare uno strano problema.

Il punto è: sto scrivendo un indicatore multitemporale, cioè un indicatore che, essendo aperto in qualsiasi momento, eseguirà calcoli e darà segnali anche per tutti gli altri tempi.

La base dell'indicatore è RSI.

In init() quando si cambia il timeframe, viene messo un array separato in corrispondenza della linea dell'indicatore. Per ognuno di essi viene visualizzata la linea, quando si è in questo o quel momento, ma i calcoli per gli altri tempi non vanno avanti (la funzione iRSI sta stupidamente inseguendo degli zeri nel calcolo). Cioè il tempo corrente viene calcolato, ma gli altri tempi no.

Sto incollando il codice:

#property indicator_separate_window
#property indicator_minimum 20
#property indicator_maximum 80

#property indicator_level1 20          // уровень RSI
#property indicator_level2 42          // уровень RSI
#property indicator_level3 50          // уровень RSI
#property indicator_level4 58          // уровень RSI
#property indicator_level5 80          // уровень RSI

#property indicator_levelcolor White   // цвет уровней 

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 2           // толщина RSI

//--- buffers
double   RSI_M1[];               // буферы под RSI
double   RSI_M5[];
double   RSI_M15[];
double   RSI_M30[];
double   RSI_H1[];
double   RSI_H4[];
double   RSI_D1[];
double   RSI_W1[];
double   RSI_MN[];

int         RSI_per           = 12;                // период RSI
int         RSIPriceType      =  PRICE_CLOSE;      // покакой цене считать RSI
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   IndicatorShortName("test");
   
   switch(Period()) {
      case PERIOD_M1:
          SetIndexBuffer(0, RSI_M1);
          break;
      case PERIOD_M5:
          SetIndexBuffer(0, RSI_M5);
          break;
      case PERIOD_M15:
          SetIndexBuffer(0, RSI_M15);
          break;
      case PERIOD_M30:
          SetIndexBuffer(0, RSI_M30);
          break;
      case PERIOD_H1:
          SetIndexBuffer(0, RSI_H1);
          break;
      case PERIOD_H4:
          SetIndexBuffer(0, RSI_H4);
          break;
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          break;
      case PERIOD_W1:
          SetIndexBuffer(0, RSI_W1);
          break;
      case PERIOD_MN1:
          SetIndexBuffer(0, RSI_MN);
          break;
   }   
   
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexLabel(0,"RSI(" + RSI_per + ")");
//----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int   shift, _Bars;
   static int  _counted_bars_W1 = 0,
               _counted_bars_D1 = 0;
   //--------------------------------------------------------------------
   _Bars = iBars(NULL, PERIOD_W1);
   shift = _Bars - _counted_bars_W1 - 1;   // Индекс первого непосчитанного
   _counted_bars_W1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_W1[shift]       = iRSI(NULL, PERIOD_W1, RSI_per, RSIPriceType, shift);
      Print(RSI_W1[shift]);
      shift--;
   }
   //------------------------------------------
   _Bars = iBars(NULL, PERIOD_D1);
   shift = _Bars - _counted_bars_D1 - 1;   // Индекс первого непосчитанного
   _counted_bars_D1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_D1[shift]       = iRSI(NULL, PERIOD_D1, RSI_per, RSIPriceType, shift);
      shift--;
   }
   //------------------------------------------   
   return(0);
  }
//+------------------------------------------------------------------+

La cosa interessante è che se lasciamo solo un array per la linea dell'indicatore e calcoliamo solo W1 in qualsiasi momento, tutto viene calcolato e disegnato correttamente in qualsiasi(!) momento.
Qual è il trucco? È impossibile prendere diversi array per la linea dell'indicatore durante l'inizializzazione, a seconda del tempo?

 
satorifx:

Buon pomeriggio. Aiutami ad affrontare uno strano problema.

Il punto è: sto scrivendo un indicatore multitime, cioè un indicatore che, essendo aperto in qualsiasi momento, calcolerà e darà segnali anche per tutti gli altri tempi.

La base dell'indicatore è RSI.

In init() quando si cambia il timeframe, viene messo un array separato in corrispondenza della linea dell'indicatore. Per ognuno di essi viene visualizzata la linea, quando si è in questo o quel momento, ma i calcoli per gli altri tempi non vanno avanti (la funzione iRSI sta stupidamente inseguendo degli zeri nel calcolo). Cioè il tempo corrente viene calcolato, ma gli altri tempi no.

Sto incollando il codice:

La cosa interessante è che se lasciamo solo un array per la linea dell'indicatore e calcoliamo solo W1 in qualsiasi momento, tutto viene calcolato e disegnato correttamente in qualsiasi(!) momento.
Qual è il trucco? È impossibile prendere diversi array per la linea dell'indicatore durante l'inizializzazione, a seconda del tempo?

Solo W1 e D1 sono letti! Che cosa vuoi? Finiscilo per gli altri!
 
borilunad:
Solo W1 e D1 sono letti! Che cosa vuoi? Finiscilo per gli altri!

Non è questo il punto. Ho dato i calcoli solo per D1 e W1, in modo che il codice non sia troppo lungo. Nota: ad ogni tick di ogni timeframe, vengono stampati i valori calcolati di W1. Quindi, se viene aperto qualsiasi tempo tranne W1, vengono stampati degli zeri. Se funziona per W1, funzionerà per altri.
 
satorifx:

Non è questo il punto. Ho dato i calcoli solo per D1 e W1, per non rendere il codice troppo lungo. Nota: ad ogni segno di spunta su qualsiasi timeframe vengono stampati i valori calcolati di W1. Quindi, se viene aperto qualsiasi tempo tranne W1, vengono stampati degli zeri. Se funziona per W1, funzionerà per tutti gli altri.
Giusto! Dobbiamo aprire il grafico settimanale per mostrarlo su altri grafici!
 
borilunad:
Corretto! Per mostrare su altri grafici, dovete aprire anche il grafico settimanale!


Ad essere onesti, non ho capito questa affermazione.
E non c'è bisogno di mostrare altro. Se eseguite il codice, vedrete che mostra già quello che voglio: su D1 mostra il grafico RSI D1 e su W1 - grafico RSI W1, ma allo stesso tempo, se D1 è aperta, allora le RSI per W1 sono tutte zero, e se W1 è aperta, allora i calcoli per D1 sono zero. La domanda è perché questo è il caso e come risolverlo.

 

Il problema è che l'array di indici si inizializza e si ridimensiona alla giusta dimensione.
Così quando apro D1 - RSI_D1[] diventa indicizzato, e tutto è a posto con esso, ma gli altri array rimangono in stato embrionale.
Ho provato in questo modo: ho dichiarato tutti gli array in questo modo:

double   RSI_W1[]    =  {0};
Ho cambiato l'interruttore in init() in questo modo:
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          ArrayResize(RSI_W1, iBars(NULL, PERIOD_W1));
          break;

Tuttavia, su ArrayResize GetLastError dà un errore:

EURUSD,Daily: impossibile ridimensionare l'array

EURUSD,Daily: some array error

Comunque, chi può dirmi come risolvere questo problema?

 
satorifx:

Il problema è che l'array di indici si inizializza e si ridimensiona alla giusta dimensione.
Così quando apro D1 - RSI_D1[] diventa indicizzato, e tutto è a posto con esso, ma gli altri array rimangono in stato embrionale.
Ho provato in questo modo: ho dichiarato tutti gli array in questo modo:

Ho cambiato l'interruttore in init() in questo modo:

Tuttavia, su ArrayResize GetLastError dà un errore:

EURUSD,Daily: impossibile ridimensionare l'array

EURUSD,Daily: some array error

Comunque, chi può dirmi come risolvere questo problema?

Se l'array è dinamico, assicuratevi che quando scrivete dei valori in esso, aumentate la dimensione dell'array per ospitare i nuovi dati. ArrayResize()
 
artmedia70:
Se l'array è dinamico, assicuratevi di aumentare la dimensione dell'array per ospitare i nuovi dati quando vi si scrivono dei valori. ArrayResize()

Ho scritto sopra:
Ma ArrayResize GetLastError dà un errore:

EURUSD,Daily: cannot resize the array

EURUSD,Daily: some array error
 
satorifx:
Questo è ciò di cui ho scritto sopra:
Tuttavia su ArrayResize GetLastError dà un errore:

EURUSD,Daily: impossibile ridimensionare la matrice

EURUSD,Daily: qualche errore di matrice
satorifx:


Ad essere onesti, non ho capito questa affermazione.
E non c'è bisogno di mostrare altro. Se eseguite il mio codice, vedrete che tutto è già mostrato: RSI D1 è mostrato su D1 e RSI W1 su W1, ma allo stesso tempo, se D1 è aperta, allora le RSI per W1 sono tutte nulle, e se W1 è aperta, allora le RSI per D1 sono tutte nulle. La domanda è perché questo è il caso e come risolverlo.

Perché il buffer è da solo e si mostra uno per uno alla tua chiamata!

#property indicator_buffers 1
Pensi davvero che non abbia niente di meglio da fare che scaricare i tuoi "codici" e testarli? Ti sto aiutando con dei consigli. E se qualcosa non va, è tutto lì per voi! O la pigrizia è nata prima di te?!
Motivazione: