TradingViewのオープンソース戦略の数は大きい.多くの優れた戦略,アイデア,インジケーターが実際のボットで使用できないのは残念です.これを見て,多くのトレーダーに定量的な取引技術を普及することにコミットしているFMZは,自然にこの問題を解決する衝動を抑制することはできません!
この経験を共有することは 絶対に提供されるべきです
9*9=81の穴を通り抜け,無数の眠れない夜を生き延び,隅に空っぽのレッドブル缶を積み重ねた後,最後にFMZはPine言語をサポートし,対応し,TradingViewのあらゆる種類の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="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit spreads") / syminfo.mintick
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("Parameter errors")
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
// Real-time K-line stage
if not barstate.ishistory
// Retrieve grid
for i = 1 to numbers
// Going long
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)
// Going short
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
もちろん,この戦略はグリッド戦略であり,欠点もありますが,常に勝つお金の印刷機ではありません.鍵は使用とパラメータに依存します.私たちは,自分の取引論理を実装するために簡単に戦略を書く方法に焦点を当て,戦略を書いて自分自身で取引してお金を稼ぐ方法に焦点を当てます.助けを求めないのはとてもクールです!
パイン言語は簡単で 簡単で 簡単に理解できます 戦略を書けないなら 詳しく説明します
付属する内容/*backtest
そして*/
FMZのバックテスト設定コードです. これは FMZの機能であり,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="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit points") / syminfo.mintick
strategy(overlay=true)
: これはスクリプトのいくつかのオプション,オーバーレイ=trueを設定するために使用され,パラメータにtrue値を割り当てますoverlay
グラフを描くとき,それはメイングラフに描かれます (K線グラフはメイングラフなので,単純に理解できます)varip beginPrice = 0
変数 startPrice は,グリッドの初期価格として使用される初期値が0のキーワード varip で宣言されます.var spacing = input.float(-1, title="Spacing prices")
: 戦略パラメータを設定します パラメータ名は"格子点の距離"です. 100を設定すると,価格は100回に1回取引されます.var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
: 戦略パラメータを設定します var amount = input.float(-1, title="Order quantity")
: 各グリッドポイント取引で取引量を制御するパラメータを設定します.var numbers = input.int(-1, title="Number of grids")
:グリッドポイントの数,設定20は1方向にグリッドポイント20です.var profit = input.int(-1, title="Profit spreads") / syminfo.mintick
: ポジションを閉じる前に,各グリッドポイントポジションの利益率を制御するパラメータを設定します.次はコードを見てください
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("Parameter errors")
つまり,間隔,金額,数値,利益などのパラメータが設定されていない場合,デフォルトは-1で,戦略は停止します (パラメータを設定せずに盲目操作することはできません)
行け! 行け!
if not barstate.ishistory and beginPrice == 0
beginPrice := close
これは,戦略がリアルタイムK線段階にあり,startPrice == 0であるとき,startPriceの値を現在の最新の価格に変更することを意味します. 戦略が公式に実行されているとき,初期現在の価格がグリッドの初期価格であることを理解することができます. スクリプトは歴史的なK線 BARステージを持っているため,戦略は歴史的な BARステージで一度論理を実行し,グリッドを歴史的な BARに配置することは間違いなく意味がありません.
歴史的な BAR ステージとは?
簡単な例を挙げると,現在の瞬間Aでは,戦略が実行し始め,戦略は100のK線BARでデータを取得します. 時間が経つにつれて,100のBARは101,102...Nになります. A瞬間から実行を開始すると,101番目のBARはリアルタイムK線ステージであり,この時間は最新のリアルタイムデータです. その後,1番目のBARから100番目のBARまで,これらは過去の歴史的市場価格ですが,戦略はこれらの歴史的な市場価格でも実行されます.
barstate.ishistory
これはPine言語に組み込まれた変数ですbarstate.ishistory
リアルタイムKラインステージです. リアルタイムBARは,リアルタイムBARで,リアルタイムBARは,リアルタイムBARで,リアルタイムBARは,リアルタイムBARで,リアルタイムBARは,リアルタイムBARで trueです.
この関数は,
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ではなく,戦略によってオーダーに与えられた名前またはラベルとして理解されていることに注意してください).存在しない場合は,文字列
次のステップはグリッドシートを起動することです.
// Real-time K-line stage
if not barstate.ishistory
// Retrieve grid
for i = 1 to numbers
// Going long
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)
// Going short
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ループが使用され,ループの数が数パラメータの値,すなわち対応する数のオーダーによって決定されます. dirパラメータに従って方向を設定します. findTradeId関数を使用して,現在のグリッド位置のラベルのオーダーが開かれたかどうかを調べ,開いたポジションがない場合にのみ計画オーダーを配置します (ポジションが開いている場合,それは繰り返すことはできません). オーダーを配置するには,計画オーダーとして制限パラメータを指定するためにstrategy.order関数を使用します. 計画オーダーを配置しながら対応する閉じるオーダーを配置します. 閉じるオーダーは,strategy.exit利益パラメータを指定し,利益ポイントを指定します.
利益曲線を見ると 電力網もリスクが高いことがわかります 保証された利益ではありません ただ 電力網を大規模に拡張するリスクは 少し小さいだけです
パインの言語で 戦略を書けないなら...