Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 378

 

Quelqu'un peut-il me dire comment écrire la chose suivante.

J'ai fait un indicateur d'entraînement, qui compte iVolume pour chaque tick : iVolume est positif pour ceux qui ont monté, et iVolume est négatif pour ceux qui ont baissé. Pour faire une courbe, j'ajoute tous les iVolume (positifs et négatifs) en augmentant le total de barre en barre. Une courbe est obtenue. Cependant, j'ai rencontré deux problèmes :

1) la ligne s'avère très cassée ;

2) il est impossible de tester l'Expert Advisor, car le graphique iVolume obtenu n'a qu'une vie réelle.

Question :

1) comment décrire le code qui permet de construire un graphique basé sur des données moyennées que j'écris dans le tampon ?

2) Est-il possible d'écrire les données de cet indicateur (qui sont reçues en mode réel) dans un certain fichier, de sorte que plus tard, en se référant à ce fichier, on puisse construire l'indicateur sur les données historiques, en leur appliquant les volumes de tick déjà collectés ? Si possible, comment le décrire de manière programmatique ? Ou existe-t-il une autre solution qui ne nécessite pas d'écrire les informations de l'iVolume actuel dans un fichier?

#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_label1  "Вверх"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Salmon
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "Вниз"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkTurquoise
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

datetime Время=0;   // Время прошлого бара
double Bid1;
double   Buf_1[];
long V1; // объем для текущего тика вверх
long V2; // накопленный объем для всех тиков вверх текущего бара
long V3; // объем текущего тика вниз
long V4; // накопленный объем для всех тиков вниз для текущего бара
long V5;  // отрицательные и положительные iVolume нарастающим итогом

void OnInit()
{
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
   //SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
   V5 = 0;
  
   
}
 
 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
//      Buf_1[0]=0;         // и обнулить последний элемент буфера
   }
   
      
   if(Bid >= Bid1) 
{
   if(Bid > Bid1) 
{   
   V1 = iVolume(NULL, 0, 0); // если повышающий цену тик
   V2 = V1 + V2;
}
  else
{
   V1 = 0;                // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
   V2 = V1 + V2;      
}               
}              
   else 
{
   V3 = iVolume(NULL, 0, 0); // если понижающий цену тик 
   V4 = V3 + V4;
}
  
   V5 = V2-V4;
   Bid1=Bid;
   Buf_1[0]= V5; // в буфер сгружаем 
  
   
  return(rates_total);
}
 

Peut-être ajouter à la fin du code :

double macurrent=iMAOnArray(Buf_1[0],0,5,0,MODE_LWMA,0);

Eh, non ! Le compilateur génère l'erreur disant qu'il n'y a pas de tableau.


 
Bonjour, pouvez-vous me dire ce que signifient les points d'exclamation dans la stratégie toaster ?
 

Anyone....., pouvez-vous aider ? L'impasse dans laquelle je me trouve est exposée ici: https://www.mql5.com/ru/forum/160683/page378#comment_6053255.

 
YarTrade: est-il possible d'écrire les données de cet indicateur (qui sont obtenues en mode réel) dans un fichier, de sorte que plus tard, en se référant à ce fichier, il serait possible de construire un indicateur sur des données historiques, en y appliquant les volumes de tick déjà collectés ? Si possible, comment le décrire de manière programmatique ? Ou existe-t-il une autre solution qui ne nécessite pas d'écrire les informations de l'iVolume actuel dans le fichier?

Indicateur basé sur les données du fichier - a entré cette ligne dans la recherche et a trouvé

 

Une sorte de cauchemar, je ne comprends pas pourquoi ça donne comme ça :
Code section :


line[0]=MathFloor(Low[1]*MathPow(10,D-1)) ;
Print("Var ",DoubleToStr(line[0],D)) ;
Print("Code ",DoubleToStr(MathFloor(Low[1]*MathPow(10,D-1)),D)) ;

Output :

EURUSD,M15 : Var 0.00000
EURUSD,M15 : Code 11754.00000


Qu'advient-il de la valeur après l'affectation ?

 
LuckySith:   Code section :

line[0]=MathFloor(Low[1]*MathPow(10,D-1)) ;
Print("Var ",DoubleToStr(line[0],D)) ;
Print("Code ",DoubleToStr(MathFloor(Low[1]*MathPow(10,D-1)),D)) ;

Print :

EURUSD,M15 : Var 0.00000
EURUSD,M15 : Code 11754.00000

Qu'advient-il de la valeur après l'affectation ?

Imprimez la valeur des variables après l'affectation et la valeur de la variable D. Utilisez votre calculatrice pour faire le calcul.

 

Bonjour à tous. Les amis, pouvez-vous nous aider ? Quelqu'un pourrait-il définir une ligne dans l'indicateur où vous pouvez spécifier le nom du fichier son, afin que la ligne soit affichée dans les paramètres de l'indicateur.

Dossiers :
Awesome-33.ex4  16 kb
 
STARIJ:

Imprimez les valeurs des variables après affectation et la valeur de la variable D. Calculons-le sur une calculatrice...


J'imprime donc la valeur de la variable après l'affectation. Le code est donc essentiellement le suivant :


a=b ;

Imprimer (a) ;

Imprimer (b) ;

Mais a est égal à zéro et b est imprimé correctement.

 
LuckySith:

C'est ainsi que j'édite la valeur assignée. Le code est donc essentiellement le suivant :


a=b ;

Imprimer (a) ;

Imprimer (b) ;

Mais a est égal à zéro alors que b est imprimé correctement.


Je ne vois pas de zéro, tu as fait une erreur quelque part.

   int D=5;
   double a=MathFloor(Low[1]*MathPow(10,D-1)); 
   Print("Var ",DoubleToStr(a,D)); 
   Print("Code ",DoubleToStr(MathFloor(Low[1]*MathPow(10,D-1)),D));