리소스 로딩... 로딩...

FMZ PINE 스크립트 문서

저자:발명가들의 수량화 - 작은 꿈, 창작: 2022-05-06 14:27:06, 업데이트: 2024-10-12 15:27:04

[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()이 글은 에 대한 글입니다.

코드

스크립트에서 코멘트나 컴파일러 명령어가 아닌 행은 문장이며, 그것은 스크립트의 알고리즘을 구현한다. 문장은 그 중 하나가 될 수 있다.

  • 변수 선언
  • 변수의 재배정
  • 함수 선언
  • 내장 함수 호출, 사용자 정의 함수 호출
  • ifforwhile또는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의 개시 가격을 기록합니다.open5분 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 정책의 내장 템플릿 "Pine 언어 거래 클래스 라이브러리"의 매개 변수 설정 설명.

img

거래 설정

  • 실행 방법 클로시 가격 모델: 현재 BAR가 끝나기 전까지 모델을 실행하고, 하위 바르가 시작될 때 거래를 실행한다. 실시간 가격 모델: 가격 변동마다 모델을 실행하고 신호가 즉시 거래를 실행합니다.
  • 기본 상장 수: 거래 지시가 거래 수를 지정하지 않은 경우 해당 설정에 따라 거래 수를 실행합니다.
  • 최대 단일 거래 단위: 실제 거래 상장에 따라, 이 매개 변수 설정과 결합하여, 거래 상자에 충격을 피하기 위해 매번 거래 상장의 최대 수를 결정한다.
  • 가격 점수:定价货币精度매개 변수와 이 매개 변수는 주문 시 미끄러운 가격을 결정한다. 예를 들어, 가격화 통화 정확도는 2로 설정된다. 즉, 소수점 두 번째까지 정확하고 0.01까지 정확하다. 그러면 미끄러운 가격 점수는 각 점마다 0.01의 가격 단위를 나타낸다. 이 경우 미끄러운 가격 점수는 5로 설정되어 있으며, 주문 시 미끄러운 가격은 0.05이다.
  • 변수 최장 주기 수: 그래프 K 라인 BAR의 수에 영향을 미치며javascript전략에서 호출SetMaxBarLen이 함수들은 같은 역할을 합니다.

선물 옵션

  • 품종 코드: 계약 코드, 거래소 객체가 비 현장 거래소 객체일 때 설정해야 합니다.
  • 최소 계약 수: 주문 시 계약의 최소 거래량.

디스크 옵션

  • 자동 복원 진행: 마지막 정책이 중단되기 전의 상태로 자동 복원합니다.
  • 주문을 다시 시도하는 횟수: 거래가 이루어지지 않은 주문은 주문을 취소하고 다시 주문을 시도하는 거래로 제한됩니다. 이 매개 변수는 최대 반복 횟수를 제한합니다.
  • 네트워크 쿼리 간격 (millisecond): REST 프로토콜에만 유효하며, 네트워크 요청 간격을 제어하고 요청이 너무 자주 거래소 제한을 초과하는 것을 피합니다.
  • 계정 동기화 시간 ((초): 계정 데이터의 동기화 시기의 주기.
  • 포스트 포지션 동기화 시간 (millisecond): 일부 거래소 데이터 지연으로 인한 반복 포지션에 대해서만, 동기화 시간을 더 크게 설정하면 이러한 문제를 완화할 수 있다.
  • 레버 팩토리: 레버 팩토리를 설정합니다.

현금 거래, 다른 설정

  • 한쪽 거래량: 기본 한쪽 거래량은 현금에만 유효합니다.
  • 최소 거래량: 최소 거래량.
  • 가격화 통화 정확성: 가격의 정확성, 즉 가격의 소수자 숫자.
  • 거래 품종 정확성: 다음 단위의 정확성, 즉 다음 단위의 소수자 수.
  • 서비스 요금: 이 설정에 따라 일부 데이터에 대해 계산하면 0.002은 2분의 1이다.
  • 수익/손실 통계 간격: 실판에서만 수익/손실 통계를 사용한다.
  • 실패 재시험 (毫秒): 네트워크 요청이 실패할 때 재시험 간격.
  • 사용 대리인: REST 프로토콜에만 유효합니다.
  • 로그 영역에서 로그를 숨기는 일반적인 오류.
  • 데이터베이스 주소 전환: REST 프로토콜에서만 유효합니다.
  • 알림: 메세지를 이메일로 밀고 보내십시오.

아래의 거래

개장

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이 함수들을 정렬할 때limitstop파라미터.

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이 경우, 시장의 현재 가격이 그 가격보다 높을 때만 주문이 발생한다.

  • 정지 주문

    주문의 중지 손실 가격을 설정하여 주문을 지불할 때, 시장의 현재 가격이 그 가격보다 높을 때만 주문을 유발합니다. 주문이 판매 주문일 때, 시장의 현재 가격이 그 가격보다 낮을 때만 주문이 촉발됩니다.

  • 스톱-리미트 주문

    동시에 설정할 수 있습니다.limitstop파라미터, 주문은 우선 조건에 맞는 가격에 촉발됩니다.

권익의 비율

//@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를 포함하지 않는 변수 부여 문법은 데이터를 업데이트할 때마다 변수의 값을 덮어 놓을 수 있습니다. 반대로, 키워드 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")

변수 a은 일련의 각 기둥의 첫 기둥의 닫기 가격을 유지한다. 변수 b은 시리즈의 첫 번째 녹색 가격 바의 종료 가격을 유지한다. 변수?? c?? 은 시리즈의 10번째?? 녹색?? 의 종료 가격을 유지했다.

FMZ에서는 실시간 가격 모델, 폐쇄 가격 모델,varvarip우리는 다음과 같은 코드를 사용하여 변수를 테스트합니다.

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 라인 단계.varvarip선언된 변수 i、ii는 정책 코드의 각 라운드 실행에 따라 증가 작업을 수행합니다.if true따라서 확실히 해당 실행 조건 코드 블록) 를 참조하십시오. 그래서 다시 검색 결과 K 라인 BAR에 표시되는 숫자가 각각 1으로 증가하는 것을 볼 수 있습니다. 역사 K 라인 단계가 끝나면 실시간 K 라인 단계가 시작됩니다.varvarip선언된 변수는 다르게 변하기 시작합니다. 실시간 가격 모델이기 때문에, K줄 BAR 내에서 가격 변화마다 전략 코드가 반복적으로 실행됩니다.i := i + 1그리고ii := ii + 1i는 매번 수정된다. 하지만 i는 매번 수정되기도 하지만, 다음 라운드 실행 시 정책 논리가 이전 값으로 돌아갑니다. 현재 K 라인 BAR가 끝나기 전까지는 업데이트가 이루어지지 않습니다. 그래서 우리는 변수 i가 여전히 각 바에 BAR1을 추가하는 것을 볼 수 있습니다. 그러나 변수 ii는 각 BAR에 여러 번 추가됩니다.

  • 매각 가격 모델 클로시 프라이스 모델은 K 라인 BAR가 끝나면 한 번씩 전략 논리를 실행하기 때문이다. 따라서 클로시 프라이스 모델에서는 역사 K 라인 단계와 실시간 K 라인 단계가varvarip선언된 변수는 위의 예제에서 증가하는 것과 완전히 일치합니다. 모든 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판 파이인 스크립트 언어는 당신이 else if 문법을 사용할 수 있도록 한다.

보편적인 암호는 다음과 같습니다:

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_then0var_decl_then1etc) ⇒ false 조건이 있는 경우 문장 블록을 사용합니다.else if또는else이 글의 논리는var_decl_else0var_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 블록을 사용하거나 전혀 사용할 수 있다. ▲then,??else if,??else if의 블록은 네 개의 공간으로 이동된다:

예를 들어

// if
x = if open > close
    5
else if high > low
    close
else
    open
plot(x)

무시할 수 있습니다.if문장의 결과값 ((var_declarationX=을 생략할 수 있다) ). 만약 당신이 표현의 부작용을 필요로 한다면 유용할 수 있다. 예를 들어 전략 거래에서:

예를 들어

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- 카운터의 시작값. series int/float 값/표현을 사용하도록 허용한다.to_num- 카운터의 최종값. 카운터가 to_num보다 크거나 from_num > to_num의 경우 to_num보다 작을 때 루프를 중단한다. series int/float thresholds/expressions를 사용할 수 있지만 루프의 첫 번째 반복에서만 평가된다.step_num- 카운터의 증가/ 감소 값. 그것은 선택적이다. 기본 값은 +1 또는 -1입니다. 그것은 from_num 또는 to_num 중 가장 큰 값에 따라 다릅니다. 값이 사용되면 카운터는 또한 from_num 또는 to_num 중 가장 큰 값에 따라 증가/ 감소합니다. 따라서 step_num의 +/- 기호는 선택적입니다.statements | continue | break- 임의의 수의 문장, 또는 4개의 공간 또는 한 개의 탭으로 축소된 continue 또는 break 키워드return_expression- 루프의 반환 값은 존재한다면 var_declaration의 변수에 할당된다. 만약 루프가 continue 또는 break 키워드로 인해 종료된다면, 루프의 반환 값은 루프의 종료 전에 할당된 마지막 변수의 반환 값이다.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개의 공간 또는 한 개의 탭으로 축소된 continue 또는 break 키워드return_expression- 회로의 반환값은var_declaration속 변수, 만약 존재한다면. 만약 루그가 continue 또는 break 키워드 때문에 탈퇴한다면, 루그의 반환 값은 루그가 탈퇴하기 전에 마지막으로 부여된 변수이다.continue- 회전에서만 사용할 수 있는 키워드. 그것은 회전의 다음 반복이 실행되도록 합니다.break- '회복'의 키워드

루프 내에서 배열의 요소 또는 크기를 변경할 수 있습니다. 여기서는for...in각 K줄에 얼마나 많은 K줄의 OHLC가 close의 SMA보다 크는지 결정하기 위한 단변수 형태:

예를 들어

// 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의 합을 반환합니다 숫자는 정수 또는 부동 소수점 값, 또는 일련의 값을 반환합니다: 이분법 +'는 expres1 + expres2를 반환한다. 원자 + 원자 는 expr (원자 연산자 대칭에 어떤 내용도 추가하지 않는다) 를 반환한다.

참고자료숫자를 가진 수학적 연산자와 변수 열을 사용할 수 있다. 숫자 열을 사용하는 경우, 연산자는 요소에 적용된다.

+=

곱셈 지표는 숫자 표현식이나 문자열에 적용됩니다.

expr1 += expr2

예를 들어

// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)

값을 반환합니다.문자열의 경우, expres1과 expres2의 연쇄를 반환한다. 숫자의 경우, 정수 또는 부동 소수점 값을, 또는 일련의 값을 반환한다.

참고자료숫자를 가진 수학적 연산자와 변수 열을 사용할 수 있다. 숫자 열을 사용하는 경우, 연산자는 요소에 적용된다.

-

미분법 또는 단적 음수.

expr1 - expr2
- expr

값을 반환합니다.전체 또는 유동점 값, 또는 일련의 값을 반환합니다: 이분법 +'는 expres1 빼기 expres2를 반환한다. 1원-이 식은 '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를 else의 가지로 사용하십시오. 두 개 또는 그 이상의?: 연산자를 사용하여 스위치 과 유사한 문장을 구현할 수 있습니다 ( 위의 예제를 참조하십시오). 숫자를 가진 수학적 연산자와 변수 열을 사용할 수 있다. 숫자 열을 사용하는 경우, 연산자는 요소에 적용된다.

안녕하세요 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 () 타입의 키워드. "Bool" 변수의 값은 true, false 또는 na가 될 수 있다.

예를 들어

// 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 (진수) 타입의 키워드.

예를 들어

// int
int i = 14    // Same as `i = 14`
i := na
plot(i)

참고자료변수 선언에서 타입을 명시적으로 언급하는 것은 선택 사항이며, 이는 na로 초기화되지 않는 한이다. 타입 시스템의 사용자 설명서 페이지에서 파이인 타입에 대한 자세한 정보를 참조하십시오.

안녕하세요 var varip float bool color string

플라트

변수 또는 파라미터를 명시적으로 선언하는 float (浮点) 타입의 키워드.

예를 들어

// 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키워드 선언 유형.
  • type 키워드 다음에는 타입 이름이다.
  • 첫 번째 줄 type는 타입 이름을 정의하고, 네 개의 공간으로 축소하여 타입이 포함하는 필드를 정의합니다.
  • 각 필드는 int, float, string 같은 데이터 타입을 선언해야 합니다.

객체를 생성합니다.

선언된 타입을 사용하여 호출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 객체는 var 키워드를 사용하여 선언되었으므로, 그것의 필드 (index, price, vol) 는 첫 번째 항목을 시작하여 마지막 항목을 끝으로 모든 반복에서 값을 유지합니다.
  • currentBar 객체는 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 언어 거래 클래식 라이브러리 템플릿 매개 변수.