2017-01-25 15 views
0

私はAPIを使用して毎分のAPIを使ってデータを収集しようとしていますが、これは60秒間停止するループを使用しています。いくつかのトラブル。データを収集してdatetime.sleep()を使用するときのタイムラグ

たとえば、12:00に請願書を送信すると、11:59のデータが届きますが、データは12:00になります。

from iqoptionapi.api import IQOptionAPI 
from datetime import datetime 
import time 

candles = None 
contador = 1 
while True: 
    if candles is None: 
     api = IQOptionAPI("iqoption.com", "user", "pass") # Data for conection 
     api.connect() 
     api.getcandles(1,1) # (id_active, time) 
     candles = api.candles.candles_data # List with candles 
     print ("Try....\n") 
    else: 
     print ("Candle petition:", contador, "-", datetime.now(), "\n") 
     api.getcandles(1, 1) 
     candles = api.candles.candles_data 
     print (candles, "\n") 
     print ("First list:", datetime.fromtimestamp(candles[0][0]), 
       "Second list:", datetime.fromtimestamp(candles[1][0]), "\n") 
     contador += 1 

    time.sleep(60) 

、これらは私の結果、次のとおりです:

これは私のコードで私は time.sleep()使用する場合 にのみ発生し、遅延、それは私が time.sleep()機能

の内側に入れ秒に比例しています

Candle petition: 2 - 2017-01-25 10:14:05.554242 

[[1485360784, 1073590, 1073600, 1073600, 1073590], [1485360785, 
1073600, 1073595, 1073600, 1073595]] 

First list: 2017-01-25 10:13:04 Second list: 2017-01-25 10:13:05 

何が起こっていますか?なぜ遅延?

+0

時間実行の実際の量は、中断を何要求されます。望みの時間が過ぎ去るまで(おそらく各呼び出しの間に数秒間スリープする)、 'datetime.now()'を繰り返し呼び出すループで呼び出しを置き換えることで、より正確に行うことができます。 – martineau

答えて

1

IQOptionAPIは、websocket-clientのように見えますが、これは非同期です。要求を送信すると、サーバーからの応答を待つことなく、すぐに戻ります。あなたはそれを受け取る前に応答をチェックしています。その結果、実際にはの前にリクエストが発生しています。そのため、あなたが使用しているsleepの長さに相当します。

IQOptionAPI内で同期要求を行う方法や、応答が入ったときのフィードバックを得る方法はすぐにはわかりませんが、もう少し見て、実際に方法があるかどうかを確認するのが最善です。この問題を回避するには、要求間の遅延の数秒を挿入し、応答確認してみてください:それ未満であってもよい)( `停止時間を伴うtime.sleep`に

api.getcandles(1, 1) 
time.sleep(2) 
candles = api.candles.candles_data 
+0

これは解決策です、今すぐ私は遅滞なくリアルタイムでcotizationsを受け取ります –

関連する問題