Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 318

 
muzzletop:
Après-midi. J'ai un EA, il fonctionne bien dans le testeur de stratégie (il ouvre les ordres et tout). Mais quand je le mets sur un graphique, rien ne se passe. L'EA ne fonctionne pas. J'ai également remarqué une croix à côté du nom de l'EA sur le graphique. Comment le réparer ?


Lorsque vous placez l'EA sur le graphique, une fenêtre s'ouvre avec des paramètres, il y a différents onglets - dans le premier "Général" vous devez mettre une coche devant "Autoriser l'EA à trader".

Si l'EA est déjà sur le graphique et est affiché avec une croix - dans la barre d'outils, cliquez sur le bouton "EAs" (cube jaune dans un chapeau avec un cercle rouge et un carré blanc à l'intérieur du cercle).

 

Bon après-midi. Aidez-moi à faire face à un problème étrange.

Le fait est que j'écris un indicateur multi-temps, c'est-à-dire un indicateur qui, étant ouvert à tout moment, calculera et donnera des signaux pour tous les autres moments également.

La base de l'indicateur est le RSI.

Dans init() lors du changement d'horizon temporel, un tableau séparé est mis en correspondance avec la ligne de l'indicateur. Pour chacun d'entre eux, la ligne est affichée, lorsque vous êtes à tel ou tel moment, mais les calculs pour les autres moments ne se déroulent pas (la fonction iRSI chasse bêtement les zéros dans le calcul). C'est-à-dire que l'heure actuelle est calculée, mais pas les autres heures.

Je colle le code :

#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);
  }
//+------------------------------------------------------------------+

Ce qui est intéressant, c'est que si nous ne laissons qu'un seul tableau pour la ligne indicatrice et que nous ne calculons que W1 à tout moment, tout est calculé et dessiné correctement à tout moment ( !).
Quelle est l'astuce ? Il est impossible de prendre des tableaux différents pour la ligne d'indicateur lors de l'initialisation, en fonction de l'heure ?

 
satorifx:

Bon après-midi. Aidez-moi à faire face à un problème étrange.

Le fait est que j'écris un indicateur multi-temps, c'est-à-dire un indicateur qui, étant ouvert à tout moment, calculera et donnera des signaux pour tous les autres moments également.

La base de l'indicateur est le RSI.

Dans init() lors du changement d'horizon temporel, un tableau séparé est mis en correspondance avec la ligne de l'indicateur. Pour chacun d'entre eux, la ligne est affichée, lorsque vous êtes à tel ou tel moment, mais les calculs pour les autres moments ne se déroulent pas (la fonction iRSI chasse bêtement les zéros dans le calcul). C'est-à-dire que l'heure actuelle est calculée, mais pas les autres heures.

Je colle le code :

Ce qui est intéressant, c'est que si nous ne laissons qu'un seul tableau pour la ligne indicatrice et que nous ne calculons que W1 à tout moment, tout est calculé et dessiné correctement à tout moment ( !).
Quelle est l'astuce ? Il est impossible de prendre des tableaux différents pour la ligne d'indicateur lors de l'initialisation, en fonction de l'heure ?

Seuls W1 et D1 sont lus ! Que voulez-vous ? Finissez-le pour les autres !
 
borilunad:
Seuls W1 et D1 sont lus ! Que voulez-vous ? Finissez-le pour les autres !

Ce n'est pas la question. J'ai donné des calculs uniquement pour D1 et W1, afin que le code ne soit pas trop long. Note : à chaque tick sur chaque timeframe, les valeurs calculées de W1 sont imprimées. Ainsi, si un temps quelconque est ouvert sauf W1, des zéros sont imprimés. Si cela fonctionne pour W1, cela fonctionnera pour d'autres.
 
satorifx:

