Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1362

 
E non puoi mettere i 2 file separatamente nel Market. Questa è la politica.
 
Aleksei Stepanenko #:

Ecco l'indicatore:

Ecco l'esperto:

Qui c'è tutto in un unico file:

Quattro è vero, ma anche cinque.

Avete solo il file Expert compilato.

Cercate di riempire l'indicatore, almeno con un semplice oggetto grafico, in modo che venga chiamato dall'Expert Advisor. Poi, dopo la compilazione, rinominate o cancellate Res_Ind.ex4, come se aveste inviato al mercato solo il file Expert Advisor. Il cliente riceverà un programma non funzionale.

 
Aleksei Stepanenko #:
E non puoi mettere i 2 file nel Market separatamente. Questa è la politica.
Ecco di cosa si tratta...
 
Dmitriy VC #:

Avete solo il file Expert compilato.

Cercate di riempire l'indicatore con almeno un semplice oggetto grafico, in modo che sia chiamato da Expert Advisor. Poi dopo la compilazione, rinominate o cancellate Res_Ind.ex4, come se aveste inviato al mercato solo il file Expert. Il cliente otterrà un programma non funzionante.

Non si può essere così testardo ... Dice che l'indicatore collegato dalla risorsa è incluso nel file eseguibile dell'Expert Advisor, quindi è.

Ma il fatto che il tuo indicatore disegni oggetti grafici e che l'EA debba leggerli è un grosso problema. Gli oggetti grafici sono disponibili solo quando si prova con la visualizzazione e l'autovalidatore sta provando senza, quindi non vede le proprietà degli oggetti...

 
Alexey Viktorov #:

Si dice che l'indicatore collegato dalla risorsa è incluso nel file eseguibile dell'EA, quindi è così.

Indicatore in una finestra separata

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

Compila Indicatore --> win.ex5.

Esperto con l'indicatore nella risorsa

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

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

Compilare l'Expert Advisor --> exp.ex5.

Esegui l'Expert Advisor, c'è una finestra dell'indicatore sul grafico.

Pubblica un file dell'Expert Advisor exp.ex5 nel Mercato (in realtà cancella il file indicatore win.ex5)

Lancia l'Expert Advisor, non c'è la finestra dell'indicatore nel grafico.

Ripristina il file cancellato win.ex5.

Ripristina l'Expert Advisor, il grafico ha la finestra dell'indicatore.


Conclusione: il codice dell'indicatore non è incluso nel codice Expert. Per il normale funzionamento dell'Expert Advisor con una risorsa Indicatore, abbiamo bisogno di un file eseguibile dell'indicatore specificato nella risorsa.


Ripeto la mia domanda:

come pubblicare nel mercato quando c'è un esperto con un indicatore personalizzato, una libreria, cioè più di un file è necessario per il normale lavoro dell'esperto?

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

Indicatore in una finestra separata

Compilare Indicatore --> win.ex5.

Esperto con questo indicatore nella risorsa

Compilare l'Esperto --> exp.ex5.

Esegui l'Expert Advisor, c'è una finestra dell'indicatore sul grafico.

Pubblica un file dell'Expert Advisor exp.ex5 nel Mercato (in realtà cancella il file indicatore win.ex5)

Lancia l'Expert Advisor, non c'è la finestra dell'indicatore nel grafico.

Ripristina il file cancellato win.ex5.

Ripristina l'Expert Advisor, il grafico ha la finestra dell'indicatore.


Conclusione: il codice dell'indicatore non è incluso nel codice Expert. Per il normale funzionamento dell'Expert Advisor con una risorsa Indicatore, abbiamo bisogno di un file eseguibile dell'indicatore specificato nella risorsa.


Ripeto la mia domanda:

come pubblicare nel mercato quando c'è un Expert Advisor con un indicatore personalizzato, libreria, cioè più di un file è necessario per il normale funzionamento dell'Expert Advisor?

Quante volte ti è stato dato un link alla documentazione? Tua madre non ti lascia leggere?

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

Leggerlo finalmente...

 
Alexey Viktorov #:

Quante volte ti è stato dato un link alla documentazione? Tua madre non ti permette di leggerlo?

Leggerlo finalmente...

Alexey, grazie per aver sottolineato l'errore direttamente.

Ho letto la documentazione, ma era "fuori dalla mia vista".

Chiedo scusa a tutti - mi sono sbagliato.

Ora ce l'ho.

 

Puoi darmi un suggerimento?

Aggiunto il calcolo del conteggio delle barre(:RatesTotal(void)) alla classe, non riesco a capire come inserirlo correttamente nella struttura. Ho qualcosa del genere. Potete per favore dirmi come renderlo più colorato.

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

Ora è tutto risolto.

Non l'ho fatto, non lo sapevo. Nessun problema :)

 

Potete dirmi come organizzare un analogo del calcolo di prev_calculated, non riesco a capirlo.


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