设为首页 收藏本站 切换语言

有關MT5的CopyBuffer用法請教

| 发表于 2025-4-25 19:49:50 | 显示全部楼层 |复制链接
各位大神晚安
請教一個問題,我最近在嘗試編寫的EA,要取MACD峰值,及ATR數值
因為回測一直沒開單,經過試驗後,
可能是CopyBuffer的用法錯誤➜未獲得實際數據填入緩衝區
我已經試到頭都快破了

想請各位大神給予一點修正建議!!!!


//==== 外部參數 ====
input double   lotSize         = 0.1;       // 交易手數
input int      macdFast        = 13;
input int      macdSlow        = 34;
input int      macdSignal      = 9;
input int      atrPeriod       = 13;

input bool     UseTrailingStop = true;      // 啟用追蹤止損
input double   TrailingStart   = 30;        // 啟動追蹤的浮動點數
input double   TrailingStep    = 15;        // 追蹤距離(點)

//==== 全域變數 ====
int macdHandle, atrHandle;
double macdMainBuf[], macdSignalBuf[], macdHistBuf[];
double atrBuf[];

//+------------------------------------------------------------------+
//| 初始化                                                           |
//+------------------------------------------------------------------+
int OnInit()
{
   macdHandle = iMACD(_Symbol, PERIOD_M15, macdFast, macdSlow, macdSignal, PRICE_CLOSE);
   atrHandle  = iATR(_Symbol, PERIOD_M15, atrPeriod);

   if(macdHandle == INVALID_HANDLE || atrHandle == INVALID_HANDLE)
   {
      Print("指標初始化失敗!");
      return INIT_FAILED;
   }

   return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| 主迴圈                                                           |
//+------------------------------------------------------------------+
void OnTick()
{
   if(Period() != PERIOD_M15) return;

   int barsToCheck = 50;
   if(CopyBuffer(macdHandle, 0, 0, barsToCheck, macdMainBuf) <= 0) return;
   if(CopyBuffer(macdHandle, 1, 0, barsToCheck, macdSignalBuf) <= 0) return;
   if(CopyBuffer(macdHandle, 2, 0, barsToCheck, macdHistBuf) <= 0) return;
   if(CopyBuffer(atrHandle, 0, 0, 3, atrBuf) <= 0) return;

   if(!PositionSelect(_Symbol))
   {
      double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

      // 多單條件
      if(CheckBullishSignal())
      {
         double sl = NormalizeDouble(ask - atrBuf[1], _Digits);
         trade.Buy(lotSize, _Symbol, ask, sl, 0, "MACD Buy");
      }

      // 空單條件
      if(CheckBearishSignal())
      {
         double sl = NormalizeDouble(bid + atrBuf[1], _Digits);
         trade.Sell(lotSize, _Symbol, bid, sl, 0, "MACD Sell");
      }
   }
   else
   {
      CheckTrailingStop();
   }
}
最近访问 头像模式
举报

评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)