tft每日頭條

 > 科技

 > 程序化自動交易教程

程序化自動交易教程

科技 更新时间:2024-11-20 13:19:11

背景

前面,通過圖文 如何利用 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制作自動化交易系統--網格交易法)1

網格交易法

本次圖文,就是帶着大家通過 BigOne API 構建一個針對數字資産的等金額網格交易策略,該策略的基本流程如下:

程序化自動交易教程(如何利用BigOne的API制作自動化交易系統--網格交易法)2

網格交易策略的流程圖

  • 創建網格對象:根據曆史成交數據确定向上、向下的網格密度(寬度)以及确定每個網格賣出、買入的價格和數量。
  • 撤銷全部訂單:撤銷當前未完成的訂單。
  • 挂買入訂單:形成買入的網格。
  • 挂賣出訂單:形成賣出的網格。
  • 判斷訂單狀态:監測數字資産價格是否觸及網格,如果觸及并成交則重新創建網格對象,如此往複執行。

代碼實現

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 交易對

程序化自動交易教程(如何利用BigOne的API制作自動化交易系統--網格交易法)3

ONE-USDT

PRS-USDT 交易對

程序化自動交易教程(如何利用BigOne的API制作自動化交易系統--網格交易法)4

PRS-USDT

EOS-USDT 交易對

程序化自動交易教程(如何利用BigOne的API制作自動化交易系統--網格交易法)5

EOS-USDT

BTM-USDT 交易對

程序化自動交易教程(如何利用BigOne的API制作自動化交易系統--網格交易法)6

BTM-USDT

該策略的回測和評估需要積累一定數據才能進行,我們後面再來介紹。

網格交易看起來似乎簡單,其實裡面包含了很複雜的問題,比如市場趨勢向上、向下、橫盤震蕩時我們如何調整向上、向下網格的寬度;如何确定每個網格買入、賣出的數字資産數量(金字塔、倒金字塔、同量……);資金固定的情況下如何進行資金分配等等。這些都是需要考慮和寫程序根據不同的場景進行自适應調整的。慢慢來啊!今天就到這裡吧!See You!


相關圖文

  • 如何利用 C# 實現 K 最鄰近算法?
  • 如何利用 C# 實現 K-D Tree 結構?
  • 如何利用 C# KDTree 實現 K 最鄰近算法?
  • 如何利用 C# 對神經網絡模型進行抽象?
  • 如何利用 C# 實現神經網絡的感知器模型?
  • 如何利用 C# 實現 Delta 學習規則?
  • 如何利用 C# 爬取帶 Token 驗證的網站數據?
  • 如何利用 C# 向 Access 數據庫插入大量數據?
  • 如何利用 C# 開發「桌面版百度翻譯」軟件!
  • 如何利用 C# 開發「股票數據分析軟件」(上)
  • 如何利用 C# 開發「股票數據分析軟件」(中)
  • 如何利用 C# 開發「股票數據分析軟件」(下)
  • 如何利用 C# 爬取「财報說」中的股票數據?
  • 如何利用 C# 爬取 One 持有者返利數據!
  • 如何利用 C# 爬取Gate.io交易所的公告!
  • 如何利用 C# 爬取BigOne交易所的公告!
  • 如何利用 C# 爬取「貓眼電影:熱映口碑榜」及對應影片信息!
  • 如何利用 C# 爬取「貓眼電影專業版:票房」數據!
  • 如何利用 C# 爬取「貓眼電影:最受期待榜」及對應影片信息!
  • 如何利用 C# 爬取「貓眼電影:國内票房榜」及對應影片信息!
  • 如何利用 C# Python 破解貓眼電影的反爬蟲機制?

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved