[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 479

 
midorum:
essayez le Bars-30
Non, ça ne l'est pas. Il devrait logiquement s'indenter à gauche de 30 barres et tirer jusqu'à la 0e barre.
 
SetIndexDrawBegin(0,Bars-30);//первый бар отрисовки индикатора 

Je ne sais pas quelle est votre logique, pour moi ce paramètre dessine les 30 dernières barres de l'indicateur.

Une fois encore, SetIndexDrawBegin() calcule les barres à partir de l'extrémité gauche du graphique.

vérifiez avant de commencer à argumenter

 
merkulov.artem:

OK. Je vais essayer d'exposer l'essence du problème, peut-être que quelqu'un pourra suggérer ou aider à le mettre en œuvre de manière plus simple.

Nous travaillons sur un tableau des minutes. Prenons la barre d'une minute (high+low/2 - valeur moyenne de la barre) sur le graphique du 29/10/12 à 00:00 - elle servira de point de référence.

Ensuite, nous vérifions la déviation de ce prix vers le haut de 10 pips (chaque déviation correcte est +1).

Lorsque nous atteignons l'écart de 10 points par rapport au point de départ - le compteur +1 ; et nous commençons à vérifier les autres écarts, mais à partir du point où nous avons atteint l'écart de 10 points, et nous attendons la prochaine hausse de 10 points du prix.

Par exemple, on obtient :

Si (point de départ) + 10 pips <= prix (nous utilisons tous les prix ultérieurs des barres à partir du point de départ.) Nous obtenons un compteur = compteur +1 ; et nous commençons le point de départ déjà à partir de ce point -(point de départ + 10 pips).

Si (point de départ + 10 pips) +10 pips <= prix (tous les prix ultérieurs des barres à partir du point de référence sont utilisés) nous obtenons counter=Counter+1 ; et nous partons de ce point-(point de départ + 10 pips) +10 pips.

Si(point de départ + 10 pips+10 pips) + 10 pips <= prix (nous utilisons tous les prix ultérieurs des barres à partir du point de référence.) nous obtenons counter=Counter+1 ; et nous partons de ce point -(point de départ + 10 pips+ 10pips) + 10 pips.

et ainsi de suite...

Jusqu'à ce que nous atteignions un compteur de 10(compteur == 10).

Et à chaque nouvellebarre d'une minute formée(haut+bas/2 - valeur moyenne de la barre), nous vérifions cette condition et attendons que le compteur atteigne10 (compteur == 10). Supposons que deux jours se soient écoulés, à chaque nouvelle barre formée nous vérifions et décalons si les conditions sont correctes ......

Et lorsque nous atteignons le compteur =10, nous émettons le message "Compteur == 10". Nous déplaçons le point de départ de 2 jours en avant du point initial défini par l'utilisateur, c'est-à-dire du29/10/12 à 00:00 au 31/10/12 à 00:00 et nous répétons le cycle.

Répétez le cycle et avancez ainsi dans le programme.

C'est-à-dire que nous devrions prendre les barres nouvellement formées et dessiner(high+low/2 - valeur moyenne de la barre). Vérifiez ensuite les conditions et, si elles sont correctes, procédez au changement de vitesse comme décrit ci-dessus.

J'ai essayé de l'implémenter par le biais d'un tableau, mais c'est très confus et cela donne des valeurs erronées ! Aidez-moi, s'il vous plaît, à mettre en œuvre cet algorithme !


Vous n'avez pas du tout besoin de tableaux ici. S'agit-il seulement d'un conseiller expert, d'un script ou d'un indicateur ? Le problème est que le code du conseiller expert sera différent de celui de l'indicateur pour la mise en œuvre de cette tâche.

Et il y a là un inconvénient de taille. Regardez, nous avons marqué le point de départ et il est juste sur le sommet de la tendance à la hausse. Supposons que nous ne tenions pas compte de la lecture de cette bougie dans l'obtention ultérieure de 10 points - appelons-la la bougie de départ. Donc, le prochain chandelier va vers le bas et nous n'attrapons aucun des deux niveaux = point de départ + 10 pips : le prix descend. Nous pouvons donc dire que nous sommes coincés pour un long moment - le prix a baissé et peut monter et descendre de toute façon - il n'atteindra pas le niveau du point de départ de toute façon - les ours l'ont pressé fortement. Mais disons que nous avons eu de la chance et qu'après 5 000 bougies, le prix est revenu au niveau du point de départ, et a même augmenté de 10 pips. Nous avons perdu beaucoup de temps, mais maintenant nous pouvons mettre le prix égal au point de départ + 10 points dans la variable et attendre que le prix atteigne le niveau = niveau de la variable + 10 points... En bref, nous n'avons pas besoin de tout cela - à en juger par votre description, nous attrapons le niveau = point de départ + 10*10 = point de départ + 100 pips. Une fois ce niveau atteint, nous déplaçons la date de départ de 2 jours dans le futur et calculons un nouveau point de départ. C'est compliqué - il existe un moyen plus simple.

Nous définissons la date de début dans des variables personnalisées (précédées de extern dans le code). Déclare une variable de type datetime. Supposons qu'il s'agisse de la variable dt_StartDate (date de début) et que, dans le bloc d'initialisation, nous lui attribuions la valeur stockée dans la variable personnalisée. Ensuite, nous recherchons le chandelier qui correspond à cette date et nous calculons le point de départ en utilisant votre formule. Toutefois, il ne s'agit pas du point de départ, mais du niveau de prix de départ. Déclarez une variable de type double, par exemple d_StartLevel (niveau de départ) et entrez la valeur du niveau calculé dans la variable. Ou encore plus simple : ne pas déclarer de variable, mais tracer une ligne horizontale passant par le prix de départ calculé. Appelons-le StartLevel. Traçons maintenant la deuxième ligne sur le graphique à une distance = 100 points au-dessus du niveau de départ - appelons-la OtlovLevel. Plus loin, nous n'avons pas besoin de tableaux - à chaque tick, nous allons simplement regarder si le prix est supérieur à OtlovLevel ou non. Dès que c'est le cas, nous augmentons la valeur de la variable dt_StartDate de 2 jours, nous calculons à nouveau le niveau de départ et déplaçons la ligne de départ à cet endroit. Ensuite, nous prenons à nouveau 100 points vers le haut à partir de la ligne de départ et nous y faisons glisser la ligne OtlovLevel. C'est tout, la tâche est résolue. À chaque fois, nous pouvons demander le prix auquel une ligne est fixée et le comparer au prix actuel ou au prix haut de la bougie actuelle.

 
midorum:

Je ne sais pas quelle est votre logique, pour moi ce paramètre dessine les 30 dernières barres de l'indicateur.

Une fois encore, SetIndexDrawBegin() calcule les barres à partir de l'extrémité gauche du graphique.

Vérifiez-le avant d'argumenter.

Donc je ne discute pas. Voici un aperçu. Prenons un indicateur CCI standard. J'ai remplacéCCIPeriod par(Bars- CCIPeriod) dans la fonction SetIndexDrawBegin . J'ai seulement changé le jaune mis en évidence dans le code...

Voici le code :

//+------------------------------------------------------------------+
//|                                                          CCI.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
//---- input parameters
extern int CCIPeriod = 14;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 3 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(1, RelBuffer);
   SetIndexBuffer(2, DevBuffer);
   SetIndexBuffer(3, MovBuffer);
//---- indicator lines
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, CCIBuffer);
//----
   if(CCIPeriod <= 0)
       CCIPeriod = 14;
