簡體   English   中英

如何組織班級結構?

[英]How to organize the structure of classes?

我正在為外匯市場(二元期權)交易的顧問編程。 使用福匯 API。 對於那些有趣的人。 我有 5 個貨幣對。 每個都包含五個不同時間范圍內的報價歷史。 例如,假設從一分鍾到五分鍾。 每個歷史必須有三個變量。 (最大、最小、最后)報價歷史在等於一分鍾的時間范圍內從 FXCM 加載一次,然后針對所有其他時間范圍進行計算。 另外,我有一個方法(或者我可以將它們組合成一個方法)用於實際數據,分別每分鍾、每兩分鍾等執行一次,以在相應的歷史記錄中記錄新形成的蠟燭。 我將附上一個我看到但我不喜歡的類結構。

class Pair:    
    def __init__(self, name):
        self.name = name

class Periods:     
    def __init__(self, name):
        self.name  = name
        self.one   = pd.DataFrame()
        self.two   = pd.DataFrame()
        self.three = pd.DataFrame()
        self.four  = pd.DataFrame()
        self.five  = pd.DataFrame()

    def get_historical_data(self): # Executed once
        self.one   = historical_data_one_minute
        self.two   = historical_data_two_minute
        self.three = historical_data_three_minute
        self.four  = historical_data_four_minute
        self.five  = historical_data_five_minute

    def set_actual_data(self, period): #Executed ones per minute
        if period == '1min':
            one_minute_candle = calculated_one_minute_candle
            self.one   = self.one.append(one_minute_candle)
        if period == '2min':
            two_minute_candle = calculated_two_minute_candle
            self.two   = self.two.append(two_minute_candle)
        ...

        if period == '5min':
            five_minute_candle = calculated_five_minute_candle
            self.five   = self.five.append(five_minute_candle)

正如您所注意到的,沒有最大、最小和最后一個變量。 那是因為我不知道怎么把它們綁起來。 我應該將“期間”分成 One_minute、Two_minute 等類來添加變量還是有其他方法? 會不會有太多的課程?

class One_minute:
    def __init__(self):
        self.largest = 0
        self.smallest = 0
        self.last = 0

    def get_historical_data(self):
        self.history = historical_data_one_minute
        self.largest = calculated_largest_from_historical_data_one_minute
        self.smallest = calculated_smallest_from_historical_data_one_minute
        self.last = calculated_last_from_historical_data_one_minute

一般來說,結構如下

(currency pair) - one_minute_history ---- largest
                |                    |___ smallest
                |                    |___ last
                |_two_minute_history ---- largest
                |                    |___ smallest
                |                    |___ last
                |_and so on

或者

(currency pair) ------ one_minute_history
                 |  |_ largest
                 |  |_ smallest
                 |  |_ last
                 |____ two_minute_history
                 |  |_ largest
                 |  |_ smallest
                 |  |_ last
                 |____ three_minute_history
                  ...

如果像這樣進行訪問會很方便

eurusd.history[1] #gets one minute history
eurusd.history[1].largest or eurusd.largest.history[1]  #gets largest price of one minute history

或者它可以是更好的東西。

總的來說,我將有 25 個不同的歷史數據框,每個貨幣對有 5 個。 而且對於每個歷史數據框,我將有三個變量

我希望我能解釋我需要得到什么。 先感謝您!

編輯:我認為無論歷史數據如何計算,都可以回答您的問題 - 這是這種方法

    def get_historical_data(self, con): # Once
        dtn     = datetime.now()  
        hours   = dtn.hour + 3
        minutes = dtn.minute
    
        data = con.get_candles(instrument, period = 'm1', start=dtn - timedelta(hours=hours, minutes=minutes), end=dtn)        
        self.one['open']      = (data['bidopen']  + data['askopen'])  / 2
        self.one['high']      = (data['bidhigh']  + data['askhigh'])  / 2
        self.one['low']       = (data['bidlow']   + data['asklow'])   / 2
        self.one['close']     = (data['bidclose'] + data['askclose']) / 2
        self.one['direction'] = 'flat'
        self.one.loc[self.one['close'] - self.one['open'] >=  0.00002, "direction"] = "up"
        self.one.loc[self.one['close'] - self.one['open'] <= -0.00002, "direction"] = "down"
    
        s = (self.one['direction'] != self.one['direction'].shift()).cumsum()
        
        self.one['series'] = self.one.groupby(s).cumcount() + 1
        self.one.loc[self.one['direction'] == 'flat', 'series'] = self.one['series'].subtract(1)
        self.one = self.one.tz_localize(pytz.timezone('UTC'))
        self.one = self.one.tz_convert(pytz.timezone('Europe/Moscow'))    
        self.one.to_csv('history.csv', index=True)          
    
        dct = {'date': 'first', 'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last'}
        
        self.two   = self.one.reset_index().groupby(np.arange(len(self.one)) // 2).agg(dct).set_index('date')
        self.three = self.one.reset_index().groupby(np.arange(len(self.one)) // 3).agg(dct).set_index('date')
        self.four  = self.one.reset_index().groupby(np.arange(len(self.one)) // 4).agg(dct).set_index('date')
        self.five  = self.one.reset_index().groupby(np.arange(len(self.one)) // 5).agg(dct).set_index('date')

該函數在循環中被調用。

con = fxcmpy.fxcmpy(config_file = 'fxcm.cfg') # Connection
periods = Periods("EUR/USD")
cycle_just_launched = True
while True:
    time.sleep(60)
    if cycle_just_launched:
        periods.get_historical_data(con)
    else:
        periods.set_actual_data(con, "1min")
    cycle_just_launched = False

似乎您需要封裝“單周期歷史”的概念,然后您可以在此基礎上構建其余部分。 就像是:

class PeriodHistory:
    def __init__(self, name, period):
        self.name = name
        self.period = period # e.g. 1min, 2min, etc.
        self.data = pd.DataFrame()
        self.largest = 0
        self.smallest = 0
        self.latest = 0

    def load(self, historic_data):
        # initialize data, largest, smallest, latest from historical

    def update(self, new_data):
        # update variables based on new data and self.period

然后是一個將多時期歷史合並為一個的類:

class MultiPeriodHistory:
    def __init__(self, name):
        self.name = name
        self.period = {}
        for i in range(1, 6):
            self.period[i] = PeriodHistory(self.name, i)
            self.period[i].load(history_data_for_period[i])

    def update(self):
        new_data = get_data_from_api(self.name)
        for i in range(1, 6):
            self.period[i].update(new_data)

然后您可以使用 dict 為每個貨幣對存儲多歷史記錄:

currencies = ('eur', 'usd', 'jpy', 'gbp', 'chf')
history = {}
for c1 in currencies:
    for c2 in currencies:
        if c1 != c2:
            history[c1 + c2] = MultiPeriodHistory(c1 + c2)

現在例如history['eurgbp'].period[3].smallest會給你你想要的。

您可能需要修改您的數據獲取並稍微更新以適應這種模式,因為我沒有完整的圖片,所以我揮手了很多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM