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

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

  • 最佳新人

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

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

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

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

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

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

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

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

    EA邦vip会员
  • 论坛元老

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

MT5CTP程序化交易开发19:主动止盈止损

[复制链接]
唐老师Lv.9 显示全部楼层 发表于 2021-9-28 11:37:06 |阅读模式 打印 上一主题 下一主题
MT5CTP的视频教学可以到网站上关于我们栏目的EA邦的各视频平台里观看。
这是第19课的代码: 双均线交叉_EA_v1.0.mq5 (18.83 KB, 下载次数: 5)
  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.    if(mad_1>mac_1 && mad_2<mac_2)
  49.      {
  50.       if(ddsl(0)==0) //多单开仓
  51.         {
  52.          bool buyKc=m_trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,开仓量,SymbolInfoDouble(_Symbol,SYMBOL_SESSION_PRICE_LIMIT_MAX),0,0,"均线交叉多单");//开仓多单
  53.          if(buyKc==true)
  54.            {
  55.             Alert("多单开仓成功!");
  56.            }
  57.          else
  58.            {
  59.             Alert("多单开仓失败!"+IntegerToString(GetLastError()));
  60.            }
  61.         }

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

  75.    if(mad_1<mac_1 && mad_2>mac_2)
  76.      {
  77.       if(ddsl(1)==0) //空单开仓
  78.         {
  79.          bool sellKc=m_trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,开仓量,SymbolInfoDouble(_Symbol,SYMBOL_SESSION_PRICE_LIMIT_MIN),0,0,"均线交叉空单");//开仓空单
  80.          if(sellKc==true)
  81.            {
  82.             Alert("空单开仓成功!");
  83.            }
  84.          else
  85.            {
  86.             Alert("空单开仓失败!"+IntegerToString(GetLastError()));
  87.            }
  88.         }

  89.       if(ddsl(0)>0) //多单平仓
  90.         {
  91.          bool cBuy=closeAll(0);
  92.          if(cBuy==true)
  93.            {
  94.             Alert("多单平仓成功!");
  95.            }
  96.          else
  97.            {
  98.             Alert("多单平仓失败!"+IntegerToString(GetLastError()));
  99.            }
  100.         }
  101.      }

  102.    if(ddsl(0)>0) //多单止盈止损
  103.      {
  104.       if(止盈>0)
  105.         {
  106.          if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-openJ(0)>止盈*SymbolInfoDouble(_Symbol,SYMBOL_POINT))
  107.            {
  108.             bool cBuy=closeAll(0);
  109.             if(cBuy==true)
  110.               {
  111.                Alert("多单止盈平仓成功!");
  112.               }
  113.             else
  114.               {
  115.                Alert("多单止盈平仓失败!"+IntegerToString(GetLastError()));
  116.               }
  117.            }
  118.         }

  119.       if(止损>0)
  120.         {
  121.          if(openJ(0)-SymbolInfoDouble(_Symbol,SYMBOL_ASK)>止损*SymbolInfoDouble(_Symbol,SYMBOL_POINT))
  122.            {
  123.             bool cBuy=closeAll(0);
  124.             if(cBuy==true)
  125.               {
  126.                Alert("多单止损平仓成功!");
  127.               }
  128.             else
  129.               {
  130.                Alert("多单止损平仓失败!"+IntegerToString(GetLastError()));
  131.               }
  132.            }
  133.         }
  134.      }

  135.    if(ddsl(1)>0) //空单止盈止损
  136.      {
  137.       if(止盈>0)
  138.         {
  139.          if(openJ(1)-SymbolInfoDouble(_Symbol,SYMBOL_ASK)>止盈*SymbolInfoDouble(_Symbol,SYMBOL_POINT))
  140.            {
  141.             bool cSell=closeAll(1);
  142.             if(cSell==true)
  143.               {
  144.                Alert("空单止盈平仓成功!");
  145.               }
  146.             else
  147.               {
  148.                Alert("空单止盈平仓失败!"+IntegerToString(GetLastError()));
  149.               }
  150.            }
  151.         }

  152.       if(止损>0)
  153.         {
  154.          if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-openJ(1)>止损*SymbolInfoDouble(_Symbol,SYMBOL_POINT))
  155.            {
  156.             bool cSell=closeAll(1);
  157.             if(cSell==true)
  158.               {
  159.                Alert("空单止损平仓成功!");
  160.               }
  161.             else
  162.               {
  163.                Alert("空单止损平仓失败!"+IntegerToString(GetLastError()));
  164.               }
  165.            }
  166.         }
  167.      }
  168.   }
  169. //+------------------------------------------------------------------+
  170. //| Timer function                                                   |
  171. //+------------------------------------------------------------------+
  172. void OnTimer()
  173.   {
  174. //---

  175.   }
  176. //+------------------------------------------------------------------+
  177. bool closeAll(int path)
  178.   {
  179.    bool a=true;
  180.    int ddzs=mt5ctp::MT5PositionsTotal();
  181.    for(int i=0; i<ddzs; i++)
  182.      {
  183.       ulong ticket = 0;
  184.       mt5ctp::MT5PositionGetTicket(i,ticket);
  185.       MT5CTPOrders order_mt5;
  186.       ZeroMemory(order_mt5);
  187.       if(!mt5ctp::MT5PositionSelectByTicket(ticket,order_mt5))
  188.          continue;
  189.       string pos_symbol = ::CharArrayToString(order_mt5.symbol);
  190.       int digit_symbol = (int)::SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS);

  191.       if(order_mt5.type==path)
  192.         {
  193.          if(m_trade.PositionClose(ticket,0)==false)
  194.             a=false;
  195.         }
  196.       //Print("编号=",i);
  197.       //Print("品种=",pos_symbol);
  198.       //Print("订单号=",order_mt5.ticket);
  199.       //Print("开仓时间=",order_mt5.time);
  200.       //Print("持仓方向=",order_mt5.type);
  201.       //Print("开仓量=",order_mt5.volume);
  202.       //Print("开仓价=",order_mt5.price,digit_symbol);
  203.       //Print("止损价=",order_mt5.sl,digit_symbol);
  204.       //Print("止盈价=",order_mt5.tp,digit_symbol);
  205.       //Print("盈亏=",order_mt5.profit);
  206.       //Print("魔术码=",order_mt5.magic);
  207.       //Print("注释=",CharArrayToString(order_mt5.comment));
  208.      }

  209.    return(a);
  210.   }

  211. //+------------------------------------------------------------------+
  212. //|                                                                  |
  213. //+------------------------------------------------------------------+
  214. double ma(string sym,ENUM_TIMEFRAMES zhouqi,int zhi,int bias,ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int k) //获取均线
  215.   {
  216.    double buf[];
  217.    ArraySetAsSeries(buf,true);
  218.    int a=iMA(sym,zhouqi,zhi,bias,method,price);
  219.    int copied=CopyBuffer(a,0,0,k+1,buf);
  220.    return(buf[k]);
  221.   }
  222. //+------------------------------------------------------------------+
  223. //|                                                                  |
  224. //+------------------------------------------------------------------+
  225. int ddsl(int path)
  226.   {
  227.    int a=0;
  228.    int ddzs=mt5ctp::MT5PositionsTotal();
  229.    for(int i=0; i<ddzs; i++)
  230.      {
  231.       ulong ticket = 0;
  232.       mt5ctp::MT5PositionGetTicket(i,ticket);
  233.       MT5CTPOrders order_mt5;
  234.       ZeroMemory(order_mt5);
  235.       if(!mt5ctp::MT5PositionSelectByTicket(ticket,order_mt5))
  236.          continue;
  237.       string pos_symbol = ::CharArrayToString(order_mt5.symbol);
  238.       int digit_symbol = (int)::SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS);

  239.       if(order_mt5.type==path)
  240.         {
  241.          a++;
  242.         }
  243.       //Print("编号=",i);
  244.       //Print("品种=",pos_symbol);
  245.       //Print("订单号=",order_mt5.ticket);
  246.       //Print("开仓时间=",order_mt5.time);
  247.       //Print("持仓方向=",order_mt5.type);
  248.       //Print("开仓量=",order_mt5.volume);
  249.       //Print("开仓价=",order_mt5.price,digit_symbol);
  250.       //Print("止损价=",order_mt5.sl,digit_symbol);
  251.       //Print("止盈价=",order_mt5.tp,digit_symbol);
  252.       //Print("盈亏=",order_mt5.profit);
  253.       //Print("魔术码=",order_mt5.magic);
  254.       //Print("注释=",CharArrayToString(order_mt5.comment));
  255.      }

  256.    return(a);
  257.   }
  258. //+------------------------------------------------------------------+
  259. double openJ(int path) //获取开仓价
  260.   {
  261.    double a=0;
  262.    int ddzs=mt5ctp::MT5PositionsTotal();
  263.    for(int i=0; i<ddzs; i++)
  264.      {
  265.       ulong ticket = 0;
  266.       mt5ctp::MT5PositionGetTicket(i,ticket);
  267.       MT5CTPOrders order_mt5;
  268.       ZeroMemory(order_mt5);
  269.       if(!mt5ctp::MT5PositionSelectByTicket(ticket,order_mt5))
  270.          continue;
  271.       string pos_symbol = ::CharArrayToString(order_mt5.symbol);
  272.       int digit_symbol = (int)::SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS);

  273.       if(order_mt5.type==path)
  274.         {
  275.          a=order_mt5.price;
  276.         }
  277.       //Print("编号=",i);
  278.       //Print("品种=",pos_symbol);
  279.       //Print("订单号=",order_mt5.ticket);
  280.       //Print("开仓时间=",order_mt5.time);
  281.       //Print("持仓方向=",order_mt5.type);
  282.       //Print("开仓量=",order_mt5.volume);
  283.       //Print("开仓价=",order_mt5.price,digit_symbol);
  284.       //Print("止损价=",order_mt5.sl,digit_symbol);
  285.       //Print("止盈价=",order_mt5.tp,digit_symbol);
  286.       //Print("盈亏=",order_mt5.profit);
  287.       //Print("魔术码=",order_mt5.magic);
  288.       //Print("注释=",CharArrayToString(order_mt5.comment));
  289.      }

  290.    return(a);
  291.   }
  292. //+------------------------------------------------------------------+
复制代码


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

使用道具 举报

精彩评论3

乒乓球Lv.1 显示全部楼层 发表于 2021-10-11 14:55:22
你好唐老师,我们的程序有一个bug,交叉的时候来回开平仓多次。
+10
回复

使用道具 举报

唐老师Lv.9 显示全部楼层 发表于 2021-10-16 17:24:16
乒乓球 发表于 2021-10-11 14:55
你好唐老师,我们的程序有一个bug,交叉的时候来回开平仓多次。

我这里正常的,你是不是加载多了。因为我在20课的时候才讲,让EA自己只管理自己的订单。
+10
要有能够持续稳定盈利的交易策略,再进行实盘交易,建议先用历史数据回测和模拟盘进行仔细验证。
回复

使用道具 举报

313and320Lv.1 显示全部楼层 发表于 2021-11-22 21:57:09
唐老师,我不知道怎么联系您,所以只能发在评论里,您的那个砖块图指标我的使用效果很好,但是一段时间后显示期限到了,老师能不能发一份没有期限的?
+10
回复

使用道具 举报

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

本版积分规则

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

  • 微信公众号

  • 微信视频号

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