Ejemplo n.º 1
0
def writeResultDataToFile(fullDF: pd.DataFrame):
    max_ymd = fullDF.TradeDate.max().strftime("%Y%m%d")
    fpath = cfg().getValueByConfigFile(key="dailypath") + f"/{max_ymd[0:6]}"
    fname = f"{fpath}/" + cfg().getValueByConfigFile(
        key="resultname") + f"_{max_ymd}.xlsx"

    outDF = getLastPeriodDF(in_DF=fullDF, period=1).filter(items=([
        "StockID",
        "StockName",
        "上市/上櫃",
        "投信(股數)",
        "外資(股數)",
        "自營商(股數)",
        "TradeDate",
        "Close",
        "Volume",
        "MFI",
    ] + [x for x in fullDF.columns[fullDF.columns.str.contains("sgl")]]))
    file.GeneratorFromDF(outDF, fname)

    fname = f"{fpath}/FocusList_{max_ymd}.xlsx"
    stgDF = pd.DataFrame()
    stgDF = stg(outDF).getFromFocusOnByStrategy(no_credit=True)
    stgDF = stgDF[[
        "StockID", "StockName", "cateDesc", "上市/上櫃", "投信(股數)", "外資(股數)",
        "自營商(股數)", "TradeDate", "Close", "Volume", "MFI", "sgl_SMA", "sgl_SAR",
        "sgl_MAXMIN", "sgl_BBANDS", "sgl_MACD"
    ]]
    file.GeneratorFromDF(stgDF, fname)
    fname = cfg().getValueByConfigFile(key="dailypath") + "/8002.xlsx"
    file.GeneratorFromDF(stgDF, fname)

    stgDF = stgDF[[
        "TradeDate", "StockID", "StockName", "上市/上櫃", "cateDesc", "Close",
        "Volume", "MFI", "sgl_SMA", "sgl_SAR", "sgl_MAXMIN", "sgl_BBANDS",
        "sgl_MACD"
    ]].rename(
        columns={
            "TradeDate": "Date",
            "上市/上櫃": "Market",
            "cateDesc": "Category",
            "sgl_SMA": "signalSMA",
            "sgl_SAR": "signalSAR",
            "sgl_MAXMIN": "signalMAXMIN",
            "sgl_BBANDS": "signalBBANDS",
            "sgl_MACD": "signalMACD"
        })
    db().updateDFtoDB(stgDF, tb_name="dailybuystrategy")
Ejemplo n.º 2
0
def callbackListDataToDF():
    global GorderDF, GdealDF, GtickDF, GbidaskDF, itemorder, itemdeal, ticks
    oDF = pd.DataFrame()
    dDF = pd.DataFrame()
    ymdt = datetime.now().strftime("%Y%m%d_%H%M%S")
    if itemorder != []:
        col = [
            "StockID", "Action", "Price", "Qty", "OrderType", "PriceType",
            "CancelQty", "TradeDate", "TradeTime", "ReceiveTime"
        ]
        GorderDF = GorderDF.append(pd.DataFrame(itemorder, columns=col))
        oDF = oDF.append(pd.DataFrame(itemorder, columns=col))
        itemorder.clear()

        fpath = f"./data/ActuralTrade/order_{ymdt}.xlsx"
        file.GeneratorFromDF(oDF, fpath)

    if itemdeal != []:
        col = [
            "StockID", "Action", "Price", "Qty", "OrderCond", "OrderLot",
            "TradeDate", "TradeTime", "ReceiveTime"
        ]
        GdealDF = GdealDF.append(pd.DataFrame(itemdeal, columns=col))
        dDF = dDF.append(pd.DataFrame(itemdeal, columns=col))
        itemdeal.clear()

        fpath = f"./data/ActuralTrade/deal_{ymdt}.xlsx"
        file.GeneratorFromDF(dDF, fpath)

    if ticks != []:
        col = [
            "StockID", "TradeTime", "Open", "Close", "High", "Low", "Volume"
        ]
        GtickDF = GtickDF.append(pd.DataFrame(ticks, columns=col))
        ticks.clear()

    if bidasks != []:
        col = [
            "StockID", "TradeTime", "BidPrice_1", "BidPrice_2", "BidPrice_3",
            "BidPrice_4", "BidPrice_5", "BidVolume_1", "BidVolume_2",
            "BidVolume_3", "BidVolume_4", "BidVolume_5", "AskPrice_1",
            "AskPrice_2", "AskPrice_3", "AskPrice_4", "AskPrice_5",
            "AskVolume_1", "AskVolume_2", "AskVolume_3", "AskVolume_4",
            "AskVolume_5"
        ]
        GbidaskDF = GbidaskDF.append(pd.DataFrame(bidasks, columns=col))
        bidasks.clear()
