Je vais écrire l'indicateur gratuitement - page 98

 
Aleksei Stepanenko:

Je ne peux qu'aider un peu, absolument gratuitement.

Il y a deux fonctions en bas de l'indicateur. Dans les commentaires, il affiche la valeur de l'indicateur lui-même et la valeur du point actuel sur la dernière ligne de tendance.

Débrouillez-vous.

Merci, Alexei. Passez une bonne journée.
 
A-V-K:
Merci, Alexei. Passez une bonne journée.

.

 

Bonjour !

J'ai écrit l'indicateur suivant


//+------------------------------------------------------------------+
//|                                                      MTF_H&L.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020"
#property strict
#property indicator_chart_window
#property indicator_buffers   2
#property indicator_width1    1
#property indicator_color1    clrTeal
#property indicator_type1     DRAW_LINE
#property indicator_width2    1
#property indicator_color2    clrCrimson
#property indicator_type2     DRAW_LINE
//---
input ENUM_TIMEFRAMES   period01 =  PERIOD_D1;
input ENUM_TIMEFRAMES   period02 =  PERIOD_M15;
input int               percount =  10;         //Ограничение истории

double Buffer1[];
double Buffer2[];
int    index1=-1;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   SetIndexBuffer(0, Buffer1, INDICATOR_DATA);
   SetIndexBuffer(1, Buffer2, INDICATOR_DATA);
//---
   IndicatorDigits(Digits);
   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[])
  {
//---
   int i, limit, barcount;
   barcount=period01/Period()*percount;
   if(barcount != 0) limit = barcount; 
   else limit = rates_total - 2;
   
   for(i=limit;i>=0;i--)
   {
      if(TimeSeconds(time[i])==0)
      index1=iBarShift(Symbol(), period02, time[i], false);

      if(TimeHour(time[i])==0&&TimeMinute(time[i])<period02)
      {
      Buffer1[i]=iOpen(NULL,period02,index1);
      Buffer2[i]=iOpen(NULL,period02,index1);
      }
      else 
      {
      Buffer1[i]=iHigh(NULL,period02,index1);
      if(Buffer1[i]<Buffer1[i+1]){
      Buffer1[i]=Buffer1[i+1];}
      
      Buffer2[i]=iLow(NULL,period02,index1);
      if(Buffer2[i]>Buffer2[i+1]){
      Buffer2[i]=Buffer2[i+1];}
      }
   }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

Veuillez m'aider à corriger l'indicateur ou me dire comment faire.

1) Je ne sais pas comment définir le point de référence "period01", pour que l'indicateur commence avec "iOpen" au début d'une nouvelle période.

2) Je ne sais pas comment utiliser "iHighest" pour ne pas avoir à utiliser de telles "béquilles".

if(Buffer1[i]<Buffer1[i+1]){
   Buffer1[i]=Buffer1[i+1];}

Aidez-moi, s'il vous plaît.

 
MakarFX:

Bonjour !

J'ai écrit l'indicateur suivant


Veuillez m'aider à corriger l'indicateur ou me dire comment faire.

1) Je ne sais pas comment définir le point de référence "period01", pour que l'indicateur commence avec "iOpen" au début d'une nouvelle période.

2) Je ne sais pas comment utiliser "iHighest" pour ne pas avoir à utiliser de telles "béquilles".

Aidez-moi, s'il vous plaît.

Pourquoi l'avez-vous écrit ?

 
Алексей Тарабанов:

Pourquoi l'avez-vous écrit ?

Vous cherchez un modèle...

si elle est déplacée au sous-sol, elle ressemble à ceci


 
MakarFX:

Bonne journée !

Salutations, Makar !

Quel est le prix d'ouverture ici ? Prendre immédiatement les extrémités de la première mesure. Comme celui-là :

if(i==limit || TimeDay(time[i])!=TimeDay(time[i+1]))
   {
   Buffer1[i]=iHigh(NULL,period02,index1);
   Buffer2[i]=iLow(NULL,period02,index1);
   }
else
   {
   if(iHigh(NULL,period02,index1)-Buffer1[i+1]>0)
      {
      Buffer1[i]=iHigh(NULL,period02,index1);
      }
   else
      {
      Buffer1[i]=Buffer1[i+1];
      }
   if(Buffer2[i+1]-iLow(NULL,period02,index1)>0)
      {
      Buffer2[i]=iLow(NULL,period02,index1);
      }
   else
      {
      Buffer2[i]=Buffer2[i+1]; 
      }
   }
Ou ai-je mal compris ?
 
Aleksei Stepanenko:

Salutations, Makar !

Quel est le prix d'ouverture ici ? Prendre immédiatement les extrémités de la première mesure. Comme celui-là :

Ou ai-je mal compris l'idée ?

J'ai écrit

1) Je ne sais pas comment définir le point de référence "period01" pour que l'indicateur commence avec "iOpen" au début d'une nouvelle période.

Pour prendre tout de suite l'extrema de la première barre est correct et je prends votre code après "else". Merci.

Mais ici

if(i==limit || TimeDay(time[i])!=TimeDay(time[i+1]))

ne convient pas, car elle est liée au début de la journée et j'ai besoin de la sélection "period01" - H1;H4 ; et ainsi de suite

 

Vous pouvez également diviser la date actuelle par le nombre de secondes de la période, puis comparer la valeur obtenue avec la valeur précédente :

int part=0;

int OnCalculate(......)
   {

   for(......)
      {
      if(time[i]/PeriodSeconds(period01)>part)
         {      
         part=time[i]/PeriodSeconds(period01);
      
         Buffer1[i]=iHigh(NULL,period02,index1);
         Buffer2[i]=iLow(NULL,period02,index1);
         }
      else
.......
      

Le départ ne sera probablement pas synchronisé avec le graphique, mais les barres de chronométrage compteront correctement. Vous pourriez réfléchir à la manière de synchroniser le premier départ,

comme :

if(time[i]%PeriodSeconds(period01)==0)
 
Aleksei Stepanenko:

Vous pouvez également diviser la date actuelle par le nombre de secondes de la période, puis comparer la valeur obtenue avec la valeur précédente :

Le départ ne sera probablement pas synchronisé avec le graphique, mais les barres de chronométrage compteront correctement. Vous pourriez réfléchir à la manière de synchroniser le premier départ,

comme :

Merci beaucoup, je vais l'essayer.
 

Vous êtes les bienvenus. Une entrée plus courte :

Buffer1[i]=MathMax(iHigh(NULL,period02,index1),Buffer1[i+1]);
Buffer2[i]=MathMin(iLow(NULL,period02,index1),Buffer2[i+1]);