avatar of 发明者量化-小小梦 发明者量化-小小梦
フォロー ダイレクトメッセージ
4
フォロー
1271
フォロワー

習得しやすく使いやすい Pine 言語を使用して戦略をまだ記述できない場合は、...

作成日:: 2022-06-01 17:37:55, 更新日:: 2023-09-18 20:19:45
comments   6
hits   2992

習得しやすく使いやすい Pine 言語を使用して戦略をまだ記述できない場合は、…

習得しやすく使いやすい Pine 言語を使用して戦略をまだ記述できない場合は、…

TradingView には、オープンソース戦略が圧倒的に多く存在します。多くの優れた戦略、アイデア、インジケーターを実践できないのは残念です。これを見て、多くのトレーダーに定量取引技術を普及させることに尽力しているFMZとしては、当然ながらこの要求を解決したいという衝動を抑えることができません。

この要求は絶対に耐えられない!

そこで、プログラミングコードの世界で、私は山や川を旅し、9つのことを経験しました。*9=81 ピット、数え切れないほどの眠れない夜を耐えた後、隅に空のレッドブルの缶の山が積み上げられました。最後に、FMZ は Pine 言語をサポートし、互換性があり、さまざまな TradingView Pine スクリプトを使用できます。

パイン語について言えば、私はつい最近になって独学で学びました。しかし、正直に言うと、定量取引用の Pine 言語は非常にシンプルで、使いやすく、習得も簡単です。 何?信じられませんか?私がグリッド戦略を書いているのを見てください〜

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利价差") / syminfo.mintick

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

FMZ のリアルタイム取引、バックテスト ツール、多数の機能、そして Pine 言語の使いやすさは、まるで虎に翼をつけたようなものです。パラメータ設定やバックテスト設定コードを含め、コードの総数は50行を超えません。初心者はグリッドの記述について心配する必要がなくなりました。 。 。

もちろん、この戦略はグリッド戦略です。グリッド戦略にも欠点があり、確実に儲かるというわけではありません。鍵となるのは、その使い方とパラメータです。この点については詳しく説明しません。戦略を簡単に作成し、独自の取引ロジックを実装し、独自の戦略を作成して収益を上げる方法に焦点を当てましょう。誰にも助けを求めずに済むのは、とても気持ちがいいです! !

コードの説明

説明させてください。コードはシンプルで理解しやすいです。習得しやすく使いやすい Pine 言語を使用して戦略をまだ記述できない場合は、私が記述します…… ……… …………………….詳しくお話ししましょう!

初めに/*backtestそして*/ラップされたコンテンツは FMZ バックテスト構成コードであり、Pine 言語のコンテンツではなく、FMZ の機能です。もちろん、この部分を書かないことを選択することもできます。バックテストを行うときは、パラメータ コントロールを手動でクリックして、バックテストの構成とパラメータを設定する必要があります。

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

次のコード:

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利点数") / syminfo.mintick
  • strategy(overlay=true): スクリプトのいくつかのオプションを設定するために使用します。overlay=trueはパラメータを与えるものです。overlayチャートのメイン画像に画像を描画するには、true の値を割り当てます (K ライン チャートがメイン画像なので、このように簡単に理解できます)。
  • varip beginPrice = 0: 変数 beginPrice はキーワード varip を使用して宣言され、最初に値 0 が割り当てられます。この値はグリッドの初期価格として使用されます。
  • var spacing = input.float(-1, title="间距价格"): 戦略パラメータを設定します。パラメータ名は「interval price」で、各グリッドポイント間の間隔です。100に設定すると、価格が100を超えるたびに取引が行われることを意味します。
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"]): 「方向」という名前の戦略パラメータが設定されています。このパラメータはドロップダウン ボックスのオプションであり、ロング、ショート、または両方を選択できます。これらはそれぞれ、グリッドがロングのみ取引、ショートのみ取引、またはロングとショートの両方取引を行うことを示します。
  • var amount = input.float(-1, title="下单量"): 各グリッドポイントトランザクションでのトランザクション量を制御するパラメータを設定します。
  • var numbers = input.int(-1, title="网格数量"): グリッド ポイントの数。20 に設定すると、1 方向に 20 個のグリッド ポイントがあることを意味します。
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintick: 各グリッドポイントのポジションがクローズされる価格差を制御するパラメータを設定します。

次に、コードを見てみましょう。

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

つまり、間隔、金額、数字、利益などのパラメータのいずれかが設定されていない場合、デフォルト値は-1となり、戦略が停止します(パラメータを設定せずに走り回ることはできませんよ~笑!)

Go on !

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

これは、戦略がリアルタイム K ライン ステージにあり、beginPrice == 0 の場合、beginPrice の値を現在の最新価格に変更することを意味します。戦略が正式に実行されている場合、初期の現在の価格がグリッドの初期価格であることが理解できます。スクリプトには履歴 K ライン BAR ステージがあるため、この戦略は履歴 BAR ステージでロジックを実行します。履歴 BAR にグリッドを配置することはまったく意味がありません。

ヒストリカル BAR フェーズとは何ですか?

簡単な例を挙げると、現在の瞬間 A で戦略の実行が開始され、戦略は 100 個の K ライン BAR のデータを取得します。時間が経つにつれて、100 個の BAR は確実に 101、102…N になります。時間 A から実行する場合、101 番目の BAR がリアルタイム K ライン ステージであり、最新のリアルタイム データです。したがって、1 番目の BAR から 100 番目の BAR まで、これらはすべて過去の市場状況ですが、戦略もこれらの過去の市場状況に基づいて実行されるため、このステージは過去の K ライン ステージになります。

barstate.ishistoryこれはPine言語の組み込み変数です。現在のBARが過去のBARである場合、barstate.ishistory歴史的な BAR でない場合は、誤りです。したがって、barstate.ishistory が true でない場合は、リアルタイム K ライン ステージにあります。

次に関数を作成しました

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

この関数の機能は、現在開いているすべての注文に特定のIDが存在するかどうかを調べることです。存在する場合、findTradeId関数は呼び出されたときに既存の注文のIDを返します(このIDは、 (取引所ではなく、戦略によって注文に割り当てられた ID です)。 、またはラベルとして解釈されます)が存在しない場合は、文字列「notFound」を返します。

次に、メッシュシートを開始します。

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

for ループは、numbers パラメータの値に基づいてループの数を決定するために、つまり、対応する順序の数を並べるために使用されます。 dir パラメータに従って方向を設定します。 findTradeId 関数を使用して、現在のグリッド位置のラベルの注文が開かれているかどうかを確認します。計画された注文は、開かれていない場合にのみ配置します (開かれている場合は、重複した注文を配置することはできません)。注文を出すときは、strategy.order 関数を使用して limit パラメータを指定して計画注文を行います。計画注文を出すと同時に、対応する決済注文も出します。ポジションをクローズするには、strategy.exit 関数を使用し、profit パラメータを指定して、利益ポイントを指定します。

習得しやすく使いやすい Pine 言語を使用して戦略をまだ記述できない場合は、…

習得しやすく使いやすい Pine 言語を使用して戦略をまだ記述できない場合は、…

習得しやすく使いやすい Pine 言語を使用して戦略をまだ記述できない場合は、…

習得しやすく使いやすい Pine 言語を使用して戦略をまだ記述できない場合は、…

利回り曲線だけ見ると、グリッドにもリスクがあり、必ず勝てるというわけではないことがわかります。ただ、グリッドを大規模に拡大すると、リスクは相対的に小さくなるだけです。

さて、習得しやすく使いやすい Pine 言語を使用して戦略をまだ記述できない場合は、私は…