加载中…
个人资料
金融自动化交易
金融自动化交易
  • 博客等级:
  • 博客积分:0
  • 博客访问:302,619
  • 关注人气:361
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

【MQL4编程模版】1  快速编码范例

(2016-05-10 08:58:36)
标签:

ea编程

mql4教程

模板

指标编程

ea

分类: MQL4教程
用模版编码到底有多快,这篇博文来演示一遍。你也可以跟着我的节奏,一步一步地写代码。无论是否有没有编程经验,都不要管模版里的各种参数和命令到底是干什么的,以后再花时间搞清楚。
给新手的提示:按照本文内容反复演练,直到能够完全独立写出这个程序。此技无他唯手熟尔
 

1.1     提出交易规则

猜单双赌博游戏有一种玩法是:如果上一盘赢了,本次下注10元,如果上一盘输了,本次下注1元。

根据这个玩法,我们制定一个交易规则,就叫做“单挑”。规则如下:

1.       建仓类型。计算34日均线数据,如果报价在MA之上市价建Sell单,如果报价在MA之下市价建Buy单。均线参数为预设参数。

2.       建仓量。如果上一单亏损,则本次按照最小建仓单位执行,如果上一单盈利,则本次按照最小建仓单位N倍执行,N为预设参数。如果是新账号第一单则按照最小建仓单位执行。

3.       平仓。成交持仓单按预设止盈点数设置止盈,按(止盈点数-2倍点差)设置止损。

4.       每次只有1张成交持仓单。

1.2     程序准备

运行MetaEditor,打开模版程序,另存为“单挑[2016.01]”。

 

先修改程序封面:

#property   copyright     "点击查阅本软件最新动态"

#property   link          "http://blog.sina.com.cn/yiwence"

#property   description   "[软件性质] 内部测试      [授权账号] 任意"

#property   description   "[授权截止] 2026.10.01   [软件版本] 2016.01"

#property   description   "[    ] "单挑"是一款基于猜单双赌博原理的自动化交易软件。"

#property   description   "============================\n【合作模式】带盘、贴牌、定制开发\n【联系方式】老易 QQ:921795  Mobile:13974863868"

#property   icon          "\\Images\\EasyGo\\yixingLogo.ico" //logo 必须是ico格式

1.3     编写预设参数代码

 

编写初始建仓量、盈利倍数、止盈间隔以及MA相关参数,其他保留原样,点击F7编译无报错。

//=============================外部预设参数====================================

//    以下内容只是模版,需要根据实际情况重新编制

input   string              Note6="===控单参数===";             //项目一

input   double              InitLots=0.01;                      //初始仓量

input   double              LotsBets=2.0;                       //盈利倍数

input   int                 TPInterval=150;                     //止盈间隔

input   string              Note7="===指标参数===";             //项目二

input   ENUM_TIMEFRAMES     MA_timeframe=PERIOD_CURRENT;        //均线时间框架

input   int                 MA_period=34;                       //均线采样数量

input   int                 MA_shift=0;                         //均线平移量

input   ENUM_MA_METHOD      MA_method=MODE_SMMA;                //均线计算方法

input   ENUM_APPLIED_PRICE  MA_applied_price=PRICE_WEIGHTED;    //均线计算价格

input   int                 k_shift=0;                          //信号取值k线

input   string              Note8="===风险节点参数===";         //项目三

input   double              RiskNode1=3.0;                      //蓝色风险节点

input   double              RiskNode2=5.0;                      //绿色风险节点

input   double              RiskNode3=8.0;                      //黄色风险节点

input   double              RiskNode4=13.0;                     //红色风险节点

input   string              Note9="===其他参数===";             //项目四

input   int                 MagicNumber=20160326;               //EA订单识别码(接管其他订单=-1)

input   color                 clrDashboard=clrSkyBlue;            //显示仪表盘背景颜色

1.4     编写信号代码

 

egTradingSignal模块中编写信号代码。

【MQL4编程模版】1 <wbr> <wbr>快速编码范例

 

void egTradingSignal(string  &mySingle[])

