基于前面所述的两个基本规则,我准备着手寻找适应这个两大规则的交易方法。
一旦开始关注交易方法,两个最常被提及的方法就立刻跃入眼帘,马丁格尔加注法和网格交易法。作为初学者,当然马丁格尔加注法最容易理解,而且马丁格尔加注法也完全符合汇市两大基本原则:一、没规律,任何时候做多或做空都可能有错。马丁格尔的操作手法是无论什么情况,只有赢和损两种结果,每一轮操作理论上仅仅与前次的结果相关,无非按照X*2^N倍数加仓。二、有趋势,对于每一轮下单只要按照趋势下,如果入场时机和止盈点选择合理,那么胜率是大于50%的,所以在汇市操作要比在赌场赌大小更可靠。
所以,我决定按照马丁格尔加注法作为我交易策略的基础。当然,我清楚的知道,实际操作远没有一个公式那么简单,如果真的存在这么一个万能公式或者是万能策略,那么这个外汇市场也就不存在了。
其实在写这篇笔记的时候,我已经着手做了几套基于马丁格尔加注法的程序,并进行了测试,测试结果当然是与预期有很大不同。我逐渐发现排查了一些初级错误,但是单凭我这样一个外汇新手的能力想要解决所有的问题几乎是不可能的。
所以我决定把这份笔记同时当做一份EA编写的教程,我会一边完善自己的设计,一边排查错误,一边把EA从最初级最简单的版本到最终相对完整的源码公开,尽量详细的为EA做出注释,并进行必要的讲解。
也就是说,我现在想要做的是一套开源的EA,为大家所用,并且可以让大家可以共同参与完善,最终形成一套比较成熟同时还可以不断变化适应市场的自动化交易系统。
今天,我从0开始,完成一个最最简单EA,并且尽量逐句注释和讲解。以备后用。
下面是第一个EA,名称:VNMTEA,版本号:0.01,功能描述:按指令下单。
Mt4平台EA的**方法:在EA交易上右键,选择第三项创建;
按照提示均默认选择,取好名字VNMTEA_0.01,最后你会得到如下的EA代码:
//+------------------------------------------------------------------+
//| VNMTEA_0.01.mq4 |
//| Copyright 2015, MetaQuotes Software Corp. |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link ""
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
//VN注: 初始化函数,在调用EA的时候执行,很多情况都会被视为重新调用,
//比如更换不同时间窗的视图
int OnInit
{
//--- create timer
//VN注: 定时器时间开启,参数为秒,即每个60秒执行一次OnTimer这个函数
EventSetTimer;
//---
return;
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
//VN注: 程序结束时调用
void OnDeinit
{
//--- destroy timer
//停止并销毁定时器事件。
EventKillTimer;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
//VN注: 行情每出现一个新的报价就会调用一次这个函数,对于实时**监测非常
//重要,比定时器事件更及时
void OnTick
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
//VN注: 定时器时间调用的函数,简单说就是每隔N秒运行一次。
void OnTimer
{
//---
}
//+------------------------------------------------------------------+
//| Tester function |
//+------------------------------------------------------------------+
//VN注: 这个函数是专为EA测试所用的,每次测试完成后会调用,可以在这输出
//一些测试结果。
double OnTester
{
//---
double ret=0.0;
//---
//---
return;
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
//VN注: 图标上面点鼠标、键盘等等动作触发的事件
void OnChartEvent
{
//---
}
//+------------------------------------------------------------------+
当然您看到的代码会与我的不同,我添加了中文注释,对每个函数进行了说明。运行这个EA是什么都不会做的。
现在我们给她增加一些功能,让她可以自动下一个订单,我们用对话框来控制是否执行订单,并且使用两个外部的参数来告诉她下单类型和下单量。
今后我的EA为了更加方便阅读使用,会遵循以下编码风格:能用中文的地方就不用英文和代号。鉴于目前MT4平台的支持,自定义的变量、函数名我都会使用中文命名,但因为多年的开发习惯,我会在中文变量名前加个英文字母前缀表明她的数据类型:i为整形,d为双精度,f为浮点型,str是字符串...
下面是带下单功能的程序源码,提醒各位不要在实盘里使用随便下单!
//+------------------------------------------------------------------+
//| VNMTEA_0.01.mq4 |
//| Copyright 2015, MetaQuotes Software Corp. |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link ""
#property version "1.00"
#property strict
extern int i订单类型 = 1;//订单类型:1、买单;0、卖单
extern double d初始交易量 = 0.1;//初始交易量
string strTemp="";//系统中临时用到的字符串
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
//VN注: 初始化函数,在调用EA的时候执行,很多情况都会被视为重新调用,
//比如更换不同时间窗的视图
int OnInit
{
//根据输入参数判断订单类型
if
{
strTemp = "您是否确定现在买入"+d初始交易量+"手 "+Symbol+"?如果是点击“Yes”按钮!如果不是,点击“No”放弃。";
}
else
{
strTemp = "您是否确定现在卖出"+d初始交易量+"手 "+Symbol+"?如果是点击“Yes”按钮!如果不是,点击“No”放弃。";
}
if==IDYES)
{
if
{
Print;
OrderSend,OP_BUY,NormalizeDouble,Ask,0,0,0,"买单",1001,0,Red);
}
else
{
Print;
OrderSend,OP_SELL,NormalizeDouble,Bid,0,0,0,"卖单",2001,0,Green);
}
}
//--- create timer
//VN注: 定时器时间开启,参数为秒,即每个60秒执行一次OnTimer这个函数
EventSetTimer;
//---
return;
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
//VN注: 程序结束时调用
void OnDeinit
{
//--- destroy timer
//停止并销毁定时器事件。
EventKillTimer;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
//VN注: 行情每出现一个新的报价就会调用一次这个函数,对于实时**监测非常
//重要,比定时器事件更及时
void OnTick
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
//VN注: 定时器时间调用的函数,简单说就是每隔N秒运行一次。
void OnTimer
{
//---
}
//+------------------------------------------------------------------+
//| Tester function |
//+------------------------------------------------------------------+
//VN注: 这个函数是专为EA测试所用的,每次测试完成后会调用,可以在这输出
//一些测试结果。
double OnTester
{
//---
double ret=0.0;
//---
//---
return;
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
//VN注: 图标上面点鼠标、键盘等等动作触发的事件
void OnChartEvent
{
//---
}
//+------------------------------------------------------------------+
你可以将以上代码原样拷贝粘贴到你的EA编辑器中,运行即可看到结果。再次提醒,以上源码不要用于实盘!
以上两章是以前写好的内容,所以下一章会更新比较慢,如果大家有兴趣一起探讨,我会更加积极的。 |