Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1362

 
Y no puedes poner los 2 archivos por separado en el Mercado. Esa es la política.
 
Aleksei Stepanenko #:

Este es el indicador:

Aquí está el experto:

Aquí está todo en un solo archivo:

El cuatro es cierto, pero también el cinco.

Sólo ha compilado el archivo Expert.

Intente llenar el indicador con al menos un objeto gráfico simple, para que sea llamado por el Asesor Experto. Luego, después de la compilación, cambie el nombre o borre Res_Ind.ex4, como si hubiera enviado al Mercado sólo el archivo del Asesor Experto. El cliente recibirá un programa no funcional.

 
Aleksei Stepanenko #:
Y no puedes poner los 2 archivos en el Mercado por separado. Esa es la política.
De eso se trata...
 
Dmitriy VC #:

Sólo tiene compilado el archivo Expert.

Intente llenar el indicador con al menos un objeto gráfico simple, para que sea llamado por el Asesor Experto. Luego, después de la compilación, renombre o elimine Res_Ind.ex4, como si hubiera enviado al Mercado sólo el archivo Expert. El cliente recibirá un programa que no funciona.

No se puede ser tan terco ... Dice que el indicador conectado por el recurso se incluye en el archivo ejecutable del Asesor de Expertos, por lo que es.

Pero el hecho de que su indicador dibuje objetos gráficos y el EA tenga que leerlos es un gran problema. Los objetos gráficos sólo están disponibles cuando se prueba con visualización y el autovalidador está probando sin ella, por lo que no ve las propiedades de los objetos...

 
Alexey Viktorov #:

Se dice que el indicador conectado por el recurso está incluido en el archivo ejecutable del EA, así es.

Indicador en una ventana aparte

//+------------------------------------------------------------------+
//|                                                          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);
  }
//+------------------------------------------------------------------+

Indicador de compilación --> win.ex5.

Experto con el indicador en el recurso

//+------------------------------------------------------------------+
//|                                                          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()
  {
//---

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

Compilar el Asesor Experto --> exp.ex5.

Ejecute el Asesor Experto, hay una ventana del indicador en el gráfico.

Publicar un archivo del Asesor Experto exp.ex5 en el Mercado (en realidad eliminar el archivo del indicador win.ex5)

Inicie el Asesor Experto, no hay ventana de indicadores en el gráfico.

Restaurar el archivo borrado win.ex5.

Restablecer el Asesor Experto, hay una ventana del indicador en el gráfico.


Conclusión: El código del indicador no está incluido en el código del experto. Para el funcionamiento normal del Asesor Experto con un recurso Indicador, necesitamos un archivo ejecutable del Indicador especificado en el recurso.


Repito mi pregunta:

¿Cómo publicar en el Mercado cuando hay un Experto con Indicador personalizado, biblioteca, es decir, se necesita más de un archivo para el trabajo normal del Experto?

Archivos adjuntos:
win.mq5  2 kb
exp.mq5  4 kb
 
Dmitriy VC #:

Indicador en una ventana aparte

Indicador de compilación --> win.ex5.

Experto con este indicador en el recurso

Compilar el Experto --> exp.ex5.

Ejecute el Asesor Experto, hay una ventana del indicador en el gráfico.

Publicar un archivo del Asesor Experto exp.ex5 en el Mercado (en realidad eliminar el archivo del indicador win.ex5)

Inicie el Asesor Experto, no hay ventana de indicadores en el gráfico.

Restaurar el archivo borrado win.ex5.

Restablecer el Asesor Experto, el gráfico tiene la ventana del indicador.


Conclusión: El código del indicador no está incluido en el código del experto. Para el funcionamiento normal del Asesor Experto con un recurso Indicador, necesitamos un archivo ejecutable del Indicador especificado en el recurso.


Repito mi pregunta:

¿cómo publicar en el Mercado cuando hay un Asesor Experto con un Indicador personalizado, biblioteca, es decir, se necesita más de un archivo para el funcionamiento normal del Asesor Experto?

¿Cuántas veces le han dado un enlace a la documentación? ¿Tu madre no te deja leerlo?

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

Léelo por fin...

 
Alexey Viktorov #:

¿Cuántas veces te han dado un enlace a la documentación? ¿Tu madre no te deja leerlo?

Léelo por fin...

Alexey, gracias por señalar el error directamente.

Leí la documentación, pero estaba "fuera de mi vista".

Pido disculpas a todo el mundo: me he equivocado.

Ya lo tengo.

 

¿Puede darme una pista, por favor?

Añadido el cálculo del recuento de barras(:RatesTotal(void)) a la clase, no se sabe cómo encajar en la estructura correctamente. Tengo algo así. Por favor, puedes decirme cómo hacerla más colorida.

#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 #:

Ya está todo solucionado.

No lo hice, no lo sabía. No hay ningún problema :)

 

Me podéis decir cómo organizar un análogo de cálculo de prev_calculado, no lo consigo.


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
  }
Razón de la queja: