[英]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.