2017-01-25 10 views
0

매분 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를받습니다. –