登陆/注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 2481

[MT4] 一个以标准MACD指标为基础简单的智能交易系统的创建

[复制链接]

79

主题

320

回帖

1504

活跃度

回帖达人实盘认证实名认证发贴达人本站牛人

程序猿的仔仔实盘认证 发表于 2019-3-29 01:04:03 | 显示全部楼层 | 关注 | 私信
以 MQL4语言程序为原理展示一个以标准MACD 指标为基础简单的智能交易系统的创建。 在这个智能交易中,我们将看到一些特性的示例,像赢利水平的设定,追踪止损的设置等等。在我们的范例中,通过开仓和管理仓位来完成交易。
交易原理:
BUY– MACD指标在零以下, 从下至上并且穿过低端的信号线。
SELL– MACD指标在零以上,从上至下并且穿过顶端的信号线。
Long exit – 赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD 指标在零以上,从上至下并且穿过顶端的信号线)。
Short exit – 赢利上限的执行,追踪止损的执行或当穿过 MACD 的信号线 (MACD指标在零以下, 从下至上并且穿过低端的信号线)。

初始变量
所有使用在智能交易程序中的变量必须按照 MetaQuotes Language 4 要求的指定。
  1. extern double TakeProfit = 50;
  2. extern double Lots = 0.1;
  3. extern double TrailingStop = 30;
  4. extern double MACDOpenLevel=3;
  5. extern double MACDCloseLevel=2;
  6. extern double MATrenDPeriod=26;
复制代码
MetaQuotes语言4 是需要“外部变量”辅助的。外部变量可以从外部设定,在智能交易程序源代码设定之后不可以修改。提供一个额外的灵活性。
  1. extern double MATrendPeriod=26;
复制代码
检测初始数据
确认智能交易运行正常非常重要,该代码部分通常使用在所有的智能交易中。因为是一个标准的检测:
  1. // 变量(Lots, StopLoss, TakeProfit,
  2. // TrailingStop) 我们的情况需要检测TakeProfit
  3. // 图表中少于100 柱
  4.    if(Bars<100)
  5.      {
  6.       Print("少于 100柱");
  7.       return(0);  
  8.      }
  9.    if(TakeProfit<10)
  10.      {
  11.       Print("赢利少于10");
  12.       return(0);  // 检测TakeProfit
  13.      }
复制代码
对于数据的快速通道设置内部变量
在源代码中经常需要注意指标值或计算值。简化代码和数据放置在内部变量中。
  1. int start()
  2.   {
  3.    double MacdCurrent, MacdPrevious, SignalCurrent;
  4.    double SignalPrevious, MaCurrent, MaPrevious;
  5.    int cnt, ticket, total;
  6.    MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
  7.    MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
  8.    SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
  9.    SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
  10.    MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
  11.    MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
复制代码
现在,用 iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)代替,您可以在源代码中使用 MacdCurrent。
检测交易终端 –是空的吗?如果是:
在我们的智能交易中,我们仅使用开单和操作挂单。不过,使更安全,我们来认识一种对于先前定单交易终端检测:
  1. total=OrdersTotal();
  2.    if(total<1)
  3.      {
复制代码
在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。
  1. if(AccountFreeMargin()<(1000*Lots))
  2.         {
  3.          Print("没有资金.自由保证金 = ", AccountFreeMargin());
  4.          return(0);  
  5.         }
复制代码
尽可能检测看涨仓位 (BUY)
  1.       if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
  2.          MacdPrevious
  3.          MathAbs(MacdCurrent)>(MACDOpenLevel*Point) &&
  4.          MaCurrent>MaPrevious)
  5.         {
  6.          ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
  7.                           "macd sample",16384,0,Green);
  8.          if(ticket>0)
  9.            {
  10.             if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
  11.                Print("BUY 开单 : ",OrderOpenPrice());
  12.            }
  13.          else Print("错误 opening BUY order : ",GetLastError());
  14.          return(0);
  15.         }
