可以套用的简单交易系统
本人在学习当中,拿出心得跟大家分享吧 下面的代码是一个智能交易系统,并不是很麻烦,仅有200多行代码 开仓手数为了方便并未使用资金管理,如果还有不明白的地方可以跟帖询问。 复制内容到剪贴板 代码: //+------------------------------------------------------------------+ //| Designed by . China | //| Copyright 2007, | //| 这是一个智能交易系统,不是指标 | //+------------------------------------------------------------------+ #property copyright "Copyright 2007, haha " #property link "" #define MAGICMA 200708081234 //+------------------------------------------------------------------+ //| 注意没有指标文件那些property | //+------------------------------------------------------------------+ //在主函数和子函数外定义的变量为全局变量,全局变量的值在系统执行过程中是不变的,使用extern的作用是 //定义时对全局变量进行赋值,系统使用过程中,用户可以修改. extern int whichmethod = 1; //1~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(lotmaxLots) 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() //在这个函数计算设置你的交易信号 { 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(MacdCurrentSignalCurrent && MacdPreviousMaPrevious) return (1); // 买 Ma在上升,Macd在0线上,并且两线上交叉 if(MacdCurrent>0 && MacdCurrentSignalPrevious && MaCurrent 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 (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); } } } } } 以上代码已编译通过,可直接在mt4上编译执行,感兴趣的可以下载编译后进行测试 |
打赏
最新创建圈子
- 新闻EA运行效果图圈 2019-05-05
圈主:admin 帖子:1