이 있다. 파인 언어의 표현도 마찬가지다.
우선 순위 | 연산자 |
---|---|
9 | [] |
8 | 일元 연산자일 때 `+ 、- “ |
7 | * 、/ 、% |
6 | 이진 연산자의 ` + - |
5 | > 、< 、>= 、<= |
4 | == 、!= |
3 | and |
2 | or |
1 | ?: |
우선순위가 높은 표현식 부분에서 먼저 연산하고, 우선순위가 동일하다면 왼쪽에서 오른쪽으로 연산한다. 어떤 부분을 먼저 연산하도록 강요할 경우,()
이 부분의 표현식을 먼저 연산하도록 강요하는 표현식을 포괄한다.
우리는 이미 아이덴티커의 개념을 배웠습니다. 아이덴티커은 변수의 이름으로서 변수에 이름을 붙인 것입니다. 그래서 변수는 보존값의 아이덴티커입니다. 그렇다면 변수를 선언하는 방법은 무엇입니까? 선언 변수는 어떤 규칙이 있습니까?
var
。
2 키워드 사용varip
。
var
、varip
키워드는 사실 우리가 이전 “가치 부여 연산자” 섹션에서 배웠고, 여기서 더 이상 언급하지 않습니다. 변수의 선언 모드는 아무것도 쓰지 않으면, 예를 들어:i = 1
사실, 우리는 이미 말했듯이, 이렇게 선언된 변수들은, 그리고 부여된 값들은, 모든 K선 BAR에서 실행됩니다.
int i = 0
float f = 1.1
트레이딩 뷰의 타입은 좀 더 까다롭습니다. 트레이딩 뷰에서 다음과 같은 코드를 사용하면 오류가 발생합니다.
baseLine0 = na // compile time error!
결론적으로, 변수를 선언하는 것은 다음과 같이 쓸 수 있습니다.
// [<declaration_mode>] [<type>] <identifier> = value
声明模式 类型 标识符 = 值
여기에서는 부가 연산자를 사용합니다.=
변수 선언할 때 변수에 값을 부여한다. 값을 부여할 때, 값은 문자열, 숫자, 표현식, 함수 호출, 또는 함수 호출이 될 수 있다.if
、 for
、while
또는switch
이 구조 키워드, 문장 사용법은 후속 강의에서 자세히 설명할 것이다. 사실 우리는 이전 강의에서 간단한 if 문장 부여법을 배웠고, 다시 살펴볼 수 있다.
여기서 우리는 input 함수를 설명하는 데 초점을 맞추고 있습니다. 이 함수는 우리가 기획을 할 때 자주 사용하는 함수입니다. 또한 기획을 할 때 매우 중요한 함수입니다.
입력 함수:
input函数,参数defval、title、tooltip、inline、group
FMZ의 input 함수는 Trading View의 함수와 약간 다르지만, 이 함수는 전략 변수의 부여 입력으로 사용된다. 아래의 예시를 통해 FMZ의 input 함수의 사용에 대해 자세히 설명한다:
param1 = input(10, title="参数1名称", tooltip="参数1的描述信息", group="分组名称A")
param2 = input("close", title="参数2名称", tooltip="参数2的描述信息", group="分组名称A")
param3 = input(color.red, title="参数3名称", tooltip="参数3的描述信息", group="分组名称B")
param4 = input(close, title="参数4名称", tooltip="参数4的描述信息", group="分组名称B")
param5 = input(true, title="参数5名称", tooltip="参数5的描述信息", group="分组名称C")
ma = ta.ema(param4, param1)
plot(ma, title=param2, color=param3, overlay=param5)
변수를 선언할 때 변수에 값을 부여하는 것은 input 함수이며, FMZ에서 input 함수는 FMZ 정책 인터페이스에서 정책 파라미터를 설정하기 위한 컨트롤을 자동으로 그려낸다. FMZ에서 지원되는 컨트롤은 현재 숫자 입력 상자, 텍스트 입력 상자, 드래그 상자, B값 선택이 있다. 그리고 정책 파라미터 그룹을 설정하고, 파라미터를 설정하는提示文本信息 등의 기능을 설정할 수 있다.
우리는 input 함수의 몇 가지 주요 변수를 소개합니다.
개별 변수 선언, 부여 이외에, 파인 언어에는 변수의 집합을 선언하고 가치를 부여하는 글쓰기도 있다:
[变量A,变量B,变量C] = 函数 或者 ```if```、 ```for```、```while```或```switch```等结构
가장 흔한 것은ta.macd
함수가 MACD 지수를 계산할 때, MACD 지수는 다선 지표이기 때문에 세 세의 데이터를 계산한다. 그래서 다음과 같이 쓸 수 있다:
[dif,dea,column] = ta.macd(close, 12, 26, 9)
plot(dif, title="dif")
plot(dea, title="dea")
plot(column, title="column", style=plot.style_histogram)
이 코드를 사용하면 MACD 도표를 그리는 것이 매우 쉽습니다. 내장 함수가 여러 변수를 반환할 수 있을 뿐만 아니라, 작성된 사용자 정의 함수 역시 여러 데이터를 반환할 수 있습니다.
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)
if와 같은 구조를 여러 변수에 부여하는 글쓰기 방식도 위와 같은 사용자 정의 함수 방식과 비슷하며, 관심 있는 사람도 시도해 볼 수 있다.
[ema10, ema20] = if true
fast = ta.ema(close, 10)
slow = ta.ema(close, 20)
[fast, slow]
plot(ema10, title="ema10", color=color.fuchsia, overlay=true)
plot(ema20, title="ema20", color=color.aqua, overlay=true)
일부 함수는 조건부 분할의 로컬 코드 블록에 쓰일 수 없다. 주로 다음과 같은 함수들이 있다:
barcolor(), fill(), hline(), indicator(), plot(), plotcandle(), plotchar(), plotshape()
트레이딩 뷰에서는 오류 보고를 작성한다. FMZ에서는 제한이 덜 엄격하지만, 트레이딩 뷰의 규범을 따르는 것도 권장한다. 예를 들어 FMZ에서는 오류 보고가 없지만, 이렇게 쓰는 것은 권장하지 않는다.
strategy("test", overlay=true)
if close > open
plot(close, title="close")
else
plot(open, title="open")
예를 들자면:
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 (false) 이므로, if의 로컬 코드 블록은 실행되지 않는다. 이 때에도 else의 분할이 없기 때문에, if 문장은 na를 반환한다.
스위치 문장은 또한 일부 조건에 따라 다른 경로를 수행하도록 설계하는 분기 구조의 문장입니다. 스위치 문장은 일반적으로 다음과 같은 몇 가지 핵심 지식 포인트를 가지고 있습니다.
1, switch 문장은 if 문장과 마찬가지로 값을 반환할 수 있습니다. 2. 다른 언어의 스위치 문장과 달리, 스위치 구조를 실행할 때, 코드의 로컬 블록만을 실행하므로, 브레이크 선언은 불필요하다 (즉, 브레이크와 같은 키워드를 쓸 필요가 없다). 3 , 스위치의 각 분할은 로컬 코드 블록을 쓸 수 있으며, 이 로컬 코드 블록의 마지막 줄은 반환 값 ((그것은 값의 모음이 될 수 있습니다) ᅲ). 어떤 분할도 실행되지 않은 로컬 코드 블록을 반환하면 na。 4. 스위치 구조의 표현식 판단 위치, 문자열, 변수, 표현식 또는 함수 호출을 쓸 수 있다. 5. switch는 구조에 다른 조건이 없는 경우에 사용되는 기본값으로 반환되는 값을 지정할 수 있습니다.
스위치는 두 가지 형태로 나뉘어져 있는데, 예를 하나씩 살펴보면 어떻게 쓰이는지 알 수 있습니다.
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 함수를 배웠고, 여기서 우리는 input와 비슷한 두 함수를 배우게 됩니다.input.string
、input.int
기능.
input.string
이 문자는 문자열을 반환합니다.input.int
함수는 integer 값을 반환합니다. 이 예제에서는 실제로 새로운 함수를 추가합니다.options
이 문장에서는,options
변수는 선택값으로 구성된 배열로 전달될 수 있다. 예를 들어options=["EMA", "SMA", "RMA", "WMA"]
그리고options=[5, 10, 20]
(주: 하나는 문자열 타입이고, 하나는 숫자 타입이다) ᄒ 이렇게 하면 정책 인터페이스의 컨트롤은 특정 숫자를 입력할 필요가 없게 되고, 컨트롤은 아래로 이동하여 options 파라미트에서 제공되는 이러한 옵션을 선택한다.
변수func의 값은 스위치의 표현으로 쓰이는 문자열이며, 변수func은 스위치의 표현으로 쓰이는 변수, 함수 호출, 표현으로 쓰이는 변수, 함수 호출, 표현으로 쓰이는 변수이며, 스위치의 어떤 분파를 실행하는지 결정한다. 변수func이 스위치의 어떤 분파의 표현과 일치하지 않으면, 기본 분파 코드 블록을 실행한다.runtime.error("error")
함수는 정책이 예외를 던지는 것을 멈추게 한다.
위 테스트 코드에서 runtime.error 이후의 스위치의 기본 분기 코드 블록의 마지막 라인에는 runtime.error를 추가하지 않았습니다.[na, na] 같은 코드가 반환값을 호환하기 위해서는 트레이딩 뷰에서 이 문제를 고려해야 하는데, 타입이 일치하지 않으면 오류가 발생한다. 그러나 FMZ에서 엄격하게 요구되는 타입이 없기 때문에 이러한 호환 코드들을 생략할 수 있다. 따라서 FMZ에서 if, switch 분할 반환값의 타입 호환 문제를 고려할 필요가 없다.
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)
테스트 코드 예제에서 볼 수 있듯이, 스위치는 실행의 분기 조건에 대해 실제 로컬 코드 블록과 일치한다. 일반적으로 스위치 문장 뒤에 있는 분기 조건은 상호 거부적이어야 한다. 즉, 예제에서 up와 down는 동시에 참이 될 수 없다. 스위치는 분기 중 하나의 로컬 코드 블록만 실행할 수 있기 때문에, 관심 있는 사람은 다음과 같은 문장을 코드에서 쓸 수 있다:up = close > open // up = close < open
참고문헌의 내용을 바꾸고, 다시 측정하여 관찰한 결과를 보면, switch 지파가 첫 번째 지파만 실행할 수 있다는 것을 알게 된다. 또한 주의할 필요가 있다. switch 지파에 함수 호출을 작성하지 않도록 노력한다. 함수는 각 BAR에 호출될 수 없으므로 데이터 계산에 문제가 발생할 수 있다.switch
예를 들어, 실행 분자는 결정되어 있고, 전략 실행에 따라 변경되지 않습니다.)
返回值 = for 计数 = 起始计数 to 最终计数 by 步长
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
for 문장을 사용하는 것은 매우 간단합니다. for 루프는 최종적으로 하나의 값을 반환할 수 있습니다.[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 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
返回值 = for [索引变量, 索引变量对应的数组元素] in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
두 가지 형태의 주요 차이점은 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 순환 응용
파이어 언어에서 제공되는 내장 함수를 사용하여 일부 순환 논리 계산을 할 수 있을 때, 순환 구조를 사용하여 직접 작성할 수 있고, 내장 함수를 사용하여 처리할 수도 있다. 우리는 두 가지 예를 들겠습니다.
1 평균을 계산합니다.
순환 구조를 사용할 때:
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)
배열의 모든 요소의 합을 계산하기 위해 루프를 사용할 수 있고, 내장 함수를 사용할 수도 있다.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)
계산된 데이터를 볼 수 있으며, plot 도면을 사용하여 도표에 완전히 일치한다.
그래서, 만약 여러분이 이런 일을 할 수 있다면, 왜 이런 일을 할 수 있는 기능이 있다면, 왜 이런 일을 할 수 있는 기능이 있다면, 왜 이런 일을 할 수 있는 기능이 있다면, 왜 이런 일을 할 수 있는 기능이 있다면, 왜 이런 일을 할 수 있는 기능이 있다면, 왜 이런 일을 할 수 있는 기능이 있다면, 왜 이런 일을 할 수 있는 기능이 있다면, 왜 이런 일을 할 수 있는 기능이 있다면, 1 , 배열의 몇 가지 연산에 대해, 계산 . 2., 과거로 돌아가서, 예를 들어, 현재 BAR의 높이에 비해 얼마나 많은 과거의 높이를 찾아내십시오. 현재 BAR의 높이는 스크립트에서 실행되는 BAR에서만 알려져 있기 때문에, 과거 BAR에 대한 시간적 귀환과 분석을 위해 순환이 필요합니다. 3, 파인 언어의 내장 함수가 과거 BAR에 대한 계산을 완료할 수 없는 경우.
while
문장은 반복 부분의 코드를 실행하도록 하고, while 구조의 판단 조건이 false (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)
보시다시피, while 순환은 매우 간단하며, 내장된 함수로 대체할 수 없는 계산 논리를 설계할 수 있다. 예를 들어, 계열 곱셈을 계산한다:
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의 파인 언어는 매우 엄격하지 않은 타입을 요구하지 않으며, 심지어 하나의 배열에서 문자열과 수치를 동시에 저장할 수 있다.[]
사용해야 합니다.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
선언하는 배열이나 변수만 선언하는 배열이 부여될 수 있다. 예를 들어:
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
함수 . 파인 언어에는 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")
a 배열의 변화는 계속적으로 확인되고, 재배치되지 않는다. b 배열은 각 BAR에서 초기화된다.barstate.islast
그래서 실시간으로 인쇄할 때는 여전히 하나의 요소만 있고, 값은 0 이다.
array.get를 사용하여 배열에서 인덱스 위치를 지정하는 요소를 얻습니다. array.set를 사용하여 배열에서 인덱스 위치를 지정하는 요소를 수정합니다.
array.get의 첫 번째 변수는 처리해야 할 배열이고, 두 번째 변수는 지정된 인덱스이다. array.set의 첫 번째 변수는 처리해야 할 배열, 두 번째 변수는 지정된 인덱스, 세 번째 변수는 쓰기 원하는 요소이다.
다음 간단한 예제를 통해 설명해 보겠습니다.
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 회 회 회 회 회 회 중high의 최대값의 거리를 계산함으로써 색상 등급을 계산한다. 가장 최근의 100 회 회 회 중high의 최대값에 가까운 거리에, 등급이 높을수록, 대응하는 색상 값이 더 깊어진다 (transparency는 낮다).
어떻게 배열을 가로질러 우리가 전에 배운 for/for in/while 문장을 사용할 수 있을까요?
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")
이 세 가지 탐색 방식은 동일한 결과를 가져옵니다.
배열은 스크립트의 범주에서 선언할 수 있고, 함수 또는 if 지부의 지역 범주에서도 선언할 수 있다.
배열의 요소를 사용하는 방법은 다음과 같습니다. 우리는 다음 예제를 통해 차트에 두 개의 줄이 그려져있는 것을 볼 수 있습니다. 각 그룹에는 두 개의 줄이 있으며 각 그룹의 두 개의 줄의 값은 완전히 동일합니다.
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")
추가, 삭제 응용 프로그램: 배열을 큐로
배열과 배열의 덧셈과 셈을 이용해서 ‘배열’이라는 데이터 구조를 만들 수 있다. 배열은 tick값의 이동 평균을 계산하는데 사용될 수 있다. 어떤 학우들은 ‘왜 배열 구조를 만들까? 우리는 배열을 이용해서 평균을 계산할 수 있지 않은가? ‘라고 물었을지도 모른다.
쿼이는 프로그래밍 분야에서 자주 사용되는 구조로, 쿼이의 특징은 다음과 같다.
큐에 들어간 요소가 큐에서 나온 것
이렇게 하면 큐에 존재하는 데이터는 최신 데이터이며, 큐의 길이가 무한히 팽창하지 않도록 할 수 있습니다.
다음 예제에서 우리는 틱 레벨의 이동 평균값을 계산하기 위해 틱 레벨의 이동 평균값을 기록하는 큐어 구조를 사용하고 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")
그리고 우리는 a의 행렬을 선언할 때,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 평균선으로 계산된 함수입니다.
또한, 두 개의 변수에 대한 사용자 정의 함수의 예제를 반환할 수 있습니다:
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)
하나의 함수는 빠른 선, 느린 선, 두 개의 EMA 평균 선 지표를 계산할 수 있다.
이 함수들은 매우 편리하게FMZ PINE 스크립트 문서검색
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
함수 호출 시의 변수 설정을 제어할 수 있습니다.“파인 언어 거래 클래스 라이브러리 모드 버전 변수”설정 제어, 파인 언어 거래 클래스 라이브러리 모델링 파라미터 제어에 대한 거래 세부 사항은 링크된 문서에서 확인할 수 있다.
이 강연의 핵심은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
변수가 3일 때 우리는 같은 방향으로 거래하는 것을 최대 3번 설정합니다. 그래서 예제에서는 4번strategy.entry
다음 명령어에서 한 번 실행되지 않았습니다.default_qty_value
변수는 0.1이므로 ID는 long1입니다.strategy.entry
다음 순서 동작의 다음 순서는 0.1 으로 설정되어 있습니다.strategy.entry
함수 호출을 할 때 우리가 지정한direction
평균strategy.long
그래서 반검사시에는 주문을 모두 지불해야 합니다.
코드에 주의하십시오strategy.entry("long3", ...
다음 명령어는 동일한 ID: long3에 대해 두 번 호출됩니다.strategy.entry
다음 명령은 실행되지 않았고, 두 번째 호출을 합니다.strategy.entry
함수는 이 ID의 주문을 수정하기 위해 ((반검사 테스트 때 표시된 데이터는 이 제한 주문 아래의 주문량이 0.3을 위해 수정되었다는 것을 볼 수 있다) ᅲ). 다른 경우, 예를 들어, 처음 ID는 long3의 주문을 거래했을 때, 이 거래된 IDlong3에 따라 계속 사용한다strategy.entry
함수가 주문하면, 주문의 포지션은 IDlong3에 누적됩니다.
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번 연속으로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long2로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long1로 long2로 long1로 long2로 long1로 long1로 long1로 strategy.close
함수의 서로 다른 변수를 평소 위치로 설정할 때 재측정되는 서로 다른 결과가 발견된다.strategy.close
이 함수는 평준화 하향 주문 가격을 지정할 수 있는 변수가 없으며, 이 함수는 주로 즉시 현재 시장 가격으로 평준화 하기 위해 사용됩니다.
3、strategy.close_all
strategy.close_all
함수는 현재 보유한 모든 포지션을 평면화하기 위해 사용되며, 파인 언어 스크립트 포지션은 오직 한 방향으로만 할 수 있기 때문에, 즉 현재 보유한 방향과 반대되는 신호가 발생하면 현재 보유한 포지션을 평면화하고 신호에 따라 포지션을 열 수 있습니다.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
true) 이므로, when 변수 설정 조건이 충족될 때만 ID를 long로 실행합니다.strategy.entry
입수 함수: 포지션을 보유한 후strategy.position_size
0보다 크면, ID가 short의 입문 함수를 실행할 수 있습니다. 현재 다수 상위 포지션을 보유하고 있기 때문에, 이 시점에 나타나는 이 상쇄 신호는 다수 상위 포지션을 평정한 후 다시 역으로 공백하게 만듭니다. 다음으로 우리는 if 조건에서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
: Stop Loss 목표, 가격으로 지정하라.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
long1을 의도적으로 설정했습니다.limit
변수, 상장값이 1이므로 거래가 불가능하다. 그리고 테스트 조건 출구 함수strategy.exit
점수 정지, 가격 정지, 평준화 된 고정 수량 포지션 위치, 비율 평준화 된 포지션이 사용됩니다. 확장 예제에서는 정지 만이 표시됩니다. 상쇄 작업도 동일합니다.strategy.exit
이 함수는 더 복잡한 추적 스톱 패러미터를 가지고 있습니다.trail_price
、trail_points
、trail_offset
이 예제에서 사용법을 학습하는 것도 시험할 수 있습니다.
5、strategy.cancel
strategy.cancel
모든 예약 목록의 명령을 취소 / 중지하는 함수.strategy.order
, strategy.entry
, strategy.exit
출입 ID를 생성할 수 있다. 이 함수의 주요 변수는:id
、when
。
매개변수:
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
함수와 비슷하