Ejemplo n.º 3
0
def CallBackListToDF(last: bool = False) -> None:
    global GorderDF, GdealDF, GoperDF, itemdeal, itemorder

    oDF = pd.DataFrame()
    dDF = pd.DataFrame()
    ymdt = datetime.now().strftime("%Y%m%d_%H%M%S")
    file_path = cfg().getValueByConfigFile(key="dailypath") + f"/{ymdt[0:6]}"

    if itemorder != []:
        col = [
            "StockID", "Action", "Price", "Qty", "OrderType", "PriceType",
            "CancelQty", "TradeDate", "TradeTime", "ReceiveTime"
        ]
        GorderDF = GorderDF.append(pd.DataFrame(itemorder, columns=col))
        # 準備存成File用的DF
        oDF = oDF.append(pd.DataFrame(itemorder, columns=col))
        file.GeneratorFromDF(oDF, f"{file_path}/order_{ymdt}.xlsx")
        itemorder.clear()

    if itemdeal != []:
        col = [
            "StockID", "Action", "Price", "Qty", "OrderCond", "OrderLot",
            "TradeDate", "TradeTime", "ReceiveTime"
        ]
        GdealDF = GdealDF.append(pd.DataFrame(itemdeal, columns=col))
        # 準備存成File用的DF
        dDF = dDF.append(pd.DataFrame(itemdeal, columns=col))
        file.GeneratorFromDF(dDF, f"{file_path}/deal_{ymdt}.xlsx")
        itemdeal.clear()

        buyDF = pd.DataFrame()
        sellDF = pd.DataFrame()
        buyDF = dDF.loc[dDF.Action == "Buy"]
        sellDF = dDF.loc[dDF.Action == "Sell"]
        if not buyDF.empty:
            GoperDF = GoperDF.append(
                buyDF.filter(items=["StockID", "Price", "Qty", "TradeTime"]))

    # 產生當天最後的結果檔案
    if last:
        if not GorderDF.empty:
            file.GeneratorFromDF(GorderDF,
                                 f"{file_path}/order_{ymdt[0:8]}.xlsx")
        if not GdealDF.empty:
            file.GeneratorFromDF(GdealDF, f"{file_path}/deal_{ymdt[0:8]}.xlsx")
Ejemplo n.º 4
0
def calFocusStockTrend():
    global GtickDF
    getTrend = []
    try:
        if not GtickDF.empty:
            bkTickDF = GtickDF.copy(deep=True).sort_values(
                by=["StockID", "TradeTime"])  # deep = True 才不會改到原始的DF
            for stockid, oneStkDF in bkTickDF.groupby("StockID"):
                # oneStkDF.reset_index(inplace = True, drop = True)
                reg_up = linregress(x=oneStkDF.index,
                                    y=oneStkDF.Close.astype(float))
                up_line = reg_up.intercept + reg_up.slope * oneStkDF.index

                oneStkDFtmp = oneStkDF[oneStkDF.Close < up_line]
                feq = 0
                while len(oneStkDFtmp) >= 5 and feq < 50:
                    feq += 1
                    reg_new = linregress(x=oneStkDFtmp.index,
                                         y=oneStkDFtmp.Close.astype(float))
                    up_new = reg_new.intercept + reg_new.slope * oneStkDFtmp.index
                    oneStkDFtmp = oneStkDFtmp[oneStkDFtmp.Close < up_new]
                oneStkDF[
                    "Low_Trend"] = reg_new.intercept + reg_new.slope * oneStkDF.index
                if reg_up.slope >= 0:
                    val = "+"
                else:
                    val = "-"

                l = []
                l.append(str(stockid))
                l.append(str(val))
                l.append(float(reg_up.slope))
                l.append(float(reg_new.slope))
                getTrend.append(l)
            TrendDF = pd.DataFrame(
                getTrend, columns=["StockID", "Trend", "SlopeOrg", "SlopeNew"])
            ymd = datetime.now().strftime("%Y%m%d")
            path = f"./data/ActuralTrade/{ymd[0:6]}"
            if not TrendDF.empty:
                fpath = f"{path}/Trend_{ymd}.xlsx"
                file.GeneratorFromDF(TrendDF, fpath)
                logger.info(f"Generate Trend File Down!")
    except Exception as exc:
        logger.error(f"Tick to DF error! {exc}")
Ejemplo n.º 5
0
            # 取消訂閱
            con(api).UnsubscribeTickBidAskByStockList(subList, "bidask")
            break

    if datetime.now().strftime("%H:%M") >= closepoint:
        # 取消訂閱
        con(api).UnsubscribeTickBidAskByStockList(subList, "bidask")
        break

    tool.WaitingTimeDecide(check_secs)

ymd = datetime.now().strftime("%Y%m%d_%H%M%S")
path = f"./data/ActuralTrade/{ymd[0:6]}"
if not GorderDF.empty:
    fpath = f"{path}/order_{ymd}.xlsx"
    file.GeneratorFromDF(GorderDF, fpath)
    logger.info(f"Generate Order File Down!")
if not GdealDF.empty:
    fpath = f"{path}/deal_{ymd}.xlsx"
    file.GeneratorFromDF(GdealDF, fpath)
    logger.info(f"Generate Deal File Down!")
if not GtickDF.empty:
    fpath = f"{path}/tick_{ymd}.xlsx"
    file.GeneratorFromDF(GtickDF, fpath)
    logger.info(f"Generate Tick File Down!")
