Questions des débutants MQL5 MT5 MetaTrader 5 - page 1362

 
Et vous ne pouvez pas mettre les 2 fichiers dans le Marché séparément. C'est la politique.
 
Aleksei Stepanenko #:

Voici l'indicateur :

Voici l'expert :

Voici tout dans un seul fichier :

Quatre est vrai, mais cinq l'est aussi.

Vous n'avez compilé que le fichier Expert.

Essayez de remplir l'indicateur, au moins avec un simple objet graphique, afin qu'il soit appelé par le conseiller expert. Ensuite, après la compilation, renommez ou supprimez Res_Ind.ex4, comme si vous n'aviez envoyé au marché que le fichier Expert Advisor. Le client recevra un programme non fonctionnel.

 
Aleksei Stepanenko #:
Et vous ne pouvez pas mettre les 2 fichiers séparément dans le Marché. C'est la politique.
C'est de ça qu'il s'agit...
 
Dmitriy VC #:

Vous n'avez compilé que le fichier Expert.

Essayez de remplir l'indicateur avec au moins un objet graphique simple, de sorte qu'il soit appelé par l'Expert Advisor. Puis, après la compilation, renommez ou supprimez Res_Ind.ex4, comme si vous aviez envoyé au marché uniquement le fichier Expert. Le client recevra un programme qui ne fonctionne pas.

Vous ne pouvez pas être si têtu... Il est dit que l'indicateur connecté par la ressource est inclus dans le fichier exécutable du Conseiller Expert, donc il l'est.

Mais le fait que votre indicateur dessine des objets graphiques et que l'EA doive les lire est un gros problème. Les objets graphiques ne sont disponibles que lorsqu'on teste avec la visualisation et l'autovalidateur teste sans, donc il ne voit pas les propriétés des objets...

 
Alexey Viktorov #:

Il est dit que l'indicateur connecté par la ressource est inclus dans le fichier exécutable de l'EA, donc il l'est.

Indicateur dans une fenêtre séparée

//+------------------------------------------------------------------+
//|                                                          win.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

   IndicatorSetString(INDICATOR_SHORTNAME,"win");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Compiler l'indicateur --> win.ex5.

Expert avec l'indicateur dans la ressource

//+------------------------------------------------------------------+
//|                                                          exp.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#resource "\\Indicators\\win.ex5"
char      number    = -1;
int       handle    = INVALID_HANDLE;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   if(number<0)
     {
      handle=iCustom(_Symbol,_Period,"win.ex5");
      number=char(ChartGetInteger(0,CHART_WINDOWS_TOTAL));

      if(handle!=INVALID_HANDLE)
        {
         ChartIndicatorAdd(0,number,handle);
        }
     }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(reason==REASON_REMOVE)
     {
      ChartIndicatorDelete(0,int(ChartWindowFind(0,"win")),"win");
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+

Compiler le conseiller expert --> exp.ex5.

Lancez le Conseiller Expert, il y a une fenêtre d'indicateur sur le graphique.

Publier un fichier de l'Expert Advisor exp.ex5 sur le marché (en fait, supprimer le fichier de l'indicateur win.ex5).

Lancer l'Expert Advisor, il n'y a pas de fenêtre d'indicateur dans le graphique.

Restaurer le fichier supprimé win.ex5.

Restaurer l'Expert Advisor, le graphique a la fenêtre de l'indicateur.


Conclusion : Le code de l'indicateur n'est pas inclus dans le code Expert. Pour le fonctionnement normal du Conseiller Expert avec une ressource Indicateur, nous avons besoin d'un fichier exécutable de l'Indicateur spécifié dans la ressource.


Je répète ma question :

comment publier dans le marché quand il y a un expert avec un indicateur personnalisé, une bibliothèque, c'est-à-dire que plus d'un fichier est nécessaire pour le travail normal de l'expert ?

Dossiers :
win.mq5  2 kb
exp.mq5  4 kb
 
Dmitriy VC #:

Indicateur dans une fenêtre séparée

Compiler l'indicateur --> win.ex5.

Expert avec cet indicateur dans la ressource

Compiler l'expert --> exp.ex5.

Lancez le Conseiller Expert, il y a une fenêtre d'indicateur sur le graphique.

Publier un fichier de l'Expert Advisor exp.ex5 sur le marché (en fait, supprimer le fichier de l'indicateur win.ex5).

