[TOC]
なぜこのレッスンをするのか?このレッスンから得られる成果は? まず,このコースはJavaScriptとPythonのプログラミング言語をベースにしたもので,言語は単なる技術であり,最終的には,この技術を業界に応用する.量化取引は,急速に成長している新興業界であり,人材の需要も大きい.
このコースのシステム学習は,量化取引の分野についてより深い理解を得ることができます.量化取引の分野に飛び込む準備をしている同級生なら,あなたにも役立ちます. もしあなたが株式や先物投資の愛好家なら,量化取引は,あなたの主題取引に完全に役立つことができます. 金融市場で利益を得るために取引戦略を開発することによって,投資資金のチャネルとプラットフォームを広げることができます.
この前に,私の個人的な取引経験についてお話しします. 私は金融の専門家ではなく,統計の専門家です. 私は学生時代に株式の主観的な取引を始めた. その後,偶然の要因は,国内民間基金の量的な取引の専門家となり,主に戦略研究と戦略開発を行いました.
取引の輪には,前後10年以上も,様々なタイプの戦略も開発しています. 私の投資理念は,リスク管理がすべてより高く,絶対的利益に焦点を当てています. 私たちのコースのテーマは,量化取引から資産管理まで,絶対的利益のためのCTA戦略の開発です.
CTAとは,外国では商品取引アドバイザーと呼ばれ,国内では投資マネージャーと呼ばれている.伝統的なCTAは,一般投資家の資金を集約し,専門投資機関に委託し,最終的に取引アドバイザー (すなわちCTA) による株式先物,商品先物,国債先物投資を行う.
しかし,現実には,グローバルフューチャーマーケットが成長するにつれて,CTAの概念も拡大し,従来のフューチャーよりもはるかに広い範囲に広がっています. それはフューチャー市場で投資するだけでなく,金利市場,株式市場,外国為替市場,オプション市場などにも投資することができます. この品種に定量的な歴史的データがある限り,これらの歴史的データに基づいて対応するCTA戦略を開発することができます.
1980年代以前は,電子盤技術がまだ成熟していなかったが,ほとんどのトレーダーは,William Indicator,KDJ,RSI,MACD,CCIなどの技術指標を手動で描き,商品先物取引の将来的動向を判断した.その後,トレーダーは顧客の資産管理を支援するために専用のCTAファンドを設立した.1980年代まで電子盤普及が始まってから,真のCTAファンドが登場した.
CTA基金の管理規模の変化 ユニット:10億ドル
上記の図を見ると,特に量化取引の台頭により,世界のCTAファンドの規模は2005年の130.6億ドルから2015年には300億ドルを超えました.
CTAファンドの業績は,規模とともに上昇した.下図のBaleck CTA指数を見ると,Baleck CTA指数がグローバル商品取引顧問にとって代表的な業界基準である. 1979年末から2016年末までの間,Baleck CTAファンドの指数は,年収9.59%,シャープ比0.37,最大引き戻し15.66%で,累積収益が28.95倍に達した.
資産配置のポートフォリオにおいて,CTA戦略は通常,他の戦略と非常に低い関連性を保持しているため,以下のように,赤い輪では,2000~2002年のグローバル株価熊市と2008年のグローバル小額借入危機の間,バレーCTAファンド指数は落ちないだけでなく,ポジティブな収益を達成し,株式市場や債券市場が危機に陥ったときに,CTAは強力な収益を提供することができる.また,我々は多くのバークレー商品CTA指数の 1980年以降の収益水準を見ることができ,P500を押し下げ,P500を下回ることも見ることができます.
中国におけるCTAの発展は10年近くに過ぎていないが,この勢いは強烈である.これは主に国内商品先物取引の比較的オープンな取引環境,取引資金の低い門檻,保証金制度の採用により多空の双方向取引が可能であり,取引料金が安く,取引所の技術構造が株式と比較してより先進的で,システム取引が容易であるなど,多くの理由から恩恵を受けている.
2010年以来,CTAファンドは主に民間資金の形式で存在している.国内政策が,資金専用投資の範囲を徐々に開くにつれて,CTAファンドは,資金専用投資の形式で存在し始め,より透明な公的な運営方法が,より多くの投資家の資産配置のための必要なツールとなっています.
上記の図から示すように,入手しやすさ,資金の限界,取引戦略の実行方法,APIのペアリングなどに関係なく,CTA戦略は他の取引戦略と比較して個人トレーダーにとってもより適しています.国内フューチャー種間の契約は非常に小さく,例えば,一手玉米や豆腐の数千ドルで取引することができ,資金の限界はほとんどありません.また,CTA戦略の別の部分は従来の技術分析から来ているため,他の戦略と比較して比較的簡単です.
CTA戦略の設計プロセスも比較的シンプルで,まずは歴史的データを初処理し,次に定量化モデルに入力します.定量化モデルは,数学モデリング,プログラミングデザインなどのツールから形成された取引戦略を含みます. 計算分析により,これらのデータを分析して取引信号を生成します. もちろん,実際の開発では,上記の図のように簡単ではありません.
取引戦略の観点からCTA戦略も多様である:それはトレンド戦略,またはスロット戦略,または大周期中間の長線戦略,または日中の短線戦略,戦略論理は技術分析,または基本的な分析に基づいている,主観的取引,またはシステム取引である可能性があります.
CTA戦略には異なる分類方法があり,取引方法により主観取引とシステム取引に分けられる.海外のCTA戦略の発展は比較的先進であり,システム取引のCTA戦略は100%に近い.分析方法により,基本分析と技術分析に分けられる.収益源により,トレンド取引とショック取引に分けられる.
全体的に見ると,CTA戦略は,全体的な取引市場において,傾向戦略が約70%を占め,平均回帰戦略は約25%,反傾向または傾向逆転戦略は約5%を占めている.その中で,最も大きな割合を占める傾向戦略は,保有周期によって,また,以下に分類することができる:高周波取引,日中取引,中間ショート取引,中間ロング取引.
高頻度で街の戦略現在,市場には2つの主要な高周波取引戦略があります. 1つは高周波取引戦略,もう1つは高周波割引戦略である. 市場取引戦略は取引市場で流動性を提供すること,つまり,市場取引者がいる取引市場で,取引をしたいと望む人が取引を保証する必要があります. 市場での流動性が不足すると,単一の取引ができないので,市場取引者は他の人の対価盤を買い売らなければなりません.
高周波配当戦略高周波配当は,2つの関連性のある株やETFとETFの組み合わせを取引するものです.ETFの計算方法により,ETFの期待価格を同じ方法で計算できます.ETFの指数価格によってETFの期待価格を減算して,通常価格差が通路内で動作する差を得ることができます.
日内戦略文字通り,一晩中持たない限りは,昼間取引戦略と呼ばれる.昼間取引は持てる周期が短いため,通常は市場に入るとすぐに利益を得ることができないので,すぐに脱出する.したがって,この取引方法は市場リスクが低い.しかし,市場は短時間で急速に変化するので,昼間取引は通常,トレーダーに対して比較的高い要求を伴う.
中間線・長線戦略理論上,持有周期が長くなるほど,戦略容量は大きくなる.特に機関取引では,短期戦略容量が限られ,大資金が短時間で出入できないため,より多くの中期戦略が配置される.通常,持有周期は数日,数ヶ月,またはそれ以上である.
CTA戦略データ一般的にCTA戦略は,開場価格,最高価格,最低価格,閉場価格,取引量などを含む,分・時間・日線データで研究対象となる.L2データから購入価格,販売価格,購入量,販売量などの深層データなどのTickデータを使用するCTA戦略は少数である.
CTA戦略の基本的な考えは,従来の技術指標を元に考えられる. この分野では,公開された参考文献が多く,論理は比較的単純で,ほとんどが統計学に基づいている. 例えば,誰もがよく知っている様々な技術指標:MA,SMA,EMA,MACD,KDJ,RSI,BOLL,W&R,DMI,ATR,SAR,BIAS,OBV,などなど.
市場には,マルチ均等線配列,デュアルトラスト,R-ブレイカー,海
上記は,従来の技術分析に基づく取引戦略である.そのプロセスは,歴史的データと正しい取引理念に基づいて,確率優位性のある因子または売買条件を精製し,市場が将来的にこの法則を保持すると仮定し,最終的にコードを使用して取引戦略を実装し,自動取引を行う. オープン・ストップ・ストップ・ロスト・ハグ・ハグ・ダウスト・ハグなど,これらは一般的には人工的介入を必要としない.実際には,価格時間配列の存在系数が正の自己関連関係を追求する
CTA戦略の最大の利点は,現在の市場が上下に関わらず絶対的な利益を得ることが可能であり,特に市場の牛牛が急速に転機し,市場動向が明らかに流動しているときに,この戦略の利点は非常に大きい.しかし,市場が揺れ動いている場合,またはトレンドが不明である場合,この戦略は高い点で購入し,低い点で販売し,絶えず損失を回帰する可能性があります.
未来CTA戦略が儲かる理由は主に以下の通りです.
また,トレンドフォローの取引の特徴は,市場がないときに小額の損失を出し,市場が来ると大金を稼ぐことである.しかし,取引をした人は,市場が多くの時間を波動する市場であり,わずかな時間しかトレンド市場ではないことを知っている.したがって,トレンドフォロー戦略は,取引で勝率が低いが,全体的に,各取引の利益と損失の比率が大きい.
トレンドフォロー戦略は収益に不安定であるため,多くの投資機関は,多種多種戦略を用いて投資ポートフォリオを構築し,その間に一定量の逆転戦略を配置する.逆転戦略は,価格の時間配列が負の相関関係を持つ因数である,すなわち,高低吸收である.
CTAと伝統的な資産の関連性
上記の図を見ると,理論的には,さまざまなスタイルや関連性が低い戦略が,市場価格の様々な変化に直面して,同時に異なる取引信号を同時に作る.複数の収益曲線が相互に重なり合っているため,全体的な収益が補完されるため,収益曲線はより平坦になり,収益の変動が軽減される.
上記の観点からすると,マスターレベルの戦略を開発するのではなく,複数の中
次に,全商品フューチャー市場の各品種の流動性,収益性,安定性を評価し,収益性低い波動率を持つ商品フューチャー品種の組み合わせをシフトし,業界中立性シフトを行い,ポートフォリオの業界配置を分散することによって全体的な波動性をさらに低下させ,最終的に市場価値のマッチングによって実際の商品フューチャー品種の組み合わせを構築して取引を行うための母戦略を設計する必要があります.
各品種には複数のパラメータ戦略の配置も可能で,リトゲーションが良好な近隣のパラメータ組み合わせを選択することができる.市場傾向が顕著であるとき,複数のパラメータ戦略は通常一致して,上乗を相当する.市場が波動しているとき,複数のパラメータ戦略は通常一致せず,それぞれが過剰または空きでリスクをカバーし,下乗を相当する.これは,投資ポートフォリオの最大リトゲーション率をさらに低下させ,全体的な収益率を保持する.
ニュートンはかつて言いました: "もし私が他の人よりも遠くを見ることができるなら,それは私が巨人の肩の上に立っているからです".
市場公開のCTA戦略には均線戦略,ブリンズ戦略,海
基本分析は,短期間の価格動向を気にする必要はないし,価値が最終的に価格に反映されると信じている.むしろ,価格に影響する要因を分析し,品種の価値を判断する.一般的に,上から下の分析方法を使用します.
上記の図を見ると,商品価格に影響する要因は多くあり,林林は10点以上を合計し,さらに10点以上を細分化しており,これらのデータは絶えず変化しています.
実際,商品先物商品の基本的な分析は,すべての要素を分析するのではなく,基本的な分析の核心要素を把握し,複雑な情報から規則を見つけることができる.
マクロ要因マクロ経済データは複雑で,日々,毎時,毎分,政治界,中央銀行,金融機関,公式および非公式の多くの経済データが公表されています. 政治や経済危機を除いて,マクロ分析は会話のための良い素材であり,あまり便利ではありません. アメリカの有名なファンド管理専門家ピーター・リンチは,私が経済動向を分析するのに年間15分以上費やしていないと発言しました.
多様性要因基本面分析では,品種分析は主に上昇水位,供給需要関係,商品庫存,産業利益等を分析する.
超期貨をやっている友人は,国内商品先物商品は,単純に以下に分けることができることを知っています. 工業製品と農産物. 産業製品と農産物の分析方法は,供給と需要の両面から説明する. 工業製品の供給は比較的安定しています. 重要な技術革新がない限り,生産力は短期間に大きく変化する可能性はほとんどありません. そのため,産業製品の価格に影響する要因は主に需要です.
したがって,経済学の法則によれば,商品価格を最終的に決定するのは供給と需要関係であり,理論的には供給と需要のデータを得る限り,商品の将来の価格を判断することができる.産業用品では,供給のデータは入手しやすいが,需要のデータは入手しづらい.農業用品では,需要のデータは入手しやすいが,供給のデータは入手しづらい.
実際には,さらに減法も行える.供給と需要が経済市場における相互の結果である,在庫である.我々は,在庫データによって,市場の供給と需要の強弱関係を判断することができる.ある商品の在庫が高くなった場合,市場の供給の力が需要よりも大きいことを示し,外部条件が変化しない前提では,商品価格が低下する.ある商品の在庫が低くなった場合,市場の需要の力が供給よりも大きいことを示し,外部条件が変化しない前提では,商品価格が上昇する.
商品庫存の分析に加えて,現貨市場と先物市場の価格差,すなわち基差の分析が必要である.もし先物価格が現貨価格よりも大きい場合,これを先物上昇と呼びます.もし先物価格が現貨価格よりも小さい場合,これを先物流水付けと呼びます.先物配送制度により,先物配送日に先物価格が現貨価格に等しいものとします.
引き上げ物でも引き上げ物でも,先物配送制度の制約により,納期先物価は理論上現貨価格と同等であるべきである.納期日が近づくにつれて,現貨価格と先物価格が一致する傾向がある.一方,先物価が現貨に戻り,もう一方,現貨が先物価に戻る.
上記の原理に基づいて,我々は,在庫と基差の両方を用いて,将来の先物価格を判断することができる.ある商品の在庫が低く,もしも先物価格が現物価格よりもはるかに低い場合,我々は,現物市場の需要力が供給力よりも大きく,将来の現物価格の上昇の可能性が高いと判断することができる.また,先物配送制度により,配送日付が近づくにつれて,先物価格が補償され,現物価格と平衡し,将来の先物価格の上昇の可能性が高いと判断することができる.
最後に,我々は,在庫と基差によって将来の価格の概率的な方向を判断したが,より正確な売り場はないので,技術分析と連携して明確な入出シグナルを与える必要がある. 基本面分析の構造全体は,低在庫+深水塗り+技術分析多頭シグナル=多作;高在庫+大幅上水+技術分析空頭シグナル=空き.
取引戦略について言えば,代表的な海
その後4年間,中央海
真実が明らかになった後,海
海
海賊取引法が何を意味するのか見てみましょう.
1, 市場 - 買ったり売ったりするものは,基本的にどの市場で取引されているか. 海
このことから,海
海上取引の最大の利点は,有効な取引方法の構築に役立つことであり,これは,大量投資,動的停止・停止・損失,市場傾向を追跡する戦略を組み合わせたもので,特にATR値の使用とポジション管理の理念は,学ぶ価値があります. もちろん,傾向を追跡する戦略の共通点は,浮気反吐です.浮気が追いつくことは,それに伴う波の大きな落ち込みにより全部吐く可能性が高い.大きなトレンドの中で非常に強く,波動する市場でうまく機能しません.
20世紀後半には,アメリカの金融投資分野では,非常に奇妙な取引方法が流行し,数千人の実践の後,効果と大きな実用的な価値が発見され,多くの投資専門家とプロトレーダーの認識を得て,現在までほぼすべての金融投資分野に完全に適用することができます. 外為,金,株式,先物,原油,指数,債券,これがカオス操作法です.
混沌という言葉は,宇宙の混沌状態を記述するものである.その考えは,結果が必然であるが,既知の知識によって結果が計算できない,計算自体も結果を変え,結果が必然ではなく最大または最小の結果が最終的に生じる可能性がある.これは取引市場と非常に似ています.参加者が市場を分析し,取引をする時も市場が変化します.市場は永続的な変異性があり,参加者が新しい市場形状を知ったとき,市場も同様に,参加者が認識するときに発生することを認識し,変化します.そして,それは必ず参加者が知らない方向に変化する傾向があり,十分な知性を持つので,参加者がその変化の法則を捉えることを防止します.すなわち,市場は安定性がないので,過去についての認識は未来を代表することはできません.
混沌操作法 (CHAOS) は,ビル・ウィリアムスによって発明された投資思想,取引戦略,入出シグナルの一連の完全なセットである. 現在,国際的に多くの投資家が混沌操作法を使用して市場取引に参加している. 金融市場の発展が遅れているため,混沌理論は比較的新しい考え方であり,国内で混沌操作法の研究者はほとんどいない. 混沌操作法が非常に普遍的な取引戦略であるため,株式,債券,期貨,外為,デジタル商品を含むほぼすべての金融投資分野に適用することができます.
混沌操作法の理論的基礎は,名前の通り,混沌理論である.混沌理論は,気象学者エドワード・ローレンツによって提唱され,20世紀後半の最も偉大な科学発見の一つである.有名な蝶効果
混沌の操作方法は5つの大きな次元 (技術指標) で構成されています.
クジラ線 (アライガター)
フラクタル
"モメンタム"
加速 (加速)
"バランスライン"
上記の図を見ると,クジラ線は分形幾何学と非線形力学を用いた平衡線の一組であり,本質的には拡張指数加重移動平均線であり,均線の一種である.ただし,計算方法は通常の均線よりも少し複雑である.次に,クジラ線をマック語で定義する方法を見てみましょう:
// 参数
N1:=11;
N2:=21;
// 定义价格中线
N3:=N1+N2;
N4:=N2+N3;
HL:=(H+L)/2;
// 鳄鱼线
Y^^SMA(REF(HL,N3),N4,1);
R:=SMA(REF(HL,N2),N3,1);
G:=SMA(REF(HL,N1),N2,1);
まず2つの外部パラメータN1とN2を定義し,外部パラメータに基づいて最高価格と最低価格の平均値HLを計算し,次に異なるパラメータでHLの平均値を計算します.
混沌操作法では,形状的に定義された分形の概念を例に挙げると,手掌を開いて指を上に向け,中指は上分形,左の小指と名指,右の食指と大指はそれぞれ,非革新的な高いK線を表す.基本的な分形は,これらの5つのK線で構成される.
// 分形
TOP_N:=BARSLAST(REF(H,2)=HHV(H,5))+2;
BOTTOM_N:=BARSLAST(REF(L,2)=LLV(L,5))+2;
TOP:=REF(H,TOP_N);
BOTTOM:=REF(L,BOTTOM_N);
MAX_YRG^^MAX(MAX(Y,R),G);
MIN_YRG^^MIN(MIN(Y,R),G);
TOP_FRACTAL^^VALUEWHEN(H>=MAX_YRG,TOP);
BOTTOM_FRACTAL^^VALUEWHEN(L<=MIN_YRG,BOTTOM);
クジラ線と分形を計算すると,これらの2つの条件に基づいて,指数セット加重移動平均線をクジラ線と分形指標を計算する基準価格として,単純な混沌操作策略を書き出すことができます. もちろん,元の混沌操作策略はより複雑になります. コードは以下のとおりです:
// 如果当前无多单,并且收盘价升破上分形,并且上分形在鳄鱼线上方时,多头开仓
BKVOL=0 AND C>=TOP_FRACTAL AND TOP_FRACTAL>MAX_YRG,BPK(1);
// 如果当前无空单,并且收盘价跌破下分形,并且下分形在鳄鱼线下方时,空头开仓
SKVOL=0 AND C<=BOTTOM_FRACTAL AND BOTTOM_FRACTAL<MIN_YRG,SPK(1);
// 如果收盘价跌破鳄鱼的下巴时,多头平仓
C<Y,SP(BKVOL);
// 如果收盘价升破鳄鱼的下巴时,空头平仓
C>Y,BP(SKVOL);
簡単な理解のために,私は詳細な解説をコードに直接書き込みました. この戦略の取引論理を以下のように簡略化することができます.
次に,この単純な混沌とした操作方法の戦略のリトークの結果を具体的にどう見ていくか見てみましょう.リトークを実体環境に近いものにするため,ここで手続費を取引所の2倍に設定し,開場と開場が2跳のスライドをそれぞれ追加します.リトークのデータ種は螺紋鋼指数であり,取引種は螺紋鋼主力連続,固定1握りの開場です.下記は1時間レベルでの初期リトークの業績報告です.
資本曲線とリトートパフォーマンスデータから見ると,この戦略は良好なパフォーマンスを示し,全体的な資本曲線は安定して上向きである.しかし,螺紋鋼の品種は2016年末以降,市場の特徴が変化し,以前の高波動率の一面的な動きから広い波動的な動きに転換した.資本曲線から見ると,2017年から今までの利益は明らかに弱である.
つまり,混沌操作の本質は,市場がどう動いているか,あるいは偽の突破がどうなっているかに関心を持たず,突破が分岐した場合に直接参入することである.決して市場を予測しようとせず,観察者とフォロワーとして行動することである.
ソロスは1987年に著した『
上記の原則から,非有効な先物市場では,異なる期間の配当契約が市場に影響を受けることも,必ずしも同期ではないことも,価格設定が完全に有効でないこともわかっています.したがって,同じ取引標識の異なる期間の配当契約価格に基づいて,二つの価格が大きな幅を持つ場合,異なる期間の先物契約を同時に買ったり売ったりして,跨期利息を設定することができます.
商品先物と同様に,デジタル通貨には関連した長期利息合約の組み合わせもあります. OKEXの取引所では,ETCの当週,ETCの次週,ETCの四半期などがあります. 例えば,当週とETCの四半期間の格差が長期的に約5で維持されていると仮定します. もしある日の格差が7に達すると,将来のある時点で格差が5に戻ると予想します.
この格差は存在するものの,人工操作が時間がかかり,精度が低下し,価格変動の影響を受け,人工利上げは多くの不確実性があります.量化モデルによって利上げ機会を把握し,利上げ取引戦略を策定し,プログラムアルゴリズムにより取引先に自動注文を提出し,迅速に正確に利上げ機会を把握し,効率的に安定して収益を得ることが,量化利上げの魅力です.
このコースでは,発明者による量化取引プラットフォームとOKEX取引所のETCフューチャー契約を活用して,デジタル通貨取引において,瞬間の利回りの機会を把握し,見られる利得を把握し,同時にヘッジするリスクを把握する簡単な利回りの戦略をどのように示すかを教えます.
デジタル通貨の長期投資戦略を作成する難易度: 中等級戦略環境
戦略的論理
上記は簡単なデジタル通貨の長期利率戦略の論理的な説明です. では,プログラムで自分のアイデアを実現するにはどうすればよいでしょうか. 我々は発明者が取引プラットフォームを量化する前に枠組みを構築しようとしました.
function Data() {} // 基础数据函数
Data.prototype.mp = function () {} // 持仓函数
Data.prototype.boll = function () {} // 指标函数
Data.prototype.trade = function () {} // 下单函数
Data.prototype.cancelOrders = function () {} // 撤单函数
Data.prototype.isEven = function () {} // 处理单只合约函数
Data.prototype.drawingChart = function () {} // 画图函数
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 计算boll技术指标
data.trade(); // 计算交易条件下单
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
}
//入口函数
function main() {
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
システム取引では,データ取得,計算データ,注文取引,注文後の処理以外の本質的な違いはありません. プログラムでは同様です. まず,プログラムは20行目のmain関数を実行します. これは合意された慣習的な規則です. プログラムが取引戦略処理を完了すると,前もって (もしある場合は) 無限回転モード,すなわち輪廻モード,または輪廻モードでは,繰り返し実行されるonTick関数を実行します.
onTick関数では,主体取引における取引プロセスです. まず基本価格データを取得し,その後口座残高を取得し,次に指標を計算し,次に取引条件を計算し,注文を開始し,最後に注文後に処理します.
戦略的な考えと取引プロセスを比較して,戦略的枠組みを簡単に構築できます. 戦略は3つのステップに簡略化できます.
取引戦略フレームワークが構築された後,実際の取引プロセスと取引の詳細に基づいて,戦略フレームワークに必要な詳細コードを記入する必要があります.
1 取引前の処理
1.必要なグローバル変数を宣言する
var chart = {}
var ObjChart = Chart ( chart )
var bars = []
var oldTime = 0
2. 設定方針の外部パラメータ
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量
3.データ処理関数を定義する
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
this.accountData = _C(exchange.GetAccount); // 获取账户信息
this.positionData = _C(exchange.GetPosition); // 获取持仓信息
var recordsData = _C(exchange.GetRecords); //获取K线数据
exchange.SetContractType(tradeTypeA); // 订阅套利A合约
var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
exchange.SetContractType(tradeTypeB); // 订阅套利B合约
var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
// 正套价差(合约A卖一价 - 合约B买一价)
this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
// 反套价差(合约A买一价 - 合约B卖一价)
this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
Data.prototype.mp = function (tradeType, type) {
var positionData = this.positionData; // 获取持仓信息
for (var i = 0; i < positionData.length; i++) {
if (positionData[i].ContractType == tradeType) {
if (positionData[i].Type == type) {
if (positionData[i].Amount > 0) {
return positionData[i].Amount;
}
}
}
}
return false;
}
Data.prototype.boll = function (num, timeCycle) {
var self = {}; // 临时对象
// 正套价差和反套价差中间值
self.Close = (this.basb + this.sabb) / 2;
if (this.timeA == this.timeB) {
self.Time = this.time;
} // 对比两个深度数据时间戳
if (this.time - oldTime > timeCycle * 60000) {
bars.push(self);
oldTime = this.time;
} // 根据指定时间周期,在K线数组里面传入价差数据对象
if (bars.length > num * 2) {
bars.shift(); // 控制K线数组长度
} else {
return;
}
var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
return {
up: boll[0][boll[0].length - 1], // boll指标上轨
middle: boll[1][boll[1].length - 1], // boll指标中轨
down: boll[2][boll[2].length - 1] // boll指标下轨
} // 返回一个处理好的boll指标数据
}
Data.prototype.trade = function (tradeType, type) {
exchange.SetContractType(tradeType); // 下单前先重新订阅合约
var askPrice, bidPrice;
if (tradeType == tradeTypeA) { // 如果是A合约下单
askPrice = this.askA; // 设置askPrice
bidPrice = this.bidA; // 设置bidPrice
} else if (tradeType == tradeTypeB) { // 如果是B合约下单
askPrice = this.askB; // 设置askPrice
bidPrice = this.bidB; // 设置bidPrice
}
switch (type) { // 匹配下单模式
case "buy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
case "sell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closebuy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closesell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
default:
return false;
}
}
Data.prototype.cancelOrders = function () {
Sleep(500); // 撤单前先延时,因为有些交易所你懂的
var orders = _C(exchange.GetOrders); // 获取未成交订单数组
if (orders.length > 0) { // 如果有未成交的订单
for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
Sleep(500); //延时0.5秒
}
return false; // 如果取消了未成交的单子就返回false
}
return true; //如果没有未成交的订单就返回true
}
Data.prototype.isEven = function () {
var positionData = this.positionData; // 获取持仓信息
var type = null; // 转换持仓方向
// 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
if (positionData.length % 2 != 0 || positionData.length != 2) {
for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
if (positionData[i].Type == 0) { // 如果是多单
type = 10; // 设置下单参数
} else if (positionData[i].Type == 1) { // 如果是空单
type = -10; // 设置下单参数
}
// 平掉所有仓位
this.trade(positionData[i].ContractType, type, positionData[i].Amount);
}
}
}
Data.prototype.drawingChart = function (boll) {
var nowTime = new Date().getTime();
ObjChart.add([0, [nowTime, boll.up]]);
ObjChart.add([1, [nowTime, boll.middle]]);
ObjChart.add([2, [nowTime, boll.down]]);
ObjChart.add([3, [nowTime, this.basb]]);
ObjChart.add([4, [nowTime, this.sabb]]);
ObjChart.update(chart);
}
4. 入力関数 main () の内側では,プログラムの起動後に1回しか実行されないトランザクションプレ処理コードを実行します.
SetErrorFilter ( )
exchange.IO ( )
ObjChart.reset ( )
LogProfitReset ( )
上記の取引事前処理を定義した後に,次のステップに移り,相談モードに入り, onTick () 関数を繰り返し実行し,Sleep () の質問時の休憩時間を設定します.一部の仮想通貨取引所のAPIは,特定の時間内にアクセス数に内蔵制限があります.
function main() {
// 过滤控制台中不是很重要的信息
SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
ObjChart.reset(); //程序启动前清空之前绘制的图表
LogProfitReset(); //程序启动前清空之前的状态栏信息
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
2 データを取得し計算する
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
if (!boll) return; // 如果没有boll数据就返回
}
3 申請し,その後処理する
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "closebuy"); // 合约A平多
}
if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "closesell"); // 合约B平空
}
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "closesell"); // 合约A平空
}
if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "closebuy"); // 合约B平多
}
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
if (data.basb < boll.down) { // 如果basb价差低于下轨
if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "buy"); // 合约A开多
}
if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "sell"); // 合约B开空
}
} else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "sell"); // 合约A开空
}
if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "buy"); // 合约B开多
}
}
}
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
この200行以上で,簡単なデジタル通貨の長期利息戦略を完全に作成しました. 完全なコードは以下のとおりです:
// 全局变量
// 声明一个配置图表的 chart 对象
var chart = {
__isStock: true,
tooltip: {
xDateFormat: '%Y-%m-%d %H:%M:%S, %A'
},
title: {
text: '交易盈亏曲线图(详细)'
},
rangeSelector: {
buttons: [{
type: 'hour',
count: 1,
text: '1h'
}, {
type: 'hour',
count: 2,
text: '3h'
}, {
type: 'hour',
count: 8,
text: '8h'
}, {
type: 'all',
text: 'All'
}],
selected: 0,
inputEnabled: false
},
xAxis: {
type: 'datetime'
},
yAxis: {
title: {
text: '价差'
},
opposite: false,
},
series: [{
name: "上轨",
id: "线1,up",
data: []
}, {
name: "中轨",
id: "线2,middle",
data: []
}, {
name: "下轨",
id: "线3,down",
data: []
}, {
name: "basb",
id: "线4,basb",
data: []
}, {
name: "sabb",
id: "线5,sabb",
data: []
}]
};
var ObjChart = Chart(chart); // 画图对象
var bars = []; // 存储价差序列
var oldTime = 0; // 记录历史数据时间戳
// 参数
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量
// 基础数据
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
this.accountData = _C(exchange.GetAccount); // 获取账户信息
this.positionData = _C(exchange.GetPosition); // 获取持仓信息
var recordsData = _C(exchange.GetRecords); //获取K线数据
exchange.SetContractType(tradeTypeA); // 订阅套利A合约
var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
exchange.SetContractType(tradeTypeB); // 订阅套利B合约
var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
// 正套价差(合约A卖一价 - 合约B买一价)
this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
// 反套价差(合约A买一价 - 合约B卖一价)
this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
// 获取持仓
Data.prototype.mp = function (tradeType, type) {
var positionData = this.positionData; // 获取持仓信息
for (var i = 0; i < positionData.length; i++) {
if (positionData[i].ContractType == tradeType) {
if (positionData[i].Type == type) {
if (positionData[i].Amount > 0) {
return positionData[i].Amount;
}
}
}
}
return false;
}
// 合成新K线数据和boll指标数据
Data.prototype.boll = function (num, timeCycle) {
var self = {}; // 临时对象
// 正套价差和反套价差中间值
self.Close = (this.basb + this.sabb) / 2;
if (this.timeA == this.timeB) {
self.Time = this.time;
} // 对比两个深度数据时间戳
if (this.time - oldTime > timeCycle * 60000) {
bars.push(self);
oldTime = this.time;
} // 根据指定时间周期,在K线数组里面传入价差数据对象
if (bars.length > num * 2) {
bars.shift(); // 控制K线数组长度
} else {
return;
}
var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
return {
up: boll[0][boll[0].length - 1], // boll指标上轨
middle: boll[1][boll[1].length - 1], // boll指标中轨
down: boll[2][boll[2].length - 1] // boll指标下轨
} // 返回一个处理好的boll指标数据
}
// 下单
Data.prototype.trade = function (tradeType, type) {
exchange.SetContractType(tradeType); // 下单前先重新订阅合约
var askPrice, bidPrice;
if (tradeType == tradeTypeA) { // 如果是A合约下单
askPrice = this.askA; // 设置askPrice
bidPrice = this.bidA; // 设置bidPrice
} else if (tradeType == tradeTypeB) { // 如果是B合约下单
askPrice = this.askB; // 设置askPrice
bidPrice = this.bidB; // 设置bidPrice
}
switch (type) { // 匹配下单模式
case "buy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
case "sell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closebuy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closesell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
default:
return false;
}
}
// 取消订单
Data.prototype.cancelOrders = function () {
Sleep(500); // 撤单前先延时,因为有些交易所你懂的
var orders = _C(exchange.GetOrders); // 获取未成交订单数组
if (orders.length > 0) { // 如果有未成交的订单
for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
Sleep(500); //延时0.5秒
}
return false; // 如果取消了未成交的单子就返回false
}
return true; //如果没有未成交的订单就返回true
}
// 处理持有单个合约
Data.prototype.isEven = function () {
var positionData = this.positionData; // 获取持仓信息
var type = null; // 转换持仓方向
// 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
if (positionData.length % 2 != 0 || positionData.length != 2) {
for (var i = 0; i < positionData.length; i++) { // 遍历持仓数
ダイアンワン99学ぶこと
パパ学習する
クンフェン91学習する