复制代码
尽可能的检测卖空仓位(SELL)
  1.       if(MacdCurrent>0 && MacdCurrentSignalPrevious &&
  2.          MacdCurrent>(MACDOpenLevel*Point) && MaCurrent
  3.         {
  4.          ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,
  5.                           "macd sample",16384,0,Red);
  6.          if(ticket>0)
  7.            {
  8.             if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
  9.                Print("SELL 开单 : ",OrderOpenPrice());
  10.            }
  11.          else Print("错误SELL定单开仓 : ",GetLastError());
  12.          return(0);
  13.         }
复制代码
周期循环检验先前开仓
  1. for(cnt=0;cnt
  2.   {
  3.    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
  4.    if(OrderType()<=OP_SELL &&   // 检验开仓
  5.       OrderSymbol()==Symbol())  // 检验货币
  6.      {
复制代码
如果是看涨仓位
  1. if(OrderType()==OP_BUY)   // 打开看张仓位
  2.   {
复制代码
如果是看涨仓位应该平仓吗?
  1. if(MacdCurrent>0 && MacdCurrentSignalPrevious &&
  2.    MacdCurrent>(MACDCloseLevel*Point))
  3.   {
  4.    OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓
  5.    return(0); //退出
  6.   }
复制代码
检测追踪止损
  1. if(TrailingStop>0)  
  2.   {                 
  3.    if(Bid-OrderOpenPrice()>Point*TrailingStop)
  4.      {
  5.       if(OrderStopLoss()
  6.         {
  7.          OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
  8.                      OrderTakeProfit(),0,Green);
  9.          return(0);
  10.         }
  11.    }
  12.   }
复制代码
如果是卖空仓位应该平仓吗
  1. if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
  2.    MacdPrevious(MACDCloseLevel*Point))
  3.   {
  4.    OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //平仓
  5.    return(0); // 退出
  6.   }
复制代码
检测追踪止损
  1. if(TrailingStop>0)  
  2.   {                 
  3.    if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
  4.      {
  5.       if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
  6.         {
  7.          OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
  8.                      OrderTakeProfit(),0,Red);
  9.          return(0);
  10.         }
  11.      }
  12.   }
复制代码
关闭所有残留开仓。
  1.        }
  2.       }
  3.    }
  4. return(0);
  5. }
复制代码

0

主题

61

回帖

12

活跃度
易指禅 发表于 2020-8-31 12:19:22 | 显示全部楼层 | 关注 | 私信
非常感谢楼主的无私分享

1

主题

61

回帖

3702

活跃度

实盘认证实名认证

天王盖地虎,小鸡炖蘑菇。

0

主题

336

回帖

2374

活跃度

实盘认证实名认证

侯晓阳实盘认证 发表于 2022-7-6 06:35:06 | 显示全部楼层 | 关注 | 私信
明天进来学习一点点,希望赶上各位步伐

0

主题

271

回帖

1436

活跃度

回帖达人实盘认证实名认证

苏苒实盘认证 发表于 2022-7-10 17:46:42 | 显示全部楼层 | 关注 | 私信
来挖矿了,谢谢分享

0

主题

906

回帖

2210

活跃度

回帖达人实盘认证实名认证

铅华浮尘实盘认证 发表于 2022-10-22 00:24:01 | 显示全部楼层 | 关注 | 私信
好好学习量化交易

10

主题

537

回帖

6489

活跃度

回帖达人实盘认证实名认证

youbin9实盘认证 发表于 2022-10-22 18:35:33 | 显示全部楼层 | 关注 | 私信
好好学习,天天向上

15

主题

368

回帖

1625

活跃度

回帖达人实盘认证实名认证发贴达人

挖矿学习,感谢分享
温馨提示
无充值,无付费,唯一微信公众号24KRMB,珍惜账号,理性讨论 知道啦

评论管理|实名认证|黑名单|手机版|倡议书|版权声明|24KRMB ( 鄂ICP备19016902号 )

GMT+8, 2024-10-18 21:16 , Processed in 0.959761 second(s), 41 queries , Gzip On.

Copyright © 2012-2024 24KRMB.COM

Powered by 阿里云提供驱动 UI: 240701

快速回复 返回列表