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

 
anrei2002 #:

Les flèches non pertinentes ont disparu immédiatement ! !!

Je ne m'attends pas à ce que vous compreniez, j'ai eu un client avec un problème similaire, je n'ai pas pu lui expliquer pendant un an, il y avait un indicateur différent, mais aussi avec un peek. Il semble être un gars intelligent, mais apparemment sa soif de profit a vraiment éteint sa logique et sa pensée... Il a fini par tout réaliser lorsqu'il a vidé beaucoup d'argent. Je ne sais pas quoi faire... Si vous le réinitialisez, l'indicateur cessera de fonctionner. Si vous le réinitialisez, seules les flèches de droite restent, mais dans l'historique... J'ai vu beaucoup de ces indicateurs

 
MakarFX #:
Montrez ce que vous avez déjà fait.
#property description "Stochastic Oscillator" (oscillateur stochastique)
#propriété stricte

#propriété indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 2
#propriété indicator_color1 LightSeaGreen
#property indicator_color2 Red
#property indicator_level1 20.0
#property indicator_level2 80.0
#property indicator_levelcolor clrSilver
#property indicator_levelstyle STYLE_DOT
//--- paramètres d'entrée
entrée int InpKPeriod=5 ; // entrée K Period
input int InpDPeriod=3 ; // entrée D Période
entrée int InpSlowing=3 ; // Ralentissement

chaîne d'entrée PARA_Ref = "$USDX" ;
//chaîne d'entrée PARA_Ref = "ETHUSD" ;


//--- tampons
double ExtMainBuffer[] ;
double ExtSignalBuffer[] ;
double ExtHighesBuffer[] ;
double ExtLowesBuffer[] ;

double cl[] ;
double hi[] ;
double lo[] ;



//---
int draw_begin1=0 ;
int draw_begin2=0 ;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé |
//+------------------------------------------------------------------+
int OnInit(void)
{
string short_name ;
//--- 2 tampons supplémentaires sont utilisés pour le comptage.
IndicatorBuffers(4) ;
SetIndexBuffer(2, ExtHighesBuffer) ;
SetIndexBuffer(3, ExtLowesBuffer) ;
//--- lignes d'indicateurs
SetIndexStyle(0,DRAW_LINE) ;
SetIndexBuffer(0,ExtMainBuffer) ;
SetIndexStyle(1,DRAW_LINE) ;
SetIndexBuffer(1,ExtSignalBuffer) ;
//--- nom pour l'étiquette de la DataWindow et de la sous-fenêtre de l'indicateur
short_name="Stochastic_Mult_1("+IntegerToString(InpKPeriod)+", "+IntegerToString(InpDPeriod)+", "+IntegerToString(InpSlowing)+")" ;
IndicatorShortName(nom_court) ;
SetIndexLabel(0,short_name) ;
SetIndexLabel(1, "Signal") ;
//---
draw_begin1=InpKPeriod+InpSlowing ;
draw_begin2=draw_begin1+InpDPeriod ;
SetIndexDrawBegin(0,draw_begin1) ;
SetIndexDrawBegin(1,draw_begin2) ;
//--- initialisation faite
return(INIT_SUCCEED) ;
}
//+------------------------------------------------------------------+
//| oscillateur stochastique |
//+------------------------------------------------------------------+
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,k,pos,n ;

