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

 
Vitaly Muzichenko #:

同样,你需要在加载下一个副本时改变前缀吗?

你能用语言说明目的是什么吗?

按钮可以从你的窗口外创建和控制。


会是什么呢?

 
Igor Makanu #:

你能用语言说明目的是什么吗?

这些按钮也可以从你的窗口外创建和控制。


那会是什么?

我不知道,但它应该是这样的:在你的子窗口中创建,当你点击时,得到这个子窗口的编号。你不需要画任何东西,只需要一个按钮,当点击时,在Alert中显示关于子窗口号码的信息

 
Vitaly Muzichenko #:

我不知道,但这是一个方法:在你的子窗口中创建,当你点击它时,你会得到子窗口的编号。你不需要画任何东西,只需要一个按钮,当点击时,在Alert中显示关于子窗口号码的信息

对我的第一个来源进行了检查。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#include <Controls\Button.mqh>
CButton button;

//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   string short_name = MQLInfoString(MQL_PROGRAM_NAME) + "=Set (" + (string)MASlow + "/" + (string)MAFast + ")";
   IndicatorSetString(INDICATOR_SHORTNAME, short_name);

  // IndicatorSetString(INDICATOR_SHORTNAME, "IndicatorSetString() Demo");
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
   srand(GetTickCount());
   long c_id = ChartID();
   int c_wf = ChartWindowFind();
   Print(c_id, " / ", c_wf);
   button.Create(c_id, "button" + (string)rand(), c_wf, 10, 10, 100, 100);
   button.Text("Button");
//---
   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[])
{
   for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+


唉,一切都像你写的那样--如果你用默认参数运行这个指标的多个副本,按钮将只出现在子窗口的第一个指标上。

但如果你在启动过程中改变参数,一切都会好起来。


总的来说,情况并不清楚

 
Igor Makanu #:

我在我的第一个来源上检查了它。

唉,一切都像你写的那样--如果你用默认参数运行这个指标的几个副本,按钮将只出现在子窗口的第一个指标上

但如果你在启动过程中改变参数,一切都会好起来。

总的来说,情况并不清楚

因此,这里有一个问题:如何自动改变参数,而不进入设置?

到目前为止,没有任何效果......。

---

P.S. 理想情况下,但可惜的是

input long MASlow = TimeLocal(); //
 
Vitaly Muzichenko #:

到目前为止,它没有发挥作用 ...

而且它不会。

加在。

int OnInit()
{
   Print(__FUNCTION__);

我放了一个指标--我在日志中得到了OnInit,但是下一个指标已经沉默了,也就是说,只有一份指标真正在运行,而其他指标只是一个图形外壳

 
Igor Makanu #:

而这是不可能的。

加在。

我把指标--我在日志中得到了OnInit,但是下一个指标已经沉默了,也就是说,只有一份指标真正在运行,其他指标只是一个图形化的外壳

事情就是这样的。我想mt5的架构不对。mt4终端工作正常。

如果你决定在mt5中这样做,你将禁止以相同的输入参数运行指标副本,因为它似乎是存在但不存在。

 
Vitaly Muzichenko #:

事情就是这样的。mt5的架构一定是一团糟。在mt4中一切运作正常。

如果你决定在mt5中这样做,你应该禁止启动具有相同输入参数的指标副本,因为它似乎存在,但事实上它不存在。

指标的计算部分与图形部分不一样。因此,计算部分对他们都是一样的。有几个图形化的。

你就不能在一个指标中搜索所有的子窗口,并在标签中加上子窗口的编号吗?同时在计时器中抓取图表的子窗口数量:当增加时--添加到一个新的子窗口标签。但也要搜索什么指标放在里面--如果它是不同的,那么就不要加...

只是一个未经测试的想法。

ZS.我不同意 "曲率 "的说法。20个相同指标的一个计算部分要比20个相同指标的20个计算部分好。

 
Artyom Trishkin #:

一个指标的计算部分与图形部分不一样。因此,计算部分对他们都是一样的。有几个图形化的。

我们就不能在一个指标中寻找所有的子窗口,并在标签中加上子窗口的编号吗?同时在定时器中抓取图表的子窗口数量:增加--添加到一个新的子窗口标签。但也要搜索什么指标放在里面 - 如果不同,就不要添加...

只是一个未经测试的想法。

ZS.我不同意 "曲率 "的说法。20个相同指标的一个计算部分要比20个相同指标的20个计算部分好。

做了,对按钮没有反应--OnChartEvent拷贝没有触发,也不理解子窗口的编号。

总之,这里是不工作的地方,连同它的其余代码一起

关于交易、自动交易系统和策略测试的论坛

初学者的常见问题 MQL5 MT5 MetaTrader 5

Igor Makanu, 2021.09.12 21:53

你不知道。

添加到。

int OnInit()
{
   Print(__FUNCTION__);

我放了一个指标--我在日志中得到了OnInit,但是下一个指标已经沉默了,也就是说,只有一个指标的副本在实际运行,其他指标只是一个图形外壳


 
Vitaly Muzichenko #:

做了,对按钮没有反应--OnChartEvent拷贝不起作用,不理解子窗口的编号。

总之,这里是不工作的地方,与它一起的是其余的代码


但是!!!。如果我在 "Debug.tpl "的名字下制作一个包含2-3个这样的指标的模板,并开始调试指标,那么OnInit()就能正常工作。

一般来说,我做了这样一个实验。

我在OnInit()中把#property调到最大,希望在未创建指标时,能运行OnInit(),并根据窗口中的指标数量,为指标取一个短名称。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
//#property indicator_label1  "Label1"
//#property indicator_type1   DRAW_LINE
//#property indicator_color1  clrRed
//#property indicator_style1  STYLE_SOLID
//#property indicator_width1  2
//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//input string shortName = "1";  // Префикс…
long chart_id = ChartID();
string short_name = "";
/********************************************************************\
|           Custom indicator initialization function                 |
\********************************************************************/
int OnInit()
 {
//--- indicator buffers mapping
  long windows_total = ChartGetInteger(chart_id, CHART_WINDOWS_TOTAL);
  short_name = (string)windows_total;
  Print(short_name);
  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
  PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);
  PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID);
  PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2);
  PlotIndexSetString(0, PLOT_LABEL, "Label1");
  IndicatorSetString(INDICATOR_SHORTNAME, short_name);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

但这并没有帮助。

我开始了第一份副本

指标名称 2.........

我开始第二份拷贝--两个指标的指标名称仍然是2

我开始调试,我看到了什么?尚未加载的指标已经在打印了......读第二行和第三行......

怎么会这样呢?


进一步的调试在进入OnInit()时停止,windows_total变量包含垃圾,short_name仍然是一个空字符串......。

Hi.........,但都已经印好了......怎么会呢?

而short_name已经改变。

因此,在调试模式下全面加载指标后,指标的名称如下

也许我们应该提请开发人员注意这种错误...

 
朋友们好,也许我走错了地方,但我看到了名为 "来自初学者的问题MQL5 MT5 MetaTrader 5 "的部分。 所以我的问题是:我曾经从Market下载Demo EAs进行测试,现在无论我做了什么,MT5都无法下载Demo。 MT4没有问题,MT5没有,这是什么原因?