可以套用的简单交易系统

楼主  收藏   举报   帖子创建时间:  2019-05-05 14:50 回复:0 关注量:513
本人在学习当中,拿出心得跟大家分享吧
  下面的代码是一个智能交易系统,并不是很麻烦,仅有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上编译执行,感兴趣的可以下载编译后进行测试
打赏