[TOC] 低周波通信の戦略について 2020年に書いた記事で,https://www.fmz.com/digest-topic/6228『この記事は,私の高周波戦略が長期にわたって安定した収益を上げていたが,徐々に利益が低下し,一度停止した.ここ数ヶ月間,再び努力して改造し,現在も少しお金を稼いでいる.』 この記事は,私の高周波戦略のアイデアと,いくつかの簡素化されたコードを詳細に紹介し,引引金を投げ出す役割を果たします.
リターン・コミッションの口座,比安を例に挙げると,現在のmakerのリターン・コミッションは10万分の5で,1日の取引額が100万Uであれば,リターン・コミッションは5000Uである. もちろんテイカーもVIP率に基づいており,戦略が支払わなければ,VIPレベルは高周波戦略にほとんど影響しない.一般取引所には異なるグレードのリターン・コミッションがあり,高い取引額を維持する必要がある.
速さ.高速なため,高速と呼ばれている.コロサーバーに加入すると,最小の遅延と最も安定した接続を得る条件も内卷の条件の一つとなる.内部の時間ができるだけ少なくなるようにする.この記事では,私が使用するウェブソケットのフレームワークについて説明します.
適正な市場、高周波取引は量的な取引の真珠と呼ばれている.多くの程序化されたトレーダーは試したと思うが,ほとんどの人は儲からないし,改善する方向も見つけられないため,停止すべきだ.主な理由は,間違った取引市場を見つけることである.戦略の初期段階は,取引を行うのに比較的容易な市場を探すべきである.そうすれば有利な利害関係があり,改善されたフィードバックがあり,戦略の進歩に有利である.最初から最も激烈な競争市場で,多くの潜在的ライバルと競争している場合,どのように試みてもすぐに損をするなら,すぐに堅持できない.私は新しい永続契約取引を推奨する.
競争に直面する.あらゆる取引の市場は動的変化であり,取引戦略は一度に一度に終わらない.高周波取引は,この市場に入ると,最も賢い,最も勤勉なトレーダーのグループと直接対抗する.ゼロとゲーム市場では,あなたが稼ぐことは,他の人の稼ぐよりも少ない.遅くなれば,入るほど,困難が高くなり,すでに市場で常に改善され,いつでも排除される可能性があります.
高周波戦略には様々な種類があります
私の戦略は,トレンドとマーケットメーカーの組み合わせで,トレンドを判断し,注文を掲示し,取引後にすぐに注文を掲示し,ストックを保持しない.
以下のコードは,Binance Perpetual Contract の基礎となるアーキテクチャであり,主にwebsocketの深深度オーダーストリーム・トレード市場,およびポジション位置情報をサブスクリプションしている.市場とアカウント情報が別々のサブスクリプションであるため,最新情報を取得するかどうかを判断するために常にread (−1) を使用する必要があるため,EventLoop (−1000) が使用されており,直接的な死回路を回避し,システム負荷を軽減している.EventLoop (−1000) はwssにブロックされるか,同時に任務を送信し,1000msを超えると戻ってくる.
var datastream = null
var tickerstream = null
var update_listenKey_time = 0
function ConncetWss(){
if (Date.now() - update_listenKey_time < 50*60*1000) {
return
}
if(datastream || tickerstream){
datastream.close()
tickerstream.close()
}
//需要APIKEY
let req = HttpQuery(Base+'/fapi/v1/listenKey', {method: 'POST',data: ''}, null, 'X-MBX-APIKEY:' + APIKEY)
let listenKey = JSON.parse(req).listenKey
datastream = Dial("wss://fstream.binance.com/ws/" + listenKey + '|reconnect=true', 60)
//Symbols是设定的交易对
let trade_symbols_string = Symbols.toLowerCase().split(',')
let wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string.join(Quote.toLowerCase()+"@aggTrade/")+Quote.toLowerCase()+"@aggTrade/"+trade_symbols_string.join(Quote.toLowerCase()+"@depth20@100ms/")+Quote.toLowerCase()+"@depth20@100ms"
tickerstream = Dial(wss_url+"|reconnect=true", 60)
update_listenKey_time = Date.now()
}
function ReadWss(){
let data = datastream.read(-1)
let ticker = tickerstream.read(-1)
while(data){
data = JSON.parse(data)
if (data.e == 'ACCOUNT_UPDATE') {
updateWsPosition(data)
}
if (data.e == 'ORDER_TRADE_UPDATE'){
updateWsOrder(data)
}
data = datastream.read(-1)
}
while(ticker){
ticker = JSON.parse(ticker).data
if(ticker.e == 'aggTrade'){
updateWsTrades(ticker)
}
if(ticker.e == 'depthUpdate'){
updateWsDepth(ticker)
}
ticker = tickerstream.read(-1)
}
makerOrder()
}
function main() {
while(true){
ConncetWss()
ReadWss()
worker()
updateStatus()
EventLoop(1000)
}
}
先ほど述べたように,私の高周波戦略は,トレンドを判断し,セールスを実行する事前である.短期トレンドを判断する方法は,主に取引の方向性,価格,量,取引時間などを含む,購読中のaggTradeの取引データに基づいており,購入の主な参照は深さと取引量である.以下の詳細は,注意すべき指標である.ほとんどの指標は,2つのグループに分けられ,特定の時間ウィンドウで動的統計であり,私の戦略の時間ウィンドウは10秒以内にあります.
//bull代表短期看涨,bear短期看跌
let bull = last_sell_price > avg_sell_price && last_buy_price > avg_buy_price &&
avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
let bear = last_sell_price < avg_sell_price && last_buy_price < avg_buy_price &&
avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;
最新の販売価格が販売注文の平均価格よりも高く,最新の購入価格が購入注文の平均価格よりも高く,固定間隔の購入価格が販売注文の価格よりも高くなった場合,短期看板を判断する.
function updatePrice(depth, bid_amount, ask_amount) {
let buy_price = 0
let sell_price = 0
let acc_bid_amount = 0
let acc_ask_amount = 0
for (let i = 0; i < Math.min(depth.asks.length, depth.bids.length); i++) {
acc_bid_amount += parseFloat(depth.bids[i][1])
acc_ask_amount += parseFloat(depth.asks[i][1])
if (acc_bid_amount > bid_amount && buy_price == 0) {
buy_price = parseFloat(depth.bids[i][0]) + tick_size
}
if (acc_ask_amount > ask_amount && sell_price == 0) {
sell_price = parseFloat(depth.asks[i][0]) - tick_size
}
if (buy_price > 0 && sell_price > 0) {
break
}
}
return [buy_price, sell_price]
}
ここで古い考え方を採用し,必要な量まで深さを繰り返す.ここで1s以内に10コインの支払いを処理できると仮定し,新しい契約を考慮しない場合,販売单の価格を10コインの支払いの衝撃位置に設定します.具体的にはどのくらいの時間窓口を設定する必要があります.
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
Ratioは,購入量が最近販売された注文数に固定された割合を表す固定比率を表します.この戦略は,現在の購入活動に応じて注文サイズに適応します.
if(bull && (sell_price-buy_price) > N * avg_diff) {
trade('buy', buy_price, buy_amount)
}else if(position.amount < 0){
trade('buy', buy_price, -position.amount)
}
if(bear && (sell_price-buy_price) > N * avg_diff) {
trade('sell', sell_price, sell_amount)
}else if(position.amount > 0){
trade('sell', sell_price, position.amount)
}
中にはavg_diffが平均取引の差値で,当時の注文の買い売り差額が一定倍数以上の値で,見込みの時にのみ決済を行う.空き注文を保持した場合,このときも平衡し,長期請求書を避ける.下注文は,注文の取引を保証するために,オンリーメーカーの注文を下すことができます.また,Bian安のカスタムオーダーIDを使用して,注文の返還を待つ必要がないようにすることができます.
var tasks = []
var jobs = []
function worker(){
let new_jobs = []
for(let i=0; i<tasks.length; i++){
let task = tasks[i]
jobs.push(exchange.Go.apply(this, task.param))
}
_.each(jobs, function(t){
let ret = t.wait(-1)
if(ret === undefined){
new_jobs.push(t)//未返回的任务下次继续等待
}
})
jobs = new_jobs
tasks = []
}
/*
需要的任务参数写在param里
tasks.push({'type':'order','param': ["IO", "api", "POST","/fapi/v1/order",
"symbol="+symbol+Quote+"&side="+side+"&type=LIMIT&timeInForce=GTX&quantity="+
amount+"&price="+price+"&newClientOrderId=" + UUID() +"×tamp="+Date.now()]})
*/
mztcoin草神さん,売る論理は? 取引後にすぐに売る. 庫存庫を保持していない. つまり,同じforサイクルで売る. 価格は何で売る? 取引がない.
mztcoin草神 野蛮
ダンゴウ草神牛波1
77924998草神は何のAWSサーバを使っているの?
クキティ暴力を振るう
ブクシアックグラス・ゴンは,高周波の授業で支払いをします.
心のままにこの戦略は,コピーできるなら使えるのか?
脚本家 トレッドマン高周波取引の入門を学ぶために,より多くの教えることを望んで,草神を呼び出す~
♪風口の波の中で ♪野蛮な
fmゼロ草の神様 野蛮!
オーク量化野蛮な
小草目の当たりにならないほど,意味がない.