Ce n'est pas la question. Je n'ai donné les calculs que pour D1 et W1, afin de ne pas rendre le code trop long. Veuillez noter que les valeurs calculées de W1 sont imprimées à chaque tick sur n'importe quelle période de temps. Ainsi, si un temps quelconque est ouvert sauf W1, des zéros sont imprimés. Si cela fonctionne pour W1, cela fonctionnera pour tous les autres.
C'est ça ! Nous devons ouvrir le graphique hebdomadaire pour l'afficher sur d'autres graphiques !
 
borilunad:
Correct ! Pour afficher sur d'autres graphiques, vous devez ouvrir le graphique hebdomadaire également !


Pour être honnête, je n'ai pas compris cette déclaration.
Et il n'y a pas besoin de montrer autre chose. Si vous exécutez le code, vous verrez qu'il montre déjà ce que je veux : sur D1 il montre le graphique RSI D1 et sur W1 - le graphique RSI W1, mais en même temps, si D1 est ouvert, alors les RSI pour W1 sont tous à zéro, et si W1 est ouvert, alors les calculs pour D1 sont à zéro. La question est de savoir pourquoi c'est le cas et comment y remédier.

 

Le problème est que le tableau d'index s'initialise et se redimensionne à la bonne taille.
Ainsi, lorsque j'ouvre D1 - RSI_D1[] devient indexé, et tout va bien avec lui, mais les autres tableaux restent à l'état embryonnaire.
J'ai essayé de cette manière : j'ai déclaré tous les tableaux de cette façon :

double   RSI_W1[]    =  {0};
J'ai changé le commutateur dans init() comme ceci :
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          ArrayResize(RSI_W1, iBars(NULL, PERIOD_W1));
          break;

Cependant, sur ArrayResize GetLastError donne une erreur :

EURUSD,Daily : impossible de redimensionner le tableau

EURUSD,Daily : some array error

Bref, qui peut me dire comment résoudre ce problème ?

 
satorifx:

Le problème est que le tableau d'index s'initialise et se redimensionne à la bonne taille.
Ainsi, lorsque j'ouvre D1 - RSI_D1[] devient indexé, et tout va bien avec lui, mais les autres tableaux restent à l'état embryonnaire.
J'ai essayé de cette manière : j'ai déclaré tous les tableaux de cette façon :

J'ai changé le commutateur dans init() comme ceci :

Cependant, sur ArrayResize GetLastError donne une erreur :

EURUSD,Daily : impossible de redimensionner le tableau

EURUSD,Daily : some array error

Bref, qui peut me dire comment résoudre ce problème ?

Si le tableau est dynamique, assurez-vous que lorsque vous y inscrivez des valeurs, vous augmentez la taille du tableau pour accueillir les nouvelles données. ArrayResize()
 
artmedia70:
Si le tableau est dynamique, veillez à augmenter sa taille pour accueillir les nouvelles données lorsque vous y écrivez des valeurs. ArrayResize()

J'ai écrit à ce sujet ci-dessus :
Mais ArrayResize GetLastError donne une erreur :

EURUSD,Daily : cannot resize the array

EURUSD,Daily : some array error
 
satorifx:
C'est ce que j'ai écrit plus haut :
Cependant, sur ArrayResize GetLastError donne une erreur :

EURUSD,Daily : impossible de redimensionner le tableau

EURUSD,Daily : une erreur de tableau
satorifx:


Pour être honnête, je n'ai pas compris cette déclaration.
Et il n'y a pas besoin de montrer autre chose. Si vous exécutez mon code, vous verrez que tout est déjà affiché : le RSI D1 est affiché sur D1 et le RSI W1 sur W1, mais en même temps, si D1 est ouvert, alors les RSI pour W1 sont tous nuls, et si W1 est ouvert, alors les RSI pour D1 sont tous nuls. La question est de savoir pourquoi c'est le cas et comment y remédier.

Car le tampon est seul et se montre un par un à votre appel !

#property indicator_buffers 1
Vous pensez vraiment que je n'ai rien de mieux à faire que de télécharger vos "codes" et de les tester ? Je t'aide en te donnant des conseils. Et si quelque chose ne va pas, tout est là pour vous ! Ou la paresse était-elle née avant vous ? !