错误、漏洞、问题 - 页 2997

 
Alexey Viktorov:

也许是滑雪板坏了?


然后是RTS-6.21。


这是另一回事。你有什么经纪人,MT5是什么版本。

 
Alexey Viktorov:

也许是滑雪板坏了?


还有RTS-6.21。


谢谢你的帮助。弄明白了。从不同的文件夹连接了不同版本的指标。

 
Francuz:

是的,我做到了。结果并没有改变。

我不相信。
,再试试。

datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   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[])
{

   if(prev_calculated>0 && handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}
 
Nikolai Semko:

我不相信。
,再试试。

我想明白了。问题是,来自不同文件夹的两个不同的ATR文件被连接起来。这就是为什么出现了价值差异。

谢谢你的帮助。
 
Nikolai Semko:

我不相信。
,再试试。

尼古拉,他有一个不同的问题。我也没有立即理解这个问题,以为我需要从不同的TF中获取价值。润滑了滑雪板,一切都很顺利。
 
Alexey Viktorov:
尼古拉,他有一个不同的问题。我一开始也不明白这个问题,我以为我需要从另一个TF中获取数值。我给滑雪板上了油,一切都很顺利。

奇怪,我什么都不明白。
我完全按照他的描述 在我的问题中重现了他的问题。
它的发生正是因为CopyBuffer的唯一执行发生在OnCalculate的第一次运行中,当时prev_calculated == 0,而且不保证条形已经生成。
解决办法是忽略这第一次运行,只在prev_calculated>0时运行唯一的CopyBuffer。
我不明白"来自不同文件夹的两个不同ATR文件"。

 
Nikolai Semko:

奇怪,我什么都不明白。
我完全按照他的描述 在我的问题中重现了他的问题。
它的发生正是因为CopyBuffer的唯一执行发生在OnCalculate的第一次运行中,当时prev_calculated == 0,而且不保证条形已经生成。
解决办法是忽略这第一个调用,只在prev_calculated>0时执行单个CopyBuffer。
为什么会有"两个来自不同文件夹的不同ATR文件"--我不明白。

那么,如果打开图表并创建了当前TF的指标,那么当图表被打开时,数据应该已经准备好了。不是吗?

 
Alexey Viktorov:

那么,如果打开一个图表,并为当前的TF创建一个指标,当图表打开时,数据应该已经准备好了。不是吗?

哦,有多少美妙的发现在等着我们......。更多

 
Alexey Viktorov:

好吧,如果一个图表被打开,并且为当前的TF创建了一个指标,那么当图表被打开时,数据应该已经准备好了。不是吗?

我没有正确表达。酒吧是的--很可能他们已经准备好了。但不能保证在第一次调用OnCalculate时,当prev_calculated == 0时,指标已经对所有这些条形图进行了重新计算。
你可以运行这样的指标来确定。
但必须在交易报价时进行。如果市场关闭,你不会看到不匹配的情况。
因此,最好在周末时在加密货币上进行尝试,因为加密货币正在运动中。
如果Buffer数组的大小=-1,这意味着指标缓冲区还没有重新计算,BS值将不正确。

   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   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[])
{

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      int total_bars = iBars(NULL,PERIOD_CURRENT);
      int size = CopyBuffer(handle, 0, 0, total_bars, Buffer);
      Print("Total Bars = " + string(total_bars) + ", Size of Buffer array = " + string(size));
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


如果你在下一次调用OnCalculate(当prev_calculated>0时)时做,就不会有这样的问题。

SOM,代码中有一个错误--已经修正。

 
Artyom Trishkin:

哦,我们将有多么奇妙的发现......更多

我是指计算指标的数据。不要讽刺))))