Асинхронный вызов Twitter внутри функции, которая находится в асинхронной очереди - https://github.com/DeviaVir/zenbot - PullRequest
0 голосов
/ 30 августа 2018

Системная информация

  • Написал ли я собственный код (в отличие от использования zenbot vanilla) : я добавил стратегию и файлы lib. Стратегия использует файлы lib для извлечения из API Twitter и расчета его настроения.
  • Платформа и распространение ОС (например, Linux Ubuntu 16.04) : Ubuntu 16.04
  • Версия Zenbot (ссылка на версию или версия): v4.1.0
  • Ветка Zenbot : нестабильно
  • NodeJS версия : v8.11.2
  • Версия Python (при использовании скрипта Python) : python 2.7.12, 3.5.2
  • Точная команда для воспроизведения (включая все) : ./zenbot.sh trade - paper --strategy sentiment_strat --days 2 --period = 10m
  • Вносил ли я какие-либо изменения в conf-sample.js? : Нет - ** Использованы дополнительные библиотеки - twitter npm - v1.7.1, vader-sentiment -v1.1.3

Опишите проблему

Проблема заключается в том, что после извлечения API Twitter Zenbot будет продолжать печатать то же значение BTC. Похоже, что он не выходит из функции onPeriod () в стратегии. Поддержка функции извлечения информации из Twitter является требованием к функциям, поскольку это позволит пользователям выполнять анализ настроений или выполнять другие виды анализа для совершения сделок. Я близок к тому, чтобы заставить это работать, но я застрял на том, почему это происходит. Я предполагаю, что это как-то связано с тем, что я использую асинхронную функцию - я должен сделать это, потому что, если я не жду возвращаемого значения, настроение будет рассчитано на неопределенное значение.

Я поместил console.log () в функцию onPeriod () после того, как я вызвал main (), но, как вы видите из errorlog.txt, он не дошел до этой точки - он застрял внутри main () даже если main () завершена, и определение того, держать, покупать или продавать, выполнено - см. строки 20, 21, 22 (строка 23 - это повторяющиеся выходные данные той же цены BTC, пока я не вышел из процесса). Errorlog.txt

После запуска отладчика и наблюдения за его бесконечным циклом внутри async_hooks.js и net.js - я обнаружил, что функция onPeriod () вызывается внутри async.queue (). Имеет ли проблема асинхронный вызов внутри другого асинхронного вызова? Или это что-то еще?

Исходный код / ​​Журналы ошибок

расположение файла: zenbot / extensions / стратегии / sentiment_strat / стратегии.js

let sentiment = require('../../../lib/calculateSentiment'),
twit = require('../../../lib/getTweets.js'),
n = require('numbro'),
z = require('zero-fill'),
getTweetsBoolean = true

module.exports = {
name: 'sentiment_strat',
description: 'Strategy based on sentiment.',
getOptions: function () {
    this.option('period', 'period length, same as --period_length',   
 String, '10m')


},

calculate: function (s) {

    if (s.in_preroll) {
        return
    }
},

onPeriod: function (s, cb) {
    if (s.in_preroll) {
        cb()
        return
    }

    async function main(getTweetsBoolean) {
        number_of_tweets = 100
        pulled_tweets = await twit('BTC', number_of_tweets)
        console.log('pulled_tweets')
        sentiment(s, 'sentiment', pulled_tweets)

        console.log('Sentiment: ' + s.period.sentiment)

        if (s.period.sentiment > 0.1) {
            console.log('buy')
            s.signal = 'buy'
        } else if (s.period.sentiment < -0.1) {
            console.log('sell')
            s.signal = 'sell'
        } else {
            console.log('hold')
        }
        return

    }

    main()
    console.log('onPeriod After main()')
    cb()
},

onReport: function (s) {
    var cols = []
    return cols
   }
}

расположение файла: zenbot / lib / getTweets.js

 var Twitter = require('twitter')

module.exports = function getTweets(keyphrase, number_of_tweets) {

function parseTweets(tweets) {
var parsed_tweets = []
list_of_unparsed_tweets = tweets['statuses']
for (let i = 0; i < list_of_unparsed_tweets.length; i++) {
    num_followers = list_of_unparsed_tweets[i]['user']  
 ['followers_count']
    user = list_of_unparsed_tweets[i]['user']['screen_name']
    parsed_tweets.push({"tweet":filter(list_of_unparsed_tweets[i]                                                                          
  ['full_text']),"num_followers":num_followers, "user": user})
}
  return parsed_tweets
}

function filter(tweet){
return tweet.replace(/["']/g,'').replace(/[()*.,:;]/g,'').replace(/\W
\s/g,'')
}

//create twitter client
var client = new Twitter({
    consumer_key: '',
    consumer_secret: '',
    access_token_key: '',
    access_token_secret: ''
});

//perform the get request based on the given keyphrase
return new Promise(function(resolve, reject){
client.get('search/tweets', {
    q: keyphrase,
    count: number_of_tweets,
    tweet_mode: 'extended',
    lang : 'en'

 }, function (error, tweets, response) {
    if(error){
        console.log(error)
        return
    }
    resolve(parseTweets(tweets))
       });
    });
}

расположение файла: zenbot / lib / calculateSentiment.js

var vader = require('vader-sentiment')

module.exports = function calculateSentiment(s, key, texts) {
if (s.lookback == null || s.period == null) {
 s.period['key'] = ''
} else {
 let totalFollowers = 0
 for (let j = 0; j < texts.length; j++) {
   totalFollowers += texts[j]['num_followers']
 }
 let totalSentiment = 0
 for (let i = 0; i < texts.length; i++) {
   let weighted_normalized_sentiment = 
 vader.SentimentIntensityAnalyzer.polarity_scores(texts[i] 
 ['tweet'])['compound']*texts[i]['num_followers']/totalFollowers
   totalSentiment += weighted_normalized_sentiment 
 }
 s.period[key] = totalSentiment / texts.length

     } 
 }

1 Ответ

0 голосов
/ 16 сентября 2018

Оказывается, это была проблема с не включением определенного флага. Необходимо включить --minimum_period в качестве флага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...