Overall Statistics
Total Trades
6353
Average Win
0.00%
Average Loss
0.00%
Compounding Annual Return
5.362%
Drawdown
0.800%
Expectancy
0.391
Net Profit
1.035%
Sharpe Ratio
2.141
Loss Rate
50%
Win Rate
50%
Profit-Loss Ratio
1.76
Alpha
0.089
Beta
-3.011
Annual Standard Deviation
0.019
Annual Variance
0
Information Ratio
1.324
Tracking Error
0.019
Treynor Ratio
-0.014
Total Fees
$0.00
import io, requests
import numpy as np
import pandas as pd
from datetime import timedelta

assets = ['AUDUSD', 'EURUSD', 'GBPUSD', 'NZDUSD', 'USDCAD', 'USDCHF', 'USDJPY', 'USDNOK', 'USDSEK', 'USDSGD']
No_Channels = 10
Input_Size = 256

class BasicTemplateAlgorithm(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2019,1,1)  #Set Start Date
        self.SetEndDate(2019,3,13)    #Set End Date
        self.SetCash(100000)           #Set Strategy Cash
        self.SetBrokerageModel(BrokerageName.OandaBrokerage)
        for asset in assets: self.AddForex(asset, Resolution.Hour, Market.Oanda, True, 1.0)
        self.History(512, Resolution.Hour)
    def OnData(self, data):
        cc = None
        for asset in assets:
            df = self.History([asset], timedelta(14), Resolution.Hour).loc[asset]
            df = df['bidclose'].resample('1H').interpolate(method='cubic')
            if asset[-3:] != 'USD': df = 1.0 / df
            df = np.log((df/df.shift(1)).tail(Input_Size))
            cc = df if cc is None else pd.concat([cc, df], axis=1)
        stdarr = np.exp(cc.abs().quantile(0.25).values)
        self.Debug(stdarr)
        X = np.swapaxes(cc.values, 0, 1)
        data = {'arr': X.reshape(-1).tolist()}
        response = requests.post('https://rota.serveo.net/test', json=data)
        try:
            weights = np.array(response.json()['arr'])
        except:
            self.Debug('JSONDecodeError')
            return
        #self.Debug(weights)
        for i, asset in enumerate(assets):
            ratio = weights[i] if asset[-3:] == 'USD' else (-1.0*weights[i])
            #self.SetHoldings(asset, ratio)
            
            self.Transactions.CancelOpenOrders(asset)
            oq = self.CalculateOrderQuantity(asset, ratio)
            lp = self.Securities[asset].AskPrice * stdarr[i]
            if oq > 0: lp = self.Securities[asset].BidPrice / stdarr[i]
            if oq != 0: self.LimitOrder(asset, oq, lp)