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

 
Forexman77:

La question n'a pas été écartée. Donc, tout d'abord.

Un maximum est trouvé, puis une ligne est tracée par rapport à celui-ci. La distance entre cette ligne maximale et le minimum actuel est vérifiée. S'il dépasse "Rmax", une flèche est placée sur la barre où se trouve le maximum. La flèche est placée mais pas là. Pour que ce soit clair, j'ai ajouté le tampon "BufferLow[i]" qui montre la différence et ses données peuvent être vues dans la fenêtre de l'explorateur.

C'est toujours comme ça. Vous ne pouvez pas attendre la neige en hiver) Je l'ai fait moi-même.

Si quelqu'un était tourmenté par une telle idée, voici le code :

#property copyright "Kamil Gazizullin"
#property link      "forexman77@yandex.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 5
#property  indicator_color1 Magenta
#property  indicator_color2 Aqua
#property  indicator_color3 SlateBlue
#property  indicator_color4 SlateBlue
#property  indicator_color5 clrNONE
//--- input parameters
extern int       Period_=10;
extern double diapazon  =0.003;
//--- buffers
double Max[];
double Min[];
double MaxIndex[];
double MinIndex[];
double rAZNOST[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(5);
   SetIndexBuffer(0,MaxIndex);
   SetIndexBuffer(1,MinIndex);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,116);
   SetIndexEmptyValue(1,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,116);
   SetIndexEmptyValue(0,0.0);
   SetIndexBuffer(2,Max);
   SetIndexBuffer(3,Min);
   SetIndexBuffer(4,rAZNOST);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),limit, i,k,r,p,t,f;
    double minimum,maximum,Dmax,Dmin;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
   for(i=0;i<limit;i++)
   {
      maximum=High[iHighest(NULL,0,MODE_HIGH,Period_,i)];
      minimum=Low[iLowest(NULL,0,MODE_LOW,Period_,i)];
      Max[i]=maximum;
      Min[i]=minimum;
   }
   for(i=0;i<limit;i++)
   {
      k=iHighest(NULL,0,MODE_HIGH,Period_,i);
      t=iLowest(NULL,0,MODE_LOW,Period_,i);
      Dmax=Max[i]-Low[i];
      Dmin=High[i]-Min[i];
      if (Dmax > diapazon){p=k;for(r=p;r>=k;r--)MaxIndex[k]=Max[k];}
      if (Dmin > diapazon){p=t;for(f=p;f>=t;f--)MinIndex[t]=Min[t];}
      if (MaxIndex[i]==Max[i+1])MaxIndex[i]=0;
      if (MinIndex[i]==Min[i+1])MinIndex[i]=0;
      rAZNOST[i]=Max[i]-Min[i];
   }
   return(0);
  }
 
Awwl:

Le Heiken Ashi intégré semble un peu sous-développé (je me demande si c'est juste moi sur le 745 ?), mais son fonctionnement est clair. Et la façon dont WmiFor est construit n'est pas claire !

Dans le code Heiken Ashi, une bougie est tirée à partir de 4 histogrammes à barres :

Autrement dit, à mesure que le nombre de tampons augmente (de 0 à 3), de nouvelles barres sont dessinées par-dessus les anciennes. L'ordre est le suivant :

LowHigh - HighLow - Open - Close.

L'ordre des chandeliers doit être le suivant pour qu'ils aient l'air comme il faut, avec leurs corps et leurs queues :

max(Open,Close)//ligne de couleur épaisse// - min(Open,Close)//blanc épais// - High//ligne de couleur épaisse// - Low//blanc épais//.

Compilons l'indicateur, mettons-le sur le graphique et voyons tous les problèmes (voir l'image).

Mais cette méthode, comme le Heiken Ashi, présente un inconvénient : sous chaque "bougie", nous avons une boucle blanche dans la couleur de fond qui recouvre tout ce qui est inférieur. Mais avec WmiFor, tout est parfait ! Des fonctionnalités non documentées?

Première image - Heiken Ashi (placé dans une fenêtre séparée), deuxième image - WmiFor, le fond est en vert clair pour plus de clarté.

Nous comparons un modèle souple et un modèle rond ? Pourquoi mettre Haken dans une fenêtre séparée s'il est conçu pour une fenêtre graphique et dessiné là comme un chandelier avec des ombres et un corps ? Si la valeur du tampon change, la même barre changera de taille et aucune nouvelle barre ne sera dessinée par-dessus.

Le MT4 ne dispose pas d'une méthode de dessin sous forme de chandeliers, donc seul un histogramme est possible, et la façon dont vous calculez les valeurs tampons ne regarde que vous. WmiFor, d'ailleurs, dessine aussi un histogramme. Mettons-le aussi dans une fenêtre séparée et regardons ses défauts ;)))

