嗨,和你分享写指标的一些经验。
当我们在写 MQL 指标的时候,有两个原则要把握在心里:
原则 1. 现在我多了这根 bar,我要得到这根 bar 的判断
原则 2. 为了得到这根 bar 的判断,所以我需要往回看一段 bar
原则 1 说明在 MQL 中,我们不能因为后面的判断去改前面的判断
你可能会觉得我在讲废话,但是在形态学中有时候就不适合写成指标
例如:在艾略特波理论中,对波的判断会依赖后续的价格成形
如果后续的价格呈现一个其他走势,会影响我们对前面波形的判断
原则 2 比较重要,原则 2 是 MQL 程式结构的特色
你在写 MQL 的时候,你不能只想交易逻辑,你脑海要有一种
从现在的 bar 往回拉一个区间,观看前面所有的资讯来判断当前 bar
假设价格在 MA(20) 上面已经经过 20 个 bar,你要往回看多长?
要往回看 20 个 bar ,因为你不知道前高(the last high)在哪里
前高可能在前面 20 个 bar 的第 5 个 bar:
https://imgur.com/GpZOQT9.png
所以, 你首先要决定的是, 要往回看多长
这也就是说,我们会先跑整个资料,但是到我们要看的长度
就停,然后开始计算这个 bar 的判断:
// 回顾区块
[ 预先区块 ]
for(int i=rates_total-1; i>=pos; i++)
{
[ 主区块 ]
}
在预先区块中,我们先判断现在这个时间是在 MA 上,还是 MA 下
如果现在是在 MA 上,那我们回顾到 MA 下就可以停了
// 预先区块
bool is_up_trend_now = false;
if(iClose[0] > MA[0])
{
is_up_trend_now = true;
}
如果现在是在 MA 上,is_up_trend_now 就会是 true
然后我们开始往回去看,只看我们要的趋势:
// 主区块
if(is_up_trend_now)
{
[上升关注区块]
}
else
{
[下降关注区块]
}
其中,上升关注区块 就是,如果现在在 MA 上,往回都还在 MA 上
我们就继续关注,但一但趋势改变,我们就停:
// 上升关注区块
if( iClose[i] > MA[i])
{
[前高更新区块]
}
else
{
break;
}
如果往回看,都还在上升趋势,我们就要记录前高(last_high)
所以我们需要放一个变量先设定在预先区块中
如果是下降趋势,就需要前低,什么叫“前”?就是相对现在
所以你的前高、前低,应该先以现在的高、现在的低当初始值去更新
// 预先区块
double last_high = iHigh[0];
double last_low = iLow[0];
bool is_up_trend_now = false;
...
然后编写前高更新区块:
if(iHigh[i] > last_high)
{
last_high = iHigh[i];
}
依此类推,在下降关注区块中,也会有前高更新区块:
if(iClose[i] < MA[i])
{
if(iLow[i] < last_low)
{
last_low = iLow[i];
}
}
else
{
break;
}
所以,整个回顾区块中运行结束,我们会知道:
1. 现在是上升趋势(与否)
2. 与此对应会有设定好的前高(或前低)
接着再进到对现在的 bar 的判断:
// 回顾区块
....
// 当前判断区块
if(is_up_trend_now)
{
// 现在开盘是否超过前高?
if(iOpen[0] > last_high)
{
// 画上箭头
}
}
else
{
// 下降趋势, 开盘是否低于前低?
if(iOpen[0] < last_low)
{
// 画下箭头
}
}
现在的重点不是我写的这些拉哩拉杂的 Code
我也没有很完整照 MQL 语法写
重点是你有没有学到我的思维方式,你有没有学到我前面的流程
缺定义?想定义,要用回顾N个Bar的想法想,而不是交易逻辑想
缺变量?往前到预先区块设定变量,设好初始值
大家都不应该逃避写完整 indicator
很多人不想碰 buffer,不想碰 OnCalculate 我能理解
但我觉得可以给自己一个机会,在 MQL 的预先架构下,磨练思维去贴合程式
会对于大家撰写 MT 交易程式有十足的帮助
进阶补充:
聪明的人可能会发现,我可能不用每次都回顾前面所有的价格资讯
只要有箭头资讯就能判断,这就更好了,但我倾向于每次都重拉价格算
避免状态变量、缓冲阵列(Buffer)的使用,除非有效率问题
效率问题会在什么时候发生?
回测优化的时候,因为指标默认每个 tick 都要算
但如果你只是练习,之后就直接写 EA,我觉得不要用 Buffer 会比较好
也就是说,不要使用到前面是否是箭头?还是没有箭头的 Array