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

 
Igor Makanu:

Essayez de poser la question différemment, votre question n'est peut-être pas claire.

Je vais essayer d'expliquer. Mais n'oubliez pas que je ne suis pas un programmeur, pratiquement.

Nous disposons d'un indicateur tick qui construit une courbe sur les valeurs des offres.

#property  indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
double x[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,x);
   SetIndexDrawBegin(0,0);
   SetIndexLabel(0,"x");
   SetIndexShift(0,0);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double b=MarketInfo(Symbol(),MODE_BID);
   x[0]=b;
   for(int j=ArraySize(x)-1;j>=1;j--){x[j]=x[j-1];}
   return(0);
  }
//+------------------------------------------------------------------+

Maintenant, ce que je veux faire.

Fixez l'indicateur sur le graphique. Obtenir la première valeur de bid1 sur le premier tick. Retenez-le (c'est ce que j'ai fait - j'entre dans le deuxième tampon y[0] et j'enregistre sa valeur dans init()).

Au deuxième tick, nous obtenons la deuxième valeur de bid2.

Ensuite, nous devons obtenir la différence de points. delta=bid1-bid2 (je l'ai fait de cette façon : delta=x[0]-x[1]).

Ajoutez maintenant delta à y[0] et obtenez la valeur de y[1], qui correspond en fait à la valeur de bid2.

La courbe de l'indicateur devrait être identique à celle que nous recherchons, mais elle est tracée en utilisant les valeurs calculées des écarts d'offre.

Cet indicateur est nécessaire comme modèle pour les calculs ultérieurs.

Ne jetez pas de pierres. Je l'ai expliqué du mieux que j'ai pu.

Merci.

 
Oleg Bondarev:

Je vais essayer d'expliquer. Mais n'oubliez pas que je suis un programmeur novice, pratiquement.

Nous disposons d'un indicateur de tick, qui construit une courbe par valeurs d'enchères.

Maintenant, ce que je veux faire.

Fixez l'indicateur sur le graphique. Obtenir la première valeur de bid1 sur le premier tick. Retenez-le (c'est ce que j'ai fait : j'ai entré le deuxième tampon y[0] et prescrit sa valeur dans init()).

Au deuxième tick, nous obtenons la deuxième valeur de bid2.

Ensuite, nous devons obtenir la différence de points. delta=bid1-bid2 (je l'ai fait de cette façon : delta=x[0]-x[1]).

Ajoutez maintenant delta à y[0] et obtenez la valeur de y[1] qui correspond réellement à la valeur de bid2.

La courbe de l'indicateur devrait être identique à celle que nous recherchons, mais elle est tracée en utilisant les valeurs calculées des écarts d'offre.

Cet indicateur est nécessaire comme modèle pour les calculs ultérieurs.

Ne jetez pas de pierres. J'ai essayé de l'expliquer du mieux que je pouvais.

Merci.

Ce que vous voulez faire n'est pas clair

il y a un problème ici - vous utilisez les tampons d'indicateur comme un tableau pour stocker les ticks (Bid), la taille du tampon d'indicateur change le terminal lui-même, et en plus - le terminal déplace les tampons d'indicateur lui-même à l'apparition d'une nouvelle barre

vous devez utiliser un tableau pour stocker les ticks, et utiliser un tampon d'indicateur pour dessiner.

J'ai créé un code similaire au vôtre, où j'enregistre les ticks dans un tableau.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=10;  //Размер массива тиков
//--- indicator buffers
double         Label1Buffer[];
double TickArr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArrayResize(TickArr,TickCount);                                   //изменим размер массива
   ArrayInitialize(TickArr,SymbolInfoDouble(_Symbol,SYMBOL_BID));    // проинициализируем массив значением текущего Bid
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = SymbolInfoDouble(_Symbol,SYMBOL_BID); // в 0-й элемент массива запомнили новый Bid
   
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Maintenant, vous devez ajouter votre calcul à ce code et le dessiner en utilisant le tampon de l'indicateur Label1Buffer comme vous le souhaitez.

 
Il serait bien qu'ils ajoutent la possibilité de changer les propriétés d'un autre indicateur de façon programmatique. En gros, après avoir ajouté (par programmation) un autre indicateur au graphique, vous pouvez en définir la couleur, le style et l'épaisseur des lignes.
 
Igor Makanu:

ce que vous voulez faire n'est pas clair

voici le problème exact - vous utilisez les tampons d'indicateur comme un tableau pour stocker les ticks (Bid), la taille du tampon d'indicateur change le terminal lui-même, et en plus - le terminal déplace les tampons d'indicateur lui-même quand une nouvelle barre apparaît.

vous devez utiliser un tableau pour stocker les ticks, et utiliser un tampon d'indicateur pour dessiner les ticks.

J'ai créé un code similaire au vôtre, où j'enregistre les ticks dans un tableau.

Maintenant, vous devez ajouter votre calcul à ce code et le dessiner en utilisant le tampon de l'indicateur Label1Buffer, comme vous le souhaitez.

Merci de votre réponse. Je vais vous torturer un peu plus.

Dois-je ajouter le calcul ici ?

int OnCalculate()

Voici mon calcul.

   if(TickArr[0]>TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]+(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]<TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]-(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]==TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1];
     }

