文章 "ZigZag(之字折线)的力量(第一部分)。 开发指标基类" - 页 7

 
Sergey Voytsekhovsky:

下载新存档,尝试编译 TestZZ_03.mq5

结果还是一样。出错,两次引用同一个函数,但参数不同。

显示CZigZagModule::GetZigZagData() 方法的代码,其中应传递缓冲区编号。

 
TestZZZ_03 和 TestZZZ_04 没有出现在加载的 EA 中,因此 TestZZ_04 也没有被编译。
 
Anatoli Kazharski:

显示CZigZagModule::GetZigZagData() 方法的代码,其中需要传递缓冲区编号。

void CZigZagModule::GetZigZagData(const double &zz_h[],const double &zz_l[],const datetime &time[])

{

int h_total =::ArraySize(zz_h);

int l_total =::ArraySize(zz_l);

int total =h_total+l_total;

//--- ZZ 变量归零

ZeroZigZagData();

//--- 让我们循环遍历复制的 ZZ 值

for(int i=0; i<total; i++)

{

//--- 如果我们已经获得了所需数量的 ZZ 最大值和最小值,则退出循环

if(m_counter_highs==m_copy_extremums && m_counter_lows==m_copy_extremums)

break;

//--- 控制数组 超限

if(i>=h_total || i>=l_total)

break;

//-- 填充最大值数组,直到复制到所需的数量

if(zz_h[i]>0 && m_counter_highs<m_copy_extremums)

{

m_zz_high[m_counter_highs] =zz_h[i];

m_zz_high_bar[m_counter_highs] =i;

m_zz_high_time[m_counter_highs] =time[i];

//-- 增加高点计数器

m_counter_highs++;

}

//-- 填充最小值数组,直到我们复制了所需的最小值个数

if(zz_l[i]>0 && m_counter_lows<m_copy_extremums)

{

m_zz_low[m_counter_lows] =zz_l[i];

m_zz_low_bar[m_counter_lows] =i;

m_zz_low_time[m_counter_lows] =time[i];

//--- 增加最小值计数

m_counter_lows++;

}

}


 
Sergey Voytsekhovsky:
TestZZ_03 和 TestZZ_04 没有出现在上传的智能交易系统中,因此 TestZZ_04 也没有编译。

那就试着找出它们不出现的原因。我再次查看了存档。所有测试都在这里。

 
Anatoli Kazharski:

显示需要传递缓冲区编号的CZigZagModule::GetZigZagData() 方法的代码。

void CZigZagModule::GetZigZagData(const int handle,int buffer_num_highs,int buffer_num_lows、

const string symbol,const ENUM_TIMEFRAMESperiod

const datetime start_time,const datetime stop_time)

{

//--- 获取初始数据

int times_total =::CopyTime(symbol,period,start_time,stop_time,m_zz_time_temp);

int highs_total =::CopyBuffer(handle,2,0,times_total,m_zz_highs_temp);

int lows_total =::CopyBuffer(handle,3,0,times_total,m_zz_lows_temp);

//--- 极值的最大数量

int max_items =(int)::fmax((double)highs_total,(double)lows_total);

//--- 如果还不够,再试一次

if(times_total<max_items)

{

while(true)

{

::Sleep(100);

times_total=::CopyTime(symbol,period,start_time,stop_time,m_zz_time_temp);

if(times_total>=max_items)

break;

}

}

//--- 计数器

int lows_counter =0;

int highs_counter =0;

//--- 计数高点

int h_total=::ArraySize(m_zz_highs_temp);

for(int i=0; i<h_total; i++)

{

if(m_zz_highs_temp[i]>0)

highs_counter++;

}

//--- 计算最小值

int l_total=::ArraySize(m_zz_lows_temp);

for(int i=0; i<l_total; i++)

{

if(m_zz_lows_temp[i]>0)

lows_counter++;

}

//--- 获取极值个数

int copy_extremums=(int)::fmin((double)highs_counter,(double)lows_counter);

CopyExtremums(copy_extremums);

//--- 让我们循环查看复制的 ZZ 值

GetZigZagData(m_zz_highs_temp,m_zz_lows_temp,m_zz_time_temp);

}

 
Sergey Voytsekhovsky:

...

正确插入代码

//---

这是错误的方法。这是有参数列表的方法:

//+------------------------------------------------------------------+
//|| 从传递的句柄中获取 ZZ 数据
//+------------------------------------------------------------------+
void CZigZagModule::GetZigZagData(const int handle,int buffer_num_highs,int buffer_num_lows,
                                  const string symbol,const ENUM_TIMEFRAMES period,
                                  const datetime start_time,const datetime stop_time)
 

这两种方法都写在一个内联文件中。

第一页 217.

第二页 258

 
Sergey Voytsekhovsky:

...

你没有替换文件。全部删除。然后从最后一个压缩包重新下载:https://www.mql5.com/ru/forum/299970/page6#comment_10495849

Обсуждение статьи "ZigZag всему голова (Часть I). Разработка базового класса индикатора"
Обсуждение статьи "ZigZag всему голова (Часть I). Разработка базового класса индикатора"
  • 2019.02.03
  • www.mql5.com
Опубликована статья ZigZag всему голова (Часть I). Разработка базового класса индикатора: Автор: Anatoli Kazharski...
 
.... 还是我删得太多了?
 
如果我从电脑上删除 MT5 并安装新的 MT5,我需要下载什么?旧存档和新存档?还是只下载一个新的?我对存档完全不明白。旧的存档有 1 和 2 选项,但不正确。新的什么也没放,应该能正常工作,但显然不够。请原谅我不懂文件,但我找不到 MT5 中哪些文件负责什么的正常解释或说明。