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

有關MT5的CopyBuffer用法請教

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-25 16:16:00 | 显示全部楼层 |阅读模式
各位大神晚安

請教一個問題,我最近在嘗試編寫的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();

   }

}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-10-11 19:21 , Processed in 0.107106 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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