物語の物語は,
var lineColor = na
n = if bar_index > 10 and bar_index <= 20
lineColor := color.green
else if bar_index > 20 and bar_index <= 30
lineColor := color.blue
else if bar_index > 30 and bar_index <= 40
lineColor := color.orange
else if bar_index > 40
lineColor := color.black
else
lineColor := color.red
plot(close, title="close", color=n, linewidth=5, overlay=true)
plotchar(true, title="bar_index", char=str.tostring(bar_index), location=location.abovebar, color=color.red, overlay=true)
重点:判断用表現でブル値を返します. 縮小注意. 最大は1つのelseブランチしかありません. すべてのブランチ式は真実ではないし,elseブランチがない場合はnaを返します.
x = if close > open
close
plot(x, title="x")
K線BARが陰線であるとき,すなわちclose < open のとき,if文の後の表現が false であるため,ifのローカルコードブロックは実行されない.このときもelse 支部がないので,if文は na を返します.x は na に代入されます.この点を図図で描くことはできません.
スイッチ文は,特定の条件に応じて異なる経路を実行するように設計された分岐式構造の文である.スイッチ文には一般的に以下のいくつかの重要な知識点がある.
1, switch 文は if 文と同じ値を返します. 2,他の言語のスイッチ文とは異なり,スイッチ構造を実行するときに,コード内のローカルブロックのみを実行するので,break宣言は不要である (つまりbreakのようなキーワードを書く必要がない). スイッチの各ブランチにローカルコードブロックを書き込むことができます. このローカルコードブロックの最後の行は返される値である (それは値の元集合である可能性があります). 支部されたローカルコードブロックが実行されていない場合はnaを返します. 4. スイッチ構造内の表現の位置判断,文字列,変数,表現,または関数呼び出しを書き込む. 5. スイッチは,構造内の他の状況がない場合に実行されるデフォルト値として使用される返還値を指定することを許可する.
このスイッチは2つの形式に分けられ,例を一つずつ見て,その使い方を理解します.
1は,表記を持つものです.switch
メディアの報道によると,
// input.string: defval, title, options, tooltip
func = input.string("EMA", title="指标名称", tooltip="选择要使用的指标函数名称", options=["EMA", "SMA", "RMA", "WMA"])
// input.int: defval, title, options, tooltip
// param1 = input.int(10, title="周期参数")
fastPeriod = input.int(10, title="快线周期参数", options=[5, 10, 20])
slowPeriod = input.int(20, title="慢线周期参数", options=[20, 25, 30])
data = input(close, title="数据", tooltip="选择使用收盘价、开盘价、最高价...")
fastColor = color.red
slowColor = color.red
[fast, slow] = switch func
"EMA" =>
fastLine = ta.ema(data, fastPeriod)
slowLine = ta.ema(data, slowPeriod)
fastColor := color.red
slowColor := color.red
[fastLine, slowLine]
"SMA" =>
fastLine = ta.sma(data, fastPeriod)
slowLine = ta.sma(data, slowPeriod)
fastColor := color.green
slowColor := color.green
[fastLine, slowLine]
"RMA" =>
fastLine = ta.rma(data, fastPeriod)
slowLine = ta.rma(data, slowPeriod)
fastColor := color.blue
slowColor := color.blue
[fastLine, slowLine]
=>
runtime.error("error")
plot(fast, title="fast" + fastPeriod, color=fastColor, overlay=true)
plot(slow, title="slow" + slowPeriod, color=slowColor, overlay=true)
この関数は,この関数と同じような関数です.input.string
、input.int
この関数は,input.string
文字列に戻すには,input.int
この関数は,整数の値を返します.options
参数を使う方法options
参数は選択値からなる配列に伝達できる.例えば,例では,options=["EMA", "SMA", "RMA", "WMA"]
そしてoptions=[5, 10, 20]
(注意: 1 つは文字列型, 1 つは数値型である). この手順では,インターフェース上のコントロールは特定の値を入力する必要がなく,選択オプションのパラメータで提供されているオプションを選択するドロップボックスになります.
変数func の値は文字列で,変数func は,実行するスイッチ内のどのブランチを決定する (変数,関数呼び出し,表現) スイッチの表現として使用されます.変数func がスイッチ内のどのブランチの表現と一致できない場合は,デフォルトのブランチのコードブロックを実行します.runtime.error("error")
函数が停止する際の異常を回避する.
上記のテストコードでは,Switchのデフォルトブランチコードブロックの最後の行runtime.errorの後, [na, na] のようなコードを入れていないため,対応値が返されます. 取引ビューでは,この問題を考慮する必要があります. タイプ不一致の場合,エラーが返されます. しかし,FMZでは,タイプが厳格に要求されていないため,この対応コードを省略できます.
strategy("test", overlay=true)
x = if close > open
close
else
"open"
plotchar(true, title="x", char=str.tostring(x), location=location.abovebar, color=color.red)
FMZではエラーが表示されないが,ifブランチが返されるタイプが一致しないため,トレードビューではエラーが表示される.
2 式がないswitch
未来を見ていきましょうswitch
表現式のない文字で書くこともあります.
up = close > open // up = close < open
down = close < open
var upOfCount = 0
var downOfCount = 0
msgColor = switch
up =>
upOfCount += 1
color.green
down =>
downOfCount += 1
color.red
plotchar(up, title="up", char=str.tostring(upOfCount), location=location.abovebar, color=msgColor, overlay=true)
plotchar(down, title="down", char=str.tostring(downOfCount), location=location.belowbar, color=msgColor, overlay=true)
テストコードの例では,Switchが実行ブランチ条件で真のローカルコードブロックにマッチすることを確認できます. 一般的に,switch文の後に続くブランチ条件は相互否定的である必要があります.つまり,例のupとdownは同時に真実ではなりません.Switchが実行するローカルコードブロックは1つのブランチのみであるため,コードに以下のような文を入れることが興味があります.up = close > open // up = close < open
注釈の内容を入れ替えて,結果を観察して再測する. スイッチブランチは最初のブランチのみを実行することが判明する. さらに,スイッチのブランチに関数呼び出しを書き込まないように注意する必要があります. 関数は各BARで呼び出されることができません.switch
実行ブランチは決まっているので,戦略を実行するときに変更されません.)
返回值 = for 计数 = 起始计数 to 最终计数 by 步长
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
for 文の使い方は非常にシンプルで, for ループは最終的に1つの値 (または [a, b, c] のような形式で複数の値を返す) を返します.上記の偽コードのように,変数を"返し値"の位置に代入します. for 文の後には"カウント"変数があります.これはループの数を制御し,他の値を引用します. "カウント"変数はループ開始前に"初期カウント"に代入され,その後"成長"設定に従って"カウント"数が"最終変数"よりも大きいとループが停止します.
for サイクルで使用されるbreak
キーワード:実行break
文章が終わると,ループは停止します.
for サイクルで使用されるcontinue
キーワード:実行continue
文末の後,ループは無視されます.continue
後に続くコードは,直接次のループを実行する. for 文は,最後のループ実行時の値に戻します. コードが実行されていない場合は空値に戻します.
簡単に例を挙げましょう.
ret = for i = 0 to 10 // 可以增加by关键字修改步长,暂时FMZ不支持 i = 10 to 0 这样的反向循环
// 可以增加条件设置,使用continue跳过,break跳出
runtime.log("i:", i)
i // 如果这行不写,就返回空值,因为没有可返回的变量
runtime.log("ret:", ret)
runtime.error("stop")
for ... in
文は2つの形式があり,以下のような偽コードが示しています.
返回值 = for 数组元素 in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
返回值 = for [索引变量, 索引变量对应的数组元素] in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
この2つの形式の主な違いは,forキーワードの後に続く内容にあることがわかる.一つは,変数を配列要素の参照変数として使用する.もう一つは,索引変数,配列要素の変数の配列を含む構造を使用して引用する.他のものは,返回値規則,break,continueなどのルール,forループの一致性を使用する.また,簡単な例で使用を説明する.
testArray = array.from(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
for ele in testArray // 修改成 [i, ele]的形式:for [i, ele] in testArray , runtime.log("ele:", ele, ", i:", i)
runtime.log("ele:", ele)
runtime.error("stop")
索引を使う必要がある場合for [i, ele] in testArray
文字は『○』と書かれています.
for 循環型アプリケーション
パイン言語で提供された内蔵関数でいくつかのループ論理計算を行うことができる場合,回転構造を使用して直接記述することもできます.
計算した平均値
循環構造の設計では:
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
sum = 0
for ele in a
sum += ele
avg = sum / length
plot(avg, title="avg", overlay=true)
例では,for回転式求和を使用し,均等値を計算します.
組み込み関数を使って直線を計算する:
plot(ta.sma(close, length), title="ta.sma", overlay=true)
内蔵関数を直接使用するta.sma
均線指標を計算する際には,均線を計算する際には,明らかに内蔵関数を使う方が簡単である.グラフ上の対比では,計算結果が完全に一致していることがわかる.
2 求和
この例を参考にしましょう.
循環構造の設計では:
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
sum = 0
for ele in a
sum += ele
avg = sum / length
plot(avg, title="avg", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
行列のすべての要素の sum を計算するには,ループを使用して処理することもできます.array.sum
計算してみましょう.
内蔵関数を使って直接求和を計算する:
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
plot(array.sum(a) / length, title="avg", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
計算されたデータは,グラフに完全に一致するプロット図を用いて表示される.
ループの設計は,基本的に以下の3つの点に基づいています: 1、数列に対するいくつかの操作、計算、 2. 過去を振り返る,例えば,現在のBARの高値よりも過去の高値がどのくらい高いかを調べる. 現在のBARの高値が,スクリプトが実行されているBARにのみ知られているため,タイムリーに戻り,過去のBARを分析するループが必要である. 3、Pine言語を使用する内蔵関数は,過去BARの計算を完了できない場合.
while
文は, while 構造の判断条件が false になるまで,ループ部分のコードが実行されるようにします.
返回值 = while 判断条件
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
whileの他のルールは,forループと類似しており,ループのローカルコードブロックの最後の行は返却値であり,複数の値を返却することができる. "ループ条件"がリアル時ではループを実行し,条件が偽時ではループを停止する.ループではbreak,continue文も使用できる.
平均線を計算した例で示します.
length = 10
sma(data, length) =>
i = 0
sum = 0
while i < 10
sum += data[i]
i += 1
sum / length
plot(sma(close, length), title="sma", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
ループの使用も非常に簡単で,内蔵関数で代用できない計算論理を設計することもできます. 例えば,計算階乗:
counter = 5
fact = 1
ret = while counter > 0
fact := fact * counter
counter := counter - 1
fact
plot(ret, title="ret") // ret = 5 * 4 * 3 * 2 * 1
パイン言語における配列の定義は,他のプログラミング言語における配列の定義と類似している. パインの配列は1次元配列である. 通常は連続した一連のデータを保存するために使用される. 配列は,単一のデータを保存する配列の要素と呼ばれる. これらの要素の型は,整体,浮点型,文字列,色値,ブル値などである. FMZ上のパイン言語は,非常に厳格な種類要求を必要とせず,文字列と数字を同時に配列に保存することも可能である. 配列の底層も配列構造であるため,歴史演算子が前のBAR上の配列状態を参照した場合,配列の要素を引用する際に歴史演算子を使用しない.[]
必要なのはarray.get()
そしてarray.set()
関数、数列内の要素の索引順序は,数列の最初の要素の索引が0で,次の要素の索引が増加して1である.
簡単なコードで説明します.
var a = array.from(0)
if bar_index == 0
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1])
else if bar_index == 1
array.push(a, bar_index)
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1])
else if bar_index == 2
array.push(a, bar_index)
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1], ", 向前数2根BAR上的a,即a[2]值:", a[2])
else if bar_index == 3
array.push(a, bar_index)
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1], ", 向前数2根BAR上的a,即a[2]值:", a[2], ", 向前数3根BAR上的a,即a[3]值:", a[3])
else if bar_index == 4
// 使用array.get 按索引获取元素,使用array.set按索引修改元素
runtime.log("数组修改前:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3))
array.set(a, 1, 999)
runtime.log("数组修改后:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3))
使用するarray<int> a
、float[] b
宣言される行列またはただ1つの変数を宣言する行列は,例えば:
array<int> a = array.new(3, bar_index)
float[] b = array.new(3, close)
c = array.from("hello", "fmz", "!")
runtime.log("a:", a)
runtime.log("b:", b)
runtime.log("c:", c)
runtime.error("stop")
配列変数の初期化 一般的な用途array.new
そしてarray.from
函数。Pine语言中还有很多和类型相关的与array.new类似的函数:array.new_int()
、array.new_bool()
、array.new_color()
、array.new_string()
ほら
varキーワードは,varキーワードで宣言された配列が最初のBARにのみ初期化されるように,配列の宣言パターンにも作用する.
var a = array.from(0)
b = array.from(0)
if bar_index == 1
array.push(a, bar_index)
array.push(b, bar_index)
else if bar_index == 2
array.push(a, bar_index)
array.push(b, bar_index)
else if barstate.islast
runtime.log("a:", a)
runtime.log("b:", b)
runtime.error("stop")
変化が継続的に定着し,再配置されないように見える. b 配列は各BARで初期化される.barstate.islast
リアルタイムでプリントするときは,まだ1つの要素,値0を保持します.
array.get で配列内の指数位置を指定する要素を取得し,array.set で配列内の指数位置を指定する要素を変更する.
array.get の最初のパラグラムは処理する配列であり,第2パラグラムは指定されたインデックスである. array.set の第1項目は処理する配列,第2項目は指定するインデックス,第3項目は書き込む要素である.
この簡単な例を使って説明しましょう.
lookbackInput = input.int(100)
FILL_COLOR = color.green
var fillColors = array.new(5)
if barstate.isfirst
array.set(fillColors, 0, color.new(FILL_COLOR, 70))
array.set(fillColors, 1, color.new(FILL_COLOR, 75))
array.set(fillColors, 2, color.new(FILL_COLOR, 80))
array.set(fillColors, 3, color.new(FILL_COLOR, 85))
array.set(fillColors, 4, color.new(FILL_COLOR, 90))
lastHiBar = - ta.highestbars(high, lookbackInput)
fillNo = math.min(lastHiBar / (lookbackInput / 5), 4)
bgcolor(array.get(fillColors, int(fillNo)), overlay=true)
plot(lastHiBar, title="lastHiBar")
plot(fillNo, title="fillNo")
この例では,基調色緑を初期化し,色を保存する配列を宣言し初期化し,色値に異なる透明度を与えます (color.new関数を使用します). 現在のBARは100回見回りの周期内で最も高い値の距離を計算して色級を計算します. 最近100回見回りの周期内で最も高い値が近いほど,レベルが高くなるほど,対応する色値がより深い (透明度が低い).多くの類似の戦略は,この方法で現在のN回見回りの周期内価格のレベルを表します.
この式では,行列をどのように行うかについて説明します.
a = array.from(1, 2, 3, 4, 5, 6)
for i = 0 to (array.size(a) == 0 ? na : array.size(a) - 1)
array.set(a, i, i)
runtime.log(a)
runtime.error("stop")
a = array.from(1, 2, 3, 4, 5, 6)
i = 0
while i < array.size(a)
array.set(a, i, i)
i += 1
runtime.log(a)
runtime.error("stop")
a = array.from(1, 2, 3, 4, 5, 6)
for [i, ele] in a
array.set(a, i, i)
runtime.log(a)
runtime.error("stop")
この3つのやり方は同じ結果を出しています.
配列は,スクリプトのグローバル範囲で宣言することもできます.また,関数またはifブランチのローカル範囲で宣言することもできます.
配列内の要素の使用については,以下の方法が等価である.次の例から,グラフに2つの列を描くことができる.各列には2つの列があり,各列の2つの列の数はまったく同じである.
a = array.new_float(1)
array.set(a, 0, close)
closeA1 = array.get(a, 0)[1]
closeB1 = close[1]
plot(closeA1, "closeA1", color.red, 6)
plot(closeB1, "closeB1", color.black, 2)
ma1 = ta.sma(array.get(a, 0), 20)
ma2 = ta.sma(close, 20)
plot(ma1, "ma1", color.aqua, 6)
plot(ma2, "ma2", color.black, 2)
1, 行列の追加操作に関する関数:
array.unshift()
、array.insert()
、array.push()
。
2, 行列の削除操作に関する関数:
array.remove()
、array.shift()
、array.pop()
、array.clear()
。
この例で,これらの配列の追加,削除の操作関数をテストします.
a = array.from("A", "B", "C")
ret = array.unshift(a, "X")
runtime.log("数组a:", a, ", ret:", ret)
ret := array.insert(a, 1, "Y")
runtime.log("数组a:", a, ", ret:", ret)
ret := array.push(a, "D")
runtime.log("数组a:", a, ", ret:", ret)
ret := array.remove(a, 2)
runtime.log("数组a:", a, ", ret:", ret)
ret := array.shift(a)
runtime.log("数组a:", a, ", ret:", ret)
ret := array.pop(a)
runtime.log("数组a:", a, ", ret:", ret)
ret := array.clear(a)
runtime.log("数组a:", a, ", ret:", ret)
runtime.error("stop")
追加,削除するアプリケーション:配列として配列
配列や配列の追加,削除関数を使って"列"のデータ構造を作ることができます. 列は,ティックの価格の移動平均を計算するために使用できます. 学生が尋ねるかもしれません. なぜ列構造を作るのか?
配列とは,プログラミングでよく使われる構造で,配列の特徴は以下の通りである.
列に最初に入る要素は列から最初に出ます.
この方法では,列に含まれるデータが最新のデータであることを確認し,列の長さは無限に膨張しない (無限に膨張するコードは午後にしか書きません.
次の例では,各ティックの価格を記録する列構造を使用して,ティックのレベルでの移動平均値を計算し,1分間のK線レベルでの移動平均線観察と比較します.
strategy("test", overlay=true)
varip a = array.new_float(0)
var length = 10
if not barstate.ishistory
array.push(a, close)
if array.size(a) > length
array.shift(a)
sum = 0.0
for [index, ele] in a
sum += ele
avgPrice = array.size(a) == length ? sum / length : na
plot(avgPrice, title="avgPrice")
plot(ta.sma(close, length), title="ta.sma")
キーワードで定義します. キーワードで定義します.varip
⇒ 価格の変化は a 行列に記録される.
関連関数を計算する:
array.avg()
この式は,すべての要素の平均値を求めます.array.min()
微小な要素は,array.max()
任意の項目の最大要素は,array.stdev()
定数列のすべての要素の標準差は,array.sum()
求数列のすべての要素の和である.
操作関連機能:array.concat()
2つの配列を結合または接続する.array.copy()
複製行列はarray.join
配列内のすべての要素を文字列に連結する.array.sort()
順番を順番に並べて,順番を順番に並べます.array.reverse()
逆行列は,array.slice()
数列を切断する.array.includes()
判断する要素.array.indexof()
参数の値が最初に表示されたインデックスを返します. 値が見つからない場合は -1 を返します.array.lastindexof()
この項目は,この項目の最後に表示された値を見つけます.
数式計算に関する関数のテスト例:
a = array.from(3, 2, 1, 4, 5, 6, 7, 8, 9)
runtime.log("数组a的算数平均:", array.avg(a))
runtime.log("数组a中的最小元素:", array.min(a))
runtime.log("数组a中的最大元素:", array.max(a))
runtime.log("数组a中的标准差:", array.stdev(a))
runtime.log("数组a的所有元素总和:", array.sum(a))
runtime.error("stop")
これらの関数は,比較的によく使われる数式計算関数である.
関連関数を操作する例:
a = array.from(1, 2, 3, 4, 5, 6)
b = array.from(11, 2, 13, 4, 15, 6)
runtime.log("数组a:", a, ", 数组b:", b)
runtime.log("数组a,数组b连接在一起:", array.concat(a, b))
c = array.copy(b)
runtime.log("复制一个数组b,赋值给变量c,变量c:", c)
runtime.log("使用array.join处理数组c,给每个元素中间增加符号+,连接所有元素结果为字符串:", array.join(c, "+"))
runtime.log("排序数组b,按从小到大顺序,使用参数order.ascending:", array.sort(b, order.ascending)) // array.sort函数修改原数组
runtime.log("排序数组b,按从大到小顺序,使用参数order.descending:", array.sort(b, order.descending)) // array.sort函数修改原数组
runtime.log("数组a:", a, ", 数组b:", b)
array.reverse(a) // 此函数修改原数组
runtime.log("反转数组a中的所有元素顺序,反转之后数组a为:", a)
runtime.log("截取数组a,索引0 ~ 索引3,遵循左闭右开区间规则:", array.slice(a, 0, 3))
runtime.log("在数组b中搜索元素11:", array.includes(b, 11))
runtime.log("在数组a中搜索元素100:", array.includes(a, 100))
runtime.log("将数组a和数组b连接,搜索其中第一次出现元素2的索引位置:", array.indexof(array.concat(a, b), 2), " , 参考观察 array.concat(a, b):", array.concat(a, b))
runtime.log("将数组a和数组b连接,搜索其中最后一次出现元素6的索引位置:", array.lastindexof(array.concat(a, b), 6), " , 参考观察 array.concat(a, b):", array.concat(a, b))
runtime.error("stop")
パイン言語は,カスタム関数を設計することができる.一般的に,パイン言語のカスタム関数は,以下のルールがあります:
1,すべての関数はスクリプトの全域で定義されている. 別の関数で関数を宣言することはできません.
2、関数が自分のコードで自らを呼び出すことを許さない.
3,原則としてすべてのPINE言語に内蔵された絵図関数 (※)barcolor()、 fill()、 hline()、plot()、 plotbar()、 plotcandle()
) はカスタム関数の中で呼び出せない.
4,関数は単行本,複数行本として記述できる. 最後の文の返却値は,現在の関数の返却値であり,返却値は,元组形式に戻すことができる.
単行本で設計されたカスタム関数など,以前にも何度も使用してきました.
barIsUp() => close > open
この関数は,現在のBARが太陽線であるかどうかを返します.
複数の行のカスタム関数として設計されています.
sma(data, length) =>
i = 0
sum = 0
while i < 10
sum += data[i]
i += 1
sum / length
plot(sma(close, length), title="sma", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
定式関数で自らが実現した SMA均線計算関数である.
また,2つの変数のカスタム関数の例を返します.
twoEMA(data, fastPeriod, slowPeriod) =>
fast = ta.ema(data, fastPeriod)
slow = ta.ema(data, slowPeriod)
[fast, slow]
[ema10, ema20] = twoEMA(close, 10, 20)
plot(ema10, title="ema10", overlay=true)
plot(ema20, title="ema20", overlay=true)
1つの関数は,快線,遅線,二つの均線EMAを計算できる.
機能の定義は,FMZ PINE スクリプトのドキュメント検索中.
パイン言語の内蔵関数分類:
1 文字列処理関数str.
シリーズ♪
2,色値処理関数color.
シリーズ♪
3 参数入力関数input.
シリーズ♪
4 指標計算関数ta.
シリーズ♪
5 図解関数plot.
シリーズ♪
6、数式処理関数array.
シリーズ♪
7 取引に関する関数strategy.
シリーズ♪
8、数学演算に関する関数math.
シリーズ.
9、他の関数 (時間処理,非プロット系列図解関数,request.
配列関数,型処理関数など) ⇒
strategy.
シリアル関数は,私たちが設計戦略で頻繁に使用する関数で,これらの関数と戦略が特定の実行時に取引を実行する関数は密接に関連しています.
1、strategy.entry
strategy.entry
この関数は,いくつかのパラメータを比較して重要なものです.id
, direction
, qty
, when
ほら
パラメータ:
id
: は,ある取引ポジションの名称を参照するために使用される. この id は,撤回,変更,平衡を参照することができます.direction
:下注の方向が多 (買) える場合,このパラメータが伝わります.strategy.long
この内蔵変数は,空白 (売る) 時に伝わります.strategy.short
この変数は.qty
: 注文する量を指定します.このパラメータが伝わらなければ,デフォルトの注文量を使用します.when
:実行条件,このパラメータを指定して,現在の下記操作が起動するかどうかを制御できます.limit
オーダー制限価格を指定する.stop
ストップダスト価格.strategy.entry
函数の具体的な実行詳細は,strategy
函数に呼び出すときのパラメータ設定を制御することもできます"Pine 言語取引庫のテンプレートパラメータ"設定制御,Pine言語取引クラス模板庫パラメータ制御の取引詳細については,リンクのドキュメントを参照してください.
重要なことは,ここでは説明します.strategy
この関数では,pyramiding
、default_qty_value
パラメータ. 次のコードでテストします.
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)
ema10 = ta.ema(close, 10)
findOrderIdx(idx) =>
if strategy.opentrades == 0
false
else
ret = false
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == idx
ret := true
break
ret
if not findOrderIdx("long1")
strategy.entry("long1", strategy.long)
if not findOrderIdx("long2")
strategy.entry("long2", strategy.long, 0.2, when = close > ema10)
if not findOrderIdx("long3")
strategy.entry("long3", strategy.long, 0.2, limit = low[1])
strategy.entry("long3", strategy.long, 0.3, limit = low[1])
if not findOrderIdx("long4")
strategy.entry("long4", strategy.long, 0.2)
plot(ema10, title="ema10", color=color.red)
コード開始/*backtest ... */
パッケージの一部は,リテスト設定のために設定され,リテスト設定の時間などの情報を記録するため,デビューに便利であり,策略コードではありません.
暗号は:strategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)
指定する場合は,pyramiding
この例では4回です. この例では4回です.strategy.entry
命令の実行が完了していない.default_qty_value
このとき,このIDはstrategy.entry
下行操作の下行量は,デフォルトで 0.1 と設定されています.strategy.entry
この関数は,この関数で,direction
均等にstrategy.long
テストは,テストの返信で支払われます.
暗号に注意してくださいstrategy.entry("long3", ...
次の操作は,同じID:strategy.entry
下の操作は完了せず,第二回の呼び出しstrategy.entry
このIDのオーダーを変更する関数 (復試テストで表示されるデータでは,この制限オーダーの下位のオーダー量が0.3に変更されたことも見ることができます).別の例として,最初のIDがstrategy.entry
函数で注文すると,すべての注文ポジションがID
2、strategy.close
strategy.close
関数は平衡が識別IDを指定する入場保有位に使用される. 主なパラメータは:id
,when
,qty
,qty_percent
。
パラメータ:
id
取引先へのアクセスIDは,私たちが使っているものです.strategy.entry
入力時に指定されたID.when
実行条件:qty
取引先の数.qty_percent
取引の割合は:この関数の使い方については,次の例で説明します.
コードの中で/*backtest ... */
是FMZ.COM国际站回测时的配置信息,可以删掉,设置自己需要测试的市场、品种、时间范围等信息。
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("close Demo", pyramiding=3)
var enableStop = false
if enableStop
runtime.error("stop")
strategy.entry("long1", strategy.long, 0.2)
if strategy.opentrades >= 3
strategy.close("long1") // 多个入场订单,不指定qty参数,全部平仓
// strategy.close() // 不指定id参数,会平掉当前的持仓
// strategy.close("long2") // 如果指定一个不存在的id则什么都不操作
// strategy.close("long1", qty=0.15) // 指定qty参数平仓
// strategy.close("long1", qty_percent=50) // qty_percent设置50即为平掉long1标识仓位的50%持仓
// strategy.close("long1", qty_percent=80, when=close<open) // 指定when参数,修改为close>open就不触发了
enableStop := true
テスト戦略は,連続して3回の複数エントリーを開始し,エントリーIDがstrategy.close
関数の異なるパラメータを平衡に設定すると,異なる結果が返される.strategy.close
この関数には,平成の注文価格を指定するパラメータがなく,この関数は,主に現在の市場価格で即座に平成するために使用されます.
3、strategy.close_all
strategy.close_all
この関数は,Pine言語のスクリプトで,Pine は"つの方向にしか持たないので,現在の持有をすべて平らにする.strategy.close_all
呼び出されると,現在の方向に所有するすべての資産を平らにする.strategy.close_all
この関数の主要パラメータは,when
。
パラメータ:
when
実行条件:この例を参考にしてみましょう.
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("closeAll Demo")
var enableStop = false
if enableStop
runtime.error("stop")
strategy.entry("long", strategy.long, 0.2, when=strategy.position_size==0 and close>open)
strategy.entry("short", strategy.short, 0.3, when=strategy.position_size>0 and close<open)
if strategy.position_size < 0
strategy.close_all()
enableStop := true
テストコードの開始時に,保有量は0 (つまりstrategy.position_size==0
設定された条件を満たすときのみIDをstrategy.entry
入力関数.複数のポジションを保持した後に.strategy.position_size
0より大きいとき,IDはstrategy.position_size < 0
空頭持持は,現在持っている方向の全持を平らにする.そしてマークします.enableStop := true
監視日記を閲覧できるように,ポリシーを停止します.
発見しましたstrategy.close_all
この関数には,平成の注文価格を指定するパラメータがなく,この関数は,主に現在の市場価格で即座に平成するために使用されます.
4、strategy.exit
strategy.exit
この関数は,入札株の平衡操作に使用されます.strategy.close
そしてstrategy.close_all
この関数は,現在の市場価格で即座に平衡されます.strategy.exit
この関数は,パラメータ設定に基づいて平衡を計画します.
パラメータ:
id
:現在の平衡条件リストの注文識別子ID、from_entry
:平衡操作を行うためのログインIDを指定する.qty
取引先の数.qty_percent
:平仓パーセント,範囲: 0 ~ 100、profit
利益の目標,ポイントで表示される.loss
ストップダメージ目標,ポイントで表示.limit
利益目標,価格で指定された.stop
ストップダース目標,価格指定.when
実行条件:各パラメータの使用を理解するためにテスト戦略を使用します.
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/
strategy("strategy.exit Demo", pyramiding=3)
varip isExit = false
findOrderIdx(idx) =>
ret = -1
if strategy.opentrades == 0
ret
else
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == idx
ret := i
break
ret
strategy.entry("long1", strategy.long, 0.1, limit=1, when=findOrderIdx("long1") < 0)
strategy.entry("long2", strategy.long, 0.2, when=findOrderIdx("long2") < 0)
strategy.entry("long3", strategy.long, 0.3, when=findOrderIdx("long3") < 0)
if not isExit and strategy.opentrades > 0
// strategy.exit("exitAll") // 如果仅仅指定一个id参数,则该退场订单无效,参数profit, limit, loss, stop等出场条件也至少需要设置一个,否则也无效
strategy.exit("exit1", "long1", profit=50) // 由于long1入场订单没有成交,因此ID为exit1的出场订单也处于暂待状态,直到对应的入场订单成交才会放置exit1
strategy.exit("exit2", "long2", qty=0.1, profit=100) // 指定参数qty,平掉ID为long2的持仓中0.1个持仓
strategy.exit("exit3", "long3", qty_percent=50, limit=strategy.opentrades.entry_price(findOrderIdx("long3")) + 1000) // 指定参数qty_percent,平掉ID为long3的持仓中50%的持仓
isExit := true
if bar_index == 0
runtime.log("每点价格为:", syminfo.mintick) // 每点价格和Pine语言模板参数上「定价货币精度」参数设置有关
このテスト戦略は,リアルタイムの価格モデルのリトートテストを使用して,3つのエントリー操作を実行し始めます.strategy.entry
limit
パラメータ,配当価格が1で取引ができない. そしてテスト条件出力関数.strategy.exit
・点数による停止・価格による停止・固定数による停止・百分比による停止・停止は,この例では止止止のみが示されているため,止止損操作も同義である.strategy.exit
この関数には,より複雑な追跡停止パラメータがあります.trail_price
、trail_points
、trail_offset
この例では,その使い方をテストすることもできます.
5、strategy.cancel
strategy.cancel
この関数は,すべてのプレハングのコマンドをキャンセル/停止するために使用されます.strategy.order
, strategy.entry
, strategy.exit
この関数の主要パラメータは:id
、when
。
パラメータ:
id
削除したいIDは:when
実行条件:この関数は,取引が終わらない入力命令をキャンセルするために使用されていることがよく理解されています.
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("strategy.cancel Demo", pyramiding=3)
var isStop = false
if isStop
runtime.error("stop")
strategy.entry("long1", strategy.long, 0.1, limit=1)
strategy.entry("long2", strategy.long, 0.2, limit=2)
strategy.entry("long3", strategy.long, 0.3, limit=3)
if not barstate.ishistory and close < open
strategy.cancel("long1")
strategy.cancel("long2")
strategy.cancel("long3")
isStop := true
6、strategy.cancel_all
strategy.cancel_all
函数とstrategy.cancel
関数は類似します. すべてのプレハング命令をキャンセル/停止します. 指定できます.when
パラメータは.
パラメータ:
when
実行条件:/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("strategy.cancel Demo", pyramiding=3)
var isStop = false
if isStop
runtime.error("stop")
strategy.entry("long1", strategy.long, 0.1, limit=1)
strategy.entry("long2", strategy.long, 0.2, limit=2)
strategy.entry("long3", strategy.long, 0.3, limit=3)
if not barstate.ishistory and close < open
strategy.cancel_all()
isStop := true
7、strategy.order
strategy.order
機能やパラメータの設定は ほぼ同じですstrategy.entry
共通点として,strategy.order
この関数はstrategy
この関数は,pyramiding
パラメータ設定の影響,次回数制限はありません.
パラメータ:
id
: は,ある取引ポジションの名称を参照するために使用される. この id は,撤回,変更,平衡を参照することができます.direction
:下注の方向が多 (買) える場合,このパラメータが伝わります.strategy.long
この内蔵変数は,空白 (売る) 時に伝わります.strategy.short
この変数は.qty
: 注文する量を指定します.このパラメータが伝わらなければ,デフォルトの注文量を使用します.when
:実行条件,このパラメータを指定して,現在の下記操作が起動するかどうかを制御できます.limit
オーダー制限価格を指定する.stop
ストップダスト価格.コンピュータを活用するstrategy.order
単位の数は,この性質を制限しません.strategy.exit
条件退出関数、格子取引のようなスクリプトを構築する、例は非常にシンプルで,学習のみです:
/*backtest
start: 2021-03-01 00:00:00
end: 2022-08-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["ZPrecision",0,358374]]
*/
varip beginPrice = -1
if not barstate.ishistory
if beginPrice == -1 or (math.abs(close - beginPrice) > 1000 and strategy.opentrades == 0)
beginPrice := close
for i = 0 to 20
strategy.order("buy"+i, strategy.long, 0.01, limit=beginPrice-i*200, when=(beginPrice-i*200)<close)
strategy.exit("coverBuy"+i, "buy"+i, qty=0.01, profit=200)
strategy.order("sell"+i, strategy.short, 0.01, limit=beginPrice+i*200, when=(beginPrice+i*200)>close)
strategy.exit("coverSell"+i, "sell"+i, qty=0.01, profit=200)
このチュートリアルの戦略例は,戦略を教え,戦略設計のアイデアを指導するためにのみ使用され,いかなる取引の指導や助言も行いません.
strategy("supertrend", overlay=true)
[supertrend, direction] = ta.supertrend(input(5, "factor"), input.int(10, "atrPeriod"))
plot(direction < 0 ? supertrend : na, "Up direction", color = color.green, style=plot.style_linebr)
plot(direction > 0 ? supertrend : na, "Down direction", color = color.red, style=plot.style_linebr)
if direction < 0
if supertrend > supertrend[2]
strategy.entry("entry long", strategy.long)
else if strategy.position_size < 0
strategy.close_all()
else if direction > 0
if supertrend < supertrend[3]
strategy.entry("entry short", strategy.short)
else if strategy.position_size > 0
strategy.close_all()
パイン言語でトレンド戦略を書くのは非常に簡単です. ここで,スーパートレンド指標を使って,シンプルなトレンド追跡戦略をデザインします.
戦略コードが使えるようになっていますstrategy
この機能は,いくつかの簡単な設定を行います.strategy("supertrend", overlay=true)
設定した. 設定した. 設定した.overlay
このパラメータはtrue
パイン戦略を設計したり,パイン戦略のスクリプトを学ぶとき,まずは,戦略インターフェースのパラメータ設計を見て, "超トレンド指標戦略"のソースコードを見ます.input
関数
[スーパートレンド,方向性] = ta.スーパートレンド (入力) 5,因数 (因数)input.int(第10回,第4回)
input
函数呼び出しは直接ta.supertrend
インディケーター関数のパラメータは,スーパートレンドインディケーターを計算するために使用される.
パイン言語のポリシーのインターフェースでは,この関数が2つのパラメータコントロールをデフォルトで設定します.
制御のデフォルト値はinput
函数とinput
この関数は,input.int
) の第1パラグラム,これらは前回の章でも説明されています. この2つの関数を使って,戦略インターフェースに設定することができます.ta.supertrend
超トレンド指標関数は価格データを計算します.supertrend
方向性データです.direction
そしてそれを使います.plot
函数グラフは,グラフを描いているとき,スーパートレンド指標の方向に基づいてグラフを描いていることに注意してください.direction
市場が上昇する傾向にあるのは,direction
1時現在市場が下落傾向にあるので,我々は見ることができます.plot
グラフを描くときの判断direction
0より大きい, 0より小さい.
次の記事if ... else if
この式は,この式が,この式が,この式が,この式が,この式がdirection < 0
超トレンド指標の価格データは,現在市場が上向きな段階にあることをリアルタイムで示しています.supertrend
前2つのBARの超トレンド指標の価格より高い (つまりsupertrend[2],还记得历史操作符引用某个变量历史数据吧
このとき,当時は持株がある場合,このとき,逆向下向きの単一関数呼び出しを行うと,先の持株が平らになり,当時の取引方向に基づいて取引を開始します.supertrend > supertrend[2]
条件が達成されていない限り,strategy.position_size < 0
空頭座席を保持しても 引き金になりますstrategy.close_all()
函数を実行し,すべての平衡を実行します.
direction > 0
ダウントレンド段階では,複数の保有者がすべて平衡した場合,条件を満たす.supertrend < supertrend[3]
シャットダウン信号が鳴る時,[3]
前列3のBARの超トレンド指標の価格データに言及することは,策略家の意図的なことかもしれません.なぜなら,ある市場では,契約取引市場などの空きリスクは,多きリスクよりも少し大きいからです.
についてta.supertrend
この指標は,同級生が興味を持っているものでしょうか? 現在の傾向が上向きなのか下向きなのかを判断する方法でしょうか?
この指標は,Pine言語のカスタム関数として実現できます.
pine_supertrend(factor, atrPeriod) =>
src = hl2
atr = ta.atr(atrPeriod)
upperBand = src + factor * atr
lowerBand = src - factor * atr
prevLowerBand = nz(lowerBand[1])
prevUpperBand = nz(upperBand[1])
lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
int direction = na
float superTrend = na
prevSuperTrend = superTrend[1]
if na(atr[1])
direction := 1
else if prevSuperTrend == prevUpperBand
direction := close > upperBand ? -1 : 1
else
direction := close < lowerBand ? 1 : -1
superTrend := direction == -1 ? lowerBand : upperBand
[superTrend, direction]
この定義関数は,この関数と,この関数の内置関数です.ta.supertrend
計算した指標データも同じです.
このカスタム関数アルゴリズムから,Pineが組み込んだ超傾向指標の計算は,hl2
内置変数 (最高価格,最低価格を足し,2で割る,最高価格,最低価格の平均値) は,パラメータatrPeriodに基づいて特定の周期のATR指標 (波幅) を計算し,その後hl2とATRを使用して上線,下線を構築します.
コード内の三元式によって更新lowerBand
そしてupperBand
。
lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
lowerBand: 上向きトレンドの変化を判断する下向きトレンド.upperBand:上向きトレンドの変化を判断する下向きトレンド.lowerBandとupperBandは常に計算されており,このカスタム関数で現在のトレンド方向を判断するだけです.
else if prevSuperTrend == prevUpperBand
direction := close > upperBand ? -1 : 1
else
direction := close < lowerBand ? 1 : -1
超トレンド値が,前回のバーで,prevUpperBand
この線は,現在下向きの傾向を示しています.close
超えているupperBand
価格が突破すると,この時点でトレンドが変化し,上向きに変わると考えます.direction
方向変数は−" (上昇傾向) に設定されています. そうでない場合も" (低下傾向) に設定されています.if direction < 0
信号条件が触発された後,より多くのことをします.direction > 0
信号条件が触発されたときに空止します.
superTrend := direction == -1 ? lowerBand : upperBand
[superTrend, direction]
最後に,方向性によって選択された特定の超トレンド指標の価格データと方向性データに戻します.
/*backtest
start: 2021-03-01 00:00:00
end: 2022-09-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["v_input_1",4374],["v_input_2",3],["v_input_3",300],["ZPrecision",0,358374]]
*/
varip balance = input(50000, "balance")
varip stocks = input(0, "stocks")
maxDiffValue = input(1000, "maxDiffValue")
if balance - close * stocks > maxDiffValue and not barstate.ishistory
// more balance , open long
tradeAmount = (balance - close * stocks) / 2 / close
strategy.order("long", strategy.long, tradeAmount)
balance := balance - tradeAmount * close
stocks := stocks + tradeAmount
runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount)
else if close * stocks - balance > maxDiffValue and not barstate.ishistory
// more stocks , open short
tradeAmount = (close * stocks - balance) / 2 / close
strategy.order("short", strategy.short, tradeAmount)
balance := balance + tradeAmount * close
stocks := stocks - tradeAmount
runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount)
plot(balance, title="balance value(quoteCurrency)", color=color.red)
plot(stocks*close, title="stocks value(quoteCurrency)", color=color.blue)
ダイナミック・バランス・戦略とは, ダイナミック・バランス・戦略とは, ダイナミック・バランス・戦略とは,BaseCurrency
(取引品種) の金額とQuoteCurrency
(計額貨幣) の金額は常に均衡処理を行う.どの資産の相対価格が上昇し,口座に所持する価値が増加すると,どの資産が売却される.ある資産の相対価格が低下し,口座に所持する価値が減少すると,その資産を購入する.これは動的均衡戦略と呼ばれる.実際には動的均衡戦略は,格子戦略であり,波動状況でうまく機能する.しかし,傾向状況では継続的な損失が必要であり,価格が戻るまで待つことが必要である.
この戦略のデメリットは,この戦略の回帰図が示すように,価格の大上昇 (または大下落) の段階では浮上戦略が大きな損失を伴う.したがって,この戦略は現金戦略に適しており,フューチャーでの使用はリスクを控える必要があります.
戦略的なコードデザインを見てみましょう.
シンプルなデザインで 戦略的に模倣したbalance
資産の総額は,stocks
基本通貨資産数 (BaseCurrency Asset Number) のバランス情報. 口座の実際の資産数を読み取らないので,適切な買い出しを計算する模擬金額を使います. そして,このダイナミックバランス戦略を引っ張るグリッドに影響を与える重要なパラメータは,maxDiffValue
このパラメータはバランスの取れた判断基準である.BaseCurrency
そしてQuoteCurrency
偏差が超えているmaxDiffValue
価格が高くなった資産を売り,安価な資産を買い,資産をバランスに戻す.
戦略取引の信号のトリガーがリアルタイムBAR段階で意味を持つ必要があるため,戦略取引条件はif判断に設定されている.not barstate.ishistory
⇒ 価格が現在の価格で計算された場合,balance
価値が超えているstocks
値時に購入する. 対照的に売却する. 取引文を実行した後更新する.balance
そしてstocks
変数,そして次のバランストリガーを待つ.
戦略回路の開始時の品種価格が1458で,私は意図的にパラメータを設定しました.balance
設定するパラメータは:4374 ((1458*3)stocks
3、資産が開始時にバランス状態にあるようにする、
このビデオでは,strategy.exit
ポジション退出関数,その追跡ストップ・デストロップ・ブレーキ機能は,例文では説明していない.このセクションの戦略設計例では,使用します.strategy.exit
超トレンド戦略を最適化するために,関数の追跡ストップ・ロスト・ストップ機能.
まず,まずは,strategy.exit
関数の追跡停止・損失停止パラメータ:
1、trail_price
パラメータ: トリガー置く追跡ストップ・ストップ・損失平衡单のこの論理行動の位置 ((価格で指定)