//--- vérifier le nombre de barres
si(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
retour(0) ;
//--- compter de 0 à rates_total
ArraySetAsSeries(ExtMainBuffer,false) ;
ArraySetAsSeries(ExtSignalBuffer,false) ;
ArraySetAsSeries(ExtHighesBuffer,false) ;
ArraySetAsSeries(ExtLowesBuffer,false) ;
ArraySetAsSeries(low,false) ;
ArraySetAsSeries(high,false) ;
ArraySetAsSeries(close,false) ;

//---
pos=InpKPeriod-1 ;
si(pos+1<prev_calculé)
pos=prev_calculated-2 ;
sinon
{
for(i=0 ; i<pos ; i++)
{
ExtLowesBuffer[i]=0.0 ;
ExtHighesBuffer[i]=0.0 ;
}
}
//--- calculer HighesBuffer[] et ExtHighesBuffer[]
for(i=pos ; i<rates_total && !IsStopped() ; i++)
{
double dmin=1000000.0 ;
double dmax=1000000.0 ;
for(k=i-InpKPeriod+1 ; k<=i ; k++)
{
n = i-k ;
if(dmin>iLow(PARA,0,n)* iLow(PARA_Ref,0,n)) // original : if(dmin>low[k])
dmin=iLow(PARA,0,n)* iLow(PARA_Ref,0,n) ; // original : dmin=low[k] ;
if(dmax<iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n)) // original : if(dmax<high[k])
dmax=iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n) ; // original : dmax=high[k] ;

}
ExtLowesBuffer[i]=dmin ;
ExtHighesBuffer[i]=dmax ;
}
//--- ligne %K
pos=InpKPeriod-1+InpSlowing-1 ;
si(pos+1<prev_calculé)
pos=prev_calculated-2 ;
sinon
{
for(i=0 ; i<pos ; i++)
ExtMainBuffer[i]=0.0 ;
}
//--- cycle principal
for(i=pos ; i<rates_total && !IsStopped() ; i++)
{
double sumlow=0.0 ;
double sumhigh=0.0 ;
for(k=(i-InpSlowing+1) ; k<=i ; k++)
{
n = i-k ;
sumlow +=((iClose(PARA,0,n) * iClose(PARA_Ref,0,n))-ExtLowesBuffer[k]) ; // original : sumlow +=(close[k]-ExtLowesBuffer[k]) ;
sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]) ;
}
si(sumhigh==0.0)
ExtMainBuffer[i]=100.0;
sinon
ExtMainBuffer[i]=sumlow/sumhigh*100.0 ;
}
//--- signal
pos=InpDPeriod-1 ;
si(pos+1<prev_calculé)
pos=prev_calculated-2 ;
sinon
{
for(i=0 ; i<pos ; i++)
ExtSignalBuffer[i]=0.0 ;
}
for(i=pos ; i<rates_total && !IsStopped() ; i++)
{
double sum=0.0 ;
for(k=0 ; k<InpDPeriod ; k++)
sum+=ExtMainBuffer[i-k] ;
ExtSignalBuffer[i]=sum/InpDPeriod ;
}
//--- OnCalcul fait. Retourne le nouveau prev_calculé.
retour(taux_total) ;
}
//+------------------------------------------------------------------+
 
Il peut être corrigé sans perdre la logique, mais il dessinera la flèche sur la 8ème barre, ou même sur la 9ème barre (mais sans redessiner et sans signaux de gauche). Vous en aurez besoin comme ceci, c'est-à-dire que la nouvelle flèche la plus fraîche sera sur la 9ème barre. Et le délai d'ouverture sera également de 9 mesures.
 
Nikolay Ivanov #:

Je ne m'attends pas à ce que vous compreniez, j'ai eu un client avec un problème similaire, je n'ai pas pu lui expliquer pendant un an, il y avait un indicateur différent, mais aussi avec un dispositif de voyeurisme. Il semble être un gars intelligent, mais apparemment sa soif de profit a vraiment éteint sa logique et sa pensée... Il a fini par tout réaliser lorsqu'il a vidé beaucoup d'argent. Je ne sais pas quoi faire... Si vous le réinitialisez, l'indicateur cessera de fonctionner. Si vous le réinitialisez, seules les flèches de droite restent, mais dans l'historique... J'ai vu beaucoup de ces indicateurs.

Je ne suis pas un programmeur, mais je ne comprends toujours pas pourquoi la flèche ne peut pas être corrigée avec l'apparition d'une nouvelle bougie.

Le monde est plein d'indicateurs avec re-croisement et cela fonctionne bien pour tous ! La flèche se déplace avec le croisement de l'ensemble et il n'y a pas d'oscillation.

Ils ont tous le même code...

Dossiers :
02.png  15 kb
 
asdkika1 #:

Il vaut mieux écrire ce que vous voulez faire... point par point.

 
anrei2002 #:

