Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1362

 
Und Sie können die beiden Dateien nicht getrennt auf den Markt bringen. Das ist die Politik.
 
Aleksei Stepanenko #:

Hier ist der Indikator:

Hier ist der Experte:

Hier ist alles in einer Datei:

Vier ist wahr, aber fünf auch.

Sie haben nur die Datei Expert kompiliert.

Versuchen Sie, den Indikator zumindest mit einem einfachen grafischen Objekt zu füllen, damit er vom Expert Advisor aufgerufen wird. Benennen Sie dann nach der Kompilierung die Datei Res_Ind.ex4 um oder löschen Sie sie, als ob Sie nur die Expert Advisor-Datei an den Markt gesendet hätten. Der Kunde erhält ein nicht-funktionales Programm.

 
Aleksei Stepanenko #:
Und Sie können die beiden Dateien nicht getrennt auf den Markt bringen. Das ist die Politik.
Das ist es, worum es geht...
 
Dmitriy VC #:

Sie haben nur die Expert-Datei kompiliert.

Versuchen Sie, den Indikator mit mindestens einem einfachen grafischen Objekt zu füllen, so dass er von Expert Advisor aufgerufen wird. Benennen Sie dann nach der Kompilierung die Datei Res_Ind.ex4 um oder löschen Sie sie, als ob Sie nur die Datei Expert an den Markt geschickt hätten. Der Kunde erhält ein nicht funktionierendes Programm.

Sie können nicht so stur sein ... Es sagt, dass der Indikator durch die Ressource verbunden ist in der ausführbaren Datei des Expert Advisor enthalten, so ist es.

Aber die Tatsache, dass Ihr Indikator grafische Objekte zeichnet und EA diese lesen muss, ist ein großes Problem. Grafische Objekte sind nur verfügbar, wenn mit Visualisierung getestet wird, und der Autovalidator testet ohne Visualisierung, so dass er die Eigenschaften der Objekte nicht sieht...

 
Alexey Viktorov #:

Es wird gesagt, dass der Indikator, der mit der Ressource verbunden ist, in der ausführbaren Datei des EA enthalten ist, also ist er es.

Indikator in einem separaten Fenster

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

Indikator kompilieren --> win.ex5.

Experte für den Indikator in der 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()
  {
//---

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

Kompilieren Sie den Expert Advisor --> exp.ex5.

Führen Sie den Expert Advisor aus, es erscheint ein Indikatorfenster auf dem Chart.

Veröffentlichen Sie eine Datei des Expert Advisors exp.ex5 auf dem Markt (löschen Sie die Indikator-Datei win.ex5)

Starten Sie den Expert Advisor, es gibt kein Indikatorfenster im Chart.

Stellen Sie die gelöschte Datei win.ex5 wieder her.

Stellen Sie den Expert Advisor wieder her, es gibt ein Indikatorfenster im Chart.


Fazit: Der Code des Indikators ist nicht im Expertencode enthalten. Für den normalen Betrieb des Expert Advisors mit einem Ressourcenindikator benötigen wir eine ausführbare Datei des in der Ressource angegebenen Indikators.


Ich wiederhole meine Frage:

Wie kann man auf dem Markt veröffentlichen, wenn es einen Experten mit einem benutzerdefinierten Indikator und einer Bibliothek gibt, d.h. mehr als eine Datei wird für die normale Arbeit des Experten benötigt?

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

Indikator in einem separaten Fenster

Indikator kompilieren --> win.ex5.

Experte mit diesem Indikator in der Ressource

Kompilieren Sie den Experten --> exp.ex5.

Führen Sie den Expert Advisor aus, es erscheint ein Indikatorfenster auf dem Chart.

Veröffentlichen Sie eine Datei des Expert Advisors exp.ex5 auf dem Markt (löschen Sie die Indikator-Datei win.ex5)

Starten Sie den Expert Advisor, es gibt kein Indikatorfenster im Chart.

Stellen Sie die gelöschte Datei win.ex5 wieder her.

Stellen Sie den Expert Advisor wieder her, es gibt ein Indikatorfenster im Chart.


Fazit: Der Code des Indikators ist nicht im Expertencode enthalten. Für den normalen Betrieb des Expert Advisors mit einem Ressourcenindikator benötigen wir eine ausführbare Datei des in der Ressource angegebenen Indikators.


Ich wiederhole meine Frage:

Wie kann man auf dem Markt veröffentlichen, wenn es einen Expert Advisor mit einem benutzerdefinierten Indikator oder einer Bibliothek gibt, d.h. mehr als eine Datei wird für den normalen Betrieb des Expert Advisors benötigt?

Wie oft hat man Ihnen schon einen Link zur Dokumentation gegeben? Deine Mutter lässt dich das Buch nicht lesen?

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

Lesen Sie es endlich...

 
Alexey Viktorov #:

Wie oft hat man Ihnen schon einen Link zur Dokumentation gegeben? Deine Mutter lässt dich das Buch nicht lesen?

Lesen Sie es endlich...

Alexey, danke, dass du mich direkt auf den Fehler hingewiesen hast.

Ich habe die Dokumentation gelesen, aber sie war "außer Sichtweite".

Ich entschuldige mich bei allen - ich habe mich geirrt.

Jetzt habe ich es.

 

Können Sie mir bitte einen Tipp geben.

Berechnung der Balkenanzahl(:RatesTotal(void)) zur Klasse hinzugefügt, kann nicht herausfinden, wie man sie korrekt in die Struktur einfügt. Ich habe etwas Ähnliches. Können Sie mir bitte sagen, wie ich es bunter machen kann?

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

Es ist jetzt alles geregelt.

Ich wusste es nicht, ich wusste es nicht. Überhaupt kein Problem :)

 

Können Sie mir sagen, wie man eine analoge Berechnung von prev_calculated organisiert, ich kann es nicht herausfinden.


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
  }
Grund der Beschwerde: