[TOC]
Pine의 코드는 다음과 같은 일반적인 구조를 따르고 있습니다.
<version>
<declaration_statement>
<code>
FMZ의 파인 언어 지원 해설 기호: 단선 해설//
이 글의 주제는/* */
예를 들어, 다음 예제에서 해설 글씨를 사용하십시오:
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // 计算MACD指标
/*
plot函数在图表上画出指标线
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')
다음과 같은 형태의 컴파일러 명령은 컴파일러에게 이 스크립트가 어떤 버전의 파이인으로 작성되었는지 알려줍니다:
//@version=5
기본 버전은 v5이고, 코드에서 제외할 수 있습니다.//@version=5
。
indicator()
strategy()
선언 문장은 스크립트의 유형을 결정하고, 이는 또한 어떤 내용이 허용되고, 어떻게 사용되고 실행되는지 결정한다. 스크립트의 핵심 속성을 설정한다. 예를 들어, 그것의 이름, 그것이 차트에 추가될 때 그것이 어디에 나타날지, 그것이 표시하는 수치의 정확성과 형식, 그리고 실행 시 행동하는 특정 값을 관리한다. 예를 들어, 그것은 차트에 표시되는 최대 그림 객체의 수를 관리한다. 전략의 경우, 속성은 초기 자본, 수수료, 점, 등과 같은 재검토를 제어하는 매개 변수를 포함한다. FMZ의 Pine는 전략 코드에 포함되어야 할 것을 요구하지 않는다.indicator()
또는strategy()
이 글은
스크립트에서 코멘트나 컴파일러 명령어가 아닌 행은 문장이며, 그것은 스크립트의 알고리즘을 구현한다. 문장은 그 중 하나가 될 수 있다.
if
,for
,while
또는switch
같은 구조문장은 여러 가지 방법으로 분류될 수 있습니다.
空格
또는制表符
(tab 키) 시작. 그들의 첫 번째 문자는 또한 해당 줄의 첫 번째 문자가어야 한다. 해당 줄의 첫 번째 위치에서 시작하는 문자는 정의에 따라 스크립트의 범주의 일부가 된다.local block
▲ 로컬블록은 하나의 표기장 또는 네 개의 공간으로 축소되어야 한다 (그렇지 않으면 전줄의 연속적인 내용으로 결정되는 전줄의 연속 코드로 풀려난다) 그리고 각 로컬블록은 다른 로컬 스펙트럼을 정의한다.예를 들어, 세 개의 로그램을 포함하고, 하나는 사용자 정의 함수 선언에서, 두 개는 변수 선언에서 if 구조를 사용하며, 다음과 같은 코드를 사용합니다:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
긴 줄은 여러 줄로 나눌 수 있고, 또는 "폐쇄"될 수 있다. 포괄된 줄은 4의 배수가 아닌 한, 모든 수의 공간으로 축소되어야 한다.
a = open + high + low + close
이렇게 포장할 수 있습니다. (선별로 축소된 공간의 수는 4의 배가 아닙니다.)
a = open +
high +
low +
close
긴 플롯 (plot) 호출을 묶어 놓을 수 있습니다.
close1 = request.security(syminfo.tickerid, "D", close) // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close) // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100), // 一行长的plot()调用可以被包装
color = color.new(color.purple, 40),
style = plot.style_area,
trackprice = true)
사용자 정의 함수 선언의 문장도 포괄될 수 있다. 그러나, 로그램은 문법적으로 축소로 시작되어야 하기 때문에 (4개의 공간 또는 1개의 표기호) 다음 줄로 분리할 때, 문장의 연속 부분은 하나 이상의 축소로 시작되어야 한다 (4개의 공간의 배수와 같지 않다). 예를 들어:
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
시간계열은 데이터 타입이나 형식이 아니라, 시간계열은 PINE 언어의 기본 구조의 개념이다. 시간에 연속적으로 변화하는 값을 저장하기 위해 사용되며, 각각의 값은 시간점에 해당한다. 시간계열의 개념의 구조는 시간이 지남에 따라 변화하는 일련의 데이터를 처리하고 기록하는 데 적합하다.
기본 변수open
예를 들어,open
내장 변수는 K줄 BAR의 개시 가격을 기록합니다.open
5분 K선 주기의 데이터입니다.open
변수에 기록된 것은 K 라인 BAR (?? 기둥) 의 열기 가격입니다. 당신의 정책 프로그램이 실행되는 동안 코드에서 참조됩니다.open
즉, 현재 K 라인 BAR의 열기값을 참조한다. 시간 계열의 이전 값 (역시 값) 을 참조하기 위해 우리는 사용한다.[]
역사 연산자는 어떤 K줄 BAR에서 실행될 때open[1]
즉, 현재 K 라인 BAR의 이전 K 라인 BAR의 개시 가격을 참조하는 것이다.
하지만시간 순서쉽게 "배열" 같은 데이터 구조를 떠올릴 수 있지만, PINE 언어에는 배열 유형도 있습니다. 그러나 그들은 시간 순서와 완전히 다른 개념입니다.
PINE 언어에서 이렇게 설계된 시간 계열은 전략 코드에서 매우 쉽게 종결 가격의 누적 값을 계산할 수 있으며, for와 같은 루킹 구조를 사용하지 않고, 단지 PINE 언어를 사용하는 내장 함수를 사용하여 계산할 수 있습니다.ta.cum(close)
또 다른 예로, 우리는 마지막 14개의 K줄 BAR (즉, 코드가 실행될 때 현재 시점까지 가장 가까운 14개의 K줄 BAR) 의 최대값과 최소값의 평균값을 계산해야 합니다.ta.sma(high - low, 14)
시간계열에 함수를 호출하는 결과도 시간계열에 흔적을 남깁니다.[]
역사 연산자는 이전 값을 참조한다. 예를 들어, 현재 K 라인 BAR의 종료 가격이 마지막 10개의 K 라인 BAR 중 가장 높은 가격의 최대값을 초과하는지 테스트할 때 (현재의 K 라인 BAR를 제외한다) 우리는 이렇게 쓸 수 있다.breach = close > ta.highest(close, 10)[1]
이 글은 다른 글과도 같습니다.breach = close > ta.highest(close[1], 10)
그래서ta.highest(close, 10)[1]
그리고ta.highest(close[1], 10)
이 글은 다른 글과 비슷합니다.
다음 코드를 사용하여 확인할 수 있습니다:
strategy("test pine", "test", true)
a = ta.highest(close, 10)[1]
b = ta.highest(close[1], 10)
plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green)
위의 테스트 코드는 a와 b가 각 BAR에 해당 시퀀스의 값을 출력합니다. a와 b가 항상 같다는 것을 볼 수 있습니다. 따라서 두 표현 방식은 동등합니다.
PINE 정책의 내장 템플릿 "Pine 언어 거래 클래스 라이브러리"의 매개 변수 설정 설명.
定价货币精度
매개 변수와 이 매개 변수는 주문 시 미끄러운 가격을 결정한다. 예를 들어, 가격화 통화 정확도는 2로 설정된다. 즉, 소수점 두 번째까지 정확하고 0.01까지 정확하다. 그러면 미끄러운 가격 점수는 각 점마다 0.01의 가격 단위를 나타낸다. 이 경우 미끄러운 가격 점수는 5로 설정되어 있으며, 주문 시 미끄러운 가격은 0.05이다.javascript
전략에서 호출SetMaxBarLen
이 함수들은 같은 역할을 합니다.strategy(title = "open long example", pyramiding = 3) // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.01) // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10)) // 条件触发,执行下单,市价开多仓
strategy.entry("long3", strategy.long, 0.03, limit = 30000) // 指定(较低的)价格,计划下买单订单,等待成交开仓,限价开仓
strategy(title = "close long example", pyramiding = 2) // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.1) // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.1) // 市价开多仓,指定分组标签为long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%") // 平仓,指定平掉分组标签为long1的仓位的50%持仓
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%") // 平仓,指定平掉分组标签为long2的仓位的80%持仓
PINE 언어의 보유 메커니즘은 단방향 보유와 유사하다. 예를 들어, 다중 지위를 보유할 때 ("다중 지위 보유") 판매 운영, 계획 목록 등이 있는 경우 ("거래 방향에 비해 역방향) 의 주문이 발생하면, 먼저 다중 지위를 평평하게 하고 ("모든 다중 지점을 평평하게 하고") 그 다음에는 평평화 이전 보유 방향에 비해 역방향의 주문을 실행한다.
하위 명령어를 사용하면 하위 명령어를 사용할 때, 어떤 가격을 지정하지 않으면 시장 가격 목록으로 설정됩니다. 하위 목록은 시장 가격 이외에도 계획 목록으로 주문할 수 있으며 계획 목록은 즉시 하위 목록을 작동하지 않습니다. 계획 목록은 트리거가 없을 때 존재하는 프로그램의 계획 위탁 큐에 포함될 수 있습니다.실제 디스크 / 재검토시간 상태 정보 (즉, 전략 실행 상태 탭) 의 "계획 주문" 테이블 분화에서 볼 수 있다. 시장 실시간 가격 조건이 충족될 때 시스템이 실제로 이 계획 주문을 촉발할 때이다. 따라서 이 주문의 거래 가격에 약간의 오차가 있는 것이 정상적인 상황이다.strategy.entry
이 함수들을 정렬할 때limit
、stop
파라미터.
var isTrade = false
if not barstate.ishistory and not isTrade
isTrade := true
strategy.entry("test 1", strategy.long, 0.1, stop=close*1.3, comment="test 1 order") // stop
strategy.entry("test 2", strategy.long, 0.2, limit=close*0.7, comment="test 2 order") // limit
strategy.entry("test 3", strategy.short, 0.3, stop=close*0.6, limit=close*1.4, comment="test 3 order") // stop-limit
제한 주문
주문의 제한 가격을 설정합니다.direction
변수는strategy.long
), 시장의 현재 가격이 그 가격보다 낮을 때만 주문이 촉발됩니다.
주문이 판매 주문이 될 때 (예:direction
변수는strategy.short
이 경우, 시장의 현재 가격이 그 가격보다 높을 때만 주문이 발생한다.
정지 주문
주문의 중지 손실 가격을 설정하여 주문을 지불할 때, 시장의 현재 가격이 그 가격보다 높을 때만 주문을 유발합니다. 주문이 판매 주문일 때, 시장의 현재 가격이 그 가격보다 낮을 때만 주문이 촉발됩니다.
스톱-리미트 주문
동시에 설정할 수 있습니다.limit
、stop
파라미터, 주문은 우선 조건에 맞는 가격에 촉발됩니다.
//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// 简单的均线交叉策略
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
// 如果均线交叉条件满足,则买入或卖出
if (longCondition)
strategy.entry("Long", strategy.long)
if (shortCondition)
strategy.entry("Short", strategy.short)
지정default_qty_type=strategy.percent_of_equity
다음으로 설정합니다.default_qty_value
비율 수 ((0~100), 1 또는 1%); 계좌에 있는 화폐 수에 따라 단위를 계산한다. 예를 들어: 현재 계좌에 10000 USDT가 있고, 1%를 설정하면 100 USDT 규모의 단위를 계산한다.
var는 배분 및 일회성 초기화 변수에 사용되는 키워드이다. 일반적으로, 키워드 var를 포함하지 않는 변수 부여 문법은 데이터를 업데이트할 때마다 변수의 값을 덮어 놓을 수 있습니다. 반대로, 키워드 var를 사용하여 변수를 할당할 때, 데이터가 업데이트 되더라도 상태가 유지될 수 있으며, if-expressions의 조건이 충족될 때만 변경할 수 있습니다.
var variable_name = expression
설명:
variable_name
- 파인 스크립트에서 허용되는 사용자 변수의 모든 이름 (대문자와 소문자를 포함할 수 있으며, 숫자와 하부선을 포함할 수 있지만 숫자로 시작될 수 없습니다)expression
- 어떤 수학적 표현식도 일반 변수를 정의하는 것과 같습니다.예를 들어
// Var keyword example
var a = close
var b = 0.0
var c = 0.0
var green_bars_count = 0
if close > open
var x = close
b := x
green_bars_count := green_bars_count + 1
if green_bars_count >= 10
var y = close
c := y
plot(a, title = "a")
plot(b, title = "b")
plot(c, title = "c")
변수
FMZ에서는 실시간 가격 모델, 폐쇄 가격 모델,var
、varip
우리는 다음과 같은 코드를 사용하여 변수를 테스트합니다.
strategy("test pine", "test 1", true)
// 测试 var varip
var i = 0
varip ii = 0
// 将策略逻辑每轮改变的i、ii打印在图上
plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)
// 每轮逻辑执行都给i、ii递增1
if true
i := i + 1
ii := ii + 1
실시간 가격 모델
위의 테스트 코드는 실행 시 두 단계로 나뉘어 있습니다: 1, 역사 K 라인 단계; 2, 실시간 K 라인 단계.var
、varip
선언된 변수 i、ii는 정책 코드의 각 라운드 실행에 따라 증가 작업을 수행합니다.if true
따라서 확실히 해당 실행 조건 코드 블록) 를 참조하십시오. 그래서 다시 검색 결과 K 라인 BAR에 표시되는 숫자가 각각 1으로 증가하는 것을 볼 수 있습니다. 역사 K 라인 단계가 끝나면 실시간 K 라인 단계가 시작됩니다.var
、varip
선언된 변수는 다르게 변하기 시작합니다. 실시간 가격 모델이기 때문에, K줄 BAR 내에서 가격 변화마다 전략 코드가 반복적으로 실행됩니다.i := i + 1
그리고ii := ii + 1
i는 매번 수정된다. 하지만 i는 매번 수정되기도 하지만, 다음 라운드 실행 시 정책 논리가 이전 값으로 돌아갑니다. 현재 K 라인 BAR가 끝나기 전까지는 업데이트가 이루어지지 않습니다. 그래서 우리는 변수 i가 여전히 각 바에 BAR1을 추가하는 것을 볼 수 있습니다. 그러나 변수 ii는 각 BAR에 여러 번 추가됩니다.
매각 가격 모델
클로시 프라이스 모델은 K 라인 BAR가 끝나면 한 번씩 전략 논리를 실행하기 때문이다. 따라서 클로시 프라이스 모델에서는 역사 K 라인 단계와 실시간 K 라인 단계가var
、varip
선언된 변수는 위의 예제에서 증가하는 것과 완전히 일치합니다. 모든 K줄에 BAR가 1로 증가합니다.
varip (var intrabar persist) 은 분배 및 한 번에 초기화되는 변수에 사용되는 키워드이다. var 키워드와 유사하지만 varip 선언을 사용하는 변수는 실시간 K줄 업데이트 사이에 값을 유지한다.
varip variable_name = expression
설명:
variable_name
- Pine 스크립트에서 허용되는 사용자 변수의 모든 이름 (대문자와 소문자를 포함할 수 있으며, 숫자와 하부선을 포함할 수 있지만 숫자로 시작될 수 없습니다.)expression
- 어떤 수학적 표현식도 일반 변수를 정의하는 것과 같다. 첫 번째 K줄에서, 표현식은 한 번만 계산하고 변수에 한 번만 할당한다.예를 들어
// varip
varip int v = -1
v := v + 1
plot(v)
var를 사용하면 그래프가 bar_index의 값을 반환한다. varip를 사용하면 역사 K줄에서 동일한 동작이 발생하지만 실시간 K줄에서는 그래프가 하나의 값을 반환하고, 이 값은 각 틱에 대해 하나씩 증가한다.
참고자료float,int,bool,string과 같은 간단한 타입과 그 타입의 배열과 함께만 사용 가능합니다.
부르 타입의 변수의 값을 표시하거나,비교또는논리연산자가 계산할 수 있는 값이다.
참고자료참고로비교연산자와논리연산자의 설명.
안녕하세요
bool
부르형 변수의 값과 비교 동작, 논리 동작의 결과를 나타냅니다.
참고자료참고로비교연산자와논리연산자의 설명.
안녕하세요
bool
if 문장은 표현 조건이 충족될 때 실행되어야 하는 문장 블록을 정의한다. 4판 파이인 스크립트 언어는 당신이
보편적인 암호는 다음과 같습니다:
var_declarationX = if condition
var_decl_then0
var_decl_then1
...
var_decl_thenN
return_expression_then
else if [optional block]
var_decl_else0
var_decl_else1
...
var_decl_elseN
return_expression_else
else
var_decl_else0
var_decl_else1
...
var_decl_elseN
return_expression_else
참고자료
var_declarationX
- 이 변수는 if 문장의 값을 얻습니다condition
- 조건이 true라면 문장 블록을 사용합니다then
이 글의 논리는var_decl_then0
,var_decl_then1
etc) ⇒ false 조건이 있는 경우 문장 블록을 사용합니다.else if
또는else
이 글의 논리는var_decl_else0
,var_decl_else1
그리고 그 다음에는return_expression_then , return_expression_else
- 모듈의 마지막 표현식 또는 블록else의 표현식이 문장의 최종 값을 반환한다. 변수가 마지막에 선언되면 그 값은 결과 값이 된다.
if 문장의 반환 값의 종류는return_expression_then
그리고return_expression_else
타입. 트레이딩뷰에서 실행될 때, 그들의 타입이 일치해야 합니다:else 블록에 문자열 값을 가지고 있을 때, then 문장 블록에서 정수를 반환하는 것은 불가능합니다.FMZ에서 실행될 때, 다음 예는 오류를 반환하지 않습니다. y값이 "open"으로 설정되면, 플롯 그래프가 그려지는 값은 n/a입니다.
예를 들어
// This code compiles
x = if close > open
close
else
open
// This code doesn’t compile by trading view
// y = if close > open
// close
// else
// "open"
plot(x)
빗나갈 수 있습니다.else
블록. 이 경우, 조건이 false라면 var_declarationX 변수에??empty 문값을 부여한다 (na、false 또는??):
예를 들어
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
여러??else if 블록을 사용하거나 전혀 사용할 수 있다. ▲
예를 들어
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
무시할 수 있습니다.if
문장의 결과값 ((
예를 들어
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
만약 문장은 서로 포함될 수 있습니다.
예를 들어
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
'for'
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- return_expression의 값으로 지정되는 선택 가능한 변수 선언.counter
- 회전 카운터 값의 변수를 저장하고 회전 반복마다 1 또는 step_num 값을 증가/ 감소시킨다.from_num
- 카운터의 시작값. to_num
- 카운터의 최종값. 카운터가 to_num보다 크거나 from_num > to_num의 경우 to_num보다 작을 때 루프를 중단한다. step_num
- 카운터의 증가/ 감소 값. 그것은 선택적이다. 기본 값은 +1 또는 -1입니다. 그것은 from_num 또는 to_num 중 가장 큰 값에 따라 다릅니다. 값이 사용되면 카운터는 또한 from_num 또는 to_num 중 가장 큰 값에 따라 증가/ 감소합니다. 따라서 step_num의 +/- 기호는 선택적입니다.statements | continue | break
- 임의의 수의 문장, 또는 4개의 공간 또는 한 개의 탭으로 축소된 return_expression
- 루프의 반환 값은 존재한다면 var_declaration의 변수에 할당된다. 만약 루프가 continue
- 회전에서만 사용할 수 있는 키워드. 그것은 회전의 다음 반복이 실행되도록 합니다.break
- '회복'의 키워드
예를 들어
// Here, we count the quantity of bars in a given 'lookback' length which closed above the current bar's close
qtyOfHigherCloses(lookback) =>
int result = 0
for i = 1 to lookback
if close[i] > close
result += 1
result
plot(qtyOfHigherCloses(14))
안녕하세요
for...in
while
for...in
구조는 배열의 각 요소에 대해 여러 개의 문장을 반복적으로 실행하도록 허용한다. 그것은 어떤 변수와 함께 사용될 수 있다:array_element
또는 두 개의 매개 변수와 함께 사용할 수 있습니다:[index, array_element]
^ 두 번째 형태는 루킹의 기능에 영향을 미치지 않는다 ^ 원소군의 첫 번째 변수에서 현재 반복된 인덱스를 추적한다 ^
[var_declaration =] for array_element in array_id
statements | continue | break
return_expression
[var_declaration =] for [index, array_element] in array_id
statements | continue | break
return_expression
var_declaration
- 선택 가능한 변수 선언이 루크에 부여됩니다return_expression
이 문서는index
- 현재 반복 인덱스의 선택 가능한 변수를 추적한다. ▲ 인덱스는 0에서 시작된다. ▲ 변수는 루킹체에서 변하지 않는다. ▲ 사용 시에는 하나의 포함도 포함되어야 한다.array_element
이 부분의 본문은array_element
- 루프에서 처리해야 할 각각의 연속적 배열 요소의 변수를 포함합니다. 이 변수는 루프체에서 변하지 않습니다.array_id
- 회전 반복 배열 ID.statements | continue | break
- 임의의 수의 문장, 또는 4개의 공간 또는 한 개의 탭으로 축소된 return_expression
- 회로의 반환값은var_declaration
속 변수, 만약 존재한다면. 만약 루그가 continue
- 회전에서만 사용할 수 있는 키워드. 그것은 회전의 다음 반복이 실행되도록 합니다.break
- '회복'의 키워드
루프 내에서 배열의 요소 또는 크기를 변경할 수 있습니다.
여기서는for...in
각 K줄에 얼마나 많은 K줄의 OHLC가
예를 들어
// Here we determine on each bar how many of the bar's OHLC values are greater than the SMA of 'close' values
float[] ohlcValues = array.from(open, high, low, close)
qtyGreaterThan(value, array) =>
int result = 0
for currentElement in array
if currentElement > value
result += 1
result
plot(qtyGreaterThan(ta.sma(close, 20), ohlcValues))
여기 우리는 for...in의 두 개의 변수 형태를 사용해서isPos
그 값은true
그리고 그들은 우리의valuesArray
대수에서 대응값은 현재입니다:
예를 들어
// for...in
var valuesArray = array.from(4, -8, 11, 78, -16, 34, 7, 99, 0, 55)
var isPos = array.new_bool(10, false)
for [index, value] in valuesArray
if value > 0
array.set(isPos, index, true)
if barstate.islastconfirmedhistory
runtime.log(str.tostring(isPos))
안녕하세요
for
while
array.sum
array.min
array.max
while
문장은 로컬 코드 블록의 조건을 반복하도록 허용합니다.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
설명:variable_declaration
- 선택 가능한 변수 선언.return expression
이 변수에 초기화 값을 부여할 수 있습니다.boolean_expression
- true가 되면 실행합니다while
문장의 로컬 블록. false가 되면,while
문장 후에 스크립트를 실행합니다.continue
- continue
키워드는 다음 반복으로 순환 브랜치를 유도합니다.break
- break
키워드는 루프를 종료합니다. 스크립트의 실행은while
이 문장들은 문장을 마치고 다시 시작합니다.return_expression
- 제공while
문장이 반환하는 값의 선택 라인.
예를 들어
// This is a simple example of calculating a factorial using a while loop.
int i_n = input.int(10, "Factorial Size", minval=0)
int counter = i_n
int factorial = 1
while counter > 0
factorial := factorial * counter
counter := counter - 1
plot(factorial)
참고자료초기while
행 뒤에 있는 로컬 코드 블록은 네 개의 공간 또는 한 표기 문자로 축소되어야 합니다.while
이 모든 것은while
다음의 풀 표현식은 결국 false가 되어야 합니다.break
。
스위치 오퍼레이터는 조건과 표현의 값에 따라 컨트롤을 몇 가지 문구 중 하나로 옮깁니다.
[variable_declaration = ] switch expression
value1 => local_block
value2 => local_block
...
=> default_local_block
[variable_declaration = ] switch
boolean_expression1 => local_block
boolean_expression2 => local_block
...
=> default_local_block
이 글은 이 글의 제목과 같은 글입니다.
예를 들어
// Switch using an expression
string i_maType = input.string("EMA", "MA type", options = ["EMA", "SMA", "RMA", "WMA"])
float ma = switch i_maType
"EMA" => ta.ema(close, 10)
"SMA" => ta.sma(close, 10)
"RMA" => ta.rma(close, 10)
// Default used when the three first cases do not match.
=> ta.wma(close, 10)
plot(ma)
이 글은 이쪽에서 읽었습니다.
예를 들어
strategy("Switch without an expression", overlay = true)
bool longCondition = ta.crossover( ta.sma(close, 14), ta.sma(close, 28))
bool shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
switch
longCondition => strategy.entry("Long ID", strategy.long)
shortCondition => strategy.entry("Short ID", strategy.short)
값을 반환합니다.실행되는 로컬 문장 블록의 마지막 표현식의 값.
참고자료실행할 수 있습니다.local_block
예를 들어default_local_block
그 중 하나는 ᅳdefault_local_block
그리고=>
표시가 함께 입력되고, 전 블록이 실행되지 않는 경우에만 실행됩니다.switch
문장의 결과는 변수에 할당되며 지정되지 않습니다.default_local_block
실행되지 않으면local_block
이 문장이 다시 돌아옵니다.na
ᅳ할 것입니다switch
이 문장의 결과가 변수에 할당되면, 모든local_block
예를 들어, 같은 타입의 값을 반환해야 합니다.
안녕하세요
if
?:
series는 데이터 시리즈 타입을 나타내는 키워드이다.series
키워드는 보통 불필요합니다.
변수를 부여하는 데 사용되지만 변수를 선언할 때만 사용된다.
좌측 변수에 부여하는 부여 연산자. 이전에 선언된 변수에 부여하기 위해 사용된다.
어떤 종류의 표현식에도 적용될 수 있습니다.
expr1 != expr2
값을 반환합니다.부르 값, 또는 부르 값의 일련.
모전수 ((진수 미적수) ᅳ 숫자의 표현식에 적용된다.ᅳ
expr1 % expr2
값을 반환합니다.정수 또는 유동점 값, 또는 일련의 값.
참고자료파인 스크립트에서, 정수들의 잔수를 계산할 때, 상자는 절단된다. 즉, 그것을 사각형으로 다섯으로 세어 최소의 절대값에 넣는다. 얻은 값은 배당과 동일한 기호를 가지고 있다.
예제: -1 % 9 = -1 - 9 * truncate ((-1/9) = -1 - 9 * truncate ((-0.111) = -1 - 9 * 0 = -1。
모그먼트 지표는 숫자 표현식에 쓰인다.
expr1 %= expr2
예를 들어
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
값을 반환합니다.정수 또는 유동점 값, 또는 일련의 값.
곱셈은 ≠ 곱셈을 뜻한다.
expr1 * expr2
값을 반환합니다.정수 또는 유동점 값, 또는 일련의 값.
곱셈 지표는 숫자 표현식에 사용됩니다.
expr1 *= expr2
예를 들어
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
값을 반환합니다.정수 또는 유동점 값, 또는 일련의 값.
추가 또는 단위 정수. 숫자 표현식 또는 문자열에 적용된다.
expr1 + expr2
+ expr
값을 반환합니다.문자열의 이진성+
expres1과 expres2의 합을 반환합니다
숫자는 정수 또는 부동 소수점 값, 또는 일련의 값을 반환합니다:
이분법
참고자료숫자를 가진 수학적 연산자와 변수 열을 사용할 수 있다. 숫자 열을 사용하는 경우, 연산자는 요소에 적용된다.
곱셈 지표는 숫자 표현식이나 문자열에 적용됩니다.
expr1 += expr2
예를 들어
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
값을 반환합니다.문자열의 경우, expres1과 expres2의 연쇄를 반환한다. 숫자의 경우, 정수 또는 부동 소수점 값을, 또는 일련의 값을 반환한다.
참고자료숫자를 가진 수학적 연산자와 변수 열을 사용할 수 있다. 숫자 열을 사용하는 경우, 연산자는 요소에 적용된다.
미분법 또는 단적 음수.
expr1 - expr2
- expr
값을 반환합니다.전체 또는 유동점 값, 또는 일련의 값을 반환합니다:
이분법 -
이 식은 'expr'의 부정식을 반환합니다.
참고자료숫자를 가진 수학적 연산자와 변수 열을 사용할 수 있다. 숫자 열을 사용하는 경우, 연산자는 요소에 적용된다.
소수법칙 지칭.
expr1 -= expr2
예를 들어
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
값을 반환합니다.정수 또는 유동점 값, 또는 일련의 값.
예외는 △ 숫자의 표현식에 적용됩니다.
expr1 / expr2
값을 반환합니다.정수 또는 유동점 값, 또는 일련의 값.
부수 지정.. 숫자 표현식에 적용된다.
expr1 /= expr2
예를 들어
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
값을 반환합니다.정수 또는 유동점 값, 또는 일련의 값.
더 작다. 숫자 표현식에 적용된다.
expr1 < expr2
값을 반환합니다.부르 값, 또는 부르 값의 일련.
더 작거나 같다. 숫자 표현식에 적용된다.
expr1 <= expr2
값을 반환합니다.부르 값, 또는 부르 값의 일련.
이 표현은 어떤 종류의 표현에도 적용될 수 있습니다.
expr1 == expr2
값을 반환합니다.부르 값, 또는 부르 값의 일련.
'=>' 연산자는 사용자 정의 함수 선언 및switch
이 문장은
함수 선언 문법은 다음과 같습니다.
<identifier>([<parameter_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
1개<local_block>
0 또는 그 이상의 파인 문장입니다.<function_result>
변수, 표현식, 또는 모음입니다.
예를 들어
// single-line function
f1(x, y) => x + y
// multi-line function
f2(x, y) =>
sum = x + y
sumChange = ta.change(sum, 10)
// Function automatically returns the last expression used in it
plot(f1(30, 8) + f2(1, 3))
참고자료사용자 설명서의 선언 함수 및 스크립트 라이브러리 페이지에서 사용자 정의 함수에 대한 자세한 정보를 얻을 수 있습니다.
더 큰. 숫자의 표현식에 적용됩니다.
expr1 > expr2
값을 반환합니다.부르 값, 또는 부르 값의 일련.
더 크거나 같다.
expr1 >= expr2
값을 반환합니다.부르 값, 또는 부르 값의 일련.
삼중 조건 연산자.
expr1 ? expr2 : expr3
예를 들어
// Draw circles at the bars where open crosses close
s2 = ta.cross(open, close) ? math.avg(open,close) : na
plot(s2, style=plot.style_circles, linewidth=2, color=color.red)
// Combination of ?: operators for 'switch'-like logic
c = timeframe.isintraday ? color.red : timeframe.isdaily ? color.green : timeframe.isweekly ? color.blue : color.gray
plot(hl2, color=c)
값을 반환합니다.만약 express1이 true로 평가되면 express2이 true로 평가된다. 그렇지 않으면 express3이다. 0과 NaN+, Infinity,-Infinity의 값은 false로 간주되며 다른 값은 true이다.
참고자료만약 당신이 그것을 필요로 하지 않는다면, na를
안녕하세요
na
일련 하위 표기 ▲Expr1 시리즈의 이전 값에 대한 액세스를 제공합니다 ▲Expr2는 지난 k줄의 숫자이며, 숫자가 되어야 합니다 ▲플로버는 하위로 오차됩니다 ▲
expr1[expr2]
예를 들어
// [] can be used to "save" variable value between bars
a = 0.0 // declare `a`
a := a[1] // immediately set current value to the same as previous. `na` in the beginning of history
if high == low // if some condition - change `a` value to another
a := low
plot(a)
값을 반환합니다.여러 가지 값들이 있습니다.
안녕하세요
math.floor
논리 AND는 부르 표현식에 적용된다.
expr1 and expr2
값을 반환합니다.부르 값, 또는 부르 값의 일련.
논리 OR↑는 풀 표현식에 적용된다.
expr1 or expr2
값을 반환합니다.부르 값, 또는 부르 값의 일련.
논리적인 역 (==NOT==) 은 풀 표현에 적용된다.
not expr1
값을 반환합니다.부르 값, 또는 부르 값의 일련.
변수 또는 파라그램을 명시적으로 선언하기 위해 사용된
예를 들어
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
참고자료변수 선언에서 타입을 명시적으로 언급하는 것은 선택 사항이며, 이는 na로 초기화되지 않는 한이다. 타입 시스템의 사용자 설명서 페이지에서 파이인 타입에 대한 자세한 정보를 참조하십시오.
안녕하세요
var
varip
int
float
color
string
true
false
변수 또는 파라미터를 명시적으로 선언하는
예를 들어
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
참고자료변수 선언에서 타입을 명시적으로 언급하는 것은 선택 사항이며, 이는 na로 초기화되지 않는 한이다. 타입 시스템의 사용자 설명서 페이지에서 파이인 타입에 대한 자세한 정보를 참조하십시오.
안녕하세요
var
varip
float
bool
color
string
변수 또는 파라미터를 명시적으로 선언하는
예를 들어
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
참고자료변수 선언에서 타입을 명시적으로 언급하는 것은 선택적이지만, na로 초기화되지 않는 경우이다.
안녕하세요
var
varip
int
bool
color
string
변수 또는 파라미터를 명시적으로 선언하는 "string" 타입의 키워드.
예를 들어
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
참고자료변수 선언에서 타입을 명시적으로 언급하는 것은 선택 사항이며, 이는 na로 초기화되지 않는 한이다. 타입 시스템의 사용자 설명서 페이지에서 파이인 타입에 대한 자세한 정보를 참조하십시오.
안녕하세요
var
varip
int
float
bool
str.tostring
str.format
변수 또는 파라미터를 명시적으로 선언하는 "color" 타입의 키워드.
예를 들어
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
참고자료컬러 문자에는 다음과 같은 형식이 있습니다: #RRGGBB 또는 #RRGGBBAA;; 글자는 00에서 FF까지의 16진수를 나타냅니다. (0에서 255까지의 10진수), RR,GG 및 BB는 색상의 빨간색, 녹색 및 파란색 분자의 값입니다. AA는 색상 투명성 (또는 알파 분자) 의 선택값이며, 00은 보이지 않으며 FF는 투명하지 않습니다. AA가 제공되지 않은 경우 FF를 사용합니다. 변수 선언에서 타입을 명시적으로 언급하는 것은 선택 사항이며, 이는 na로 초기화되지 않는 한이다. 타입 시스템의 사용자 설명서 페이지에서 파이인 타입에 대한 자세한 정보를 참조하십시오.
안녕하세요
var
varip
int
float
string
color.rgb
color.new
변수 또는 파라미터를 명시적으로 선언하는 array.new<type>
,array.from
함수는 배열 개체 (또는 ID) 를 만듭니다.
예를 들어
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
참고자료배열 객체는 항상
안녕하세요
var
array.new
array.from
PINE 언어의 Objects 객체는 사용자 정의 타입 (UDT) 의 예시로, 메소드 없는 클래스로 이해할 수 있으며, 사용자가 정책에서 사용자 정의 타입을 생성하여 하나의 엔티티에 다른 값을 조직할 수 있습니다.
유형 정의
이제, 주문 정보를 저장하기 위해 주문 유형을 정의해 보겠습니다.
type order
float price
float amount
string symbol
type
키워드 선언 유형.객체를 생성합니다.
선언된 타입을 사용하여 호출new()
함수 생성 객체:
order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)
이 문서는 다른 문장과 같은 문장들을 포함합니다.
order order1 = na
이 글의 내용은 한 가지 실제적인 예입니다.
type order
float price
float amount
string symbol
if strategy.position_size == 0 and open > close
strategy.entry("long", strategy.long, 1)
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
// runtime.log(order1) // 输出 {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}
예를 들어,
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
이 글은 다음과 같은 형태로 작성될 수 있습니다.
order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
var 키워드에 대한 객체 유형 사용
//@version=5
indicator("Objects using `var` demo")
//@type A custom type to hold index, price, and volume information.
type BarInfo
int index = bar_index
float price = close
float vol = volume
//@variable A `BarInfo` instance whose fields persist through all iterations, starting from the first bar.
var BarInfo firstBar = BarInfo.new()
//@variable A `BarInfo` instance declared on every bar.
BarInfo currentBar = BarInfo.new()
// Plot the `index` fields of both instances to compare the difference.
plot(firstBar.index, "firstBar")
plot(currentBar.index, "currentBar")
var 키워드 선언을 사용하여 사용자 정의 타입의 객체에 변수를 할당할 때, 해당 키워드는 자동으로 해당 객체의 모든 필드에 적용됩니다. 이것은 var 키워드 선언을 통해 선언된 객체가 각 이더리 사이에 상태를 유지할 것이며, 각 이더리에서 필드 값을 다시 초기화 할 필요가 없다는 것을 의미합니다.
두 개의 객체의 인덱스 필드를 그리면서 그 사이의 차이를 비교할 수 있다. firstBar.index는 이전 설정된 값을 각 이더리스에서 유지하며, currentBar.index는 각 이더리스에서 현재 항목의 bar_index 값으로 다시 초기화된다.
varip 키워드에 사용되는 객체 타입
//@version=5
indicator("Objects using `varip` fields demo")
//@type A custom type that counts the bars and ticks in the script's execution.
type Counter
int bars = 0
varip int ticks = 0
//@variable A `Counter` object whose reference persists throughout all bars.
var Counter counter = Counter.new()
// Add 1 to the `bars` and `ticks` fields. The `ticks` field is not subject to rollback on unconfirmed bars.
counter.bars += 1
counter.ticks += 1
// Plot both fields for comparison.
plot(counter.bars, "Bar counter", color.blue, 3)
plot(counter.ticks, "Tick counter", color.purple, 3)
파인에서는 varip 키워드를 사용하여 객체의 필드가 확정되지 않은 기둥에 회전하지 않고 스크립트 실행 내내 계속 존재하도록 지시합니다. Counter 타입의 선언에서, bars 필드는 varip 키워드를 사용하지 않으므로, 확인되지 않은 각 열에 로글됩니다. 반면, ticks 필드는 varip 키워드를 사용하므로, 확인되지 않은 열에 로글되지 않습니다. counter 객체는 var 키워드를 사용하여 선언되므로 스크립트 실행 내내 계속 존재합니다. 각 반복에서 바스 필드와 틱스 필드가 1을 더한다. 바스 필드는 확인되지 않은 각 기둥 안에 회전하지만 틱스 필드는 회전하지 않는다. 마지막으로, counter.bars와 counter.ticks 필드를 그려서 그 사이의 차이를 비교할 수 있다. counter.bars의 값은 확인되지 않은 각 기둥에 회전하고 counter.ticks의 값은 스크립트 실행이 끝날 때까지 계속 증가한다.
필드 값을 변경합니다.
type order
float price
float amount
string symbol
if strategy.position_size == 0 and open > close
strategy.entry("long", strategy.long, 1)
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
if strategy.position_size != 0
runtime.log(order1)
order1.price := 999
order1.amount := 100
runtime.log(order1)
runtime.error("stop")
사용할 수 있습니다:=
재배정 연산자는 객체 필드의 값을 변경합니다.
객체 집합
예를 들어, 사용자가 정의한 order 타입의 객체를 저장하는 빈 행렬을 선언합니다:
type order
float price
float amount
string symbol
arrOrder = array.new<order>()
order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")
array.push(arrOrder, order1)
array.push(arrOrder, order2)
runtime.log(arrOrder)
runtime.error("stop")
또는
type order
float price
float amount
string symbol
var array<order> arrOrder = na
arrOrder := array.new<order>()
order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")
array.push(arrOrder, order1)
array.push(arrOrder, order2)
runtime.log(arrOrder)
runtime.error("stop")
복제 대상
파인에서는 객체가 참조로 할당된다. 기존 객체가 새로운 변수에 할당될 때, 둘 다 같은 객체를 가리키다.
//@version=5
indicator("")
type pivotPoint
int x
float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivot1
pivot2.x := 2000
// Both plot the value 2000.
plot(pivot1.x)
plot(pivot2.x)
아래 예제에서, 우리는 피보트1 객체를 만들고 그 x 필드를 1000로 설정한다. 그리고 우리는 피보트2가 그 피보트1 객체에 대한 참조를 포함하는 변수를 선언한다. 따라서 둘 다 같은 인스턴스를 가리킨다. 따라서, 피보트2.x를 변경하면 피보트1.x도 변경된다. 왜냐하면 둘 다 같은 x 객체의 필드를 참조하기 때문이다.
원본 객체로부터 독립된 복사본을 만들려면, 이 경우 우리는 내장된 복사 (() 방법을 사용할 수 있다. 이 예에서, 우리는 피보트2가 피보트1 객체의 복사본의 변수를 참조한다고 선언한다. 이제, 피보트2.x를 바꾸는 것은 피보트1.x를 바꾸지 않습니다. 왜냐하면 그것은 x가 하나의 개별 객체의 필드를 가리키기 때문입니다:
//@version=5
indicator("")
type pivotPoint
int x
float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivotPoint.copy(pivot1)
pivot2.x := 2000
// Plots 1000 and 2000.
plot(pivot1.x)
plot(pivot2.x)
참고로, 트레이딩뷰의 복사 방법은 초록본이다. 만약 객체가 특수 타입의 필드를 가지고 있다면 (array 등) 그 객체의 초록본의 필드는 해당 객체와 동일한 인스턴스에 가리킬 것이다. FMZ 플랫폼은 추가 처리 없이 직접 딥 코피를 구현합니다.
깊은 복사
//@version=5
indicator("test deepCopy")
type orderInfo
float price
float amount
type labelInfo
orderInfo order
string labelMsg
labelInfo1 = labelInfo.new(orderInfo.new(100, 0.1), "test labelInfo1")
labelInfo2 = labelInfo.copy(labelInfo1)
labelInfo1.labelMsg := "labelInfo1->2" // 修改 labelInfo1 的基础类型字段,看是否影响 labelInfo2
labelInfo1.order.price := 999 // 修改 labelInfo1 的复合类型字段,看是否影响 labelInfo2
runtime.log(labelInfo1)
runtime.log(labelInfo2)
runtime.error("stop")
테스트 결과, labelInfo.copy ((labelInfo1)) 는 실행 시 깊은 복사, labelInfo1의 변경은 labelInfo2에 영향을 미치지 않습니다.
파인 언어의 메소드 (Methods) 는 특정 인스턴스의 내장 또는 사용자 정의 타입과 관련된 특수 함수이다. 대부분의 부분에서 그들은 일반 함수와 거의 비슷하지만 더 짧고 편리한 문법을 제공합니다. 사용자는 파인 객체의 필드를 액세스하는 것처럼 점표로 직접 변수에서 접근 방법을 사용할 수 있습니다. 파인에는 모든 특수 유형의 내장 방법이 포함되어 있습니다. 집합수, 매트릭스, 매핑, 라인, 채울 라인 등을 포함합니다. 이러한 방법은 사용자에게 스크립트에서 이러한 유형의 특수 프로그램을 호출하는 더 간결한 방법을 제공합니다.
내장 방법
예를 들어, 이런 스크립트 코드:
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sourceArray = array.new<float>(samplesInput)
var float sampleMean = na
var float sampleDev = na
// Identify if `n` bars have passed.
if bar_index % n == 0
// Update the queue.
array.push(sourceArray, sourceInput)
array.shift(sourceArray)
// Update the mean and standard deviaiton values.
sampleMean := array.avg(sourceArray)
sampleDev := array.stdev(sourceArray) * multiplier
// Calculate bands.
float highBand = sampleMean + sampleDev
float lowBand = sampleMean - sampleDev
plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)
이 문서는 다른 문장과 비교하여
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sourceArray = array.new<float>(samplesInput)
var float sampleMean = na
var float sampleDev = na
// Identify if `n` bars have passed.
if bar_index % n == 0
// Update the queue.
sourceArray.push(sourceInput)
sourceArray.shift()
// Update the mean and standard deviaiton values.
sampleMean := sourceArray.avg()
sampleDev := sourceArray.stdev() * multiplier
// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand = sampleMean - sampleDev
plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)
그리고 PINE가 지원하는 것을 볼 수 있습니다.Methods
그 다음에는array.avg(sourceArray)
이 방법은 다음과 같이 작성할 수 있습니다:sourceArray.avg()
ᅳ
FMZ는 현재 지원되지 않습니다.array.avg
이 글은 이쪽에서 읽었습니다.
사용자 정의 방법
파인은 사용자가 기본 또는 사용자 정의 타입의 모든 객체와 함께 사용할 수 있는 사용자 정의 방법을 허용합니다. 정의 방법은 본질적으로 정의 함수와 동일하지만 두 가지 중요한 차이점이 있습니다:
1, 메소드 키워드는 함수의 이름 앞에 포함되어야 한다. 2, 방법의 매개 변수, 그 중 첫 번째 매개 변수의 타입은 메소드가 연관될 객체의 타입을 표시하기 때문에 명시적으로 선언되어야 한다.
예를 들어, 다음 코드에서 브린 지표를 계산하는 코드를 사용자 사용자 지정 방법으로 포괄하는 방법:
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sourceArray = array.new<float>(samplesInput)
var float sampleMean = na
var float sampleDev = na
// Identify if `n` bars have passed.
if bar_index % n == 0
// Update the queue.
sourceArray.push(sourceInput)
sourceArray.shift()
// Update the mean and standard deviaiton values.
sampleMean := sourceArray.avg()
sampleDev := sourceArray.stdev() * multiplier
// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand = sampleMean - sampleDev
plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)
이 글은
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sour
우우오안어떻게 하면 여러 거래가 동시에 실행될 수 있을까요?
가벼운 구름JS처럼 트레이딩을 통해 트레이딩을 할 수 있나요? 감사합니다.
리사20231자세한 문서 제공 감사합니다.
예술오케이! 이 파이인 스크립트는 어떻게 okex의 모티브 디스크를 플랫폼에서 사용할 수 있을까요?
예술이것은 TradingView 플랫폼의 전략을 직접 발명가 플랫폼에 복사하여 사용할 수 있는 것과 같습니다.
발명가들의 수량화 - 작은 꿈PINE 언어는 단종 정책을 수행할 수 있으며, 다종 정책은 파이썬, 자바스크립트, C++로 작성하는 것이 좋습니다.
발명가들의 수량화 - 작은 꿈오, 네, OKX는 특이하게도, 그들의 아날로그 환경과 실제 환경은 같은 주소를 가지고 있지만 다른 곳에서 차이를 만듭니다. 그래서 아날로그 디스크로 전환하는 데 기본 주소를 바꿀 방법이 없습니다.
가벼운 구름okx 모형 디스크는 사용할 수 없습니다.
발명가들의 수량화 - 작은 꿈이 다채로운 구조의 문제는 해결되지 않습니다. 각 거래소의 인터페이스가 다르기 때문에, 인터페이스 주파수 제한이 다르기 때문에 많은 문제가 발생할 수 있습니다.
발명가들의 수량화 - 작은 꿈좋은 소식입니다.
가벼운 구름JS와 혼용하는 것이 가장 좋다고 느껴지고, JS는 다양한 거래 방식에 더 잘 적응할 수 있습니다.
트렌드 사냥꾼그리고 그 다음에는 다양한 품종을 고려할 것인가? 매매 가격은 모든 품종에 걸쳐 적용됩니다.
발명가들의 수량화 - 작은 꿈이 모든 것은 매우 무례합니다.
가벼운 구름좋은, 감사합니다.
발명가들의 수량화 - 작은 꿈안녕하세요, PINE 언어 전략은 한 가지 종류만 사용할 수 있습니다.
발명가들의 수량화 - 작은 꿈이 문서는 이 문서를 계속 개선해 나갈 것입니다.
발명가들의 수량화 - 작은 꿈네, 그렇습니다.
발명가들의 수량화 - 작은 꿈PINE 템플릿 클래식 라이브러리, 매개 변수에 스위치 거래소의 기본 주소를 설정할 수 있다. 문서의 시작: PINE 언어 거래 클래식 라이브러리 템플릿 매개 변수.