初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1362

 
而且你不能把这两个文件分开放在市场上。这就是政策。
 
Aleksei Stepanenko #:

这里有一个指标。

这里是专家。

这里是所有东西都在一个文件中。

四是真的,但五也是真的。

你只编译了专家文件。

尝试填充指标,至少要有一个简单的图形对象,这样才能被专家顾问调用。然后,在编译后,重命名或删除Res_Ind.ex4,就像你只向市场发送专家顾问文件一样。客户将收到一份非功能性的方案。

 
Aleksei Stepanenko #:
而且你不能把这两个文件分开放在市场上。这就是政策。
这就是它的意义所在......
 
Dmitriy VC #:

你只编译了专家文件。

尝试用至少简单的图形对象来填充指标,这样它就能被专家顾问调用。然后在编译后,重命名或删除Res_Ind.ex4,就像你只向市场发送了专家文件一样。客户将得到一个不工作的程序。

你不能这么固执......它说,由资源连接的指标包含在专家顾问的可执行文件中,所以它是。

但是,你的指标绘制了图形对象,而EA必须读取它们,这是一个大问题。图形对象只有在用可视化进行测试时才能使用,而自动监测器在没有它的情况下进行测试,所以它看不到对象的属性...

 
Alexey Viktorov #:

据说由资源连接的指标包含在EA的可执行文件中,所以是这样。

在一个单独的窗口中显示指标

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

编译指标 --> win.ex5.

资源中具有指标的专家

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

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

编译专家顾问 --> exp.ex5.

运行专家顾问,图表上有一个指标窗口。

在市场上发布一个专家顾问exp.ex5的文件(实际上是删除指标文件win.ex5)。

启动专家顾问,图表中没有指标窗口。

恢复被删除的文件win.ex5。

恢复专家顾问 图表上有指标窗口。


结论:指标代码不包括在专家代码中。对于带有资源指标的专家顾问的正常操作,我们需要资源中指定的指标的可执行文件。


我重复我的问题。

当专家有自定义指标和库时,如何在市场上发布,也就是说,专家的正常工作需要一个以上的文件?

附加的文件:
win.mq5  2 kb
exp.mq5  4 kb
 
Dmitriy VC #:

在一个单独的窗口中显示指标

编译指标 --> win.ex5.

资源中具有该指标的专家

编译专家 --> exp.ex5

运行专家顾问,图表上有一个指标窗口。

在市场上发布一个专家顾问exp.ex5的文件(实际上是删除指标文件win.ex5)。

启动专家顾问,图表中没有指标窗口。

恢复被删除的文件win.ex5。

恢复专家顾问 图表上有指标窗口。


结论:指标代码不包括在专家代码中。对于带有资源指标的专家顾问的正常操作,我们需要资源中指定的指标的可执行文件。


我重复我的问题。

当有一个带有自定义指标、库的专家顾问时,如何在市场上发布,即专家顾问的正常运行需要一个以上的文件?

有多少次给了你一个文件的链接?你妈妈不让你读?

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

终于读到了...

 
Alexey Viktorov #:

有多少次给了你一个文件的链接?你妈妈不让你读?

终于读到了...

阿列克谢,感谢你直接指出了这个错误。

我读了文件,但它 "不在我的视线之内"。

我向大家道歉--我错了。

我现在明白了。

 

你能给我一个提示吗?

在类中增加了条形计数(:RatesTotal(void))的计算,不知道如何正确融入结构。得到了这样的东西。能否请您告诉我如何使其更加丰富多彩。

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

现在都整理好了。

我没有,我不知道。完全没有问题 :)

 

你能告诉我如何组织计算prev_calculated的类似物吗,我想不出来了。


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