robot + indicateur ( modifier ) - page 2

 
Hello.
Je rentre du boulot. Je lis depuis mon smartphone, mais je pense qu'il y a quelques souci.
Le icustom te donne un handle.
C'est avec ce handle que tu peux avoir les datas à partir de copybuffer.

Après pour un minimum d'économie de ressources met la déclaration du handle au global

Déclare le handle qu'une fois et surtout qu'au lancement.

Et utilise penses à bien exploiter le start et count de copybuffer pour ne pas tout copier a chaque tick ou barre

Après c'est mon avis perso, très perso.
Je pense que les indicateurs sont plus simples à gérer en "as séries" false. 
Par contre pour un EA il est plus simple de gérer avec un as séries true.

Bonne chance
 

Tu m'excuses, mais là, je n'ai rien compris.

Ma question est : comment, à partir d'un EA ou de Icustom, je peux choisir, sélectionner, lire ou récupérer une donnée présente dans l'indicateur ? Ne me réponds pas.

CopyBuffer

Dans le code ci-dessous, il n'y a que des zéros. Disons plutôt que je suis à la recherche d'un exemple. 


void OnTick()
  {

   int InpInd_Handle=iCustom(Symbol(),_Period,"ASCtrend",4);
   
   if(InpInd_Handle==INVALID_HANDLE) Print("aucun pointeur sur ASCtrend");  // Récupération d'un pointeur


   int qt=BarsCalculated(InpInd_Handle);  //Calcul de la qt de donnée
   Print("qt de donnee "+ (string)qt);
   
   
   //Lecture de toutes les données différente de zéros
   double testLecture[1];
   string txt="donnee de ASCtrend";
   
   for (int i=0;i<qt;i++){
   CopyBuffer(InpInd_Handle,i,1,1,testLecture);
   if(testLecture[0]!=0) txt=txt+" i= "+i+" val="+(string)testLecture[0];
   }
   Print(txt);  // Affichage des données
   
   }


La seule chose que j'arrive à faire, c'est récupérer un int celui de la fonction ci dessous présent dans l'indicateur.


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[])


merci pour tout retour

cdl remy

 

Bonjour
Ecoute, c'est pas très compliqué, mais il faut que tu laisses tomber ce que tu penses savoir car sinon y a pas la place pour ce que j'ai à t'expliquer.

Prends l'exemple de la doc
iCustom - Indicateurs Techniques - Référence MQL5 - Référence sur le langage de trading algorithmique/automatisé pour MetaTrader 5

y'a la première partie => RAB

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int MA_Period=21;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMA;
//--- indicator buffers
double         Label1Buffer[];
//--- handle de l'indicateur d'utilisateur Custom Moving Average.mq5
int MA_handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

après la partie oninit et pas ailleurs et certainement pas tous les ticks !!!!

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ResetLastError();
   MA_handle=iCustom(NULL,0,"Examples\\Custom Moving Average",
                     MA_Period,
                     MA_Shift,
                     MA_Method,
                     PRICE_CLOSE // calculons selon les prix de la clôture
                     );
   Print("MA_handle = ",MA_handle,"  error = ",GetLastError());
//---
   return(INIT_SUCCEEDED);
  }

comme tu peux le voir le icustom est fait là