Pour que les chandeliers dans une fenêtre séparée ressemblent à des chandeliers avec des ombres, ils doivent être dessinés relativement à 0, comme l'Accélérateur. Ou vous pouvez les dessiner avec des objets, voir par exemple All_Stars.

 

Bonjour à tous !

J'ai le cerveau embrumé ; je n'ai pas trouvé de réponse dans la documentation, mais peut-être que quelqu'un a rencontré ce problème. Voici la ligne dans l'Expert Advisor (fraction de trades positifs) :

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd,",2/5*100,",100*2/5) ;

Imprimez-le dans le journal (par exemple) :

3/6=0.00=0 0 40

En même temps, si la solution est 1 :

3/3=1.00=1 0 40

La variable BestOd=OderPluseCount/OderTotal est de type double, les autres sont de type int.

C'est-à-dire que dès qu'une valeur inférieure à 1 est rencontrée, le compilateur la transforme automatiquement en 0... Les deux dernières expressions à partir de constantes produisent des résultats surprenants - cela ressemble à la même chose, mais pas )))).

J'ai essayé différentes substitutions et tout ce qui est supérieur à 1 a la partie fractionnaire correcte.

 
Igor_:

Bonjour à tous !

J'ai le cerveau embrumé ; je n'ai pas trouvé de réponse dans la documentation, mais peut-être que quelqu'un a rencontré ce problème. Voici la ligne dans l'Expert Advisor (fraction de trades positifs) :

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd,",2/5*100,",100*2/5) ;

Imprimez-le dans le journal (par exemple) :

3/6=0.00=0 0 40

En même temps, si la solution est 1 :

3/3=1.00=1 0 40

La variable BestOd=OderPluseCount/OderTotal est de type double, les autres sont de type int.

C'est-à-dire que dès qu'une valeur inférieure à 1 est rencontrée, le compilateur la transforme automatiquement en 0... Les deux dernières expressions à partir de constantes produisent des résultats surprenants - cela ressemble à la même chose, mais pas )))).

J'ai essayé différentes substitutions, tout ce qui est supérieur à 1 a la partie fractionnaire correcte.

Essayez ceci

DoubleToStr((double)(OderPluseCount/OderTotal),2)

 
AlexeyVik:

Essayez ceci

DoubleToStr((double)(OderPluseCount/OderTotal),2)

Ça n'aide pas. Mais merci.)
 
Igor_:
Ça ne sert à rien. Mais merci.)
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)
 
Vinin:
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)

Ça marche comme ça, merci. On dirait du chamanisme ))))

Honnêtement, je suis plus préoccupé non pas par l'affichage, mais par le calcul correctde BestOd. J'ai dû le corriger aussi.

Je l'ai fait de cette façon :

BestOd=(OderPluseCount/(OderTotal*1.0)) ;

Y a-t-il une explication à cela ? Après tout, il serait très difficile de détecter cette erreur si ce n'était pas l'impression. Dans quels cas cela peut-il se produire ?

 
Igor_:

Ça marche comme ça, merci. On dirait du chamanisme ))))

Honnêtement, je suis plus préoccupé non pas par l'affichage, mais par le calcul correctde BestOd. J'ai dû le corriger aussi.

Je l'ai fait de cette façon :

BestOd=(OderPluseCount/(OderTotal*1.0)) ;

Y a-t-il une explication à cela ? Après tout, il serait très difficile de détecter cette erreur si ce n'était pas l'impression. Dans quels cas peut-elle apparaître ?

Dans toute opération avec des valeurs entières, le résultat sera un nombre entier.
 

J'ai trouvé la réponse moi-même dans le livre de référence, section"Conversion de type".

Если два значения объединяются бинарным оператором, то перед выполнением операции операнд младшего типа преобразовывается к более старшему типу в соответствии с приоритетом, указанным на схеме: 

Mais le type double dans ce schéma est le plus ancien. Et j'ai eu les deux int. Par conséquent, le résultat est un nombre entier. Introduction d'une constante d'un type supérieur (double, float), converti tous les int en elle.

Vous apprenez longtemps et consultez la documentation))))

 
Bonjour, j'ai la question suivante.
Comment faire un EA qui passe en revue et modifie les positions ouvertes, de sorte qu'il ne modifie pas à plusieurs reprises les ordres qui ont été modifiés lors du passage suivant. Vous devez les "huiler" d'une manière ou d'une autre.
Je ne peux penser à rien.
Je vous en serais très reconnaissant.