Lancer l'Expert Advisor, il n'y a pas de fenêtre d'indicateur dans le graphique.

Restaurer le fichier supprimé win.ex5.

Restaurer l'Expert Advisor, le graphique a la fenêtre de l'indicateur.


Conclusion : le code indicateur n'est pas inclus dans le code expert. Pour le fonctionnement normal du Conseiller Expert avec une ressource Indicateur, nous avons besoin d'un fichier exécutable de l'Indicateur spécifié dans la ressource.


Je répète ma question :

comment publier sur le marché lorsqu'il y a un conseiller expert avec un indicateur personnalisé, une bibliothèque, c'est-à-dire que plus d'un fichier est nécessaire pour le fonctionnement normal du conseiller expert ?

Combien de fois vous a-t-on donné un lien vers une documentation ? Ta mère ne te laisse pas le lire ?

      handle=iCustom(_Symbol,_Period,"win.ex5"); // Это делается не так!!!!

Enfin, je l'ai lu...

 
Alexey Viktorov #:

Combien de fois vous a-t-on donné un lien vers une documentation ? Ta mère ne te laisse pas le lire ?

Enfin, je l'ai lu...

Alexey, merci d'avoir signalé l'erreur directement.

J'ai lu la documentation, mais elle était "hors de ma vue".

Je m'excuse auprès de tout le monde - je me suis trompé.

Je l'ai maintenant.

 

Pouvez-vous me donner un indice ?

Ajouté le calcul du nombre de barres(:RatesTotal(void)) à la classe, je n'arrive pas à trouver comment l'intégrer correctement dans la structure. J'ai quelque chose comme ça. Pouvez-vous me dire comment le rendre plus coloré ?

#include <Arrays\ArrayObj.mqh>
/********************************************************************\
|   Класс Новый бар                                                  |
\********************************************************************/
class CNewBar : public CObject
  {
private:
   string            m_symbol;
   ENUM_TIMEFRAMES   m_timeframe;
   datetime          m_time;
   long              m_rt;
   datetime          Time(void);  
   long              RatesTotal(void);   
   string            Symbol(void)         { return this.m_symbol;    }
public:
   ENUM_TIMEFRAMES   Timeframe(void)      { return this.m_timeframe; }
   datetime          GetTime(void)        { return this.m_time;      } //  Возвращает время последнего обращения
   long              GetRatesTotal(void)     { return this.m_rt; }
   bool              IsNewBar(void);                                   //  Основная функция класса
                     CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe);
                    ~CNewBar(void) {;}
  };
//+------------------------------------------------------------------+
//|    Конструктор                                                   |
//+------------------------------------------------------------------+
CNewBar::CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe) : m_time(0)
  {
   this.m_symbol = symbol;
   this.m_timeframe = (timeframe == PERIOD_CURRENT ? Period() : timeframe);
  }

//+------------------------------------------------------------------+
//|  Возвращает количество баров в истории                           |
//+------------------------------------------------------------------+
long CNewBar::RatesTotal(void)
  {
//---- получим количество баров
  long rt=SeriesInfoInteger(this.m_symbol, this.m_timeframe,SERIES_BARS_COUNT);
//---- Проверка количества
   if(rt<1)
      Print("Error "+__FUNCTION__+" Не определенно кол-во баров ",this.m_symbol," ",this.m_timeframe);
//----
   return(rt);
  };
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   m_rt=this.RatesTotal();
   datetime tm=this.Time();
   if(tm==0 || m_rt<1)
      return false;
   if(tm!=this.m_time)
     {
      this.m_time = tm;
      return true;
     }
   return false;
  }
 
Dmitriy VC #:

C'est réglé maintenant.

Je ne savais pas, je ne savais pas. Pas de problème du tout :)

 

Pouvez-vous me dire comment organiser un analogue du calcul de prev_calculé, je n'arrive pas à le comprendre.


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CNewBar::PrevCalculated(void)
  {
   int pc=this.m_rt
   return(pc)
  }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm=this.Time();

   if(tm==0 || m_rt<1)
      return false;
   if(tm!=this.m_time)
     {
      //--- определяем время
      this.m_time = tm;
      //--- определяем кол-во
      this.m_rt=this.RatesTotal();
      return true;
     }
   return false;
  }
Raison: