我正在製作一個使用metaapi.cloud的交易機器人,我正在嘗試計算移動平均值(快速/指數),但它返回給我無效值,這是我的代碼:
async movingAverage(symbol, period, type = "S") { let candles = (await this.account.getHistoricalCandles(symbol, this.params.timeframe, null, period)).map(c => c.close); const result = []; let sum = 0; if (type === "S") { for (let i = 0; i < period; i ) { sum = candles[i]; } result.push(sum / period); for (let i = period; i < candles.length; i ) { sum = sum - candles[i - period] candles[i]; result.push(sum / period) } } else if (type === "E") { const weight = 2 / (period 1); for (let i = 0; i < period; i ) { sum = candles[i]; } sum /= period; result.push(sum); for (let i = period; i < candles.length; i ) { sum = (candles[i] * weight) (sum * (1 - weight)); result.push(sum); } } else { // throw Error() } return result; }
這是我的使用方法:
async onTick(infos) { let sma = await this.movingAverage(infos.symbol, this.params.fast, "S"); console.log('SMA ' sma[0]); }
現在,當我測試它時,SMA 應該返回“1906.6963”,但它給我的是“1900.7813” 也許我使用了錯誤的方法來計算它們? 如果有人有解決辦法!提前致謝。
在下面的範例中,將 period 設為 1 以查看已處理的所有值,將 period 設定為非常大的數字以查看整個平均值。
肯定還有其他我沒想到的邊緣狀況。為簡潔起見,下面的範例使用 SMA。
我發現了問題。它來自 MetaTrader 的 api,「getHistoricalCandles」無法按預期正常工作。 api中寫的是:
這裡的問題是StartTime 參數,它絕對不會像他們所說的那樣工作,當我將其留空時,或者當我放置
Date.now()
時,它會檢索5 小時前的蠟燭,為了檢索絕對的最後一根蠟燭,我必須輸入Date.now() 10000000000
,所以這可能是時區錯誤,暫時無法解決,因為它來自api 端.. .