Ai
1 Star 0 Fork 1

vv_soft/Lean

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
FeeModelNotUsingAccountCurrency.cs 7.31 KB
一键复制 编辑 原始数据 按行查看 历史
Martin Molinero 提交于 2018-12-25 01:29 +08:00 . Add missing crypto data
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using QuantConnect.Data;
using QuantConnect.Brokerages;
using QuantConnect.Orders.Fees;
using QuantConnect.Orders;
using QuantConnect.Interfaces;
using QuantConnect.Securities;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Regression test algorithm where custom a <see cref="FeeModel"/> does not use Account the Currency
/// </summary>
public class FeeModelNotUsingAccountCurrency : QCAlgorithm, IRegressionAlgorithmDefinition
{
private Security _security;
// Adding this so we only trade once, so math is easier and clear
private bool _alreadyTraded;
private int _initialEurCash = 10000;
private decimal _orderFeesInAccountCurrency;
/// <summary>
/// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
/// </summary>
public override void Initialize()
{
SetStartDate(2018, 4, 4); // Set Start Date
SetEndDate(2018, 4, 4); // Set End Date
// Set Strategy Cash (USD) to 0. This is required for
// SetHoldings(_security.Symbol, 1) not to fail
SetCash(0);
// EUR/USD conversion rate will be updated dynamically
// Note: the conversion rates are required in backtesting (for now) because of this issue:
// https://github.com/QuantConnect/Lean/issues/1859
SetCash("EUR", _initialEurCash, 1.23m);
SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash);
_security = AddCrypto("BTCEUR");
// This is required because in our custom model, NonAccountCurrencyCustomFeeModel,
// fees will be charged in ETH (not Base, nor Quote, not account currency).
// Setting the cash allows the system to add a data subscription to fetch required conversion rates.
SetCash("ETH", 0, 0m);
_security.FeeModel = new NonAccountCurrencyCustomFeeModel();
}
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
{
if (!Portfolio.Invested && !_alreadyTraded)
{
_alreadyTraded = true;
SetHoldings(_security.Symbol, 1);
Debug("Purchased Stock");
}
else
{
Liquidate(_security.Symbol);
}
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
Debug(Time + " " + orderEvent);
_orderFeesInAccountCurrency +=
Portfolio.CashBook.ConvertToAccountCurrency(orderEvent.OrderFee.Value).Amount;
}
public override void OnEndOfAlgorithm()
{
Log($"TotalPortfolioValue: {Portfolio.TotalPortfolioValue}");
Log($"CashBook: {Portfolio.CashBook}");
Log($"Holdings.TotalCloseProfit: {_security.Holdings.TotalCloseProfit()}");
// Fees will be applied to the corresponding Cash currency. 1 ETH * 2 trades
if (Portfolio.CashBook["ETH"].Amount != -2)
{
throw new Exception("Unexpected ETH cash amount: " +
$"{Portfolio.CashBook["ETH"].Amount}");
}
if (Portfolio.CashBook["USD"].Amount != 0)
{
throw new Exception("Unexpected USD cash amount: " +
$"{Portfolio.CashBook["USD"].Amount}");
}
if (Portfolio.CashBook["BTC"].Amount != 0)
{
throw new Exception("Unexpected BTC cash amount: " +
$"{Portfolio.CashBook["BTC"].Amount}");
}
if (Portfolio.CashBook.ContainsKey(Currencies.NullCurrency))
{
throw new Exception("Unexpected NullCurrency cash");
}
var closedTrade = TradeBuilder.ClosedTrades[0];
var profitInQuoteCurrency = (closedTrade.ExitPrice - closedTrade.EntryPrice)
* closedTrade.Quantity;
if (Portfolio.CashBook["EUR"].Amount != _initialEurCash + profitInQuoteCurrency)
{
throw new Exception("Unexpected EUR cash amount: " +
$"{Portfolio.CashBook["EUR"].Amount}");
}
if (closedTrade.TotalFees != _orderFeesInAccountCurrency)
{
throw new Exception($"Unexpected closed trades total fees {closedTrade.TotalFees}");
}
if (_security.Holdings.TotalFees != _orderFeesInAccountCurrency)
{
throw new Exception($"Unexpected closed trades total fees {closedTrade.TotalFees}");
}
}
internal class NonAccountCurrencyCustomFeeModel : FeeModel
{
public override OrderFee GetOrderFee(OrderFeeParameters parameters)
{
return new OrderFee(new CashAmount(1m, "ETH"));
}
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Average Win", "0%"},
{"Average Loss", "-6.67%"},
{"Compounding Annual Return", "-100.000%"},
{"Drawdown", "3.500%"},
{"Expectancy", "-1"},
{"Net Profit", "-6.428%"},
{"Sharpe Ratio", "-11.232"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-16.193"},
{"Beta", "1173.18"},
{"Annual Standard Deviation", "0.721"},
{"Annual Variance", "0.52"},
{"Information Ratio", "-11.251"},
{"Tracking Error", "0.72"},
{"Treynor Ratio", "-0.007"},
{"Total Fees", "$804.33"}
};
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C#
1
https://gitee.com/dahuotou/Lean.git
git@gitee.com:dahuotou/Lean.git
dahuotou
Lean
Lean
master

搜索帮助