找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
首页论坛EAHub 外汇论坛
查看: 13|回复: 0

趋势交易系统

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-23 01:20:00 | 显示全部楼层 |阅读模式
//+------------------------------------------------------------------+
//|                                                           ma.mq4 |
//|                                                             dzsq |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "dzsq"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


extern int longMa=20;   //长均线
extern int shortMa=10;  //短均线
extern int callBachMa=30;

extern int stop = 300; //止损
extern int limit = 900; //止盈
extern double lots=1;  //手数
extern double movestop = 500; //移动止损
extern int magic = 12345;

bool isCrossBuy = false; //是否交叉
bool isCrossSell = false;
//是否会调到支撑线
bool isSellCallback = false;
bool isBuyCallback = false;
//是否开仓
bool isBuyOpened=false;
bool isSellOpened=false;

datetime buytime=0;
datetime selltime=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {   
     //向下取整
     //lots = MathFloor(AccountBalance()/10000);
     //获取所有的均线价格,长期,短期,回调
     double longmaPrice1 = iMA(NULL,0,longMa,0,MODE_SMA,PRICE_CLOSE,1);
     double longmaPrice2 = iMA(NULL,0,longMa,0,MODE_SMA,PRICE_CLOSE,2);
     double shortmaPrice1 = iMA(NULL,0,shortMa,0,MODE_SMA,PRICE_CLOSE,1);
     double shortmaPrice2 = iMA(NULL,0,shortMa,0,MODE_SMA,PRICE_CLOSE,2);
     double  callBackPrice = iMA(NULL,0,callBachMa,0,MODE_SMA,PRICE_CLOSE,0);

     //均线交叉多头
     if (shortmaPrice1>longmaPrice1 && shortmaPrice2<longmaPrice2){
        isCrossBuy = true;
        isCrossSell = false;
        isSellOpened = false;
        isSellCallback = false;
        closesell(Symbol()+"sell",magic);
     }

     //均线交叉空头
     if (shortmaPrice1<longmaPrice1 && shortmaPrice2>longmaPrice2){
        isCrossBuy = false;
        isCrossSell = true;
        isBuyOpened = false;
        isBuyCallback = false;
        closebuy(Symbol()+"buy",magic);
     }

     double lowPrice = Low[0];
     double highPrice = High[0];
     double openPrice = Open[0];
     double closePrice = Close[0];
     //符合做多的条件
     if(!isBuyOpened && isCrossBuy && lowPrice < callBackPrice){
         //time[0]  表示当前时间
        if (buytime!=Time[0]){   //解决当前K线重复下单的问题
          if ( buy(lots,stop,limit,Symbol()+"buy",magic)){
            buytime=Time[0];
            isBuyOpened = true;
          }

        }
     }
     //符合做空的条件
     if(!isSellOpened && isCrossSell && highPrice > callBackPrice){
         //time[0]  表示当前时间
        if (selltime!=Time[0]){   //解决当前K线重复下单的问题
           if (sell(lots,stop,limit,Symbol()+"sell",magic)){

              selltime=Time[0];
              isSellOpened = true;

           }

        }
     }
     yidongzhisun();
  }

  //下单函数 针对一个单子
  int buy(double lots,double stop , double limit,string comm,int buymagic){  //手数,止损,止盈,注释,magic
      int ticket=0;   //订单号
      bool zhaodan = false;  //判断有没有重复下单,其实上面已经写过了,这里不写也没关系
      for (int i=0; i < OrdersTotal(); i++){

         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
           string zhushi = OrderComment();
           int magicNumber = OrderMagicNumber();

           if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && zhushi==comm && magicNumber==buymagic){
             zhaodan = true;
             break;
           }
         }
      }
      if (zhaodan==false){
         if (stop!=0 && limit==0){
            ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,50,Ask-stop*Point,0,comm,buymagic,0,White);
         }
         if (stop==0 &&limit!=0)
             ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,50,0,Ask+limit*Point,comm,buymagic,0,White);
         if (stop==0 &&limit==0)
             ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,50,0,0,comm,buymagic,0,White);

         if (stop!=0 &&limit!=0)
             ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,50,Ask-stop*Point,Ask+limit*Point,comm,buymagic,0,White);

      }

      return (ticket);

  }

  //下单函数 针对一个单子
  int sell(double lots,double stop , double limit,string comm,int sellmagic){  //手数,止损,止盈,注释,magic
      int ticket=0;   //订单号
      bool zhaodan = false;  //判断有没有重复下单,其实上面已经写过了,这里不写也没关系
      for (int i=0; i < OrdersTotal(); i++){

         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
           string zhushi = OrderComment();
           int magicNumber = OrderMagicNumber();

           if (OrderSymbol()==Symbol() && OrderType()==OP_SELL && zhushi==comm && magicNumber==sellmagic){
             zhaodan = true;
             break;
           }
         }
      }
      if (zhaodan==false){
         if (stop!=0 && limit==0){
            ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,50,Bid+stop*Point,0,comm,sellmagic,0,White);
         }
         if (stop==0 &&limit!=0)
             ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,50,0,Bid-limit*Point,comm,sellmagic,0,White);
         if (stop==0 &&limit==0)
             ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,50,0,0,comm,sellmagic,0,White);

         if (stop!=0 &&limit!=0)
             ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,50,Bid+stop*Point,Bid-limit*Point,comm,sellmagic,0,White);

      }

      return (ticket);

  }
  // 平货币
  void closebuy(string comm,int magic){
     for (int i=OrdersTotal()-1; i >=0; i--){
         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){

           if (OrderSymbol()==Symbol() && OrderType() == OP_BUY && OrderComment() == comm && OrderMagicNumber() == magic){
             OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),300,Green);  
           }
         }
       }

  }
  // 平货币
  void closesell(string comm,int magic){
     for (int i=OrdersTotal()-1; i >=0; i--){
         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){

           if (OrderSymbol()==Symbol() && OrderType()== OP_SELL && OrderComment() == comm && OrderMagicNumber() == magic){
             OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),300,Green);  
           }
         }
       }

  }
//设置移动止损
void yidongzhisun(){
  for (int i=0; i<OrdersTotal();i++)
  {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){

      if (OrderSymbol()==Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == magic){

         if ((Bid-OrderOpenPrice())>=Point*movestop){

            if (OrderStopLoss() <(Bid-Point*movestop) || OrderStopLoss()==0){
              OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*movestop,OrderTakeProfit(),0,Green);
            }
         }
      }
      if (OrderSymbol()==Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == magic){

         if ((OrderOpenPrice()-Ask)>=Point*movestop){

            if (OrderStopLoss() <(Ask + Point*movestop) || OrderStopLoss()==0){
              OrderModify(OrderTicket(),OrderOpenPrice(),Ask + Point*movestop,OrderTakeProfit(),0,Green);
            }
         }
      }
      }
  }
}

//+------------------------------------------------------------------+

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

本版积分规则

QQ|Archiver|手机版|小黑屋|EAHub外汇论坛

GMT+8, 2026-10-12 13:15 , Processed in 0.101870 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表