Je l'ai ajouté et rien.

 
Yevhenii Levchenko:
Il serait bien qu'ils ajoutent la possibilité de changer les propriétés d'un autre indicateur de façon programmatique. En gros, après avoir ajouté (par programmation) un autre indicateur au graphique, vous pouvez définir la couleur, le style et l'épaisseur des lignes.

Utilisez Canvas et dessinez des dessins animés.

 

Je vais joindre une photo en plus.

ind

 
Oleg Bondarev:

Ajouté et rien.

ce n'est pas comme ça que ça marche ))))

Pour dessiner en utilisant les tampons indicateurs en MQL, cela signifie mettre une valeur dans le tampon indicateur - dans mon exemple, c'est Label1Buffer (assigner une valeur)

dans votre exemple, vous attribuez des valeurs uniquement lorsqu'une condition est remplie et si la condition n'est pas remplie ? - Donc rien ne sera imprimé.


Et encore, j'ai créé un "modèle" où le tableau TickArr contient les valeurs des ticks Bid, mais dans vos conditions vous utilisez les valeurs précédentes du tampon de l'indicateur - et qui a mis quelles valeurs dans ces tampons ?


Essayez de tracer une ligne dans le tampon de l'indicateur, puis vous comparerez les ticks.

 
Oleg Bondarev:

Je vais joindre une photo en plus.


Et si l'angle est inversé ? Comment le calcul serait-il effectué ?

 
Oleg Bondarev:

Je vais joindre une photo en plus.


Si vous dites que vous êtes pratiquement nul en programmation, alors pourquoi acceptez-vous des tâches aussi atypiques, vous devriez peut-être commencer par des tâches simples ? Ou pour améliorer vos connaissances de base ? C'est plus facile de le faire faire pour vous, oui.
 
Igor Makanu:

ça ne va pas marcher ))))

Pour dessiner en utilisant des tampons indicateurs en MQL, cela signifie mettre une valeur (assigner une valeur) au tampon indicateur - dans mon exemple, le tampon Label1Buffer

dans votre exemple, vous attribuez des valeurs uniquement lorsqu'une condition est remplie et si la condition n'est pas remplie ? - Donc rien ne sera imprimé.


Et encore, j'ai créé un "modèle" où le tableau TickArr contient les valeurs des ticks Bid, mais dans vos conditions vous utilisez les valeurs précédentes du tampon de l'indicateur - et qui a mis quelles valeurs dans ces tampons ?


Essayez de tracer une ligne dans le tampon de l'indicateur, puis vous comparerez les ticks.

J'ai prévenu que je suis un hacker).

Je l'ai fait de cette façon.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=100000;  //Размер массива тиков
input int      TickCountb=100000;
//--- indicator buffers
double Label1Buffer[];
double TickArr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer);
   ArrayResize(TickArr,TickCount);
   ArrayResize(Label1Buffer,TickCountb);                                   //изменим размер массива
   ArrayInitialize(TickArr,MarketInfo(Symbol(),MODE_BID));    // проинициализируем массив значением текущего Bid

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = MarketInfo(Symbol(),MODE_BID); // в 0-й элемент массива запомнили новый Bid
   
   for(int j=ArraySize(TickArr)-1;j>0;j--)
   {
      Label1Buffer[j] = Label1Buffer[j-1]; // сдвинули массив
   }
   
   Label1Buffer[0]= TickArr[0];   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Maintenant, il dessine le graphique en tick mais il y a des ruptures de ligne.

Je fais un 4.

Raison: