大文 发表于 2024-10-10 22:04:45

mql5源码修改,MT5修改,MQL5代码修改,开仓平仓修改。

开仓和平仓不太对,修改一下,谢谢。


下面是代码。
//+------------------------------------------------------------------+
//|                                                      
//|                                 Copyright 2024,TradingVUE Ltd. |
//|                                       https://www.tradingvue.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024,TradingVUE Ltd."
#property link      "https://www.tradingvue.net"
#property version   "1.00"

#include <Expert\Money\MoneyFixedRisk.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>

CSymbolInfo m_symbol;
CTrade      m_trade;
CPositionInfo   m_position;
CMoneyFixedRisk m_money;

input int      maLength   = 233;            // 均线长度
input int      Inp_src      = PRICE_MEDIAN;   // 均线源值
input double   fib1         = 1.618;            // 裴波那契水平1
input double   fib2         = 2.618;            // 裴波那契水平2
input double   fib3         = 4.236;            // 裴波那契水平3
input int      kcMultiplier = 2 ;               // 肯特纳倍数
input int      kcLength   = 89;               // 肯特纳长度

input double   Inp_lot      = 0.1;            // 下单手数
input int      inp_magic      = 5555;             // 幻数
input bool   CloseAll       = true;                           // 全平
input bool   CloseAllProfit = false;                            // 平盈利
input bool   CloseAllLoss   = false;                            // 平亏损

int handle_ma, handle_tr, handle_atr, handle_rsi;


//+------------------------------------------------------------------+
//| Expert initialization function                                 |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   m_symbol.Name(Symbol());//初始化商品品种
   
   int dig = 1;
   if(m_symbol.Digits() == 3 || m_symbol.Digits() == 5)
      dig = 10;
   if(m_symbol.Digits() == 2)
      dig = 100;      
   m_money.Init(GetPointer( m_symbol), PERIOD_CURRENT, m_symbol.Point() * dig );

   handle_ma = iMA(m_symbol.Name(), PERIOD_CURRENT, maLength, 0, MODE_EMA, Inp_src);//获取指标
   handle_tr = iATR(m_symbol.Name(), PERIOD_CURRENT, 1);//获取指标
   handle_atr = iMA(m_symbol.Name(), PERIOD_CURRENT, kcLength, 0, MODE_SMA, handle_tr);//获取指标
   handle_rsi = iRSI(m_symbol.Name(), PERIOD_CURRENT,14, Inp_src);
   ChartIndicatorAdd(ChartID(), 0, handle_ma);//画图。 将指标可视化
   
   
   //m_trade.SetExpertMagicNumber(inp_magic);//幻数
   //m_trade.SetMarginMode();
   
   //滑点
   //m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   //m_trade.SetDeviationInPoints(10);   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   SetTime();
   
   
   if(!isNewBar())
   {
      return;
   }
   
   Refresh();
   
   // 获取指标中的数据--
   double kcAverageTrueRange[], ma[], rsi[];//数组,存放指标数据
   
   //Copy方式 获取数值
   ArraySetAsSeries(kcAverageTrueRange, true);//倒序排列,形成时间序列排序
   ArraySetAsSeries(ma, true);
   ArraySetAsSeries(rsi, true);
   
   //读取指标数据
   int to_copy=2;
   GetArray(handle_atr, 0, 0, to_copy, kcAverageTrueRange);
   GetArray(handle_ma,0, 0, to_copy, ma);
   GetArray(handle_rsi, 0, 0, to_copy, rsi);
   
   double kcUpper,kcLower;
   //double fbUpper1,fbLower1;   
   //double fbUpper2,fbLower2;
   double fbUpper3,fbLower3;
   for(int i=0; i<2 ; i++)
   {
      kcUpper = ma + kcMultiplier * kcAverageTrueRange;
      kcLower = ma - kcMultiplier * kcAverageTrueRange;
      
      // Calculate the Fibonacci Bands
      //fbUpper1 = ma + fib1 * (kcUpper - ma);
      //fbUpper2 = ma + fib2 * (kcUpper - ma);
      fbUpper3 = ma + fib3 * (kcUpper - ma);
      //fbLower1 = ma - fib1 * (ma - kcLower);
      //fbLower2 = ma - fib2 * (ma - kcLower);
      fbLower3 = ma - fib3 * (ma - kcLower);   
      
   }


   

   //开多单
   if(Close(0)<fbLower3 && Close(1)>fbLower3 && rsi<40)
   {
      m_trade.Buy(Inp_lot);
      //OpenSell(Inp_lot, sl, tp);
   }
   //开空单
   if(Close(0)>fbUpper3 && Close(1)<fbUpper3 && rsi>60)
   {
      m_trade.Sell(Inp_lot);
      //OpenBuy(Inp_lot, sl, tp);
   }

   if(PositionsTotal() == 0 )   return;

   // 基线交叉时全部平仓
   if((Close(0)<ma && Close(1)>ma) || (Close(0)>ma && Close(1)<ma))
   {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))   // selects the position by index for further access to its properties
      {
         if(CloseAll) // m_trade.PositionClose(m_position.Symbol());
            ClosePosition(m_position.Symbol()); // close a position by the specified symbo
         else if(CloseAllProfit)
         {
            if(m_position.Commission()+m_position.Swap()+m_position.Profit()>0.0)
               ClosePosition(m_position.Symbol()); // close a position by the specified symbo
         }
         else if(CloseAllLoss)
         {
            if(m_position.Commission()+m_position.Swap()+m_position.Profit()<0.0)
               ClosePosition(m_position.Symbol());// close a position by the specified symbo
         }
      }
   }   
   
      
}
//+------------------------------------------------------------------+


//刷新函数
bool Refresh(void)
{
   if(!m_symbol.RefreshRates())
   {
      Print("refresh error");
      return (false);
   }
   if(m_symbol.Ask() == 0 || m_symbol.Bid() == 0)
   {
      Print("refresh error");
      return (false);
   }
   
   return(true);
}


//买入函数
bool OpenBuy(double lot, double sl = 0.0, double tp = 0.0)
{
   if (sl > 0 && tp > 0)
   {
      sl = m_symbol.NormalizePrice(sl);//返回规范价格形式
      tp = m_symbol.NormalizePrice(tp);
   }
   
   if(m_trade.Buy(lot, m_symbol.Name(), m_symbol.Ask(), sl, tp))
   {
      return(true);
   }
   else
   {
      Print("Error:", GetLastError());
      return(false);
   }
}
//卖出函数
bool OpenSell(double lot, double sl = 0.0, double tp = 0.0)
{
   if (sl > 0 && tp > 0)
   {
      sl = m_symbol.NormalizePrice(sl);//返回规范价格形式
      tp = m_symbol.NormalizePrice(tp);
   }
   
   if(m_trade.Sell(lot, m_symbol.Name(), m_symbol.Bid(), sl, tp))
   {
      return(true);
   }
   else
   {
      Print("Error:", GetLastError());
      return(false);
   }
}


//获取开盘价格
double Open(const int idx)
{
   return iOpen(m_symbol.Name(), PERIOD_CURRENT, idx);//品种,周期,K线
}
//获取收盘价格
double Close(const int idx)
{
   return iClose(m_symbol.Name(), PERIOD_CURRENT, idx);
}
//获取最低价格
double Low(const int idx)
{
   return iLow(m_symbol.Name(), PERIOD_CURRENT, idx);
}
//获取最高价格
double High(const int idx)
{
   return iHigh(m_symbol.Name(), PERIOD_CURRENT, idx);
}


//检查是不是新K线
bool isNewBar()
{
   static datetime last_time = 0;
   datetime lastbar_time = datetime(SeriesInfoInteger(Symbol(), Period(), SERIES_LASTBAR_DATE));
   if(last_time == 0)
   {
      last_time = lastbar_time;
      return(false);
   }
   if(last_time != lastbar_time)
   {
      last_time = lastbar_time;
      return(true);
   }
   return(false);
}

//显示交易时间
void SetTime(void)
{
   if(ObjectFind(0, "LastTime") < 0)
   {
      //时间初始化
      ObjectCreate(0, "LastTime", OBJ_LABEL, 0, 0, 0);
      //x坐标
      ObjectSetInteger(0, "LastTime", OBJPROP_XDISTANCE, 100);
      //Y坐标
      ObjectSetInteger(0, "LastTime", OBJPROP_YDISTANCE, 2);
      //文本颜色
      ObjectSetInteger(0, "LastTime", OBJPROP_COLOR, clrDimGray);
      ObjectSetInteger(0, "LastTime", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
      ObjectSetInteger(0, "LastTime", OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
      
   }
   
   MqlRates rates[];
   CopyRates(m_symbol.Name(), 0, 0, 1, rates);
   
   int total = int(rates.time + PeriodSeconds() - TimeCurrent());
   int s = total % 60;
   int m = (total - s) / 60;
   
   //标签文本
   ObjectSetString(0, "LastTime", OBJPROP_TEXT, " Next Bar:" + IntegerToString(m) + ":" + IntegerToString(s) );
   //字体大小
   ObjectSetInteger(0, "LastTime", OBJPROP_FONTSIZE, 10);
   //禁止鼠标选择
   ObjectSetInteger(0, "LastTime", OBJPROP_SELECTABLE, false);
   //绘制
   ChartRedraw(0);
}



//获取数组
bool GetArray(const int handle, const int buffer, const int start_pos, const int count, double &arr_buffer[])
{
   bool result = false;
   
   if(!ArrayIsDynamic(arr_buffer))
   {
      Print("is not dynamic array!");//非动态数组错误,返回
      return(false);
   }
   
   ArrayFree(arr_buffer);//清空数组
   ResetLastError();//重置最后错误为空
   
   int copied = CopyBuffer(handle, buffer, start_pos, count, arr_buffer);//返回值是复制的数据数,错误时是-1
   
   if(copied != count)
   {
      Print("Failed to copy data from the indicator, error code: %d", GetLastError());
      return(false);
   }
   else
   {
      return(true);
   }
   
   return(result);
}



//+------------------------------------------------------------------+
//| Close selected position                                          |
//+------------------------------------------------------------------+
void ClosePosition(const string symbol)
{
   if(InitTrade(symbol))
      m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbo
}
//+------------------------------------------------------------------+
//| Init trade object                                                |
//+------------------------------------------------------------------+
bool InitTrade(const string symbol)
{
   if(!m_symbol.Name(symbol)) // sets symbol name
      return(false);
//---
   if(IsFillingTypeAllowed(symbol,SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(symbol,SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---
   return(true);
//---
}
//+------------------------------------------------------------------+
//| Checks if the specified filling mode is allowed                  |
//+------------------------------------------------------------------+
bool IsFillingTypeAllowed(string symbol,int fill_type)
{
//--- Obtain the value of the property that describes allowed filling modes
   int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- Return true, if mode fill_type is allowed
   return((filling & fill_type)==fill_type);
}
//+------------------------------------------------------------------+

页: [1]
查看完整版本: mql5源码修改,MT5修改,MQL5代码修改,开仓平仓修改。