各位大神晚安
請教一個問題,我最近在嘗試編寫的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();
}
} |