パイン言語を使用して半自動取引ツールを書く

作者: リン・ハーンリディア, 作成日:2022-11-08 09:56:48, 更新日:2023-09-15 20:52:26 更新日:2023-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2021-09-15 更新日:2020-09-15 更新日:2021-09-26 更新日:2020-09-15 更新日:2021-09-20

img

完全に自動化された取引のためのプログラムを書くトレーダーはますます増えているが,より大きなトレーダーグループは依然として手動トレーダーである.実際,手動主観的なトレーダーは,主観的な取引を支援するために小さなツールも書くことができます.例えば,時には良いエントリーポジションを見つけ,初期ポジションに固定ストップ損失とトラッキング利益を設定する計画を立てます.その後,後の市場モニタリングなどのよりエネルギー密集型事項を省いて,独自の確立されたストップ損失とトラッキング利益プランを正確にフォローし,プログラムがあなたのために市場モニタリングを行うようにしてください.手動取引を支援するために,損失を止めるためにストップ損失,勝利を導くためにトラッキング利益.

パラメータ設計

パイン言語を用いてこのような要件を設計する戦略は非常にシンプルである.要件に従って機能を達成するために,次のパラメータを設計する必要があります.

  1. オフセット: ストップ・プロフィートが引き出される場合,オフセットのオフセット距離は,最高価格と最低価格をオフセットしてストップ・プロフィートラインを定義します.
  2. 制限:制御に使用されるパラメータ - A.直接購入するための初期ベースポジション,B.購入を待つための指定価格,C.何もしない.
  3. 取引先は,取引先の取引先の取引先と取引先の取引先の取引先を区別する.
  4. ストップ・ロストポイント
  5. targetOffset: トレイリングストップ・プロフィートの引き金として開設価格を補償する価格差.
  6. minTick: 価格変動の最小単位.
  7. 方向: ベース位置を開く方向.

戦略設計

/*backtest
start: 2022-09-24 00:00:00
end: 2022-09-27 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["v_input_1",20],["v_input_2",0],["v_input_4",50],["v_input_5",20],["RunMode",1,358374],["ZPrecision",0,358374],["XPrecision",3,358374]]
*/

strategy("Tracking loss and profit stopping entrustment", overlay = true)

varip targetPrice = na
varip high_lowPrice = na
varip isTrade = false 
varip isAlert = false
varip isAlertMinTick = false
varip isAlertFinished = false 

varip offset = input(30, "offset", "Tracking stop loss and stop profit offset")
varip limit = input(-1, "limit", "Initial opening price: - 1 means no opening, 0 means immediate opening, and other specific values are price limits")
varip amount = input(1, "amount", "amount of opening positions")
varip loss = input(30, "loss", "stop loss")
varip targetOffset = input(30, "targetOffset", "trigger tracking profit and loss stop offset")
varip minTick = input(1, "minTick", "the minimum unit of price fluctuation")
tradeType = input.string("long", "direction", tooltip="order direction, long: go long, short: go short", options=["long", "short"])

if not barstate.ishistory and not isAlertMinTick
    runtime.log("check whether syminfo.mintick is correct! syminfo.mintick:", syminfo.mintick, "#FF0000")
    if syminfo.mintick < minTick 
        runtime.error("system syminfo.mintick < minTick parameter", "#FF0000")
    isAlertMinTick := true 

if not barstate.ishistory and limit == -1 and not isAlert
    runtime.log("No open price is set, current limit is -1 (to prevent false openings, initial default limit is -1), openings are prohibited", "#FF0000")
    isAlert := true 

if isTrade and strategy.position_size == 0 and not isAlertFinished
    runtime.log("All order processes executed, position is 0", "#FF0000")
    isAlertFinished := true 

if not barstate.ishistory and not isTrade and limit != -1
    if limit == 0 
        strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount)
    else if limit > 0 
        strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount, limit=limit)
    
    if tradeType == "long"
        targetPrice := (limit == 0 ? close : limit) + targetOffset
    else 
        targetPrice := (limit == 0 ? close : limit) - targetOffset
    strategy.exit("exit", "open", amount, loss=loss, trail_price=targetPrice, trail_offset=offset)
    runtime.log("The price per point is:", syminfo.mintick, ", current close:", close)
    isTrade := true 

if ((close > targetPrice and strategy.position_size > 0) or (close < targetPrice and strategy.position_size < 0)) and not barstate.ishistory
    high_lowPrice := na(high_lowPrice) ? close : high_lowPrice
    if strategy.position_size > 0 
        high_lowPrice := close > high_lowPrice ? close : high_lowPrice
    else 
        high_lowPrice := close < high_lowPrice ? close : high_lowPrice

plot(targetPrice, "trail_price trigger line")    
plot(strategy.position_size!=0 ? high_lowPrice : na, "current highest/lowest price")
plot(strategy.position_size!=0 ? (strategy.position_size > 0 ? high_lowPrice-syminfo.mintick*offset : high_lowPrice+syminfo.mintick*offset) : na, "moving stop loss trigger line")

戦略の設計は複雑ではありませんが,価格を常に監視する必要があるため,リアルタイム価格モデルとして設定する必要があります.

img

ストップ・ロスはポイント (minTick) で表現され,オフセットもポイント (minTick) で表現されていることに注意してください.ターゲットのオフセット後続ストップ・プロフィートトリガーラインのオフセットは価格距離 (例えば,距離のためにRMB30とする30に設定) で表現されます.minTickが1,30である場合,距離のためにRMB30を意味します.

この佣金戦略は,初期ベースポジションがロングになるだけでなく,初期ベースポジションがショートになるようにするように設計されています.その後,ストップ損失とトラッキング利益はショート方向で処理されます.

設計の実施を次のように示しましょう.

1. 戦略が実行されているとき,ベースポジションはすぐに開かれ,入力され,その後,ストップ損失と追跡ストップ利益はパラメータに従って設定されます.

img

戦略が実行されるとすぐにロングに設定され,金額は1に設定され,つまり戦略は1つの契約のポジションを開きます.

img

2. 制限パラメータを指定し,エントリー価格を指定する

他のパラメータ設定は変更されませんが,指定されたパラメータの制限値は: 1276

img

3. デフォルトの制限パラメータは -1,何も動作せず,偶然のポジション開設を防ぐ

img

終わり

パイン言語戦略を使用する際には,minTickデータに特別な注意を払うことが重要です.システム内の価格minTickの正確な数はパラメータの"価格通貨精度"に関連しています.

img

パラメータ Pricing Currency Accuracy は0に設定され,価格データ値が1桁 (すなわち0小数点) に精度が高いことを意味します.その後,最低価格変更単位は1です.いくつかのパラメータが正確な数minTickに関連しているため,これは特別な注意が必要です.

OK,上記は,この半自動化佣金戦略の全体的なデザインです. 私はそれをリアルボット取引にも使用していますが. しかし,そのようなツールは,理解するためにあなたの独自の取引習慣に従って使用する必要があります. 特定の修正,最適化はあなた自身で行うことができます. ここで戦略コードは,公共の共有,交換学習設計と論理のためのみです.

パイン言語は使いやすくて,使いやすくて,学習が簡単です.複雑なプログラミングを心配することなく,必要なツールを迅速に設計し,FMZ定量取引プラットフォームで定量取引を容易にするのにパイン言語を使用できます.


関連性

もっと