{

    mySingle[0]=""; //初始化信号代码

    //获取MA数据

    double myMA=iMA(SI.symbol,MA_timeframe,MA_period,MA_shift,MA_method,MA_applied_price,k_shift);

    //获取当前中间价

    double myTickPrice=SI.bid;

    if (SI.bid>0 && SI.ask>0) myTickPrice=(SI.bid+SI.ask)/2; //AskBid中间价

    //Buy信号  1011

    if (myTickPrice

    //Sell信号  1012

    if (myTickPrice>myMA) mySingle[0]="1012,"+mySingle[0];

    Comment(SI.symbol,"  MA34: ",myMA,"  中间价: ",myTickPrice);

    return;

}

将计算的MA数据、中间报价和信号代码输出到主图验证核对数据是否准确:

【MQL4编程模版】1 <wbr> <wbr>快速编码范例

用历史测试快速验证信号10111012是否正确:

 

【MQL4编程模版】1 <wbr> <wbr>快速编码范例

【MQL4编程模版】1 <wbr> <wbr>快速编码范例

1.5     编写建仓代码

 

egCreat模块中编写建仓代码。规则是:如果上一单亏损,则本次按照最小建仓单位执行,如果上一单盈利,则本次按照最小建仓单位N倍执行,N为预设参数。如果是新账号,没有历史交易记录,第一单则按照最小建仓单位执行。

 

bool egCreat()

{

    //计算建仓量

    double myLots=egLotsFormat(SI.symbol,InitLots); //初始建仓量

    if (//有最新平仓单

           egOrderLocationSearchHst(HO,SI.symbol,0,9,MagicNumber,1)>0

        //平仓单盈利

        && HO[egOrderPosHst(HO,egOrderLocationSearchHst(HO,SI.symbol,0,9,MagicNumber,1))].profit>0

       )

    {

        myLots=egLotsFormat(SI.symbol,InitLots*LotsBets); //建仓量翻倍

    }

    //有成交持仓单不执行

    if (TS.buy_orders+TS.sell_orders>0) return(false);

    //Buy单建仓

    if (   StringFind(SignalCode[0],"1011",0)!=-1  //Buy信号:1011

        && egOrderCreat(OP_BUY,myLots,"1",MagicNumber,SI,0)

        && egPrintOut(PrintOut,"【建仓】Buy单市价建仓")

       )

    {

        return(true);

    }

    //Sell单建仓

    if (   StringFind(SignalCode[0],"1012",0)!=-1  //Sell信号:1012

        && egOrderCreat(OP_SELL,myLots,"1",MagicNumber,SI,0)

        && egPrintOut(PrintOut,"【建仓】Sell单市价建仓")

       )

    {

        return(true);

    }

    return(false);

点击F7编译无报错,验证主程序执行建仓:

【MQL4编程模版】1 <wbr> <wbr>快速编码范例

仪表盘红框表示有1Buy单处于控制中。测试日志栏有建仓信息输出。

1.6     编写平仓代码

 

本规则成交持仓单是通过止盈止损平仓出局的。在egReduce模块中编写止盈止损代码:

 

bool egReduce()

{

    int     cnt=0;  //循环计数器变量

    double myTPPrice,mySLPrice; //止盈止损变量

//--- Sell单止盈止损

    if (TS.sell_orders==1)

    {

        cnt=egOrderPos(TO,egOrderLocationSearch(TO,SI.symbol,0,OP_SELL,MagicNumber,1));

        myTPPrice=NormalizeDouble(TO[cnt].openprice-TPInterval*SI.point,SI.digits);

        mySLPrice=NormalizeDouble(TO[cnt].openprice+(TPInterval-SI.spread*2)*SI.point,SI.digits);

        if (    TO[cnt].takeprofit==0

                && egSetTakeLoss(TO[cnt].ticket,0,myTPPrice,SI)

                && egPrintOut(PrintOut,"【止盈止损】Sell单执行止盈")

               )

            || (   TO[cnt].stoploss==0

                && egSetTakeLoss(TO[cnt].ticket,1,mySLPrice,SI)

                && egPrintOut(PrintOut,"【止盈止损】Sell单执行止损")

               )

           )

        {

            return(true);

        }

    }

//--- Buy

    if (TS.buy_orders==1)

    {

        cnt=egOrderPos(TO,egOrderLocationSearch(TO,SI.symbol,0,OP_BUY,MagicNumber,1));

        myTPPrice=NormalizeDouble(TO[cnt].openprice+TPInterval*SI.point,SI.digits);

        mySLPrice=NormalizeDouble(TO[cnt].openprice-(TPInterval-SI.spread*2)*SI.point,SI.digits);

        if (    TO[cnt].takeprofit==0

                && egSetTakeLoss(TO[cnt].ticket,0,myTPPrice,SI)

                && egPrintOut(PrintOut,"【止盈止损】Buy单执行止盈")

               )

            || (   TO[cnt].stoploss==0

                && egSetTakeLoss(TO[cnt].ticket,1,mySLPrice,SI)

                && egPrintOut(PrintOut,"【止盈止损】Buy单执行止损")

               )

           )

        {

            return(true);

        }

    }

    return(false);

}

编译无误后,验证主程序执行止盈止损:

【MQL4编程模版】1 <wbr> <wbr>快速编码范例

1.7     历史数据测试

【MQL4编程模版】1 <wbr> <wbr>快速编码范例

既有Buy单也有Sell单执行了规则。

逻辑正确,编码完成。

完成后的主程序共计551行,而真正需要我们编码的只有上述几十行。这个编程模版集成了基本控单功能,杜绝了语法错误,极少有逻辑错误,让编码人员把更多精力投放到规则逻辑的有效组合上,从而大大地提高了编码效率和编码质量。

 

这个范例源码下载地址:http://pan.baidu.com/s/1mhC81hm

1.8     关于“概率游戏”

 

猜大小游戏单从结果概率来说各占50%,但是过程中却不是盈亏相间出现的,往往会有连赢连亏的情况。如果我们能做到赢31,那就意味着即使胜率不足50%,也有机会获取盈利,由此可见,单纯玩概率游戏也有非常值得深究之处。毕竟本文是模版手册,就不再展开。

<<上一篇 【MQL4编程模版】-简介篇(含模版下载链接) 

>>下一篇   【MQL4编程模版】2  总体框架

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有