Discussion de l'article "Création d’un Expert Advisor, qui trade sur un certain nombre d’instruments" - page 3

 

6. semble manquer :

TradePerformer( 4, Symb4, Trade4, StLoss4, TkProfit4, Lots4, Slippage4, UpSignal, DnSignal, UpStop, DnStop) ;

dans Exp_TEMA.mq5 ?

 
ias:

6. semble manquer

dans Exp_TEMA.mq5 ?

Oui ! J'ai dû travailler trop dur et surchauffer dans une chaleur aussi anormale !
 
Renat:

Veuillez créer un exemple reproductible. En d'autres termes, vous avez besoin d'un code prêt à l'emploi que vous pouvez compiler, placer sur un graphique et obtenir des résultats.

Sans cela, peu de gens comprendront de quoi nous parlons.

Je me suis dit que j'allais faire un petit effort pour ne pas décourager les gens pour rien.

Voici la version complète :

#property indicator_separate_window    // L'indicateur est dessiné dans une fenêtre séparée
#property indicator_buffers 1



#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Aqua

input string InstrumentName = "EURJPY";

//-- Tableau d'indicateurs
double ScreenBuffer[]; 

//-- Tampon dynamique --
double ArrayBuffer[];

int OnInit()                          // Fonction spéciale init()
{
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   return 0;                          // Exit
}
//--------------------------------------------------------------------
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 Counted_bars;   // Nombre de barres à opérer 
int copied;

//--------------------------------------------------------------------
   //1 input rates_total = 9667 / prev_calculated = 0 / Bars = 9667
   //-- puis rates_total = 9667 / prev_calculated = 9667 / Bars = 9667
   //-- en cours alors rates_total = 9668 / prev_calculated = 9667 / Bars = 9668
   //Imprimez("rates_total : " + (string)rates_total) ;
   if (rates_total == prev_calculated) return (rates_total);//-- C'est toujours le même bar, donc on est sorti...

   //-- Obtenir le nombre de barres non traitées (à la première entrée, il s'agit de toutes, puis de 1)
   //-- Le nombre de barres de sortie se réfère au graphique lui-même, mais nous allons sortir un autre instrument.
   //-- le nombre de barres peut être différent, c'est pourquoi nous vidons d'abord toutes les données dans le tampon --
   Counted_bars = rates_total-prev_calculated;
   
   // Print("Counted_bars : " + Counted_bars) ;
   Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));
   //-- Allouer de la mémoire en fonction du nombre de mesures de l'instrument principal --
   if (ArrayResize(ArrayBuffer, Counted_bars,0) == -1) return (rates_total);//-- Erreur d'allocation de mémoire
   //--- initialiser les éléments du tableau avec la valeur EMPTY_VALUE ----
   ArrayInitialize(ArrayBuffer,EMPTY_VALUE);
         
   //-- Obtenir le nombre de barres que cet instrument a actuellement --
   copied = (int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   
   if (copied > 0){
      copied=CopyClose(InstrumentName,0,0,copied,ArrayBuffer);//-- Écriture des données dans la mémoire tampon
      if (copied <= 0) return (rates_total);//-- erreur
   } 
   else{

      return (rates_total);//-- erreur 
   }
    
   if (Counted_bars > copied) Counted_bars = copied;//-- Prendre la valeur la plus basse --

   Counted_bars--;//-- Puisqu'on compte à partir de 0 --
   //-- Les données sont chargées dans la mémoire tampon, elles sont maintenant écrites dans la mémoire tampon de l'écran de droite à gauche --
   for (int i = Counted_bars; i > 0; i--){
      ScreenBuffer[i] = ArrayBuffer[i];
   }   
   
//--------------------------------------------------------------------
   return(rates_total);
}


void OnDeinit(const int reason)
{
   ObjectsDeleteAll(0,0,-1);             // tous les objets du graphique sont supprimés.
}
 

Qu'est-ce que je fais mal, pourquoi ne puis-je pas afficher le graphique d'un autre instrument normalement ?

Tout fonctionnait dans MQL4, ici cela ne fonctionne que si vous l'affichez sur le même instrument, alors pas d'erreur.

[Supprimé]  
gisip:

Qu'est-ce que je fais mal, pourquoi ne puis-je pas afficher le graphique d'un autre instrument normalement ?

Tout fonctionnait dans MQL4, ici cela ne fonctionne que si vous l'affichez sur le même instrument, alors pas d'erreur.


Je ne suis pas sûr de l'exactitude de l'implémentation et de l'algorithme en général, mais sur la base du code et de ce que j'ai pu faire avec, je suppose que c'est le cas :

La chaîne

// Print("Counted_bars : " + Counted_bars) ;
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));

devrait ressembler à ceci

// Print("Counted_bars : " + Counted_bars) ;
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(InstrumentName,Period()));


Peut-être serait-il plus correct de changer le point partout en "0" en PERIOD_CURRENT.

En tout cas, tout a fonctionné pour moi après de tels changements.....

PS

Ce n'est peut-être pas pertinent, mais de cette façon, le compilateur COMPTE beaucoup moins.

Print("rates_total: ",rates_total," / prev_calculated: ",prev_calculated," / Bars: ",Bars(InstrumentName, PERIOD_CURRENT));
 
Interesting:

Je ne suis pas sûr de l'implémentation correcte et de l'algorithme en général, mais sur la base du code et de ce que j'ai pu faire avec, je vais supposer que c'est le cas :

La chaîne

devrait ressembler à ceci

PS

Peut-être serait-il plus correct de changer le point partout en "0" en PERIOD_CURRENT.

En tout cas, tout a fonctionné pour moi après de tels changements....

Je l'ai modifié, mais cela ne fonctionne toujours pas, le graphique ne correspond pas à la réalité.
 

Cela ressemble à ceci sur mon écran :


C'est manifestement une erreur.
[Supprimé]  

Voici comment cela s'est passé pour moi

Mais comme je ne suis pas entré dans la logique de l'inducteur et de son implémentation, ce n'est pas à moi de juger de l'exactitude des résultats.


PS

Je me débarrasserais quand même du symbole dans le paramètre et je le remplacerais par le symbole actuel et le TF, puis je l'utiliserais dans Expert Advisor ou un autre outil en utilisant la méthode habituelle iCustom().

En outre, je ne comprends pas vraiment la logique du travail avec les tampons (je veux dire la queue de la calculatrice et ainsi de suite). À mon avis, il y a beaucoup à faire....

Dossiers :
proba.mq5  4 kb
 
Interesting:

C'est ce que j'ai obtenu

Mais comme je ne suis pas entré dans la logique de l'inducteur et de son implémentation, ce n'est pas à moi de juger de la justesse des résultats.


PS

Je me débarrasserais quand même du symbole dans le paramètre et je le ferais correspondre au symbole actuel et au TF, puis je l'utiliserais dans Expert Advisor ou tout autre outil en utilisant la méthode habituelle iCustom().


Merci pour vos conseils, je vais essayer.
[Supprimé]  

Interesting:

En outre, je ne comprends pas vraiment la logique du travail avec les tampons (je veux dire la queue de la calculatrice, etc.). À mon avis, il y a beaucoup à faire....


Si j'ai bien compris, un seul tampon suffit (il faut juste qu'il soit correctement calculé et dessiné sur le graphique).

PS

Et avec la variante actuelle, j'ai l'impression que l'inducteur affiche les données de "gauche" (le tout début de l'histoire) au lieu de celles de "droite" (actuelles)....

Ou alors je ne comprends rien à la logique de cet indicateur....