我有一个代码,它有一个循环,在设置的时间范围(如 1 分钟、3 分钟、5 分钟等)结束后,连续从 API WebSocket 收集数据。收集数据后,将其排序为开放,高,低在检查该条件后进行下一个动作,完成该动作后,控制返回到收集数据的循环。我的问题是,在处理数据进行排序和条件检查时,会损失一小部分时间,从而导致错误,丢失一些数据。如何避免这种情况?如果我有一个单独的模块,可以由另一个进行数据排序和检查条件的模块访问,这会有帮助吗?如何做到这一点?
def ohlc(checkInstrument,timeframe):
global Call
global Put
global sl
global target
global CallBuyValue
global PutBuyValue
global ADXatCallBuy
global ADXatPutBuy
global first
global exitTimeCall
global exitTimePut
global flag
global wait
date=pd.to_datetime(datetime.now(timezone("Asia/Kolkata")).strftime('%Y-%m-%d %H:%M:%S'))
while(str(date)[-2::]!='00' and first == 0):
date=pd.to_datetime(datetime.now(timezone("Asia/Kolkata")).strftime('%Y-%m-%d %H:%M:%S'))
print(date)
first=1
date=date+timedelta(minutes=timeframe)
sec = date.second
if(sec > 0):
date = date-timedelta(seconds=sec)
print(date)
l=[]
while(pd.to_datetime(datetime.now(timezone("Asia/Kolkata")).strftime('%Y-%m-%d %H:%M:%S'))<date):
x=getLTP("NSE", checkInstrument)
# time.sleep(1)
if(Call==1 and Put==0 and wait == 0):
if (sl>=x):
print("x : ", x)
print("Stop loss hit")
oidexit=exitPosition(tradeCEoption)
CallBuyValue=0
target=0
sl=0
Call=0
flag=0
wait=1
elif (x>target):
sl=CallBuyValue
CallBuyValue=target
target = target + 14
print("New Target :", target)
print("New Stop Loss: ", sl)
print("New Trailing Stop Loss :", CallBuyValue)
elif(Put==1 and Call==0 and wait == 0):
if(sl<=x):
print("x : ", x)
print("Stop loss hit")
oidexit=exitPosition(tradePEoption)
PutBuyValue=0
target=0
sl=0
Put=0
flag=0
wait=1
elif(x<=target):
sl=PutBuyValue
PutBuyValue=target
target = target - 14
print("Target :", target)
print("Stop Loss: ", sl)
print("Trailing Stop Loss :", PutBuyValue)
if x!=-1:
print(x)
l.append(x)
这是通过 API websocket 循环收集数据的代码块,它还检查止损和目标,并在时间结束后控制转到条件以检查下一步操作,例如是否购买看涨期权或看跌期权。
while z == 1:
#global x
data=ohlc(checkInstrument,1) #[9:20, 17000, 17870, 16780, 17220] timeframe
dt1 = datetime.now()
print(dt1)
print(StopEntryTime)
if data[0]!=-1:
opens.append(data[1])
high.append(data[2])
low.append(data[3])
close.append(data[-1])
ttime.append(data[0])
st=''
if op!=[]:
#if op[0]=='sma':
value=ta.trend.SMAIndicator(pd.Series(close),op[1]).sma_indicator().iloc[-1]
value1=ta.trend.ADXIndicator(pd.Series(high), pd.Series(low), pd.Series(close), op[2], False).adx().iloc[-1]
value2[0]=ta.trend.ADXIndicator(pd.Series(high), pd.Series(low), pd.Series(close), op[2], False).adx().iloc[-2]
value2[1]=ta.trend.ADXIndicator(pd.Series(high), pd.Series(low), pd.Series(close), op[2], False).adx().iloc [-3]
value2[2]=ta.trend.ADXIndicator(pd.Series(high), pd.Series(low), pd.Series(close), op[2], False).adx().iloc[-4]
if value!=0 and value1!=0 and wait==0:
if value1 > 42 and value1 > value2[0]+2 and value < close[-1] and close[-1] > close[-2]+5 and Call==0 and Put == 0 and close[-1] > opens[-1]+5.5 and dt1 <= StopEntryTime:# and opens[-1] < close[-2]+50 and opens[-2] < close[-3]+50 and opens[-3] < close[-4]+50:
oidentry = findStrikePriceATM('NIFTY','CE')
Call=1
CallBuyValue=close[-1]
target = CallBuyValue + 1
sl = CallBuyValue - 24
print("set sl: ",sl)
print("set target: ",target)
print("ADX :", value1)
print("ADX -2 :", value2[1])
flag=1
if value1 > 42 and value1 > value2[0]+2 and value > close[-1] and close[-1] < close[-2]-5 and Put==0 and Call == 0 and opens[-1]-5.5 > close[-1] and dt1 <= StopEntryTime:# and opens[-1] > close[-2]-50 and opens[-2 ] > close[-3]-50 and opens[-3] > close[-4]-50:
oidentry = findStrikePriceATM('NIFTY','PE')
Put=1
PutBuyValue = close[-1]
sl = PutBuyValue + 24
target = PutBuyValue - 1
print("set sl: ",sl)
print("set target: ",target)
print("ADX :", value1)
print("ADX -2 :", value2[1])
flag=0
data.append(value)
if (dt1 >= closeTime):
if Call == 1:
print("EOD.")
#Exit Position
oidexit = exitPosition(tradeCEoption)
elif Put == 1:
print("EOD.")
#Exit position
oidexit = exitPosition(tradePEoption)
print('End Of the Day')
z = 2
break
wait=0
该块调用之前的块(OHLC 函数)并决定是否应买入看涨期权、买入看跌期权或不采取任何行动。现在,随着控制的来回移动,一些数据会丢失。今天我错过了一个尖峰,导致输出错误。如何将数据收集和提供者分开?不过,我想根据实时数据设置止损和目标。
我可以在这里使用 asyncio 吗?如何在这种情况下编码?