设为首页 收藏本站 切换语言

量化交易入门--写第一个量化程序

| 发表于 2022-12-7 11:23:07 | 显示全部楼层 |复制链接

MT4提供的sample程序只有基本的功能,不能够自动交易。

我们写一个自动交易程序,逻辑如下

· 下一个多单

· 检查当前盈利情况

· 盈利大于1美金止盈平仓,或者亏损大于1美金止损平仓

· 退出程序

  1. //+------------------------------------------------------------------+
  2. //|                                                  QuantSample.mq4 |
  3. //|                        Copyright 2020, MetaQuotes Software Corp. |
  4. //|                                             https://www.mql5.com |
  5. //+------------------------------------------------------------------+
  6. #property strict
  7. //+------------------------------------------------------------------+
  8. //| Expert initialization function                                   |
  9. //+------------------------------------------------------------------+
  10. int OnInit()
  11.   {
  12. //---
  13.    
  14. //---
  15.    return(INIT_SUCCEEDED);
  16.   }
  17. //+------------------------------------------------------------------+
  18. //| Expert deinitialization function                                 |
  19. //+------------------------------------------------------------------+
  20. void OnDeinit(const int reason)
  21.   {
  22. //---
  23.    
  24.   }
  25. //+------------------------------------------------------------------+
  26. //| Expert tick function                                             |
  27. //+------------------------------------------------------------------+
  28. void OnTick()
  29.   {
  30. //---
  31.     int ticket = 0;
  32.     if(OrdersTotal() == 0) {//检查当前是否有订单,没有则下单
  33.       //send order
  34.       ticket = OrderSend(Symbol(), OP_BUY, 0.01, MarketInfo(Symbol(), MODE_ASK), 100, 0.0, 0.0, "comment", 1024, 0,0xFFFFFFFF);
  35.     }
  36.     double profit = 0;
  37.     for(int i = 0; i < OrdersTotal(); i++){ //计算当前盈亏
  38.       if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) break;
  39.       profit = OrderProfit();
  40.     }
  41.     if(profit > 1.0 || profit < -1.0) { //当前盈亏满足条件则平仓退出
  42.       //close order
  43.       for (int index = OrdersTotal() - 1 ; index >= 0 ; index = index - 1) {
  44.           if(!OrderSelect(index, SELECT_BY_POS, MODE_TRADES)){ //选择订单
  45.             PrintFormat(">>> select failed closing trade <%s> at index %d", Symbol(), index);
  46.             continue;
  47.           }
  48.           bool close_result = true ;
  49.           switch(OrderType()) {
  50.               case OP_BUY :
  51.                     close_result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(), MODE_BID),100,0xFFFFFFFF) ; //关闭订单
  52.                   break;
  53.               case OP_SELL :
  54.                     close_result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),100,0xFFFFFFFF) ;
  55.                     break;
  56.           }
  57.       }
  58.       ExpertRemove();//退出EA
  59.     }
  60.   }
  61. //+------------------------------------------------------------------+
复制代码

这是一个包含了最最基本功能的交易程序,它没有任何量化相关的逻辑,只展示了最基本的交易能力。

复杂的量化交易程序也需要包含这两个功能,

· 下单

· 平仓

区别在于他们的下单依据,量化交易会用复杂的逻辑分析市场上反馈的数据,再决定下单和平仓的时机。我们后面会再介绍。

EA的生命周期
EA的默认生命周期包括三个函数,

· onInit

· onDeInit

· onTick

和几个可选函数

· onChartEvent

· onTimer

· onTester等

onInit
EA被MT4加载时的入口,只会执行一遍。

一般用来做全局变量初始化,UI界面绘制等操作。

onDeInit
MT4在结束一个EA时会调用onDeInit,代表着一个EA的生命周期结束。只会执行一次。

在这个函数里一般会做全局变量释放,和UI控件释放的操作。

onTick
MT4运行过程中会在有新数据来到的时候通过tick调用EA的onTick接口。

EA在收到onTick调用之后,需要检查新的数据是否满足设定的逻辑。这是一个极高频的接口,在正式环境上是毫秒级的。

onTick在回测的时候也会被调用,但频率是根据回测时设定的tick级别,从1sec到1h都有。

其他可选接口
onChartEvent
EA可以在K线图上绘制控件,用户通过控件的点击修改EA的变量等参数。这些点击事件会通过onChartEvent发送给EA处理。
onTimer
定时接口。EA初始化的时候可以通过 setTimer() 接口设定一个时间间隔,每次到点的时候会调用EA的onTimer接口。我们可以在onTimer里做一些状态校验操作,比如发送邮件,发送告警等操作。

onTester
测试接口,一般不需要实现。

编译运行EA
MT4是一个运行EA的应用,它可以加载已经编译好的EA程序,程序的后缀是ex4。
如果有帮助,就支持一下我呗
举报

评论 使用道具

精彩评论3

daerwushen
DD
| 发表于 2022-12-7 13:01:10 | 显示全部楼层
最基本功能
举报

点赞 评论 使用道具

ken138888
B
| 发表于 2022-12-7 14:32:25 | 显示全部楼层
谢谢分享了
举报

点赞 评论 使用道具

dongxu64
DDD
| 发表于 2022-12-8 08:29:24 | 显示全部楼层
量化交易的基础
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)