if not GbidaskDF.empty:
    fpath = f"{path}/bidask_{ymd}.xlsx"
    file.GeneratorFromDF(GbidaskDF, fpath)
    logger.info(f"Generate BidAsk File Down!")
logger.info("End")
Ejemplo n.º 6
0
    "SMA", "SAR", "MAXMIN", "BBANDS", "MACD"
])  # Default = ["SMA", "SAR", "MAXMIN", "BBands", "RSI", "MACD", "KDJ"]
writeResultDataToFile(stkDFwithInd)

# 做盤後模擬測試
RSIsmiDF = sim().useRSItoMakeResultDF(p_days=-1, RSI_period=12)

if not RSIsmiDF.empty:
    fpath = "./data/Simulation/RSI.xlsx"
    if tool.checkFileExist(fpath):
        RSIsmiDF = RSIsmiDF.append(pd.read_excel(fpath)).reset_index(drop=True)
        RSIsmiDF[["TradeDate", "StockID"]] = RSIsmiDF[["TradeDate",
                                                       "StockID"]].astype(str)
        RSIsmiDF = RSIsmiDF.drop_duplicates(
            subset=["TradeDate", "StockID", "Frequency"], keep="first")
    file.GeneratorFromDF(RSIsmiDF, fpath)

today = datetime.now().strftime("%Y-%m-%d")
sql = f"SELECT StockID, Date(TradeDateTime) as TickDate, TIME_FORMAT(TradeDateTime, '%T.%f') as TickTime, Close, Volume, BidPrice, BidVolume, AskPrice, AskVolume FROM dailyticks WHERE Date(TradeDateTime) = '{today}' AND Time(TradeDateTime) <= '09:05:00'"
TicksDF = db().selectDatatoDF(sql_statment=sql).sort_values(
    by=["StockID", "TickDate", "TickTime"])

tickpath = "./data/PlotData/Ticks.csv"
if not tool.checkFileExist(tickpath):
    file.GeneratorFromDF(TicksDF, tickpath, "csv")
else:
    with open(tickpath, "a") as f:
        TicksDF.to_csv(f, header=False, index=False, line_terminator="\n")

# %%
Ejemplo n.º 7
0
        R0_BuyDF, SoldOut = checkPriceToSell(R0_BuyDF, secDF, "X")
        R1_BuyDF, SoldOut = checkPriceToSell(R1_BuyDF, secDF, "X")
        break
    
    tool.WaitingTimeDecide(chk_sec)


R0_TradeDF = getTradeResultDF(stkDF, R0_BuyDF, "R0")
R1_TradeDF = getTradeResultDF(stkDF, R1_BuyDF, "R1")
R0_TradeDF = R0_TradeDF.merge(SlopeDF, on = ["StockID"], how = "left")
R1_TradeDF = R1_TradeDF.merge(SlopeDF, on = ["StockID"], how = "left")
# 準備存檔資料
ymd = date.today().strftime("%Y%m%d")
trade_path = cfg().getValueByConfigFile(key = "tradepath") + f"/{ymd[0:6]}"
# Rule0 / Rule1處理檔案的部份
file.GeneratorFromDF(R0_TradeDF, f"{trade_path}/Trade_{ymd}_R0.xlsx")
file.GeneratorFromDF(R1_TradeDF, f"{trade_path}/Trade_{ymd}_R1.xlsx")


# while True:
#     secDF = con(api).getSnapshotDataByStockID(contracts)
    
#     # 每分鐘存留一版secDF,做成minDF(0也要做一次)
#     if dotimes % 2 == 0:
#         minDF = minDF.append(secDF)
    
#     # 09:05前就只要做snapshot
#     if datetime.now().strftime("%H:%M") < "09:05":
#     # if datetime.now().strftime("%H:%M") < getExcuteTime():
#         dotimes += 1
#         tool.WaitingTimeDecide(chk_sec)
Ejemplo n.º 8
0
    oneStkDF.Close.plot()
    plt.plot(oneStkDF.Low_Trend)

    l = []
    l.append(str(stockid))
    l.append(str(val))
    l.append(float(reg_up.slope))
    l.append(float(reg_new.slope))
    getTrend.append(l)
TrendDF = pd.DataFrame(getTrend,
                       columns=["StockID", "Trend", "SlopeOrg", "SlopeNew"])
ymd = datetime.now().strftime("%Y%m%d")
path = f"./data/ActuralTrade/{ymd[0:6]}"
if not TrendDF.empty:
    fpath = f"{path}/Trend_{ymd}.xlsx"
    file.GeneratorFromDF(TrendDF, fpath)

# %%

# @api.quote.on_event
# def event_callback(resp_code: int, event_code: int, info: str, event: str):
#     global eventDF
#     l = []
#     l.append(resp_code)
#     l.append(event_code)
#     l.append(info)
#     l.append(event)
#     l.append(datetime.now().strftime("%H:%M:%S.%f"))
#     eventDF = eventDF.append(pd.DataFrame([l], columns = ["resp_code", "event_code", "info", "event", "ReceiveTime"]))
#     # print(f'Event code: {event_code} | Event: {event} | Resp_Code: {resp_code} | info: {info}')