取引戦略開発の体験談

作者: リン・ハーン小さな夢, 作成日: 2019-08-06 17:15:13, 更新日: 2023-10-20 20:06:49

img

取引戦略開発の体験談

この記事では,戦略開発の経験や,読者に戦略開発の心境を素早く理解させるための小さなコツについて説明します. 戦略設計において類似した細かい問題に直面すると,すぐに合理的な解決策を考えることができます. 発明者による量化取引プラットフォームを講義,テスト,練習のプラットフォームとして使用します. 策略プログラミング言語:JavaScript 取引市場:ブロックチェーン資産市場 (BTC,ETHなど)

  • データの取得と処理

    通常,戦略論理によって異なるため,以下のいくつかの異なるインターフェイスを使用して市場データを入手することが可能である.通常,戦略の取引論理は市場データによって動いているため (もちろん,市場を問わずの戦略も存在する.例えば,投注戦略).

    • GetTicker: リアルタイムで表示されるタグを入手する. 一般的には,現在の最新価格,購入価格,販売価格を迅速にアクセスするために使用されます.

    • GetDepth: 注文の深度を深める. 一般的に,各セットの価格,注文量などの情報を入手するために使用されます. 市場戦略などで

    • GetTrade: 最近の取引記録を入手する. 一般的に,短期間の市場行動を分析し,市場の微小な変化を分析するために使用される. 高周波戦略,アルゴリズム戦略などによく使われます.

    • GetRecords:市場K線データを入手する. 傾向を追跡する戦略として用いられる. 計算する指標です.

    • 間違いを許す

      策略を設計する際に,通常,初心者は様々な誤った状況を無視し,戦略の各リンクの実行結果は既定であると直感的に考える.しかし,実際にはそうではない.策略プログラムの実行中に,市場データを要求するときに,様々な予期せぬ状況が起こる. 例えば,いくつかのインターフェースは異常データを返します.

      var depth = exchange.GetDepth()
      
      // depth.Asks[0].Price < depth.Bids[0].Price      卖一价格低于了买一价格,这种情况不可能存在于盘面上,
      //                                                因为卖出的价格低于买入的价格,必定已经成交了。
      // depth.Bids[n].Amount = 0                       订单薄买入列表第n档,订单量为0
      // depth.Asks[m].Price = 0                        订单薄卖出列表第m档,订单价格为0
      

      直接 exchange.GetDepth ((() が null を返します.

      奇妙なケースはたくさんあります. 予測可能な問題に対する対応が必要であるため,このような対応は誤り処理と呼ばれる.

      誤り処理の通常方法は,データを捨てて取り戻すことである.

      例えば:

      function main () {
          while (true) {
              onTick()
              Sleep(500)
          }
      }
      
      function GetTicker () {
          while (true) {
              var ticker = exchange.GetTicker()
              if (ticker.Sell > ticker.Buy) {       // 以 检测卖一价格是不是小于买一价这个错误的容错处理为例,
                                                    // 排除这个错误,当前函数返回 ticker 。
                  return ticker
              }
              Sleep(500)
          }
      }
      
      function onTick () {
          var ticker = GetTicker()                  // 确保获取到的 ticker 不会存在 卖一价格小于买一价格这种数据错误的情况。
          // ...  具体的策略逻辑
      }
      

      他の予測可能なエラー処理も同様の方法で使用できます. デザインの原則は,間違ったデータに戦略的論理を動かすことは絶対にできないということです.

    • K線データの利用

      K線データを取得し,呼び出し:

      var r = exchange.GetRecords()
      

      このK線データから得られるのは,例えば,次のような行列です.

      [
          {"Time":1562068800000,"Open":10000.7,"High":10208.9,"Low":9942.4,"Close":10058.8,"Volume":6281.887000000001},
          {"Time":1562072400000,"Open":10058.6,"High":10154.4,"Low":9914.5,"Close":9990.7,"Volume":4322.099},
          ...
          {"Time":1562079600000,"Open":10535.1,"High":10654.6,"Low":10383.6,"Close":10630.7,"Volume":5163.484000000004}
      ]
      

      緑色の花が咲いています.{}中間には,時間,開場価格,最高価格,低価格,閉場価格,取引量などが含まれています. これはK線柱です. 一般的なK線データは,指標を計算するために使用されます. 例えば:MA平均線,MACDなど. K線データをパラメータとして入力 (原材料データ) し,指標パラメータを設定し,指標データの関数を計算します. 発明者の量化取引プラットフォームには多くの指標関数があります.

      例えば,平均線指標を計算すると,K線データへの周期が異なるので,対応周期の平均線が計算されます. 例えば,K線データ (K線柱が1日を表す) を送信すると,日平均線が計算される. 同様のように,K線データを送信した平均線指標関数は,1時間周期である場合,計算された指標は1時間平均線である.

      通常,指標を計算するときに見落としていることがあります. 5日平均線を計算する場合は,まずK日線データを準備します.

      var r = exchange.GetRecords(PERIOD_D1)  // 给GetRecords 函数传入参数 PERIOD_D1就是指定获取日K线,
                                              // 具体函数使用可以参看:https://www.fmz.com/api#GetRecords
      

      平均線を計算する場合は,指針関数の指針パラメータを 5 に設定します.

      var ma = TA.MA(r, 5)        // TA.MA() 就是指标函数,用来计算均线指标,第一个参数设置刚才获取的日K线数据r,
                                  // 第二个参数设置5,计算出来的就是5日均线,其它指标函数同理。
      

      R日K線データにK線列が5本未満の場合は,有効な5日K線平均指標を計算することはできますか? 答えは間違いなくノーです. 平均線指標は,ある数のK線柱の閉じる価格の平均値である.

      img

      だから,K線データ,指針関数計算の指針データを使う前に,K線データのK線柱の数が指針計算の条件 (指針パラメータ) を満たしているかどうかを判断する必要があります.

      平均線を計算する前には,この5日間の平均線を計算する上で,

      function CalcMA () {
          var r = _C(exchange.GetRecords, PERIOD_D1)     // _C() 是容错函数,目的就是避免 r 为 null , 具体可以查询文档:https://www.fmz.com/api#_C
          if (r.length > 5) {
              return TA.MA(r, 5)                         // 用均线指标函数 TA.MA 计算出均线数据,做为函数返回值,返回。
          }
      
          return false 
      }
      
      function main () {
          var ma = CalcMA()
          Log(ma)
      }
      

      img

      テスト結果によると: [null,null,null,null,4228.7,4402.9400000000005... ]

      計算された5日平均線指標は,最初の4つの値は0で,K線列数が5未満であるため,平均値を計算することはできません.

    • Kラインの更新を判断する小さなコツ

      策略を書いているとき,K線周期ごとにいくつかの操作を処理するか,またはいくつかのログを印刷するかというシナリオがよくあります. プログラミングの経験のない初心者にとって,どんなメカニズムで処理するか考えられないかもしれません.

      K線柱周期が完了したと判断すると,K線データの時間属性から始め,K線データの最後のK線柱のデータに変化があったかどうかを判断する.変化があった場合,新しいK線柱が生成される (新しいK線柱が生成される前のK線柱周期が完了することを証明する),変化がない場合,新しいK線柱が生成される現在の最後のK線柱が生成されない).

      変数は,K線データの最後のK線柱の時間を記録するために使用されます.

      var r = exchange.GetRecords()
      var lastTime = r[r.length - 1].Time       // lastTime 用来记录最后一根K线柱的时间。
      

      物理的な応用では,通常,以下のような構造があります.

      function main () {
          var lastTime = 0
          while (true) {
              var r = _C(exchange.GetRecords)
              if (r[r.length - 1].Time != lastTime) {
                  Log("新K线柱产生")
                  lastTime = r[r.length - 1].Time      // 一定要更新 lastTime ,这个至关重要。
      
                  // ... 其它处理逻辑
                  // ...
              }
      
              Sleep(500)
          }
      }
      

      img

      復習では,K行周期が日 (exchange.GetRecords 関数呼び出し時にパラメータを指定しないため,復習設定のK行周期がデフォルトパラメータである) と設定されていることが見られます.新しいK行列が表示されるたびにログが印刷されます.

  • 数値計算

    • エクスチェンジへのアクセス時間を計算する

      策略的なアクセスインターフェースの時間を特定して表示または制御したい場合は,次のコードを使用します.

      function main () {
          while (true) {
              var beginTime = new Date().getTime()
              var ticker = exchange.GetTicker()
              var endTime = new Date().getTime()
      
              LogStatus(_D(), "GetTicker() 函数耗时:", endTime - beginTime, "毫秒")
              Sleep(1000)
          } 
      }
      

      簡単に言うと,GetTicker関数を呼び出す後に記録された時間軸を呼び出す前の時間軸をマイナスして,経験したミリ秒数を計算します.つまり,GetTicker関数が実行から結果に戻るまでの時間を計算します.

    • Math.min / Math.max で数値に対する上下限制限

      数値に上限がある場合は,通常 Math.min 制限を使用します.

      例えば,下手注文の際に,単位の販売量は口座のコイン数よりも大きくなるべきではありません. 銀行口座に現金が入っている額よりも多い場合は,請求書が誤りになります.

      管理は,通常,以下のように行われます. 例えば,0.2コインを販売する計画である.

      var planAmount = 0.2
      var account = _C(exchange.GetAccount)
      var amount = Math.min(account.Stocks, planAmount)
      

      この方法により,注文する金額は,口座に存在するコインの数を超えないようにします.

      同じように,Math.max は,数値の下限を確保するために使用されます. この例は,一般的にはどのような状況に適用されますか? 一般的な取引所では,特定の取引対に対して最低注文量制限があり,この最小注文量以下であれば,注文を拒否する.この場合は,注文も失敗する. BTCの最小単位は通常 0.01 と仮定します. 取引戦略 計算によって,時に 0.01 未満の小単位を得ることは可能であるため,最小小単位を確保するために Math.max を使用できます.

    • 注文量,価格,精度制御

      精度制御は _N() 関数または SetPrecision 関数を使用できます.

      SetPrecision () は,単数値と価格値の余剰小数位をシステムから自動的に切断します.

      _N() 関数は,ある数値に対して小数値切断 (精度制御) を行う.

      例えば:

      var pi = _N(3.141592653, 2)
      Log(pi)
      

      piの値は小数点切断され,2桁の小数点が残ります.すなわち: 3.14

      詳細については,APIドキュメントを参照してください.

  • ロジカルな設定

    • 定時化,特定の時間周期で動作する

      このようなメカニズムは,タイムブーム検知の方法により,現在のタイムブームをマイナス最後のタイムタスクの実行完了時のタイムブームを判断し,このタイムブームが設定された時間の長さを超えたとき,つまり新しい操作を実行したときに,すでに経過した時間をリアルタイムで計算することができます.

      例えば,投資戦略において用いられる.

      var lastActTime = 0
      var waitTime = 1000 * 60 * 60 * 12   // 一天的毫秒数
      function main () {
          while (true) {
              var nowTime = new Date().getTime()
              if (nowTime - lastActTime > waitTime) {
                  Log("执行定投")
                  // ... 具体的定投操作,买入操作。
      
      
                  lastActTime = nowTime
              }
      
              Sleep(500)
          }
      }
      

      簡単な例を挙げましょう.

    • 戦略に自動復旧メカニズムを設計

      発明者によって量化された_G() 関数,および退出保存関数を使用して,保存進捗を退出し,自動復元状態を再起動する機能のポリシーを設計することが便利です.

      var hold = {
          price : 0, 
          amount : 0,
      }
      
      function main () {
          if (_G("hold")) {
              var ret = _G("hold")
              hold.price = ret.price
              hold.amount = ret.amount
              Log("恢复 hold:", hold)
          }
      
          var count = 1
          while (true) {
              // ... 策略逻辑
              // ... 策略运行中,可能开仓,交易,把开仓的持仓价格赋值给 hold.price ,开仓的数量赋值给 hold.amount,用以记录持仓信息。
      
              hold.price = count++     // 模拟一些数值
              hold.amount = count/10   // 模拟一些数值
      
              Sleep(500)
          }
      }
      
      function onexit () {    // 点击机器人上的停止按钮,会触发执行这个函数,执行完毕机器人停止。
          _G("hold", hold)
          Log("保存 hold:", JSON.stringify(hold))
      }
      

      img

      停止するたびにholdオブジェクトのデータが保存され,再起動するたびにデータを読み取られ,停止前の状態に戻す. もちろん,この例はシンプルな例であり,実際の戦略で使用される場合,戦略で取り戻す必要がある重要なデータ (通常,口座情報,保有量,利益数,取引方向など) に基づいて設計されます. 復旧は,もちろん条件を設定することもできます.

戦略開発のヒントは,初心者や戦略開発者にとって役立つでしょう. 練習は最速の進歩です!長春を祈ります.


関連性

もっと

ウェイス1aoこのアプリは,APIの使い方を知らない初心者向けに最適です.また,esのバージョンをアップグレードするかどうか確認してください.例として,習慣的に使っていますか?

マイケオありがとう!夢神先生,本当に文武双倍です! プログラミング技術が高く,文章文采も良い,賞賛もいい!

小さな夢こんにちは,現在ES8規格がサポートされています.

小さな夢FMZの量化支援ありがとうございました!