如何在 Buffer[] 中累积和保留记录 - 在 MQL4 自定义指标中?
How to accumulate and retain records in Buffer[] - in a MQL4 Custom Indicator?
我正在制作一个自定义指标,显示某种货币收盘价的变化。
for ( i = limit; i >= 0; i-- ) {
totaleur = 0;
for ( x = i; x < i + 1; x++ ) {
totaleur = ( ( iClose( "EURUSD", 0, x )
- iClose( "EURUSD", 0, x - 1 )
)
/ iClose( "EURUSD", 0, x - 1 )
);
}
ExtMapBuffer1[i] = totaleur;
return(0);
}
在这种情况下,指标仅显示每次观察的价格变化。
有什么想法可以让它显示观察值和所有先前观察值的变化吗?
如果您需要 N 个先前观察结果的总和 - 您需要这样的东西:
for(i=limit; i>=0; i--) {
double totaleur = 0;
for(x=i; x<i+N; x++) {
totaleur += ((iClose("EURUSD", 0, x)- iClose("EURUSD", 0, x-1))/iClose("EURUSD", 0, x-1));
}
ExtMapBuffer1[i]=totaleur;
}
当您有 return(0);
内部循环时 - 指标将停在那里并且不会 运行 使用下一个参数进行循环 - 所以要小心
实现目标有几个要点:
1:第一轮不要过早逃跑,via return(0)
将命令 return(0);
移出 code-execution 块 {...}
从 forward-stepping ( i
减少 ) for( i = limit ;...; i--){...}
code-execution 块会让指针在 (i)
中向前移动,
因为自定义指标使用渐进的、不连续的、per-partes 增量(及时)、评估(参考 MQL4 自定义指标文档 iCustom(...)
调用接口参数)
2:决定 inner-loop(分数之和) 是否正确编码
提议的表达式提供了
N
、per-Bar 相对差异的总和,
不是
N
absolute-differences 的总和除以 N
柱的净价格变化。
虽然这可能有效,但关键是,预期的模型是否正确地求和相对差异(不同的、可变的个体基础的百分比变化),或者绝对差异的总和是否应该只在最后循环的除以一个,常见的,基数——第一个和最后一个点之间的净价差(在 N
-bars 基数上),当噪声信号受制于时,这通常是一种量化建模实践一些廉价的平滑技术。
3:更正访问 TimeSeries 向量时出现的问题 (负索引)
鉴于外部 for ( i = limit; i >= 0; i-- )
循环允许 i
变为零,
鉴于内部 for ( x = i; ... )
因此允许 x == 0
,
x - 1 < 0
成为问题,
其中
指令iClose( _Symbol, PERIOD_CURRENT, x - 1 )
请求访问一个值,该值尚不存在(在 TimeSeries 向量中具有负索引)。
for ( i = limit; // SET:_______________________ START at BAR[i == limit]
i >= 0; // PRE: PRE-CONDITION i >= 0
i-- // UPD: POST-UPDATE i-- STEP FORWARD IN TIME
) { // ___________________________________________________________
totaleur = 0; // ZEROISED
for ( x = i; // SET:_________________ START at BAR[x = (i)]
x < i + 1; // PRE: PRE-CONDITION x < (i)+1
x++ // UPD: POST-UPDATE x++ +1 STEP ( ONCE )
) { // _____________________________________________________
totaleur = ( ( iClose( "EURUSD", 0, x )
- iClose( "EURUSD", 0, x - 1 )
)
/ iClose( "EURUSD", 0, x - 1 )
);
} // LOOP KEPT STORING ANY INTERIM VALUE FOR EACH x INTO THE SAME <var>
ExtMapBuffer1[i] = totaleur;
return(0); //___________________________________DO NOT PREMATURELY RET/EXIT RIGHT FROM THE 1st LOOP
}
您可能已经注意到,代码只允许在内部 for(){...}
中进行一个循环
我正在制作一个自定义指标,显示某种货币收盘价的变化。
for ( i = limit; i >= 0; i-- ) {
totaleur = 0;
for ( x = i; x < i + 1; x++ ) {
totaleur = ( ( iClose( "EURUSD", 0, x )
- iClose( "EURUSD", 0, x - 1 )
)
/ iClose( "EURUSD", 0, x - 1 )
);
}
ExtMapBuffer1[i] = totaleur;
return(0);
}
在这种情况下,指标仅显示每次观察的价格变化。
有什么想法可以让它显示观察值和所有先前观察值的变化吗?
如果您需要 N 个先前观察结果的总和 - 您需要这样的东西:
for(i=limit; i>=0; i--) {
double totaleur = 0;
for(x=i; x<i+N; x++) {
totaleur += ((iClose("EURUSD", 0, x)- iClose("EURUSD", 0, x-1))/iClose("EURUSD", 0, x-1));
}
ExtMapBuffer1[i]=totaleur;
}
当您有 return(0);
内部循环时 - 指标将停在那里并且不会 运行 使用下一个参数进行循环 - 所以要小心
实现目标有几个要点:
1:第一轮不要过早逃跑,via return(0)
将命令 return(0);
移出 code-execution 块 {...}
从 forward-stepping ( i
减少 ) for( i = limit ;...; i--){...}
code-execution 块会让指针在 (i)
中向前移动,
因为自定义指标使用渐进的、不连续的、per-partes 增量(及时)、评估(参考 MQL4 自定义指标文档 iCustom(...)
调用接口参数)
2:决定 inner-loop(分数之和) 是否正确编码
提议的表达式提供了N
、per-Bar 相对差异的总和,
不是
N
absolute-differences 的总和除以 N
柱的净价格变化。
虽然这可能有效,但关键是,预期的模型是否正确地求和相对差异(不同的、可变的个体基础的百分比变化),或者绝对差异的总和是否应该只在最后循环的除以一个,常见的,基数——第一个和最后一个点之间的净价差(在 N
-bars 基数上),当噪声信号受制于时,这通常是一种量化建模实践一些廉价的平滑技术。
3:更正访问 TimeSeries 向量时出现的问题 (负索引)
鉴于外部 for ( i = limit; i >= 0; i-- )
循环允许 i
变为零,
鉴于内部 for ( x = i; ... )
因此允许 x == 0
,
x - 1 < 0
成为问题,
其中
指令iClose( _Symbol, PERIOD_CURRENT, x - 1 )
请求访问一个值,该值尚不存在(在 TimeSeries 向量中具有负索引)。
for ( i = limit; // SET:_______________________ START at BAR[i == limit]
i >= 0; // PRE: PRE-CONDITION i >= 0
i-- // UPD: POST-UPDATE i-- STEP FORWARD IN TIME
) { // ___________________________________________________________
totaleur = 0; // ZEROISED
for ( x = i; // SET:_________________ START at BAR[x = (i)]
x < i + 1; // PRE: PRE-CONDITION x < (i)+1
x++ // UPD: POST-UPDATE x++ +1 STEP ( ONCE )
) { // _____________________________________________________
totaleur = ( ( iClose( "EURUSD", 0, x )
- iClose( "EURUSD", 0, x - 1 )
)
/ iClose( "EURUSD", 0, x - 1 )
);
} // LOOP KEPT STORING ANY INTERIM VALUE FOR EACH x INTO THE SAME <var>
ExtMapBuffer1[i] = totaleur;
return(0); //___________________________________DO NOT PREMATURELY RET/EXIT RIGHT FROM THE 1st LOOP
}
您可能已经注意到,代码只允许在内部 for(){...}