et seulement après dans oncalculate le copybuffer

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[])
  {
//--- copions les valeurs de l'indicateur Custom Moving Average à notre tampon d'indicateur
   int copy=CopyBuffer(MA_handle,0,0,rates_total,Label1Buffer);
   Print("copy = ",copy,"    rates_total = ",rates_total);
//--- si la tentative est ratée - signalez-le
   if(copy<=0)
      Print("La tentative ratée de recevoir les valeurs de l'indicateur  Custom Moving Average");
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Voilà c'est tout


Pas de besoin de ce que tu fais à tous les passages de créer l'handle

 void OnTick()
  {

   int InpInd_Handle=iCustom(Symbol(),_Period,"ASCtrend",4);
   
   if(InpInd_Handle==INVALID_HANDLE) Print("aucun pointeur sur ASCtrend");  // Récupération d'un pointeur

Pas de besoin de faire une variable pour avoir une nombre de barres tu as tout ce qu'il faut comme constantes dans oncalculate

 int qt=BarsCalculated(InpInd_Handle);  //Calcul de la qt de donnée
   Print("qt de donnee "+ (string)qt);

et avec les constantes oncalculate pas besoin de faire de boucle non plus

for (int i=0;i<qt;i++){
   CopyBuffer(InpInd_Handle,i,1,1,testLecture);
   if(testLecture[0]!=0) txt=txt+" i= "+i+" val="+(string)testLecture[0];
   }
Documentation sur MQL5: Indicateurs Techniques / iCustom
Documentation sur MQL5: Indicateurs Techniques / iCustom
  • www.mql5.com
iCustom - Indicateurs Techniques - Référence MQL5 - Référence sur le langage de trading algorithmique/automatisé pour MetaTrader 5
 
Le but du jeu est de récupérer un tableau présent dans l'indicateur pour l'utiliser dans le robot.

 Donc si je te comprends bien, dans l'indicateur, je remplis la variable que je souhaite partager. oui/non


//ici je suis dans l'indicateur


double Buffer[];  variable global
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 copy=CopyBuffer(MA_handle,0,0,rates_total,Buffer);   //  Ici, Buffer est initialisé dans l'indicateur pour être lu par le robot de trading.
                                                          //  Ma_Handle ces un equivalent  "this" ????

...




//ici je suis dans le robot

int inpInd; //variable global

int OnInit()
  {
  
  InpInd_Handle=iCustom(Symbol(),_Period,"ASCtrend",4); //init 
  
    return(INIT_SUCCEEDED);
  }

 void OnTick()
  {
       // Donc maintenant, comment je récupère le tableau à partir de InpInd_Handle initialisé dans OnInit 

}
 
???
Copybuffer
Fait attention à ton as_serie false ou true ca va changer les param de ton copybuffer
ArraySetAsSeries - Fonctions sur les Tableaux - Référence MQL5 - Référence sur le langage de trading algorithmique/automatisé pour MetaTrader 5
Documentation sur MQL5: Fonctions sur les Tableaux / ArraySetAsSeries
Documentation sur MQL5: Fonctions sur les Tableaux / ArraySetAsSeries
  • www.mql5.com
ArraySetAsSeries - Fonctions sur les Tableaux - Référence MQL5 - Référence sur le langage de trading algorithmique/automatisé pour MetaTrader 5
 

OK, si j'y arrive, je posterai une solution. En attendant, je vais me contenter de celui qui fonctionner bien, même s'il est limité à un entier.


voir https://www.mql5.com/fr/forum/454762#comment_49642104


  Avec l'initialisation faite ailleurs, bien sûr, mais là n'est pas le sujet.


int OnInit()
  {
  
  InpInd_Handle=iCustom(Symbol(),_Period,"ASCtrend",4); //init 
  
    return(INIT_SUCCEEDED);
  }
robot + indicateur ( modifier )
robot + indicateur ( modifier )
  • 2023.09.27
  • www.mql5.com
Bonjour Je souhaite faire interagir un robot de trading automatique avec un indicateur de manière simple...
 

l'indicateur en entier et sans aucune modif  https://www.mql5.com/en/code/viewcode/15186/126462/asctrend.mq5

le robot en entier

 int InpInd_Handle;
 double DnValue[1],UpValue[1];
 bool updown;

 
int OnInit()
{
   InpInd_Handle=iCustom(Symbol(),_Period,"ASCtrend",4);
   if(InpInd_Handle==INVALID_HANDLE) Print("aucun pointeur sur ASCtrend");  // récupération d'un pointeur
   return 0;
}

void OnTick()
{  
   if(CopyBuffer(InpInd_Handle,0,1,1,DnValue)<=0) {Print("ko");return;}
   if(CopyBuffer(InpInd_Handle,1,1,1,UpValue)<=0) {Print("ko");  return;}
   if(UpValue[0]!=0){updown=true;}
   if(DnValue[0]!=0){updown=false;}
   if(updown){Print("Marcher orienté a la hausse");}
   else{Print("Marcher orienté a la baisse");}
}

Je suis incapable de dire quelle variable je récupère dans astrend , mais cela fonction.

Inutile de me dire que c'est la première et la deuxième . Ce que je souhaite peut-être un jour comprend, c'est quelle variable et associer à quel index.

Ou comme je peux choisir ma variable  .