唐老师 发表于 2021-9-28 10:27:24

MT5CTP程序化交易开发14-16:均线交叉平仓

MT5CTP的视频教学可以到网站上关于我们栏目的EA邦的各视频平台里观看。
这是第16课的代码,其中已经包含了14-16课的代码:
EA文件代码:
//+------------------------------------------------------------------+
//|                                    Copyright 2020, EA邦      |
//|                                     http://www.eabang.com      |
//+------------------------------------------------------------------+
#define __MT5CTP__
// 包含库
#ifdef __MT5CTP__
#include <mt5ctp\mt5toctp.mqh>
#endif

#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.eabang.com"
#property version   "1.00"
//--- input parameters
input int      短均线=5;
input int      长均线=10;
input double   开仓量=1.0;
input int      止盈=100;
input int      止损=100;

CTrade    m_trade;
//+------------------------------------------------------------------+
//| Expert initialization function                                 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
   EventSetTimer(60);

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

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---

   double mad_1=ma(_Symbol,PERIOD_CURRENT,短均线,0,MODE_EMA,PRICE_CLOSE,1);
   double mac_1=ma(_Symbol,PERIOD_CURRENT,长均线,0,MODE_EMA,PRICE_CLOSE,1);
   double mad_2=ma(_Symbol,PERIOD_CURRENT,短均线,0,MODE_EMA,PRICE_CLOSE,2);
   double mac_2=ma(_Symbol,PERIOD_CURRENT,长均线,0,MODE_EMA,PRICE_CLOSE,2);
   
   if(mad_1>mac_1 && mad_2<mac_2)
   {
      if(ddsl(0)==0) //多单开仓
      {
         bool buyKc=m_trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,开仓量,SymbolInfoDouble(_Symbol,SYMBOL_SESSION_PRICE_LIMIT_MAX),0,0,"均线交叉多单");//开仓多单
         if(buyKc==true)
         {
            Alert("多单开仓成功!");
         }
         else
         {
            Alert("多单开仓失败!"+IntegerToString(GetLastError()));
         }
      }

      if(ddsl(1)>0) //空单平仓
      {
         bool cSell=closeAll(1);
         if(cSell==true)
         {
            Alert("空单平仓成功!");
         }
         else
         {
            Alert("空单平仓失败!"+IntegerToString(GetLastError()));
         }
      }
   }

   if(mad_1<mac_1 && mad_2>mac_2)
   {
      if(ddsl(1)==0) //空单开仓
      {
         bool sellKc=m_trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,开仓量,SymbolInfoDouble(_Symbol,SYMBOL_SESSION_PRICE_LIMIT_MIN),0,0,"均线交叉空单");//开仓空单
         if(sellKc==true)
         {
            Alert("空单开仓成功!");
         }
         else
         {
            Alert("空单开仓失败!"+IntegerToString(GetLastError()));
         }
      }

      if(ddsl(0)>0) //多单平仓
      {
         bool cBuy=closeAll(0);
         if(cBuy==true)
         {
            Alert("多单平仓成功!");
         }
         else
         {
            Alert("多单平仓失败!"+IntegerToString(GetLastError()));
         }
      }
   }
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
//---

}
//+------------------------------------------------------------------+
bool closeAll(int path)
{
   bool a=true;
   int ddzs=mt5ctp::MT5PositionsTotal();
   for(int i=0; i<ddzs; i++)
   {
      ulong ticket = 0;
      mt5ctp::MT5PositionGetTicket(i,ticket);
      MT5CTPOrders order_mt5;
      ZeroMemory(order_mt5);
      if(!mt5ctp::MT5PositionSelectByTicket(ticket,order_mt5))
         continue;
      string pos_symbol = ::CharArrayToString(order_mt5.symbol);
      int digit_symbol = (int)::SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS);

      if(order_mt5.type==path)
      {
         if(m_trade.PositionClose(ticket,0)==false)
            a=false;
      }
      //Print("编号=",i);
      //Print("品种=",pos_symbol);
      //Print("订单号=",order_mt5.ticket);
      //Print("开仓时间=",order_mt5.time);
      //Print("持仓方向=",order_mt5.type);
      //Print("开仓量=",order_mt5.volume);
      //Print("开仓价=",order_mt5.price,digit_symbol);
      //Print("止损价=",order_mt5.sl,digit_symbol);
      //Print("止盈价=",order_mt5.tp,digit_symbol);
      //Print("盈亏=",order_mt5.profit);
      //Print("魔术码=",order_mt5.magic);
      //Print("注释=",CharArrayToString(order_mt5.comment));
   }

   return(a);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double ma(string sym,ENUM_TIMEFRAMES zhouqi,int zhi,int bias,ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int k) //获取均线
{
   double buf[];
   ArraySetAsSeries(buf,true);
   int a=iMA(sym,zhouqi,zhi,bias,method,price);
   int copied=CopyBuffer(a,0,0,k+1,buf);
   return(buf);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int ddsl(int path)
{
   int a=0;
   int ddzs=mt5ctp::MT5PositionsTotal();
   for(int i=0; i<ddzs; i++)
   {
      ulong ticket = 0;
      mt5ctp::MT5PositionGetTicket(i,ticket);
      MT5CTPOrders order_mt5;
      ZeroMemory(order_mt5);
      if(!mt5ctp::MT5PositionSelectByTicket(ticket,order_mt5))
         continue;
      string pos_symbol = ::CharArrayToString(order_mt5.symbol);
      int digit_symbol = (int)::SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS);

      if(order_mt5.type==path)
      {
         a++;
      }
      //Print("编号=",i);
      //Print("品种=",pos_symbol);
      //Print("订单号=",order_mt5.ticket);
      //Print("开仓时间=",order_mt5.time);
      //Print("持仓方向=",order_mt5.type);
      //Print("开仓量=",order_mt5.volume);
      //Print("开仓价=",order_mt5.price,digit_symbol);
      //Print("止损价=",order_mt5.sl,digit_symbol);
      //Print("止盈价=",order_mt5.tp,digit_symbol);
      //Print("盈亏=",order_mt5.profit);
      //Print("魔术码=",order_mt5.magic);
      //Print("注释=",CharArrayToString(order_mt5.comment));
   }

   return(a);
}
//+------------------------------------------------------------------+
脚本文件代码:
//+------------------------------------------------------------------+
//|                                    Copyright 2020, EA邦      |
//|                                     http://www.eabang.com      |
//+------------------------------------------------------------------+
#define __MT5CTP__
// 包含库
#ifdef __MT5CTP__
#include <mt5ctp\mt5toctp.mqh>
#endif

#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.eabang.com"
#property version   "1.00"

CTrade    m_trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//---
//m_trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,1,SymbolInfoDouble(_Symbol,SYMBOL_SESSION_PRICE_LIMIT_MAX),0,0,"均线交叉多单");
//m_trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,1,SymbolInfoDouble(_Symbol,SYMBOL_SESSION_PRICE_LIMIT_MIN),0,0,"均线交叉空单");

   Print(closeAll(1));
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
bool closeAll(int path)
{
   bool a=true;
   int ddzs=mt5ctp::MT5PositionsTotal();
   for(int i=0; i<ddzs; i++)
   {
      ulong ticket = 0;
      mt5ctp::MT5PositionGetTicket(i,ticket);
      MT5CTPOrders order_mt5;
      ZeroMemory(order_mt5);
      if(!mt5ctp::MT5PositionSelectByTicket(ticket,order_mt5))
         continue;
      string pos_symbol = ::CharArrayToString(order_mt5.symbol);
      int digit_symbol = (int)::SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS);

      if(order_mt5.type==path)
      {
         if(m_trade.PositionClose(ticket,0)==false) a=false;
      }
      //Print("编号=",i);
      //Print("品种=",pos_symbol);
      //Print("订单号=",order_mt5.ticket);
      //Print("开仓时间=",order_mt5.time);
      //Print("持仓方向=",order_mt5.type);
      //Print("开仓量=",order_mt5.volume);
      //Print("开仓价=",order_mt5.price,digit_symbol);
      //Print("止损价=",order_mt5.sl,digit_symbol);
      //Print("止盈价=",order_mt5.tp,digit_symbol);
      //Print("盈亏=",order_mt5.profit);
      //Print("魔术码=",order_mt5.magic);
      //Print("注释=",CharArrayToString(order_mt5.comment));
   }

   return(a);
}

乒乓球 发表于 2021-10-10 20:58:12

H://ea
你好唐老师,恢复调试中开仓失败是啥原因?

乒乓球 发表于 2021-10-10 20:59:47

你好唐老师,恢复调试中开仓失败是啥原因?是需要开盘的情况下吗?

zxyooo888 发表于 2022-10-12 10:31:43

厉害厉害

cuiyouli 发表于 2022-12-29 19:43:24

看着就晕……老师辛苦了
页: [1]
查看完整版本: MT5CTP程序化交易开发14-16:均线交叉平仓