返回顶部
  • 发帖数2765
  • 粉丝0

愿您早日建立自己的稳定盈利的交易系统!

  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 热心会员

    经常帮助其他会员答疑
  • 推广达人

    积极宣传本站,为本站带来更多注册会员
  • 宣传达人

    积极宣传本站,为本站带来更多的用户访问量
  • 灌水之王

    经常在论坛发帖,且发帖量较大
  • 突出贡献

    长期对论坛的繁荣而不断努力,或多次提出建设性意见
  • 优秀版主

    活跃且尽责职守的版主
  • EA邦VIP

    EA邦vip会员
  • 论坛元老

    为论坛做出突出贡献的会员

MT5CTP程序化交易开发17:被动止盈止损

[复制链接]
唐老师Lv.9 显示全部楼层 发表于 2021-9-28 11:11:23 |阅读模式 打印 上一主题 下一主题
MT5CTP的视频教学可以到网站上关于我们栏目的EA邦的各视频平台里观看。
这是第17课的代码:
EA文件代码: 双均线交叉_EA_v1.0.mq5 (14.04 KB, 下载次数: 2)
  1. //+------------------------------------------------------------------+
  2. //|                                      Copyright 2020, EA邦        |
  3. //|                                     http://www.eabang.com        |
  4. //+------------------------------------------------------------------+
  5. #define __MT5CTP__
  6. // 包含库
  7. #ifdef __MT5CTP__
  8. #include <mt5ctp\mt5toctp.mqh>
  9. #endif

  10. #property copyright "Copyright 2021, MetaQuotes Ltd."
  11. #property link      "https://www.eabang.com"
  12. #property version   "1.00"
  13. //--- input parameters
  14. input int      短均线=5;
  15. input int      长均线=10;
  16. input double   开仓量=1.0;
  17. input int      止盈=100;
  18. input int      止损=100;

  19. CTrade    m_trade;
  20. //+------------------------------------------------------------------+
  21. //| Expert initialization function                                   |
  22. //+------------------------------------------------------------------+
  23. int OnInit()
  24.   {
  25. //--- create timer
  26.    EventSetTimer(60);

  27. //---
  28.    return(INIT_SUCCEEDED);
  29.   }
  30. //+------------------------------------------------------------------+
  31. //| Expert deinitialization function                                 |
  32. //+------------------------------------------------------------------+
  33. void OnDeinit(const int reason)
  34.   {
  35. //--- destroy timer
  36.    EventKillTimer();

  37.   }
  38. //+------------------------------------------------------------------+
  39. //| Expert tick function                                             |
  40. //+------------------------------------------------------------------+
  41. void OnTick()
  42.   {
  43. //---

  44.    double mad_1=ma(_Symbol,PERIOD_CURRENT,短均线,0,MODE_EMA,PRICE_CLOSE,1);
  45.    double mac_1=ma(_Symbol,PERIOD_CURRENT,长均线,0,MODE_EMA,PRICE_CLOSE,1);
  46.    double mad_2=ma(_Symbol,PERIOD_CURRENT,短均线,0,MODE_EMA,PRICE_CLOSE,2);
  47.    double mac_2=ma(_Symbol,PERIOD_CURRENT,长均线,0,MODE_EMA,PRICE_CLOSE,2);
  48.    
  49.    if(mad_1>mac_1 && mad_2<mac_2)
  50.      {
  51.       if(ddsl(0)==0) //多单开仓
  52.         {
  53.          double sun=0;
  54.          if(止损>0) sun=SymbolInfoDouble(_Symbol,SYMBOL_BID)-止损*SymbolInfoDouble(_Symbol,SYMBOL_POINT);
  55.          double ying=0;
  56.          if(止盈>0) ying=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+止盈*SymbolInfoDouble(_Symbol,SYMBOL_POINT);
  57.          bool buyKc=m_trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,开仓量,SymbolInfoDouble(_Symbol,SYMBOL_SESSION_PRICE_LIMIT_MAX),sun,ying,"均线交叉多单");//开仓多单
  58.          if(buyKc==true)
  59.            {
  60.             Alert("多单开仓成功!");
  61.            }
  62.          else
  63.            {
  64.             Alert("多单开仓失败!"+IntegerToString(GetLastError()));
  65.            }
  66.         }

  67.       if(ddsl(1)>0) //空单平仓
  68.         {
  69.          bool cSell=closeAll(1);
  70.          if(cSell==true)
  71.            {
  72.             Alert("空单平仓成功!");
  73.            }
  74.          else
  75.            {
  76.             Alert("空单平仓失败!"+IntegerToString(GetLastError()));
  77.            }
  78.         }
  79.      }

  80.    if(mad_1<mac_1 && mad_2>mac_2)
  81.      {
  82.       if(ddsl(1)==0) //空单开仓
  83.         {
  84.          double sun=0;
  85.          if(止损>0) sun=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+止损*SymbolInfoDouble(_Symbol,SYMBOL_POINT);
  86.          double ying=0;
  87.          if(止盈>0) ying=SymbolInfoDouble(_Symbol,SYMBOL_BID)-止盈*SymbolInfoDouble(_Symbol,SYMBOL_POINT);
  88.          bool sellKc=m_trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,开仓量,SymbolInfoDouble(_Symbol,SYMBOL_SESSION_PRICE_LIMIT_MIN),sun,ying,"均线交叉空单");//开仓空单
  89.          if(sellKc==true)
  90.            {
  91.             Alert("空单开仓成功!");
  92.            }
  93.          else
  94.            {
  95.             Alert("空单开仓失败!"+IntegerToString(GetLastError()));
  96.            }
  97.         }

  98.       if(ddsl(0)>0) //多单平仓
  99.         {
  100.          bool cBuy=closeAll(0);
  101.          if(cBuy==true)
  102.            {
  103.             Alert("多单平仓成功!");
  104.            }
  105.          else
  106.            {
  107.             Alert("多单平仓失败!"+IntegerToString(GetLastError()));
  108.            }
  109.         }
  110.      }
  111.   }
  112. //+------------------------------------------------------------------+
  113. //| Timer function                                                   |
  114. //+------------------------------------------------------------------+
  115. void OnTimer()
  116.   {
  117. //---

  118.   }
  119. //+------------------------------------------------------------------+
  120. bool closeAll(int path)
  121.   {
  122.    bool a=true;
  123.    int ddzs=mt5ctp::MT5PositionsTotal();
  124.    for(int i=0; i<ddzs; i++)
  125.      {
  126.       ulong ticket = 0;
  127.       mt5ctp::MT5PositionGetTicket(i,ticket);
  128.       MT5CTPOrders order_mt5;
  129.       ZeroMemory(order_mt5);
  130.       if(!mt5ctp::MT5PositionSelectByTicket(ticket,order_mt5))
  131.          continue;
  132.       string pos_symbol = ::CharArrayToString(order_mt5.symbol);
  133.       int digit_symbol = (int)::SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS);

  134.       if(order_mt5.type==path)
  135.         {
  136.          if(m_trade.PositionClose(ticket,0)==false)
  137.             a=false;
  138.         }
  139.       //Print("编号=",i);
  140.       //Print("品种=",pos_symbol);
  141.       //Print("订单号=",order_mt5.ticket);
  142.       //Print("开仓时间=",order_mt5.time);
  143.       //Print("持仓方向=",order_mt5.type);
  144.       //Print("开仓量=",order_mt5.volume);
  145.       //Print("开仓价=",order_mt5.price,digit_symbol);
  146.       //Print("止损价=",order_mt5.sl,digit_symbol);
  147.       //Print("止盈价=",order_mt5.tp,digit_symbol);
  148.       //Print("盈亏=",order_mt5.profit);
  149.       //Print("魔术码=",order_mt5.magic);
  150.       //Print("注释=",CharArrayToString(order_mt5.comment));
  151.      }

  152.    return(a);
  153.   }

  154. //+------------------------------------------------------------------+
  155. //|                                                                  |
  156. //+------------------------------------------------------------------+
  157. double ma(string sym,ENUM_TIMEFRAMES zhouqi,int zhi,int bias,ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int k) //获取均线
  158.   {
  159.    double buf[];
  160.    ArraySetAsSeries(buf,true);
  161.    int a=iMA(sym,zhouqi,zhi,bias,method,price);
  162.    int copied=CopyBuffer(a,0,0,k+1,buf);
  163.    return(buf[k]);
  164.   }
  165. //+------------------------------------------------------------------+
  166. //|                                                                  |
  167. //+------------------------------------------------------------------+
  168. int ddsl(int path)
  169.   {
  170.    int a=0;
  171.    int ddzs=mt5ctp::MT5PositionsTotal();
  172.    for(int i=0; i<ddzs; i++)
  173.      {
  174.       ulong ticket = 0;
  175.       mt5ctp::MT5PositionGetTicket(i,ticket);
  176.       MT5CTPOrders order_mt5;
  177.       ZeroMemory(order_mt5);
  178.       if(!mt5ctp::MT5PositionSelectByTicket(ticket,order_mt5))
  179.          continue;
  180.       string pos_symbol = ::CharArrayToString(order_mt5.symbol);
  181.       int digit_symbol = (int)::SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS);

  182.       if(order_mt5.type==path)
  183.         {
  184.          a++;
  185.         }
  186.       //Print("编号=",i);
  187.       //Print("品种=",pos_symbol);
  188.       //Print("订单号=",order_mt5.ticket);
  189.       //Print("开仓时间=",order_mt5.time);
  190.       //Print("持仓方向=",order_mt5.type);
  191.       //Print("开仓量=",order_mt5.volume);
  192.       //Print("开仓价=",order_mt5.price,digit_symbol);
  193.       //Print("止损价=",order_mt5.sl,digit_symbol);
  194.       //Print("止盈价=",order_mt5.tp,digit_symbol);
  195.       //Print("盈亏=",order_mt5.profit);
  196.       //Print("魔术码=",order_mt5.magic);
  197.       //Print("注释=",CharArrayToString(order_mt5.comment));
  198.      }

  199.    return(a);
  200.   }
  201. //+------------------------------------------------------------------+
复制代码


+10
要有能够持续稳定盈利的交易策略,再进行实盘交易,建议先用历史数据回测和模拟盘进行仔细验证。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

EA邦和EACTP仅为EA程序化交易软件服务供应商,使用EA工具进行交易,在使用前应该清楚的阅读和浏览软件相关的教程,使用软件是一种自发行为,所引发的一切法律后果,包括用户在使用过程中导致的任何损失均与EA软件开发者无关。
  • 微信

  • 微信公众号

  • 微信视频号

  • Powered by Discuz! X3.5 | Copyright © 2017-2024, Tencent Cloud. | EABANG.COM
  • 和仲科技有限公司| 川公网安备 51019002005489号 | 蜀ICP备17026493号