Je ne suis pas un programmeur, mais je ne comprends toujours pas pourquoi la flèche ne peut pas être corrigée avec l'apparition d'une nouvelle bougie ?

Le monde est plein d'indicateurs avec re-croisement et cela fonctionne bien pour tous ! La flèche se déplace le long du croisement de l'ensemble et il n'y a pas d'oscillation.

Ils ont tous le même code.

On parle de rerolling normal lorsque la barre de signal (où se trouve la flèche) est impliquée dans le calcul du signal et peut avoir l'indice 0... C'est-à-dire, le bar actuel... Il est redessiné chaque tick et, respectivement, le signal peut également être redessiné...

Mais en plus de la 0ème mesure, vous utilisez -1 -2 -3 -4 -5 -6 -7... D'où viendra la moins 8ème mesure ? Il n'est pas bon d'utiliser même la barre 0... et les barres avec des indices moins sont tout simplement inacceptables...

J'ai écrit plus haut comment le réparer... Il fonctionnera bien si vous attendez le signal à droite de 8 barres, alors ce sera ok, ne pense pas que la flèche sera toujours 9 barres de retard, voulez-vous que ?

 
MakarFX #:

Il vaut mieux écrire ce que vous voulez faire... point par point.

Calculer le stochastique à partir de la multiplication de deux paires.
J'ai juste pris l'indicateur stochastique standard et j'ai changé
les données d'entrée (lignes marquées).
Je n'ai jamais utilisé OnCalculate - apparemment c'est là que le chien est enterré.
Ne fonctionne pas - je n'arrive pas à comprendre pourquoi.
J'espérais que je n'aurais pas à
J'espère que je n'aurai pas à le redessiner moi-même.
 
Nikolay Ivanov #:

On parle de dépassement normal lorsque la barre de signal elle-même (où se trouve la flèche) intervient dans le calcul pour que le signal apparaisse et peut avoir un indice de 0... C'est le bar actuel... Il est redessiné chaque tick et, par conséquent, le signal peut également être redessiné...

Mais en plus de la 0ème mesure, vous utilisez -1 -2 -3 -4 -5 -6 -7... D'où viendra la moins 8ème mesure ? Il n'est pas bon d'utiliser même la barre 0... et les barres avec des indices moins sont tout simplement inacceptables...

J'ai écrit plus haut comment le réparer... Il fonctionnera correctement si vous attendez le signal à droite de 8 barres, alors tout ira bien, ne pense pas que la flèche sera toujours 9 barres de retard, voulez-vous que ?

Voici un exemple d'un autre indicateur de ce type !

Il a en plus des flèches sur le tableau, il y a des cercles à l'intersection des lignes dans le sous-sol.

Et les cercles, contrairement aux flèches, sont strictement derrière l'intersection des lignes ! Il n'y a pas de cercles supplémentaires.

Pourquoi n'y a-t-il pas de flèches ?

Dossiers :
03.png  98 kb
EATA__Alert.mq4  20 kb
 
anrei2002 #:

Voici un exemple d'un autre de ces indicateurs !

En plus des flèches sur le graphique, il y a des cercles à l'intersection des lignes dans le sous-sol.

Et les cercles, contrairement aux flèches, sont strictement derrière l'intersection des lignes ! Il n'y a pas de cercles supplémentaires.

Pourquoi y a-t-il un problème avec les flèches ?

faites tourner cet indicateur dans le testeur et observez les lignes et les cercles dans la visualisation à vitesse accélérée... Si cela n'a pas de sens même après cela, je ne sais pas comment l'expliquer autrement, simplement...

 
asdkika1 #:
Calcul stochastique à partir de la multiplication de deux paires.
J'ai juste pris l'indicateur stochastique standard et j'ai changé
les données d'entrée (lignes marquées).
Je n'ai jamais utilisé OnCalculate - je suppose que c'est là que réside le problème.
Ne fonctionne pas - je n'arrive pas à comprendre pourquoi.
J'espérais que je n'aurais pas à
J'espérais ne pas avoir à le refaire moi-même. Ça devrait être très simple.

Multiplier quoi ? Ouvert ? Fermer ? Stoch ?