iClose - Subtilité ?

 

Bonjour, 

J'ai un retour de valeur étonnant sur la fonction iClose. Et je constate une subtilité dans la documentation que je ne sais pas expliquer. 

Lien vers la doc : https://www.mql5.com/fr/docs/series/iclose

C'est la seule qui soit déclarée ainsi dans l'exemple :  

double   close = iClose(NULL,PERIOD_CURRENT,shift);

au lieu de (par exemple) : 

double close = iClose(_Symbol, PERIOD_CURRENT, shift);


D'autre part, le problème que je rencontre, c'est que la fonction ne me renvoie pas la valeur de la cloture que je retrouve sur le chart. 

Par exemple sur une comparaison dans le cadre de la définition d'une Morning star, je vais avoir plusieurs Evening star dont la troisième bougie aura un prix de clôture supérieur au prix d'ouverture de la première. 

// extrait
this.open1 = iOpen(_Symbol, PERIOD_CURRENT, 2);
this.close3 = iClose(_Symbol, PERIOD_CURRENT, 0);

// extrait

bool isThirdCandleAboveFirst = this.close3 > this.open1;                                         // Check if the third candle's close is below the first candle's open


VS les valeurs renvoyées dans le journal : (en analysant de près, il me renvoie dans ce cas spécifique la valeur du High)

2023.08.22 02:13:18.970 2023.02.08 15:32:15   this.close3 : 0.69609 - this.open1 : 0.69604

Y a t-il une subtilité que je n'ai pas saisie ? 

Merci d'avance de votre aide. 

Documentation sur MQL5: Accès aux Séries de Données et aux Indicateurs / iClose
Documentation sur MQL5: Accès aux Séries de Données et aux Indicateurs / iClose
  • www.mql5.com
iClose - Accès aux Séries de Données et aux Indicateurs - Référence MQL5 - Référence sur le langage de trading algorithmique/automatisé pour MetaTrader 5
 
Bonjour
C'est peu être la définition du close qui te fais décaler la valeur, j'ai eu qq soucis avec ça.
Essayes de passer par les index de barres, pour croiser les résultats

Attention à ton As_Serie true ou false, ça change un peu les valeurs lol
0 la barre la plus ancienne ou la plus récente
 

Bonjour Gérard, après quelques recherches, j'ai l'impression qu'il faut traiter ces informations dans l'événement onCalculate pour tout ce qui touche à l'analyse des prix sur les charts. 

ce que je ne comprends pas c'est s'il faut tout faire dans cet événement, et comment on le fait communiquer avec onTick ... ?

 

Et je découvre à l'instant que OnCalculate ne peut pas fonctionner avec EA. 

Donc il faut forcément utiliser les Copy* ?

 

Re
Moi dans mes codes, pour diverses raisons, je préfère faire un indicateur et avoir accès à Oncalculate

Ca me permet de pouvoir vérifier assez facilement qu'il retourne bien ce que je veux.

Une fois fait, j'appelle cet indicateur via Icustom()

Tu peux passer aussi par IndicatorCreate()

 

Sinon effectivement tu passer par les copy mais comme dit, ton indicateur est alors dans l'EA et pour moi c'est foireux.

Pas facile à tester, à réutiliser, à maintenir, etc 

 

Après différentes recherches sur le forum, voici le code que j'ai produit. 

//+------------------------------------------------------------------+
//| Checks formation of Evening star candlestick pattern             |
//+------------------------------------------------------------------+
double candlePatternsHelper::isEveningStar() 
{
    MqlRates rates[];
    int copied=CopyRates(NULL,0,0,3,rates);
    ArraySetAsSeries(rates,true);

    if(copied>2)
    {

        if (
        (rates[2].close > rates[2].open)                                                               && // Check if the first candle is bullish
        (MathAbs(rates[1].close - rates[1].open) < (MathAbs(rates[1].high - rates[1].low) * 0.3))      && // Check if the second candle is a a little candle
        (MathAbs(rates[0].close - rates[0].open) > (MathAbs(rates[0].high - rates[0].low) * 0.7))      && // Check if the third candle is a a strong candle
        (MathAbs(rates[2].close - rates[2].open) > (MathAbs(rates[2].high - rates[2].low) * 0.7))      && // Check if the first candle is a a strong candle
        (rates[0].close < rates[0].open)                                                               && // Check if the third candle is bearish
        (rates[0].close < rates[2].close && rates[0].close > rates[2].open))                              // Check if the third candle closes within the body of the first candle
        {
            Print("Evening Star : ", rates[1].high);
            
            // Create a rectangle object
            ObjectCreate(0, (string)rates[0].time, OBJ_RECTANGLE, 0, rates[2].time, rates[2].high, rates[0].time, rates[0].low);
            return rates[1].high;
        }
    }

    // No Evening Star pattern found
    return 0;
}

A priori, si j'ai bien compris c'est la bonne façon de procéder. 

Pour tester, j'ai ajouté un rectangle sur le graphique, et la plupart du temps j'obtiens bien mon résultat. Exemple : 

En l'état du code écrit c'est bien le résultat attendu. 

En revanche, de temps en temps j'obtiens un truc qui n'a rien à voir : 

Et là j'avoue je ne comprends pas ... En gros, il y a tjs un problème avec la troisième bougie


--EDIT--

Je viens d'ajouter ce code : 

           Print("Candle 1 - Close :  ", rates[2].close, " - Open : ", rates[2].close, " - High : ", rates[2].high, " - Low : ", rates[2].low);
           Print("Candle 2 - Close :  ", rates[1].close, " - Open : ", rates[1].close, " - High : ", rates[1].high, " - Low : ", rates[1].low);
           Print("Candle 3 - Close :  ", rates[0].close, " - Open : ", rates[0].close, " - High : ", rates[0].high, " - Low : ", rates[0].low);

Me renvoie ce résultat : 

2023.08.22 11:24:21.795 2023.03.02 16:10:17   Candle 1 - Close :  0.6717 - Open : 0.6717 - High : 0.67176 - Low : 0.67081
2023.08.22 11:24:21.795 2023.03.02 16:10:17   Candle 2 - Close :  0.67157 - Open : 0.67157 - High : 0.67169 - Low : 0.67125
2023.08.22 11:24:21.795 2023.03.02 16:10:17   Candle 3 - Close :  0.6714 - Open : 0.6714 - High : 0.67156 - Low : 0.67137

Il s'agit de cette capture : 

 
Je suis sur mon smartphone.
D'après ce que je peux voir ton code tu fais un peu plus que rechercher une config précise. C'est quoi tes coef en plus ? 0.3 et 0.7 ?
 

<0.3 c'est pour la bougie du centre, le corps doit faire -30% du haut et du bas. 

>0.7 c'est pour les deux autres bougies, le corps doit faire +70% du haut et du bas. 

Je crois que j'identifie le problème, mais j'ai besoin de confirmer : 


rates[0] fait référence à la dernière bougie cloturée ou à la bougie en cours ? CF : 

2023.08.22 11:28:43.765 2023.03.02 23:39:30   Candle 3 - Close :  0.67292 - Open : 0.67292 - High : 0.67306 - Low : 0.67291


2023.08.22 11:28:43.765 2023.03.02 23:39:59   Candle 3 - Close :  0.67294 - Open : 0.67294 - High : 0.67306 - Low : 0.67291
 
La zéro c'est la en cours.
Fais gaffe à as series
 
C'est à dire ?