Nodejs MetaAPI Cloud / Calculer la moyenne mobile
P粉715274052
P粉715274052 2023-09-03 09:12:59
0
2
496
<p>Je crée un robot de trading en utilisant metaapi.cloud et j'essaie de calculer une moyenne mobile (rapide/exponentielle) mais il me renvoie des valeurs invalides, voici mon code : </p> <pre class="brush:js;toolbar:false;">async movingAverage(symbole, point, type = "S") { let Candles = (attendez this.account.getHistoricalCandles(symbol, this.params.timeframe, null, period)).map(c => c.close); résultat const = []; soit somme = 0 ; if (tapez === "S") { pour (soit i = 0; i < période; i++) { somme += bougies[i]; } result.push(somme/période); pour (soit i = période ; i < bougies.longueur ; i++) { somme = somme - bougies[i - période] + bougies[i] ; result.push (somme / période) } } else if (tapez === "E") { poids const = 2 / (période + 1) ; pour (soit i = 0; i < période; i++) { somme += bougies[i]; } somme /= période ; result.push(somme); pour (soit i = période ; i < bougies.longueur ; i++) { somme = (bougies[i] * poids) + (somme * (1 - poids)); result.push(somme); } } autre { // lancerErreur() } renvoyer le résultat ; } ≪/pré> <p>Voici comment je l'utilise : </p> <pre class="brush:js;toolbar:false;">async onTick(infos) { let sma = wait this.movingAverage(infos.symbol, this.params.fast, "S"); console.log('SMA' + sma[0]); } ≪/pré> <p>Maintenant, quand je le teste, le SMA devrait renvoyer "1906.6963" mais il me donne "1900.7813" Peut-être que j'utilise la mauvaise façon de les calculer ? Si quelqu'un a une solution ! Merci d'avance. </p>
P粉715274052
P粉715274052

répondre à tous(2)
P粉071743732
  • SMA semble correct, EMA a de nombreux modèles différents. Étant donné que vous n'avez pas publié d'exemple d'ensemble de données, il est difficile de deviner ce qui est transmis par le serveur, mais il peut y avoir de nombreuses valeurs qui ne peuvent pas être converties, telles que NaN, null, des chaînes vides ou des nombres avec des virgules. exposants, etc. Je viens de remplacer les bougies par un tableau avec des valeurs erronées. Faites un peu de filtrage puis calculez
  • Considérez la période > l'ensemble de données. Dans ce cas, définissez la période sur la longueur.

Dans l'exemple ci-dessous, définissez la période sur 1 pour voir toutes les valeurs traitées et définissez la période sur un très grand nombre pour voir la moyenne entière.

Il existe certainement d'autres cas extrêmes auxquels je n'ai pas pensé. Par souci de concision, les exemples suivants utilisent SMA.

async function movingAverage(symbol, period, type = "S") {
        let candles = [1,2,3,"","",4, "0",0, null, "99,9123", undefined,"0.123e5", "wrongval", 9, 10, 20, 100]
        .map(d => parseFloat((d ?? "").toString().replace(",",".")))
        .filter(d => +d || +d === 0);
        const result = [];
        if (candles.length <= 0){return result}
        let sum = 0;
        period = Math.min(candles.length, period) || 1;
        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)
        }
        return result;
    }
    movingAverage("SPX",500).then(x => document.getElementById("result").textContent = x)
<div id="result"></div>
P粉563446579

J'ai trouvé le problème. Cela vient de l'API de MetaTrader, "getHistoricalCandles" ne fonctionne pas comme prévu. Ce qui est écrit dans l'API est :

getHistoricalCandles(symbol, timeframe, startTime, limit)
symbol: symbol to retrieve candles for
TimeFrame: define the timeframe according to which the candles must be generated
StartTime: time to start loading candles from. Note that candles are loaded in backward direction, so this should be the latest time, **leave it empty to request latest candles**
Limit: maximum of candles to retrieve, must be less or equals to 1000

Le problème ici est le paramètre StartTime, il ne fonctionne définitivement pas comme ils le disent quand je le laisse vide, ou quand je mets Date.now() 时,它会检索 5 小时前的蜡烛,为了检索绝对的最后一根蜡烛,我必须输入 Date.now()+10000000000, donc c'est probablement une erreur de fuseau horaire qui ne peut pas être corrigée pour l'instant puisqu'elle vient de l'API Fin...

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal