背景
前面,通過圖文 如何利用 C# 爬取 ONE 的交易數據? 向大家介紹了如何爬取在 BigOne 上線的數字資産的交易數據。
其次,通過圖文 如何利用BigOne的API制作自動化交易系統 -- 身份驗證 向大家介紹了利用 BigOne API 函數之前的身份驗證問題。
然後,通過圖文 如何利用BigOne的API制作自動化交易系統 -- 獲取賬戶資産 向大家介紹了利用 BigOne API 函數獲取自己的賬戶資産數據。
接着,通過圖文 如何利用BigOne的API制作自動化交易系統 -- 訂單系統 向大家介紹了 利用 BigOne API 函數進行挂單、撤單、查詢訂單狀态等交易操作。
最後,通過圖文 如何進行代碼的重構?以封裝 BigOne API 為例 向大家介紹了 利用 Layers 軟件體系結構風格重構對 BigOne API 的封裝過程。
有了以上的基礎,我們就可以制定交易策略,通過自動化的方式進行數字資産的交易了。從此告别手動挂單、撤單、查看是否成交的煩惱!
技術分析
道氏理論指出,金融市場的價格變動可以分為三種情況,分别是上漲、下跌和牛皮。而在上漲或下跌的過程中也會在較短周期上出現連續的波動,價格最終或者以無趨勢波動呈現出來,或者以短期的波動和長期的趨勢呈現出來的。在外彙市場上有一種被稱為漁網交易法的交易理念,這種理念認為,在一定的時間周期上,價格基本處于往複波動的狀态,投資者可以通過較高的頻率交易,利用限價單的交易方式來獲得價格波動的收益。
什麼是網格交易法呢?
網格交易法,就是跌買漲賣。具體做法是把資金分成 n 份,每次投入固定金額,先初始建倉,再設定一個百分比,比如 5%,股價跌 5% 就買入一份,漲 5% 就賣出一份,如此反複買賣,不斷的低吸高抛,不斷産生盈利,從而積少成多。
網格交易法
本次圖文,就是帶着大家通過 BigOne API 構建一個針對數字資産的等金額網格交易策略,該策略的基本流程如下:
網格交易策略的流程圖
代碼實現
Step1 定義網格交易用到的數據結構。
表示訂單的結構 Order
public class Order { // 價格 public double Price { get; set; } // 數量 public double amount { get; set; } public Order(double price, double amount) { Price = price; Amount = amount; } }
表示數字貨币資産的接口 IDigitalCurrency。
public interface IDigitalCurrency { // 資産ID string AssetId { get; } // 獲取該資産的曆史記錄 List<AssetData> GetHistoryData(string period, string time, string limit); // 獲取該資産的曆史記錄 List<AssetData> GetHistoryData(); }
利用 BTC 來實現數字資産接口舉例。
代碼原理參見:如何利用 C# 爬取 ONE 的交易數據?
public class Btc : IDigitalCurrency { public string AssetId { get; } = "BTC"; public List<AssetData> GetHistoryData(string period, string time, string limit) { string url = "https://b1.run/api/xn/v1/asset_pairs/550b34db-696e-4434-a126-196f827d9172/candles?" "period=" period "&time=" time "&limit=" limit; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; IHtmlDocument document = new JumonyParser().LoadDocument(url); List<IHtmlNode> nos = document.Nodes().ToList(); string str = nos[0].ToString(); StringReader sr = new StringReader(str); JsonTextReader jsonReader = new JsonTextReader(sr); JsonSerializer serializer = new JsonSerializer(); JsonOne one = serializer.Deserialize<JsonOne>(jsonReader); return one.data; } public List<AssetData> GetHistoryData() { string period = "DAY1"; DateTime dt = DateTime.Now; string time = dt.Year "-" dt.Month.ToString().PadLeft(2, '0') "-" dt.Day.ToString().PadLeft(2, '0') "T00:00:00.000Z"; string limit = "250"; return GetHistoryData(period, time, limit); } }
Step2 網格交易的抽象結構 GridMethod。
public abstract class GridMethod { // 資産 public IDigitalCurrency Asset { get; protected set; } // 市場交易對 public string MarketId { get; protected set; } // 網格的基準價格 public double BasePrice { get; protected set; } // 按照基準價格進行購買時,所用的資金 public double BaseMoney { get; protected set; } // 取數據的天數,用于計算網格密度 public int Days { get; protected set; } // 每日交易的頻數,用于計算網格密度 public int DailyTurnover { get; protected set; } // 向上網格的密度(寬度) public double GridAmplitudeUp { get; protected set; } // 向下網格的密度(寬度) public double GridAmplitudeDown { get; protected set; } // 向上,向下劃分網格的條數 public int GridCount { get; protected set; } // 訂單列表 public List<Order> OrderList { get; protected set; } // 計算網格密度(寬度) protected abstract void CalculateAmplitude(); // 計算網格訂單 protected abstract void CalculateGrid(); // 撤銷所有訂單 public abstract void CancelAllOrder(); // 創建買入訂單 public abstract List<OrderResponse> CreateBidOrders(); // 創建賣出訂單 public abstract List<OrderResponse> CreateAskOrders(); // 網格的格式化輸出 public override string ToString() { string infor = "AssetId:" Asset.AssetId Environment.NewLine "MarketId:" MarketId Environment.NewLine "BasePrice:" BasePrice Environment.NewLine "BaseMoney:" BaseMoney Environment.NewLine "Days:" Days Environment.NewLine "DailyTurnover:" DailyTurnover Environment.NewLine "GridAmplitudeUp:" GridAmplitudeUp Environment.NewLine "GridAmplitudeDown:" GridAmplitudeDown Environment.NewLine "GridCount:" GridCount; return infor; } }
Step3 等金額的網格策略 GridMethodEqualMoney。
該交易策略的每個網格所使用的網格寬度相同、金額相同,即是一種沉澱數字資産的交易策略。
public sealed class GridMethodEqualMoney : GridMethod { private readonly IDigitalCurrencyUtility _digitalCurrencyUtility; public GridMethodEqualMoney(IDigitalCurrency asset, string marketId, int days, int dailyTurnover, double baseMoney, double basePrice, int gridCount, IDigitalCurrencyUtility digitalCurrencyUtility) { _digitalCurrencyUtility = digitalCurrencyUtility; Asset = asset; MarketId = marketId; BasePrice = basePrice; BaseMoney = baseMoney; Days = days; DailyTurnover = dailyTurnover; GridCount = gridCount; //計算向上、向下的網格寬度 CalculateAmplitude(); //計算訂單列表 CalculateGrid(); } protected override void CalculateAmplitude() { //根據以往的成交量數據,計算指定周期的振幅。 List<AssetData> lstTrade = Asset.GetHistoryData(); List<double> lst = new List<double>(); int count = Days < lstTrade.Count - 1 ? Days : lstTrade.Count - 1; for (int i = 0; i < count; i ) { double zf = (lstTrade[i].high - lstTrade[i].low)/lstTrade[i 1].close; lst.Add(zf); } double result = lst.Count == 0 ? 0.02 : Math.Round(lst.Average()/(2.0*DailyTurnover), 4); result = Math.Max(0.02, result); GridAmplitudeUp = result; GridAmplitudeDown = result; } protected override void CalculateGrid() { OrderList = new List<Order>(); double price = Math.Round(BasePrice, 6); double amount = Math.Round(BaseMoney/price, 3); Order order = new Order(price, amount); OrderList.Add(order); for (int i = 0; i < GridCount; i ) { price = Math.Round(price/(1.0 - GridAmplitudeUp), 6); amount = Math.Round(BaseMoney/price, 3); order = new Order(price, amount); OrderList.Add(order); } price = Math.Round(BasePrice, 6); for (int i = 0; i < GridCount; i ) { price = Math.Round(price*(1.0 - GridAmplitudeDown), 6); amount = Math.Round(BaseMoney/price, 3); order = new Order(price, amount); OrderList.Add(order); } OrderList = OrderList.OrderBy(a => a.Price).ToList(); } public override void CancelAllOrder() { _digitalCurrencyUtility.CancelAllOrder(MarketId); } public override List<OrderResponse> CreateBidOrders() { List<Order> lst = OrderList.GetRange(0, GridCount); return _digitalCurrencyUtility.CreateBidOrders(lst, MarketId); } public override List<OrderResponse> CreateAskOrders() { List<Order> lst = OrderList.GetRange(GridCount 1, GridCount); return _digitalCurrencyUtility.CreateAskOrders(lst, MarketId); } }
總結
到此為止,網格交易策略的實現框架就基本介紹完了,下面是我利用該框架對 BTC、EOS、BTM、PRS、ONE等 進行網格交易的截圖。
ONE-USDT 交易對
ONE-USDT
PRS-USDT 交易對
PRS-USDT
EOS-USDT 交易對
EOS-USDT
BTM-USDT 交易對
BTM-USDT
該策略的回測和評估需要積累一定數據才能進行,我們後面再來介紹。
網格交易看起來似乎簡單,其實裡面包含了很複雜的問題,比如市場趨勢向上、向下、橫盤震蕩時我們如何調整向上、向下網格的寬度;如何确定每個網格買入、賣出的數字資産數量(金字塔、倒金字塔、同量……);資金固定的情況下如何進行資金分配等等。這些都是需要考慮和寫程序根據不同的場景進行自适應調整的。慢慢來啊!今天就到這裡吧!See You!
相關圖文:
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!