資源の読み込みに... 荷物...

発明者によるPINE言語の定量化入門教科書

作者: リン・ハーン発明者 量化 - 微かな夢作成日:2022-05-30 16:23:43,更新日:2022-09-28 17:10:21 更新日:2022-09-28 更新日:2022-09-28 17:10:21 更新日:2022-09-28 更新日:2022-09-28 17:10:21 更新日:2022-09-28 更新日:2022-09-28 17:10:21 更新日:2022-09-28 17:10:21 更新日:2022-09-28 更新日:2020-09-28 17:10:21 更新日:2020-09-28 更新日:2020-09-28 更新日:2020-09-28 17:10:21 更新日:2020-09-28 更新日:2020-09-28 更新日:2020-09-29 更新日:2021-09-21 更新日:2021-09-21 更新日:2021-09-21

物語の物語は,

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.stringinput.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 文

返回值 = 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 文

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文は, 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> afloat[] 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この関数では,pyramidingdefault_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はlong1です.strategy.entry下行操作の下行量は,デフォルトで 0.1 と設定されています.strategy.entryこの関数は,この関数で,direction均等にstrategy.longテストは,テストの返信で支払われます.

暗号に注意してくださいstrategy.entry("long3", ...次の操作は,同じID:long3に対して,2回呼び出されます.strategy.entry下の操作は完了せず,第二回の呼び出しstrategy.entryこのIDのオーダーを変更する関数 (復試テストで表示されるデータでは,この制限オーダーの下位のオーダー量が0.3に変更されたことも見ることができます).別の例として,最初のIDがlong3のオーダーで決済された場合,この決済されたIDlong3に従って継続します.strategy.entry函数で注文すると,すべての注文ポジションがIDlong3に累積します.


2、strategy.close

strategy.close関数は平衡が識別IDを指定する入場保有位に使用される. 主なパラメータは:idwhenqtyqty_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がlong1であることを示し,その後使用します.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をlongとして実行します.strategy.entry入力関数.複数のポジションを保持した後に.strategy.position_size0より大きいとき,IDはshortの入力関数を実行する可能性があります.このとき発生する空置逆信号は,当時は多頭ポジションを保持しているため,多頭ポジションを平らな状態に置き,再び空置を逆開します.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.entrylong1を故意に設定していますlimitパラメータ,配当価格が1で取引ができない. そしてテスト条件出力関数.strategy.exit・点数による停止・価格による停止・固定数による停止・百分比による停止・停止は,この例では止止止のみが示されているため,止止損操作も同義である.strategy.exitこの関数には,より複雑な追跡停止パラメータがあります.trail_pricetrail_pointstrail_offsetこの例では,その使い方をテストすることもできます.


5、strategy.cancel

strategy.cancelこの関数は,すべてのプレハングのコマンドをキャンセル/停止するために使用されます.strategy.order, strategy.entry , strategy.exitこの関数の主要パラメータは:idwhen

パラメータ:

  • 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インディケーター関数のパラメータは,スーパートレンドインディケーターを計算するために使用される.

  • input ((5, 因数)
  • input.int(第10回,第4回)

パイン言語のポリシーのインターフェースでは,この関数が2つのパラメータコントロールをデフォルトで設定します.

img

制御のデフォルト値はinput函数とinputこの関数は,input.int) の第1パラグラム,これらは前回の章でも説明されています. この2つの関数を使って,戦略インターフェースに設定することができます.ta.supertrend超トレンド指標関数は価格データを計算します.supertrend方向性データです.directionそしてそれを使います.plot函数グラフは,グラフを描いているとき,スーパートレンド指標の方向に基づいてグラフを描いていることに注意してください.direction市場が上昇する傾向にあるのは,direction1時現在市場が下落傾向にあるので,我々は見ることができます.plotグラフを描くときの判断direction0より大きい, 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)

img

img

ダイナミック・バランス・戦略とは, ダイナミック・バランス・戦略とは, ダイナミック・バランス・戦略とは,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)stocks3、資産が開始時にバランス状態にあるようにする、

ストップ・ダース・ストップ・の超トレンド戦略

このビデオでは,strategy.exitポジション退出関数,その追跡ストップ・デストロップ・ブレーキ機能は,例文では説明していない.このセクションの戦略設計例では,使用します.strategy.exit超トレンド戦略を最適化するために,関数の追跡ストップ・ロスト・ストップ機能.

まず,まずは,strategy.exit関数の追跡停止・損失停止パラメータ:

1、trail_priceパラメータ: トリガー置く追跡ストップ・ストップ・損失平衡单のこの論理行動の位置 ((価格で指定)


もっと