错误、漏洞、问题 - 页 2146

 
fxsaber:

OnCalculate - 不在此图表上运行。你已经创建了一个手柄,这就是它的位置。

如果不是在这个上--那么为什么在右边的子窗口中能正常地绘制(缓冲器绘制)?

 
A100:

在指标中。

::ChartWindowFind()返回-1(换句话说就是不工作)。


在指标被初始化之前,它不知道它所工作的子窗口的编号。只有在初始化成功后,它才会附着在窗口上。

换句话说,在指标OnInit中调用ChartWindowFind()是没用的。

 
Slava:
换句话说,在指标OnInit中调用ChartWindowFind()是没用的。

在指标OnInit中调用ChartWindowFind()(同一 指标)。

void OnStart()
{
        string name = "Test_i";
        int sub_window = 1;
        ChartIndicatorAdd( 0, sub_window, iCustom( NULL, PERIOD_CURRENT, name ));
}

结果:1:true:0
2:1:0

一切都检测得很好,让我提醒你一下指标OnInit 的代码

void OnInit()
{
//...
        ResetLastError();
        int sub_window = ChartWindowFind();
        Print( "2:", sub_window, ":", GetLastError());
}
 
A100:

如果不是这样--为什么它在所需的子窗口中能正常绘制(缓冲区绘制)?

因此,指标的计算 和它的绘图部分是不同的事情。ChartWindowFind是对负责绘制指标的机制的一个引用。也就是说,它甚至不是指标本身。

 
Slava:

在指标被初始化之前,它不知道它所操作的子窗口编号。它只有在初始化成功后才会附着在窗口上。

在OnInit之后调用ChartWindowFind()(来自OnCalculate)。

//Test.mq5//Скрипт
void OnStart()
{
        string name = "Test_i";
        ObjectCreate( 0, name, OBJ_CHART, 0, 0, 0 );
        long chart_id  = ObjectGetInteger( 0, name, OBJPROP_CHART_ID );
        int sub_window = 1;
        ChartIndicatorAdd( chart_id, sub_window, iCustom( NULL, PERIOD_CURRENT, name ));
}
//Test_i.mq5//Индикатор
void OnInit() { Print( __FUNCTION__, ":end" ); }
int OnCalculate( const int, const int, const int, const double& [] )
{
        Print( __FUNCTION__ );
        ResetLastError();
        int sub_window = ChartWindowFind();
        Print( "3:", sub_window, ":", GetLastError());
        return 0;
}

结果:OnInit。结束语:
OnCalculate
3:-1:4113

换句话说,指标已经知道它所操作的子窗口号码,但不报告它。
 
A100:

换句话说,指标已经知道它正在工作的窗口的编号,但不报告它。

它知道ChartID() 吗?

 
fxsaber:

它知道ChartID()吗?

不需要 -ChartWindowFind()函数 没有参数
 
A100:
不需要 -ChartWindowFind()函数 没有参数

只是很确定它也不知道ChartID()(没有参数)。

 
fxsaber:

我很确定它也不知道ChartID()(没有参数)。

这是一个明显的缺陷,特别是在以下情况下会出现无法操作的情况:如果

        ObjectCreate( 0, name, OBJ_CHART, 0, 0, 0 );
        long chart_id = ObjectGetInteger( 0, name, OBJPROP_CHART_ID );

但如果

        long chart_id = ChartOpen( NULL, PERIOD_CURRENT );

例如,如果我手动添加一个图表窗口,并将指标附加到该窗口,一切都很正常。

但是,如果我自动进行,它就不起作用了。

这有悖于自动交易的概念。

 
A100:

这是一个明显的缺陷,尤其是在以下情况下,它不仅无法使用

但如果

例如,如果我手动添加一个图表窗口,并将指标附加到该窗口,一切正常。

但是,如果我自动进行,它就不起作用了。

这有悖于自动交易的概念。

指标的架构变得更加清晰,这是好事。奇怪的是,文件中关于它的信息很少。

指标的计算部分和绘图部分是不同的实体。手柄是计算部分。计算的人对绘图的人一无所知,也不应该知道。

想象一下,你已经创建了一个手柄,但你把它放在不是一个,而是两个图表上。很明显,有一个指标,但它被画在两个图表上,有不同的ChartID和SubWindow。手柄指标并不关心这一点,因为它不知道这个指标是在哪里绘制的,也不知道它是否被绘制。这不是负责渲染的指标。

当你手动将指标放置在图表上或通过模板,会发生相当不同的动作。手柄是与绘图部分一起创建的。如果你在另一个具有相同符号和周期的图表上以相同的输入参数手动启动该指标,将创建另一个带有绘图部分的句柄。

而MQL则不是这样。如果你创建了一个指标,然后又创建了另一个,那么就不会再创建什么了。计算部分没有被触及。

在MQL中运行指标的唯一方法是LoadTemplate,与你在例如新图表或OBJ_CHART 上手工运行的方法相同。