非常巧合的机会,今年的7月份在Steemit上看到前辈们讨论外汇交易的EA编程,非常感兴趣很希望学习,立马去京东上去查相关的书籍,发现完全没有这个领域的知识。迷茫的搜了一个下午,发现只有MQL5的论坛能够学习,但是看着整个网站蹩脚翻译来的中文,对于大学之后就再也没有接触编程的自己简直只能用痛苦的爬行来形容。
我是学习缠论的,一直非常希望用软件把缠论的理论体系在交易中表达出来,缠论有着严格的数学定义,其分形与递归的概念简直就是程序化交易的基石,所以即便是痛苦,但看着前人已经做出来的案例,我确信缠论是一定能在MQL5上实现的。
可能我是很幸运的,无意中我发现了一个俄罗斯人写的指标,这个指标与缠论的顶与底的概念基本吻合,可能我可以根据它来改编出我想要的指标。(这个俄罗斯人的指标链接:https://www.mql5.com/zh/code/18088,见下图。)
MQL5中的指标与所有交易图形中的指标是完全类似的,EA自动化交易的逻辑简单说来就是:
1.指标输出交易信号
2.EA程序根据指标的信号调用操作类完成交易。
这个俄罗斯人的指标其实非常粗糙,至少对于我这种学缠论的人来说,这个指标经常出现连续的顶或底,这种标注的实用价值非常低,但是简单的加入一些条件判定后,缠论的顶与底出现了,见下图
缠论的顶与底之间便是一笔,简单明了的实现了笔让我欣喜万分,所以我顺便就将顶底之间的连线在程序中自动画了上去。
下面我们分析一下MQL5指标的结构是怎样的,在实际编程中,每一个部分的作用都必须要充分了解。
//+------------------------------------------------------------------+
//| 第一部分:用来为指标申明各种信息,例如版权信息、指标出现的位
//|置、需要多少数量与种类的线或者图案。
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| 第二部分:指标中全局变量的申明或者初始化的函数。
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 第三部分:每一次价格跳动都会执行的函数。
//+------------------------------------------------------------------+
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[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
如果按照以上的结构去看俄罗斯人的那个指标,会发现几乎前两个部分都不用太修改,只用在第三部分做一些文章,在第三个部分,俄罗斯人用了一个函数:
double GetFreeUpperFractal
(const int Rates_Total,const double &High[],
int shift,int left_dimension=2,int right_dimension=2)
//Rates_Total:图表所显示K线总数。
//High[]:K线的最高价。
//shift:K线的标号。 left_dimension:最高的K线左边的K线数量。
//right_dimension:最高点K线右边的K线数量。
{
//---
if(left_dimension<1) left_dimension=1;
if(right_dimension<1) right_dimension=1;
if(shift-right_dimension<1 || shift+left_dimension>Rates_Total-1) return(-1);
if(TypeFractals==TYPE_FRACTAL_ACCURATE) //TYPE_FRACTAL_ACCURATE值为TRUE时,shift号K线左右两边的K线
//最高价格依次降低。
{
for(int iii=shift-1; iii>=shift-right_dimension; iii--)
//shift号K线的右侧K线最高价依次下降
if(High[iii]>High[iii+1]) return(-1);
//若出现右侧K线最高价高于shiftK线最高价时,函数出错跳出。
for(int iii=shift+1; iii<=shift+left_dimension; iii++)
//shift号K线的左侧K线最高价依次下降
if(High[iii]>High[iii-1]) return(-1);
//若出现左侧K线最高价高于shiftK线最高价时,函数出错跳出。
}
else
{
for(int iii=shift-1; iii>=shift-right_dimension; iii--)
if(High[iii]>High[shift]) return(-1);
for(int iii=shift+1; iii<=shift+left_dimension; iii++)
if(High[iii]>High[shift]) return(-1);
}
//---
return(High[shift]);
}
不知注释的是否清晰,如果有什么问题可以在评论里讨论。
那么缠论的顶与底是否能够直接用到上面的函数呢?
当然,但是缠论对于笔有一个限制:顶与底交替出现,顶与底之间的连线为笔。
那么出现了两个问题,如何控制笔与顶依次出现,且一顶与一底之间是否需要有一个条件控制K线数量。
明天我们继续介绍缠论的笔如何通过上两个条件来实现。
后面我们会逐步实现中枢,并且通过中枢实现第三类买卖点,最后会讲到背驰,下图是5分钟中枢的一个案例,好了明天见。
good post... follow me and upvote my post
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit