单独运行代码,从 API WebSocket 收集实时库存数据,并将其提供给 Python 中的主代码

问题描述 投票:0回答:1

我有一个代码,它有一个循环,在设置的时间范围(如 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 函数)并决定是否应买入看涨期权、买入看跌期权或不采取任何行动。现在,随着控制的来回移动,一些数据会丢失。今天我错过了一个尖峰,导致输出错误。如何将数据收集和提供者分开?不过,我想根据实时数据设置止损和目标。

python trading ohlc
1个回答
0
投票

我可以在这里使用 asyncio 吗?如何在这种情况下编码?

© www.soinside.com 2019 - 2024. All rights reserved.