//----
   SetIndexDrawBegin(0, Bars - CCIPeriod);
  
//---- name for DataWindow and indicator subwindow label
   short_name="CCI(" + CCIPeriod + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i, k, counted_bars = IndicatorCounted();
   double price, sum, mul; 
   if(CCIPeriod <= 1)
       return(0);
   if(Bars <= CCIPeriod) 
       return(0);
//---- initial zero
   if(counted_bars < 1)
     {
       for(i = 1; i <= CCIPeriod; i++) 
           CCIBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           DevBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           MovBuffer[Bars-i] =0.0;
     }
//---- last counted bar will be recounted
   int limit = Bars - counted_bars;
   if(counted_bars > 0) 
       limit++;
//---- moving average
   for(i = 0; i < limit; i++)
       MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);
//---- standard deviations
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   mul = 0.015 / CCIPeriod;
   while(i >= 0)
     {
       sum = 0.0;
       k = i + CCIPeriod - 1;
       while(k >= i)
        {
          price =(High[k] + Low[k] + Close[k]) / 3;
          sum += MathAbs(price - MovBuffer[i]);
          k--;
        }
       DevBuffer[i] = sum*mul;
       i--;
     }
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       price = (High[i] + Low[i] + Close[i]) / 3;
       RelBuffer[i] = price - MovBuffer[i];
       i--;
     }
