Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
raidastauras authored Jan 8, 2018
1 parent 41950a6 commit 4b42624
Showing 1 changed file with 48 additions and 35 deletions.
83 changes: 48 additions & 35 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,26 @@
"""

from helpers.oanda_api_helpers import TradingSession, close_order_manually
from apscheduler.schedulers.blocking import BlockingScheduler
from helpers.oanda_api_helpers import TradingSession
from helpers.utils import remove_nan_rows
from helpers.get_features import get_features, min_max_scaling
from helpers.get_historical_data import get_latest_oanda_data
import tensorflow as tf
import numpy as np
import pandas as pd
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
import time
import pytz

# TODO: trading params like position size kelly criterion
position_size = 10000

# some parameters
close_current_positions = True
start_on_spot = False
start_on_spot = True

# oanda access keys
accountID = ''
access_token = ''
accountID = '101-004-3943081-006'
access_token = 'fb12d7edd860927ce27467d8ec4aee94-1cb7ffc0e40d649b736315872a10c545'
model_name = 'lr-v1-avg_score1.454-2000'

# init trading session
Expand All @@ -38,54 +40,65 @@
drop_out = graph.get_tensor_by_name('strided_slice_1:0')
y_ = graph.get_tensor_by_name('Softmax:0')

# global variables
# other variables
log = pd.DataFrame()
start_time = str(datetime.datetime.now())[:-7].replace(':', '-')
tz = pytz.timezone('Europe/Vilnius')
start_time = str(datetime.datetime.now(tz))[:-13].replace(':', '-')
margin_rate = float(trading_sess.check_account_summary()['account']['marginRate'])
last_complete_candle_stamp = ''


def do_stuff_every_period():

global log
global start_time
current_time = str(datetime.datetime.now())[:-7]

# gather data and return signal
oanda_data = get_latest_oanda_data('EUR_USD', 'H1', 64)
global last_complete_candle_stamp
global margin_rate
current_time = str(datetime.datetime.now(tz))[:-13]

# estimate position size
account_balance = np.around(float(trading_sess.check_account_summary()['account']['balance']), 0)
funds_to_commit = account_balance * (1 / margin_rate)

# download latest data
# always check if new candle is present, because even after 5 seconds, it might be not formed if market is very calm
while True:
oanda_data = get_latest_oanda_data('EUR_USD', 'H1', 300) # many data-points to increase EMA and such accuracy
current_complete_candle_stamp = oanda_data[-1]['time']
if current_complete_candle_stamp != last_complete_candle_stamp: # if new candle is complete
break
time.sleep(5)
last_complete_candle_stamp = current_complete_candle_stamp

# get features
input_data_raw, input_data_dummy = get_features(oanda_data)
input_data, input_data_dummy = remove_nan_rows([input_data_raw, input_data_dummy])
input_data_scaled_no_dummies = (input_data - min_max_scaling[1, :]) / (
min_max_scaling[0, :] - min_max_scaling[1, :])
input_data_scaled = np.concatenate([input_data_scaled_no_dummies, input_data_dummy], axis=1)
input_data_scaled_no_dummy = (input_data - min_max_scaling[1, :]) / (min_max_scaling[0, :] - min_max_scaling[1, :])
input_data_scaled = np.concatenate([input_data_scaled_no_dummy, input_data_dummy], axis=1)

# estimate signal
y_pred = sess.run(y_, feed_dict={x: input_data_scaled, drop_out: 1})
order_signal = y_pred.argmax() # 0 stands for buy, 1 for sell, 2 for hold

print('{} | price: {:.5f} | signal: buy: {:.2f}, sell: {:.2f}, nothing: {:.2f}'
.format(current_time, oanda_data[-1]['closeMid'], y_pred[0][0], y_pred[0][1], y_pred[0][2]))

# if signal long
if order_signal == 0:
if trading_sess.order_book['EUR_USD']['order_type'] == -1:
trading_sess.close_order('EUR_USD')
trading_sess.open_order('EUR_USD', position_size)

# if signal short
elif order_signal == 1:
if trading_sess.order_book['EUR_USD']['order_type'] == 1:
y_pred = sess.run(y_, feed_dict={x: input_data_scaled[-1:, :], drop_out: 1})
order_signal_id = y_pred.argmax()
order_signal = [1, -1, 0][order_signal_id] # 0 stands for buy, 1 for sell, 2 for hold

# manage trading positions
current_position = trading_sess.order_book['EUR_USD']['order_type']
if current_position != order_signal:
if current_position is not None:
trading_sess.close_order('EUR_USD')
trading_sess.open_order('EUR_USD', -position_size)

# else (uncharted waters)
trading_sess.open_order('EUR_USD', funds_to_commit * order_signal)
else:
print('Do nothing')
print('{}: EUR_USD (holding)'.format(['Long', 'Short', 'Nothing'][order_signal_id]))

# log
new_log = pd.DataFrame([[current_time, oanda_data[-1]['closeMid'], y_pred]],
columns=['Datetime', 'Last input Price', 'y_pred'])
log = log.append(new_log)
log.to_csv('logs/log {}.csv'.format(start_time))

print('{} | price: {:.5f} | signal: buy: {:.2f}, sell: {:.2f}, nothing: {:.2f}'
.format(current_time, oanda_data[-1]['closeMid'], y_pred[0][0], y_pred[0][1], y_pred[0][2]))


# Scheduler
scheduler = BlockingScheduler()
Expand Down

0 comments on commit 4b42624

Please sign in to comment.