
编制自动交易系统的基本知识
MetaTrader 4
—
示例
|
Introduction介绍
鉴于许多中国的交易者对交易系统了解不多,本文解释使用MQ4语言编制自动交易系统的基本知识.
Title 编制自动交易系统的基本知识
一个交易系统大致包括以下几个方面:
1 开仓策略,即什么条件满足时开仓, 如某条线和某条线上交叉或下交叉,
2 平仓策略,即什么条件满足时平仓, 包括止赢设置,止损设置,和跟踪止赢设置三个方面.
3 资金管理, 其中一个方面就是下单的大小
4 时间管理, 如持仓时间,开平仓时间间隔等
5 账户状态分析,如交易历史,当前资金/仓位/各仓为盈亏状态等.
当然一个交易系统不必包括全部内容,本文做为入门知识也仅通过实例介绍交易系统程序的基本构成.
//+------------------------------------------------------------------+ //| Designed by OKwh, China | //| Copyright 2007, OKwh Dxdcn | //| |<//+----------------------------+ #property copyright "Copyright 2007 , Dxd, China." #property link "http://blog.sina.com.cn/FXTrade , https://www.mql4.com/ users/DxdCn" #define MAGICMA 200610011231 //+------------------------------------------------------------------+ //| 注意没有指标文件那些property | //+------------------------------------------------------------------+ extern int whichmethod = 1; //1~4 种下单方式 1 仅开仓, 2 有止损无止赢, 3 有止赢无止损, 4 有止赢也有止损 extern double TakeProfit = 100; //止赢点数 extern double StopLoss = 20; //止损点数 extern double MaximumRisk = 0.3; //资金控制,控制下单量 extern double TrailingStop =25; //跟踪止赢点数设置 extern int maxOpen = 3; //最多开仓次数限制 extern int maxLots = 5; //最多单仓持仓量限制 extern int bb = 0; //非零就允许跟踪止赢 extern double MATrendPeriod=26;//使用26均线 开仓条件参数 本例子 int i, p2, xxx,p1, res; double Lots; datetime lasttime; //时间控制, 仅当一个时间周期完成才检查条件 int init() //初始化 { Lots = 1; lasttime = NULL; return(0); } int deinit() { return(0); } //反初始化 //主程序 int start() { CheckForOpen(); //开仓 平仓 条件检查 和操作 if (bb>0) CTP(); //跟踪止赢 return(0); } //+------下面是各子程序--------------------------------------------+ double LotsOptimized() //确定下单量,开仓调用 资金控制 { double lot=Lots; int orders=HistoryTotal(); // history orders total int losses=0; // number of losses orders without a break //MarketInfo(Symbol(),MODE_MINLOT); 相关信息 //MarketInfo(Symbol(),MODE_MAXLOT); //MarketInfo(Symbol(),MODE_LOTSTEP); lot=NormalizeDouble(MaximumRisk * AccountBalance()/AccountLeverage(),1); //开仓量计算 if(lot<0.1) lot=0.1; if(lot>maxLots) lot=maxLots; return(lot); } //平仓持有的买单 void CloseBuy() { if (OrdersTotal( ) > 0 ) { for(i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,3,White); Sleep(5000); } } } } //平仓持有的卖单 void CloseSell() { if (OrdersTotal( ) > 0 ) { for(i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,3,White); Sleep(5000); } } } } //判断是否买或卖或平仓 int buyorsell() //在这个函数计算设置你的交易信号 这里使用MACD 和MA 做例子 { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MaCurrent>MaPrevious) return (1); // 买 Ma在上升,Macd在0线上,并且两线上交叉 if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MaCurrent<MaPrevious) return (-1); // 卖 return (0); //不交易 } int nowbuyorsell = 0; void CheckForOpen() { if (Time[0] == lasttime ) return; //每时间周期检查一次 时间控制 lasttime = Time[0]; nowbuyorsell = buyorsell(); //获取买卖信号 if (nowbuyorsell == 1) //买 先结束已卖的 CloseSell(); if (nowbuyorsell == -1) //卖 先结束已买的 CloseBuy(); if (TimeDayOfWeek(CurTime()) == 1) { if (TimeHour(CurTime()) < 3 ) return; //周一早8点前不做 具体决定于你的时区和服务器的时区 时间控制 } if (TimeDayOfWeek(CurTime()) == 5) { if (TimeHour(CurTime()) > 19 ) return; //周五晚11点后不做 } if (OrdersTotal( ) >= maxOpen) return ; //如果已持有开仓次数达到最大,不做 if (nowbuyorsell==0) return; //不交易 TradeOK(); //去下单交易 } void TradeOK() //去下单交易 { int error ; if (nowbuyorsell == 1) //买 { switch (whichmethod) { case 1: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);break; case 2: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,0,"",MAGICMA,0,Blue); break; case 3: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,Ask+TakeProfit*Point,"",MAGICMA,0,Blue);break; case 4: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGICMA,0,Blue);break; default : res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);break; } if (res <=0) { error=GetLastError(); if(error==134)Print("Received 134 Error after OrderSend() !! "); // not enough money if(error==135) RefreshRates(); // prices have changed } Sleep(5000); return ; } if (nowbuyorsell == -1) //卖 { switch (whichmethod) { case 1: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); break; case 2: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,0,"",MAGICMA,0,Red); break; case 3: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,Bid-TakeProfit*Point,"",MAGICMA,0,Red); break; case 4: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGICMA,0,Red); break; default : res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); break; } if (res <=0) { error=GetLastError(); if(error==134) Print("Received 134 Error after OrderSend() !! "); // not enough money if(error==135) RefreshRates(); // prices have changed } Sleep(5000); return ; } } void CTP() //跟踪止赢 { bool bs = false; for (int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if (OrderType() == OP_BUY) { if ((Bid - OrderOpenPrice()) > (TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT))) //开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置 { if (OrderStopLoss() < Bid - TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT)) { bs = OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(),0, Green); } } } else if (OrderType() == OP_SELL) { if ((OrderOpenPrice() - Ask) > (TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT))) //开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置 { if ((OrderStopLoss()) > (Ask + TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT))) { bs = OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(),0, Tan); } } } } }
Conclusion 结论
本例 介绍了自动交易系统程序文件的基本构成, 略加修改就可以用于建立你自己系统.
比如根据你的下单策略修改buyorSell()函数.
注: 本人2006比赛的系统就是这样的框架, 2007 比赛当然也将是这样的框架
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.

21种快捷方法: MetaTrader 4客户端的潜在功能。
全屏模式;热键;快捷键;迷你窗口;收藏;图表最小化; 新闻显示; 货币对设置;市场观察;测试图表和独立图表模板;数据图表;十字光标;电子尺; 柱图表数据;图表中历史账户;定单类型;修改止损和赢利; 取消删除;打印图表。
感谢楼主分享!学习啦!
怎么看着头大啊
这样还头大吗?
//主程序
int start()
{
CheckForOpen(); //开仓 平仓 条件检查 和操作
if (bb>0) CTP(); //跟踪止赢
return(0);
}
外汇、贵金属技术分析交流群,感兴趣的可以加群:246265071 验证:5188Gold
群内只做技术分析 ,希望汲取投资经验达到共赢!