//---- cci counting
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       if(DevBuffer[i] == 0.0) 
           CCIBuffer[i] = 0.0;
       else 
           CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
       i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Logiquement, siCCIPeriod est 14. Ensuite,SetIndexDrawBegin(0, Bars - CCIPeriod) devrait dessiner uniquement les 14 dernières barres. Il commence à partir de la valeur (Bar - 14). Mais c'est ce que je vois sur l'écran

 
hoz:

Donc je ne discute pas. Voici un aperçu. Prenez l'indicateur CCI standard. J'ai remplacéCCIPeriod dans la fonction SetIndexDrawBegin par(Bars- CCIPeriod). J'ai seulement changé le jaune mis en évidence dans le code...

Voici le code :

Logiquement, siCCIPeriod est 14. Ensuite,SetIndexDrawBegin(0, Bars - CCIPeriod) devrait dessiner uniquement les 14 dernières barres. Il commence à partir de la valeur (Bar - 14). Mais c'est ce que je vois sur l'écran

Voici ce que je vois sur l'écran

en haut l'indicateur natif, en bas changé en SetIndexDrawBegin(0, Bars-CCIPeriod) ;

 
midorum, toutes mes excuses. Ma gaffe. MetaEditor a ouvert un autre terminal... Ça marche maintenant. Merci !
 
hoz:
midorum, toutes mes excuses. Ma gaffe. MetaEditor a ouvert un autre terminal... Ça marche maintenant. Merci !
Oui, je suis tout le temps confronté à ce problème aussi - 3 terminaux, et l'éditeur confond les dossiers. Il est préférable de l'exécuter via le bouton dans le terminal et d'y ouvrir le fichier manuellement.
 

Bonjour à tous, s'il vous plaît donnez moi une réponse, comment déterminer que la bougie de 15 minutes s'est ouverte, j'ai utilisé une chaîne époustouflante, mais il s'est avéré que la bougie ne s'ouvre pas toujours en fonction de l'heure... Je pense qu'il y a un moyen plus simple de savoir que la bougie s'est ouverte... mais je ne le comprends pas...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)

 
stater:

Bonjour à tous, s'il vous plaît donnez moi une réponse, comment déterminer que la bougie de 15 minutes s'est ouverte, j'ai utilisé une chaîne époustouflante, mais il s'est avéré que la bougie ne s'ouvre pas toujours en fonction de l'heure... Je pense qu'il y a un moyen plus simple de savoir que la bougie s'est ouverte... mais je ne le comprends pas...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)


https://www.mql5.com/ru/forum/131853/page4#504607
 
stater:

Bonjour à tous, s'il vous plaît donnez moi une réponse, comment déterminer que la bougie de 15 minutes s'est ouverte, j'ai utilisé une chaîne époustouflante, mais il s'est avéré que la bougie ne s'ouvre pas toujours en fonction du temps... Je pense qu'il y a un moyen plus simple de savoir que la bougie s'est ouverte... mais je ne le comprends pas...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)


bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
La fonction renvoie vrai quand une nouvelle barre apparaît sur M15
Raison: