Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1362

 
E não se pode colocar os 2 ficheiros separadamente no Mercado. É essa a política.
 
Aleksei Stepanenko #:

Aqui está o indicador:

Aqui está o perito:

Aqui está tudo num só ficheiro:

Quatro é verdade, mas cinco também é verdade.

Compilou apenas o ficheiro Expert.

Tente preencher o indicador com pelo menos um objecto gráfico simples, para que seja chamado pelo Conselheiro Especialista. Depois, após a compilação, renomear ou apagar Res_Ind.ex4, como se tivesse enviado para o Mercado apenas o ficheiro Expert Advisor. O cliente receberá um programa não-funcional.

 
Aleksei Stepanenko #:
E não se pode colocar os 2 ficheiros separadamente no Mercado. É essa a política.
É disso que se trata...
 
Dmitriy VC #:

Tem apenas o ficheiro Expert compilado.

Tente preencher o indicador com pelo menos um objecto gráfico simples, para que seja chamado pelo Expert Advisor. Depois da compilação, renomear ou apagar Res_Ind.ex4, como se tivesse enviado para o ficheiro Expert do Market only. O cliente receberá um programa de não-trabalho.

Não pode ser tão teimoso... Diz que o indicador ligado pelo recurso está incluído no ficheiro executável do Expert Advisor, assim o é.

Mas o facto de o seu indicador desenhar objectos gráficos e a EA ter de os ler é um grande problema. Os objectos gráficos só estão disponíveis quando se testa com visualização e o autovalidador está a testar sem ele, por isso não vê as propriedades dos objectos...

 
Alexey Viktorov #:

Diz-se que o indicador ligado pelo recurso está incluído no ficheiro executável da EA, pelo que o está.

Indicador numa janela separada

//+------------------------------------------------------------------+
//|                                                          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 Compilação --> win.ex5.

Perito com o indicador no 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()
  {
//---

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

Compile o Expert Advisor --> exp.ex5.

Execute o Expert Advisor, há uma janela indicadora no gráfico.

Publicar um ficheiro do Expert Advisor exp.ex5 no Mercado (de facto eliminar o ficheiro indicador win.ex5)

Lançar o Expert Advisor, não há nenhuma janela indicadora no gráfico.

Restaurar o ficheiro eliminado win.ex5.

Restaurar o Expert Advisor, o gráfico tem a janela indicadora.


Conclusão: O código do indicador não está incluído no código do perito. Para o funcionamento normal do Expert Advisor com um Indicador de recurso, precisamos de um ficheiro executável do Indicador especificado no recurso.


Repito a minha pergunta:

como publicar no Mercado quando existe Expert com Indicador personalizado, biblioteca, ou seja, é necessário mais do que um ficheiro para o trabalho normal do Expert?

Arquivos anexados:
win.mq5  2 kb
exp.mq5  4 kb
 
Dmitriy VC #:

Indicador numa janela separada

Indicador de Compilação --> win.ex5.

Perito com este Indicador no recurso

Compile the Expert --> exp.ex5.

Execute o Expert Advisor, há uma janela indicadora no gráfico.

Publicar um ficheiro do Expert Advisor exp.ex5 no Mercado (de facto eliminar o ficheiro indicador win.ex5)

Lançar o Expert Advisor, não há nenhuma janela indicadora no gráfico.

Restaurar o ficheiro eliminado win.ex5.

Restaurar o Expert Advisor, o gráfico tem a janela indicadora.


Conclusão: O código indicador não está incluído no código do perito. Para o funcionamento normal do Expert Advisor com um Indicador de recurso, precisamos de um ficheiro executável do Indicador especificado no recurso.


Repito a minha pergunta:

como publicar no Mercado quando existe um Expert Advisor com um Indicador personalizado, biblioteca, ou seja, é necessário mais do que um ficheiro para o funcionamento normal do Expert Advisor?

Quantas vezes foi-lhe dado um link para a documentação? A tua mãe não te deixa lê-lo?

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

Leia-o finalmente...

 
Alexey Viktorov #:

Quantas vezes foi-lhe dado um link para a documentação? A tua mãe não te deixa lê-lo?

Leia-o finalmente...

Alexey, obrigado por assinalar directamente o erro.

Eu li a documentação, mas estava "fora da minha vista".

Peço desculpa a todos - estava enganado.

Já o tenho.

 

Pode dar-me uma dica, por favor?

Adicionado cálculo de contagem de barras(:TaxasTotal(void)) à classe, não se consegue perceber como encaixar correctamente na estrutura. Tenho algo parecido com isto. Pode por favor dizer-me como torná-lo mais colorido?

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

Está tudo resolvido agora.

Eu não sabia, eu não sabia. Sem qualquer problema :)

 

Pode dizer-me como organizar um análogo de cálculo de pré_cálculo, não consigo perceber.


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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ão: