陶飞 发表于 2023-5-27 21:51:41

ArtificialIntelligence_Panda

//+------------------------------------------------------------------+
//|                                 ArtificialIntelligence_Panda.mq4 |
//|                                  Copyright 2011-2023, Justin Tao |
//|                         https://www.mql5.com/zh/users/taofei7456 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, Justin Tao"
#property link      "https://www.mql5.com/zh/users/taofei7456"

extern string 初始开仓量;
extern double Lots=0.01;


string TradeSignal="N/A";//交易信号,Buy,Sell,N/A


//+------------------------------------------------------------------+
//| expert initialization function                                 |
//+------------------------------------------------------------------+
int init()
{
//----

//----
   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                          |
//+------------------------------------------------------------------+
int start()
{
//----
   SendTradeSignal();
   Trade();
//----
   return(0);
}
//+------------------------------------------------------------------+

/*
函数:根据信号新开仓以及挂单处理
      根据ATR参数计算止损点,针对持仓订单执行移动止损
      平仓:止损自动平仓
*/
void Trade()
{
   int mySPREAD=MarketInfo(Symbol(),MODE_SPREAD);//获取市场滑点
   double CurrentSL,CurrentTP;
   //根据ATR参数计算止损点,ATR(0)*1.5为止损
   double StopLoss=1.5*iATR(NULL,0,14,0);
   //新开仓
   if (OrdersTotal()==0)
      {
       if (TradeSignal=="Sell")
          {
         CurrentSL=Bid+StopLoss;//当前价的止损价
         CurrentTP=Bid-StopLoss;
         OrderSend(Symbol(),OP_SELL,Lots,Bid,mySPREAD,CurrentSL,CurrentTP);
          }
       if (TradeSignal=="Buy")
          {
         CurrentSL=Ask-StopLoss;//当前价的止损价
         CurrentTP=Ask+StopLoss;
         OrderSend(Symbol(),OP_BUY,Lots,Ask,mySPREAD,CurrentSL,CurrentTP);
          }
      }
   //补仓
   if (OrdersTotal()>0)
   {
      if (OrderSelect(OrdersTotal()-1,SELECT_BY_POS)==false) return(0);//选择当前订单
      //新增仓订单时间不足一个时间周期,不做任何操作返回
      if (TimeCurrent() - OrderOpenTime() <=Period()*60) return (0);
      //开始补仓
       if (TradeSignal=="Sell")
          {
         CurrentSL=Bid+StopLoss;//当前价的止损价
         CurrentTP=Bid-StopLoss;
         OrderSend(Symbol(),OP_SELL,Lots,Bid,mySPREAD,CurrentSL,CurrentTP);
          }
       if (TradeSignal=="Buy")
          {
         CurrentSL=Ask-StopLoss;//当前价的止损价
         CurrentTP=Ask+StopLoss;
         OrderSend(Symbol(),OP_BUY,Lots,Ask,mySPREAD,CurrentSL,CurrentTP);
          }
   }

   //移动止损止盈:遍历所有持仓单,修改止损止盈价位
   if (OrdersTotal()>0)
   {
      int G_Count;
      for(G_Count=OrdersTotal();G_Count>=0;G_Count--)
       {
      if(OrderSelect(G_Count,SELECT_BY_POS)==false) continue;
         else
         {
            if (OrderProfit()>0 && OrderType()==0)
            {
               CurrentSL=Ask-StopLoss;//当前价的止损价
               CurrentTP=Ask+StopLoss;
               OrderModify(OrderTicket(),OrderOpenPrice(),CurrentSL,CurrentTP,0);
            }
            if (OrderProfit()>0 && OrderType()==1)
            {
               CurrentSL=Bid+StopLoss;//当前价的止损价
               CurrentTP=Bid-StopLoss;
               OrderModify(OrderTicket(),OrderOpenPrice(),CurrentSL,CurrentTP,0);
            }
         }
       }
   }
}

/*
函数:计算交易信号
      1、两条均线:EMA5 EMA55
      2、两条布林线: 标准差2和标准差1,ma为20
      3、EMA55向上,当5日均线上穿20日均线(布林中轨),发出做多Buy信号
      4、EMA55向下,当5日均线下穿20日均线,发出做空Sell信号
      5、55均线无明确方向,发出N/A信号
      6、布林线开口收缩小于10点,发出N/A信号
*/
string SendTradeSignal()
{
   //获取指标度数
   TradeSignal="N/A";
   double myMA_5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);//MA5
   double myBollong_Up=iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,0);//布林20日上线
   double myBollong_Main=iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0);//布林20日主线
   double myBollong_Down=iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,0);//布林20日下线
   //判断MA55的方向,10个蜡烛连续依次大于(小于)为向上(向下),否则,不交易
   string MA55_UpSignal,MA55_DownSignal;//MA55方向临时信号变量
   string Bolling_Signal;//布林带临时信号变量
   int i;//循环变量
   for (i=0;i<10;i++)
   {
      double MA_55_now=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i);//MA55当前值
      double MA_55_pre=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i+1);//MA55前值
      if (MA_55_now>MA_55_pre) MA55_UpSignal="UP";//连续大于,给出向上信号
      if (MA_55_now<=MA_55_pre)//出现小于等于,给出不交易信号,中断判断循环
      {
         MA55_UpSignal="N/A";
         break;
      }
   }
   for (i=0;i<10;i++)
   {
      MA_55_now=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i);//MA55当前值
      MA_55_pre=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i+1);//MA55前值
      if (MA_55_now<MA_55_pre) MA55_DownSignal="Down";//连续小于,给出向下信号
      if (MA_55_now>=MA_55_pre)//出现大于等于,给出不交易信号,中断判断循环
      {
         MA55_DownSignal="N/A";
         break;
      }
   }
   //EMA55向上,当5日均线上穿20日均线(布林中轨),发出做多Buy信号
   if (MA55_UpSignal=="UP" && (myMA_5>myBollong_Main)) TradeSignal="Buy";
   //EMA55向下,当5日均线下穿20日均线,发出做空Sell信号
   if (MA55_DownSignal=="Down" && (myMA_5<myBollong_Main)) TradeSignal="Sell";
   //判断布林线不交易信号
   if (MathAbs(myBollong_Up-myBollong_Down)<100*Point) TradeSignal="N/A";
   //文字显示、图表标注交易信号
   SetLable("信息栏","交易信号:"+TradeSignal,5,20,10,"Verdana",Olive);
   DrawTradPoint(TradeSignal,Close);
   return(TradeSignal);//函数返回交易信号
}

