# 使用するパッケージをインポート
import MetaTrader5 as mt5
import datetime 
import time
# タイムゾーンを使用するためのpytzモジュール
import pytz
# インジケータの計算をするTA-Lib
import talib
# テーブル形式で得られたデータを表示するためのpandasモジュール
import pandas as pd
import numpy as np
#描画するためのmatplfinance
import mplfinance as mpf

# MetaTrader 5ターミナルとの接続を確立する
if not mt5.initialize():
   print("initialize() failed, error code =",mt5.last_error())
   quit()

# タイムゾーンをUTCに設定する
timezone = pytz.timezone("UTC")

#空のデータフレーム作成
cols = ['time', 'price', 'volume']
ticks_frame = pd.DataFrame(index=[], columns=cols)
cols2 = ['time', 'open', 'high','low', 'close', 'volume']

symbol = 'USDJPY'   #取引銘柄
max_tick = 10*6*60*24*2*10#真ん中をsecondと同じ秒数にする(今無視してる)
pre_sec = 60
length_short = 1
length_long = 1

max_line = 10000
df = pd.read_csv('C:/Users/xi/MT5/in_dat/common.csv', index_col=0)
data_short = df.iat[0,4]
data_long = df.iat[0,5]

#ticks_frameを読み込み
ticks_frame = pd.read_csv('C:/Users/xi/MT5/in_dat/tick.csv', index_col=0)
ticks_frame['time'] = pd.to_datetime(ticks_frame['time'])   #timeをDatetime型に変換
ticks_frame = ticks_frame.tail(max_tick)

dt_now = datetime.datetime.now()
td = datetime.timedelta(hours=2)
print(dt_now)
past = ticks_frame.iat[-1,0]
past = past.to_pydatetime()
past_short = dt_now -td
past_long = dt_now -td

while True: #無限ループ
    try:
        #print('start')
        #1tick取得(タプル形式でtime,bid,ask,last,volume,time_msc,flags,volume_realを取得)
        USDJPY_ticks = mt5.symbol_info_tick(symbol)
        #木下がなおしてみました
        if USDJPY_ticks is None:
            print('変数が入りませんでした')
            if not mt5.initialize():
                print("initialize() failed, error code =",mt5.last_error())
                quit()
            USDJPY_ticks = mt5.symbol_info_tick(symbol)
            dt_now = datetime.datetime.now()
            td = datetime.timedelta(hours=2)
            print(dt_now)
        ########
        #UNIX時間をDatetimeに変換
        dt = datetime.datetime.fromtimestamp(USDJPY_ticks[0])
        td = datetime.timedelta(hours=2)
        dt_new = dt - td
        #取得したbidとaskの平均をとってpriceを作る
        price = (USDJPY_ticks[1] + USDJPY_ticks[2]) * 0.5
        volume = 1
        #print('dt.second=',dt.second)
        #print('pre_sec',pre_sec)
        #秒の部分が変わったらデータフレームに追加
        if pre_sec != dt.second:
            tmp_se = pd.Series( [dt_new, price, volume], index=ticks_frame.columns )
            #print(tmp_se)
            ticks_frame = ticks_frame.append( tmp_se, ignore_index=True)
            if past >= dt_new:
                print('誤った値が入ったため削除')
                print('1つ前のTickの時間：',past)
                print('間違ったTickの時間：',dt_new)
                num = ticks_frame.tail(1)
                ticks_frame = ticks_frame.drop(num.index)
                mt5.initialize()
            else:
                ticks_frame.to_csv("C:/Users/xi/MT5/in_dat/tick.csv",  index=True, header=True)
                #print(ticks_frame.tail(1))
                pre_sec = dt.second
                past = dt_new


        #短期
        ticks_frame2 = ticks_frame.set_index('time') #indexを時間に変える
        ticks_frame2 = ticks_frame2['price'].resample(data_short).ohlc().ffill().assign(volume=ticks_frame2['volume'].resample(data_short).sum().ffill())#指定した秒足でresampleする,その時間内にデータが来なかったら前の値で穴埋めする

        if length_short < len(ticks_frame2):  #ticks_frame2の長さが増えたら(新しい10秒足のデータができたら)
            
            #csvに最新の1行を追加
            #.tail(1)を使うときはファイルが自動生成されないので、ファイルがない場合はカラム名だけ入ったファイルを作成する必要がある
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_EMA.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_BBAND.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_MACD.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_RSI.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_STOCH.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_WillR.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_DMI.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_CCI.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_MOM.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_ROC.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_ULTOSC.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_AROON.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_MFI.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_TRIX.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_TSF.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_RULE.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_TRADE.csv",  index=True, header=True)
            ticks_frame2.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/short/OHLCV_short_CHART.csv",  index=True, header=True)
            #print(ticks_frame2.tail(5))
       
            length_short = len(ticks_frame2)  #長さを更新
        
        #長期
        ticks_frame3 = ticks_frame.set_index('time') #indexを時間に変える
        ticks_frame3 = ticks_frame3['price'].resample(data_long).ohlc().ffill().assign(volume=ticks_frame3['volume'].resample(data_long).sum().ffill())

        if length_long < len(ticks_frame3):
            
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_EMA.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_BBAND.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_MACD.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_RSI.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_STOCH.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_WillR.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_DMI.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_CCI.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_MOM.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_ROC.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_ULTOSC.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_AROON.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_MFI.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_TRIX.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_TSF.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_RULE.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_TRADE.csv",  index=True, header=True)
            ticks_frame3.tail(max_line).to_csv("C:/Users/xi/MT5/in_dat/long/OHLCV_long_CHART.csv",  index=True, header=True)
            #print(ticks_frame3.tail(5))

            length_long = len(ticks_frame3)

        if len(ticks_frame) == max_tick :#一定の数を超えたら配列の初めから削除していく(frameが減ったら2~7も減るから1だけ減らせばいい)
            ticks_frame = ticks_frame.drop(0) #削除したデータフレームを上書き保存
          
    except pd.errors.EmptyDataError:
        print('csvファイルが読み取れませんでした．スキップします．')
        continue

    except ValueError:
        print('ValueError')
        continue

    except AssertionError:
        print('AssertionError')
        continue

    except TypeError:
        print('TypeError')
        continue

    except AttributeError:
        print('AttributeError')
        continue

    except OverflowError:
        print('OverflowError')
        continue
    
    except OSError:
        print('OSError')
        continue
