recherche

Maison  >  Questions et réponses  >  le corps du texte

Nodejs MetaAPI Cloud / Calculer la moyenne mobile

<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粉715274052P粉715274052527 Il y a quelques jours554

répondre à tous(2)je répondrai

  • P粉071743732

    P粉0717437322023-09-04 00:37:22

    • 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>

    répondre
    0
  • P粉563446579

    P粉5634465792023-09-04 00:18:21

    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...

    répondre
    0
  • Annulerrépondre