/*
函数:在屏幕上显示标签
      LableName:标签名称;LableDoc:文本内容;LableX:标签X位置;LableY:标签Y位置;
      DocSize:文本字号;DocStyle:文本字体;DocColor:文本颜色
*/
void SetLable(string LableName,string LableDoc,int LableX,int LableY,
            int DocSize,string DocStyle,color DocColor)
   {
   ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0);
   ObjectSetText(LableName,LableDoc,DocSize,DocStyle,DocColor);
   ObjectSet(LableName, OBJPROP_XDISTANCE, LableX);
   ObjectSet(LableName, OBJPROP_YDISTANCE, LableY);
   }

/*
函数:画出交易点,红箭头为卖出,绿箭头为买入,圆圈为突破点
*/
void DrawTradPoint(string mySignal,double myPrice)
{
   if (mySignal=="Buy")
      {
       ObjectCreate("BuyPoint-"+Time,OBJ_ARROW,0,Time,myPrice);
       ObjectSet("BuyPoint-"+Time,OBJPROP_COLOR,Green);
       ObjectSet("BuyPoint-"+Time,OBJPROP_ARROWCODE,241);
      }
   if (mySignal=="Sell")
      {
       ObjectCreate("SellPoint-"+Time,OBJ_ARROW,0,Time,myPrice);
       ObjectSet("SellPoint-"+Time,OBJPROP_COLOR,Red);
       ObjectSet("SellPoint-"+Time,OBJPROP_ARROWCODE,242);
      }
}


liuqianshuai 发表于 2023-5-28 11:09:41

干货满满,一看就懂{:1_210:}

陶飞 发表于 2023-5-28 19:52:11

liuqianshuai 发表于 2023-5-28 11:09
干货满满,一看就懂

多多交流,微信taofei7456

外汇韭菜78 发表于 2023-5-31 09:37:30

不开单

陶飞 发表于 2023-5-31 10:55:59

外汇韭菜78 发表于 2023-5-31 09:37
不开单

可以开单,是不是MT4版本问题?或者重新生成EX4文件

ahuangabc 发表于 2023-6-17 23:25:42

回测不出楼主的澳美效果图

清静无为 发表于 2023-6-20 12:15:20

怎么生成EX4文件?

赚钱的方法 发表于 2024-11-29 14:05:49

{:1_189:}
页: [1]
查看完整版本: ArtificialIntelligence_Panda