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

발명자 양적화 된 PINE 언어의 소개 교과서

저자:발명가들의 수량화 - 작은 꿈, 창작: 2022-05-30 16:23:43, 업데이트: 2022-09-28 17:10:21

[TOC]

발명자 양적화 된 PINE 언어의 소개 교과서

이 비디오는 카카오페이어에서 공개되었습니다.양자화 거래에 대한 입문 너무 어렵습니까? 트레이딩 뷰로 소백에서 퀀트 대신까지 파이어 언어를 처음 탐구합니다.

발명자 양자 거래 플랫폼은 파이어 언어 작성 정책을 지원, 회색을 지원, 디스크에서 파이어 언어 정책을 실행, 파이어 언어의 낮은 버전과 호환.FMZ.COM이 글은전략 광장파인에서 검색, 포트, 포트, 포트, 포트, 포트, 포트, 포트, 포트, 포트.

FMZ는 파인 언어뿐만 아니라 파인 언어의 강력한 그래픽 기능을 지원합니다. FMZ 플랫폼의 기능, 풍부한 실용 도구, 효율적인 간편 관리, 또한 파인 정책 (스크립트) 의 실용성을 더욱 향상시킵니다. FMZ는 파인 언어에 대한 호환성을 기반으로하고 있으며, 또한 파인 언어에 대한 확장, 최적화, 자작을 수행합니다. 공식적인 교육 과정에 들어가기 전에 FMZ에서 파인 언어와 원본 파인에서 어떤 변화가 있는지 함께 살펴보십시오.

이 글은 한 가지 더 눈에 띄는 차이점들을 간략하게 정리합니다.

  • 1 FMZ에서 파이인 정책, 코드 시작 버전 표시//@version그리고 코드가 시작됩니다.strategyindicator문장은 작성할 필요가 없으며, FMZ는 현재 지원하지 않습니다.import수입library이 글은

    이 문서는 다른 문장과 비교해 볼 수 있습니다.

    //@version=5
    indicator("My Script", overlay = true)
    src = close
    a = ta.sma(src, 5)
    b = ta.sma(src, 50)
    c = ta.cross(a, b)
    plot(a, color = color.blue)
    plot(b, color = color.black)
    plotshape(c, color = color.red)
    

    이 글은 다른 글과 비슷합니다.

    //@version=5
    strategy("My Strategy", overlay=true)
    
    longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)
    
    shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)
    

    FMZ에서는 다음과 같이 간단하게 설명할 수 있습니다.

    src = close
    a = ta.sma(src, 5)
    b = ta.sma(src, 50)
    c = ta.cross(a, b)
    plot(a, color = color.blue, overlay=true)
    plot(b, color = color.black, overlay=true)
    plotshape(c, color = color.red, overlay=true)
    

    또는:

    longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)
    
    shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)
    
  • 2, 정책 (스크립트) 일부 거래 관련 설정은 FMZ 정책 인터페이스의 "Pine 언어 거래 클래스 라이브러리" 매개 변수로 설정됩니다.

    • 마감 가격 모델과 실시간 가격 모델 트레이딩 뷰에서strategy이 함수들의calc_on_every_tick매개 변수를 설정하기 위한 전략 스크립트는 가격 변동마다 실시간으로 전략 논리를 실행합니다.calc_on_every_tick파러미터는 이렇게 설정됩니다.true◎ 기본 설정calc_on_every_tick자, 이제false즉, 전략이 현재 K 라인 BAR를 완전히 다 마친 후에야 전략 논리를 실행한다. FMZ에서는 "Pine 언어 거래 클래스 라이브러리" 템플릿의 매개 변수를 통해 설정됩니다.

      img

    • 전략 실행시 가격, 부하량 등 수치 정밀 제어 FMZ에서 지정해야 합니다. 트레이딩 뷰에서는 시뮬레이션 테스트만 가능하기 때문에 실시간 주문의 정확성에 문제가 없다. FMZ에서는 실제 주문을 실행할 수 있다. 그러면 전략이 거래 품종의 가격 정밀도, 주문량 정밀도를 유연하게 지정할 수 있는 것이 필요하다. 이러한 정밀 설정은 관련 데이터의 소수자수를 제어하여 데이터가 거래소 발급 요구 사항에 부합하지 않아 주문을 할 수 없도록 방지한다.

    • 선물 계약 코드 FMZ에서 거래 품종은 계약이라면 두 가지 속성을 가지고 있다. "거래 쌍"과 "계약 코드"로 구분된다. 실제판과 재검토시 거래 쌍을 명확하게 설정하는 것 외에도 "Pine Language Trade Class Library" 템플릿의 매개 변수 "거래 품종 코드"에 구체적인 계약 코드를 설정해야 한다. 예를 들어 상속 계약은 채우기 때문이다.swap, 계약 코드는 거래 거래소가 그러한 계약을 가지고 있는지 여부에 따라 다릅니다. 예를 들어 거래의 모든 분기 계약을 작성할 수 있습니다.quarter이 계약 코드들은 FMZ의 자바스크립트/파이썬/c++ 언어 API 문서에서 정의된 미래 계약 코드와 일치한다.

    다른 설정들, 예를 들어, 최소 단위량, 기본 단위량 등에 대해 파인 언어 문서를 참조하십시오."파인 언어 거래소"변수 소개.

  • 3、runtime.debugruntime.logruntime.errorFMZ 확장 함수, 디뷰팅을 위한 ᅳ

    FMZ 플랫폼에 디뷰를 위한 3개의 기능이 추가되었다.

    • runtime.debug: 컨트롤러에서 변수 정보를 인쇄하는 것은 일반적으로 이 함수를 사용하지 않습니다.

    • runtime.log: 로그 내재 출력 ▲ FMZ PINE 언어 특기 함수 ▲

      runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
      
    • runtime.error: 호출할 때 실행 오류가 발생하고 메시지 매개 변수에서 지정된 오류 메시지가 있습니다.

      runtime.error(message)
      
  • 4, 부분적으로 도면 함수에서 확장overlay매개 변수

    FMZ에서 파인 언어, 그래프 함수plotplotshapeplotchar그리고 더 많이 증가했습니다.overlay패러그램 지원, 주체 또는 하위 그림에 그림을 지정하는 것을 허용합니다.overlay설정true그림은 주본으로 설정됩니다.false부조그램에 그림을 그리십시오. FMZ에서 Pine 정책이 실행되는 동안 주제를 그리거나 부조그램을 동시에 그리십시오.

  • 5、syminfo.mintick내장 변수의 값

    syminfo.mintick내장 변수는 현재 품종의 최소 정표값으로 정의된다.실제 디스크/재검토인터페이스에서 "Pine 언어 거래 클래스 라이브러리"의 템플릿 매개 변수는 가격화 통화 정확도를 제어할 수 있다. 가격화 통화 정확도는 거래 시 가격이 소수점 두 번째까지 정확하다는 것을 의미하는 2로 설정되어 있으며, 이 때 가격의 최소 변동 단위는 0.01이다.syminfo.mintick이 값은 0.01 입니다.

  • 6. FMZ PINE Script의 평균 가격은 서비스 요금이 포함됩니다.

    예를 들어: 주문 가격은 8000, 판매 방향, 1 대의 수 (개, 장), 거래 후 평균 가격은 8000이 아닌 8000 (비용에는 절차 요금이 포함되어 있습니다) 이다.

파인 언어의 기초

파인 언어의 기초를 배우기 시작했을 때, 우리는 몇 가지 예시의 명령어, 코드 문법과 익숙하지 않을 수 있습니다. 이해가 안되더라도, 우리는 먼저 개념을 이해하고 테스트의 목적을 이해 할 수 있습니다. 또한 설명서를 확인하기 위해 FMZ의 파인 언어 문서를 검색 할 수 있습니다. 그리고 문법, 명령어, 함수, 내장 변수 등을 점차적으로 익히기 위해 튜토리얼을 단계별로 따라가십시오.

모델 실행

파이어 언어의 문장 실행 과정과 같은 관련 개념에 대한 이해는 파이어 언어를 배우기 시작할 때 매우 필요합니다. 파이어 언어의 전략은 그래프에 기반하여 실행되며, 파이어 언어의 전략으로 이해할 수 있습니다. 그래프에서 차트에서 이미 로드 된 가장 초기 데이터에서 시간 순서에서 전후 순서로 실행되는 일련의 계산과 동작으로 실행됩니다. 그래프의 초기 로드 된 데이터의 양은 제한적입니다. 실제 시간에는 일반적으로 이 데이터 양이 거래소 인터페이스에서 반환된 데이터량에 따라 결정되며, 역 측정 시 데이터 측정 제한은 역 시스템 데이터 소스에 의해 결정됩니다.bar_index파인 스크립트 실행 시 현재 K 라인 바의 인덱스 값에 참조한다.

plot(bar_index, "bar_index")

img

plot함수는 우리가 앞으로 더 많이 사용하는 함수 중 하나입니다. 사용 방법은 간단합니다. 입력된 매개 변수에 따라 그래프에 선을 그리는 것입니다.bar_index이 라인은bar_index◎ 첫 번째 Bar 이름 위에 bar_index라는 줄의 값이 0이고, Bar가 오른쪽으로 증가하면 1이 증가하는 것을 볼 수 있습니다.

전략 설정에 따라 전략 모델의 실행 방식도 다릅니다.收盘价模型그리고实时价模型◎ 종결 가격 모델, 실시간 가격 모델의 개념은 이전에도 간략하게 소개했었다.。

  • 매각 가격 모델

    전략 코드가 실행될 때, 현재 K 라인 Bar의 주기가 완전히 실행되고, K 라인이 닫히면 K 라인 주기가 끝난다. 이 때, 다시 Pine 전략 논리를 실행하면, 촉발된 거래 신호는 다음 K 라인 Bar의 시작 시 실행된다.

  • 실시간 가격 모델

    전략 코드가 실행될 때, 현재 K 라인 바가 닫히거나 닫히지 않고, 시장의 변화와 함께 피인 전략 논리를 반복하여 트레이딩 신호를 즉시 실행한다.

파인 언어의 정책이 그래프에서 왼쪽에서 오른쪽으로 실행될 때, 그래프의 K 라인 바는历史Bar그리고实时Bar이 글은

  • 역사 바

    "실제 가격 모델"로 설정된 정책이 실행될 때, 가장 오른쪽의 K 라인 바를 제외한 모든 K 라인 바가历史Bar◎ 전략적 논리는 모든 뿌리에 있습니다.历史Bar한 번만 실행하면 됩니다. "폐기 가격 모델"로 설정된 정책이 실행될 때, 모든 바가历史Bar◎ 전략적 논리는 모든 뿌리에 있습니다.历史Bar한 번만 실행하면 됩니다.

    역사 바를 기반으로 계산: 전략 코드는 역사 바가 종료되는 상태에서 한 번 실행되고, 모든 역사 바가 한 번 실행될 때까지 다음 역사 바에서 계속 실행된다.

  • 실시간 바

    전략이 오른쪽 마지막 K선 바에 실행될 때, 이 바는 실시간 바로 바뀐다. 실시간 바가 닫히면, 이 바는 지난 실시간 바 (역사 바로 바뀐다.) 로 바뀐다.

    전략 설정이 "실제 가격 모델"로 실행되기 시작하면, 실시간 바에서 시장 변화마다 전략 논리가 실행됩니다. "폐쇄 가격 모델"로 설정된 정책이 실행을 시작했을 때 차트에서 실시간 바르가 표시되지 않습니다.

    실시간 바를 기반으로 계산: 만약 "폐기 가격 모델"으로 설정된 정책이 실시간 Bar를 표시하지 않는다면, 정책 코드는 현재 Bar가 종료될 때 한 번만 실행된다. 만약 정책을 "실제 가격 모델"로 설정하면 실시간 바에서 계산과 역사 바는 완전히 다릅니다. 실제 바에서 시장 변화마다 하나의 정책 코드가 실행됩니다. 예를 들어 내장 변수.highlowclose역사 바에 있는 값은 고정되어 있고, 실시간 바에 있는 값은 시장이 변화할 때마다 변화할 수 있다. 따라서 이러한 값에 기초하여 계산된 지표와 같은 데이터도 실시간으로 변화한다. 실시간 바에 있는 값은 고정되어 있다.close현재 가장 최신 가격을 표시합니다.high그리고low항상 현재 실시간 바가 시작된 이래로 도달한 최고 높음과 최저 낮음을 나타냅니다. 이 내장 변수는 실시간 바가 마지막으로 업데이트되었을 때 최종 값을 나타냅니다.

    실시간 바에서 전략을 실행할 때 회전 메커니즘 (실제 가격 모델): 실시간 Bar에서 실행될 때, 정책의 새로운 반복마다 실행되기 전에 사용자 정의 변수를 다시 설정하는 것은 회전이라고 한다. 회전 메커니즘을 이해하려면 다음과 같은 테스트 코드를 예로 사용한다.

    주의:

    /*backtest 
    ...
    ..
    .
    */
    

    파킷의 내용은 FMZ 플랫폼에서 코드 형태로 저장된 재검토 구성 정보입니다.

    /*backtest
    start: 2022-06-03 09:00:00
    end: 2022-06-08 15:00:00
    period: 1m
    basePeriod: 1m
    exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
    */
    
    var n = 0
    if not barstate.ishistory
        runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
        n := n + 1
        runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
      
    plot(n, title="n")
    

    img

    img

    우리는 실시간으로 실행되는 시나리오만 살펴봤습니다.not barstate.ishistory표현식 제한은 실시간 Bar에서 변수 n에 대한 덧셈에만 사용되며, 덧셈 동작을 실행하기 전에 사용된다.runtime.log함수는 정책 로그에서 정보를 출력한다. 그림 그래프 함수를 사용하여plot그려진 곡선 n은 정책이 역사 바에서 실행되는 동안 n이 항상 0인 것을 볼 수 있다. 실시간 바에 실행될 때 n 더하기 1의 동작이 발생하고 실시간 바에서 실행되는 모든 라운드에 n 더하기 1의 동작이 실행된다. 로그 정보에서 볼 수 있듯이 정책 코드가 다시 실행되는 각 라운드마다 n은 이전 정책 실행 바가 최종적으로 제출한 값으로 다시 설정된다. 실시간 바에서 정책 실행 코드가 마지막으로 실행될 때 n의 값이 업데이트되는 것을 볼 수 있기 때문에 그래프는 실시간 바에서 시작되며, 곡선 n은 시간 곡선 n의 값이 1을 증가하는 모든 Bar 증가와 함께 증가하는 것을 볼 수 있다.

    이 글의 내용은 다음과 같습니다. 1, 정책이 실시간 바에서 실행되기 시작했을 때, 매번 업데이트될 때마다 하나의 정책 코드가 실행된다. 2, 실시간 바에서 실행할 때, 정책 코드가 실행될 때마다 변수를 되돌립니다. 3, 실시간 바에서 실행할 때, 변수는 종료 업데이트에 한 번 제출됩니다.

    데이터 회전으로 인해 그래프의 곡선과 같은 그림 그래프 작업도 재디그램을 일으킬 수 있습니다. 예를 들어, 우리가 방금 테스트 코드를 수정하고, 실제 디스크 테스트:

    var n = 0
    if not barstate.ishistory
        runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
        n := open > close ? n + 1 : n
        runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
      
    plot(n, title="n")
    

    순간 A의 스크린img

    시점 B의 스크린img

    우리는 단지 이 문장을 수정했습니다.n := open > close ? n + 1 : n, 현재 실시간 Bar는 음선 (즉, 개장 가격이 종료 가격보다 높다) 이면 1을 더한다;; 첫 번째 그래프 (즉, 시점 A) 에서 개장 가격이 종료 가격보다 높기 때문에 1을 더하기 때문에 그래프 곡선 (n) 의 값은 5이다;; 그 다음 행보 변화, 가격 업데이트는 두 번째 그래프 (즉, 시점 B) 에서와 같이 표시된다. 이 때 개장 가격이 종료 가격 (이하, 음선) 보다 낮기 때문에, n은 회전하고 1을 더하지 않는다. 그래프의 곡선 (n) 은 즉시 재화되기도 하며, 이 때 곡선 (n) 의 값은 4이다. 따라서 실시간 Bar에서 표시되는 금포, 도포 등의 신호는 불확정하고 변할 수 있다.

  • 함수의 변수 문맥

    아래에서 우리는 함께 파인 언어의 함수의 변수를 연구한다. 몇몇 파인 튜토리얼에서 설명된 바에 따르면, 함수 안의 변수와 함수 밖의 변수는 다음과 같이 다르다.

    파인 함수에서 사용되는 일련의 변수들의 역사는 함수들에 대한 각각의 연속적인 호출에 의해 생성된다. 만약 스크립트가 실행되는 각 기둥에 함수를 호출하지 않으면 함수의 로컬 블록 내부와 외부 일련의 역사값 사이에 차이가 발생한다. 따라서, 각 기둥에 함수를 호출하지 않으면 함수 내부와 외부에 동일한 인덱스 값을 사용하는 일련의 참조가 동일한 역사점을 참조하지 않을 것이다.

    FMZ에서 실행되는 테스트 코드로 문제를 해결했습니다.

    /*backtest
    start: 2022-06-03 09:00:00
    end: 2022-06-08 15:00:00
    period: 1m
    basePeriod: 1m
    exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
    */
      
    f(a) => a[1]
    f2() => close[1]  
    
    oneBarInTwo = bar_index % 2 == 0
    plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")   
    plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")   
    plot(close[2], title = "close[2]", color = color.red, overlay = true)
    plot(close[1], title = "close[1]", color = color.green, overlay = true)
    

    검색 실행 스크린

    img

    테스트 코드는 비교적 간단하며, 주로 두 가지 방법으로 참조되는 데이터를 조사하는 것입니다.f(a) => a[1]그리고f2() => close[1]

    • f(a) => a[1]: 패러그램을 사용하는 방법, 함수가 마지막으로 반환a[1]

    • f2() => close[1]: 내장 변수를 직접 사용합니다close이 함수들은close[1]

    []기호는 데이터 시리즈 변수의 역사값에 대한 참조 동작을 사용하며, close[1]은 현재 종료 가격에 앞서 있는 Bar에 대한 종료 가격 데이터를 참조한다. 우리의 테스트 코드는 전체적으로 4가지 데이터를 차트에 그려낸다:

    • plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")문자 A A을 그려, 색은 빨간색이고, oneBarInTwo가 true일 때만 그려, 그려진 위치 (Y축에) 는:f(close)이 값은 값입니다.

    • plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")한 문자를 B B 로 그리며, 녹색으로 칠하고, oneBarInTwo가 true일 때만 그리며, 그려진 위치 (Y축에) 는:f2()이 값은 값입니다.

    • plot(close[2], title = "close[2]", color = color.red, overlay = true)그린 라인은 빨간색으로 그려져 있으며, Y축에 있는 위치는 다음과 같습니다.close[2]즉, 현재 Bar의 앞자리 2번 (왼쪽으로 2번) Bar의 닫기 가격이다.

    • plot(close[1], title = "close[1]", color = color.green, overlay = true)그림줄은 녹색으로 그려져 있으며, 그림의 위치 (Y축) 는 다음과 같습니다.close[1]즉, 현재 Bar의 앞자리 1자리 (왼쪽으로 1자리) Bar의 폐쇄 가격이다.

    전략으로 실행 스크리밍을 재검토하는 것은 그림 A에서 표시된 함수를 사용하지만 볼 수 있습니다.f(a) => a[1]그리고 그림 B에서 표시하는 함수f2() => close[1]모두 데이터 시리즈의 역사적 데이터를 참조하기 위해 사용되지만, 차트에서 "A"와 "B"의 표시 위치가 완전히 다릅니다. "A"의 표시 위치가 항상 빨간색 라인 위에 떨어집니다. 즉 전략의 코드입니다.plot(close[2], title = "close[2]", color = color.red, overlay = true)이 그림의 줄은close[2]

    img

    K줄의 지수 Bar, 즉 내장 변수를 통해bar_index"A"와 "B" 표시를 그리는지 계산한다. "A"와 "B" 표시를 그리는 것은 모든 K선 Bar에 그래프를 그리지 않는다.f(a) => a[1]이 방법으로 참조되는 값은, 만약 함수가 모든 바에 호출되지 않는다면, 함수와 같을 것입니다.f2() => close[1]이 방식의 참조 값은 동일하지 않습니다 (이렇게 같은 인덱스를 사용하더라도[1]).

  • 일부 내장 함수들은 결과를 제대로 계산하기 위해 각 바에 계산해야 합니다.

    이 사례를 간단히 설명하자면:

    res = close > close[1] ? ta.barssince(close < close[1]) : -1
    plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
    

    이 함수들은ta.barssince(close < close[1])3개의 오퍼레이터로 작성된condition ? value1 : value2그리고 그 결과,close > close[1]时去调用ta.barssince函数。可偏偏ta.barssince이 함수들은close < close[1]창립시 K줄의 수; ta.barssince 함수가 호출될 때 close > close[1] 즉 현재 종료값이 이전 Bar의 종료값보다 크다. ta.barssince 함수가 호출될 때 Close < close[1]의 조건이 모두 부실하거나 가장 최근에 생성된 위치도 없다.

    ta.barssince: 호출할 때, 현재 K줄 이전에는 이 조건이 결코 충족되지 않았다면, 이 함수가 na 를 반환한다.

    예를 들어:

    img

    그래서 그래프를 그리는 것은 res 변수가 값이 있는 경우에만 데이터를 그리는 것입니다.

    이 문제를 피하기 위해ta.barssince(close < close[1])함수 호출은 삼중 연산자로부터 가져와 가능한 모든 조건의 부문의 외부에 쓰여집니다. 따라서 모든 K줄 Bar에 계산을 수행합니다.

    a = ta.barssince(close < close[1])
    res = close > close[1] ? a : -1
    plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
    

    img

시간 순서

시간계열이라는 개념은 파인 언어에서 매우 중요하며, 우리가 파인 언어를 배울 때 이해해야 할 개념이다. 시간계열은 유형이 아니라 시간이 지남에 따라 저장되는 변수의 연속값의 기본 구조입니다. 우리는 파인 스크립트가 그래프에 기반하고 있다는 것을 알고 있습니다. 그래프에서 보여주는 가장 기본적인 내용은 K줄 그래프입니다. 시간계열의 각 값은 K줄의 시간표와 관련이 있습니다.open파인 언어의 내장 변수 (Pine language's built-in variable) 이다.open이 시간 계열 구조는 현재 K 문자열의 첫 번째 Bar에서 시작하여 현재 스크립트가 실행되는 이 Bar에 이르기까지 모든 K 문자열 Bar의 열값을 나타냅니다. 만약 현재 K 문자열이 5분 주기가라면, 우리는 Pine 전략 코드에서 참조 (또는 사용) 을 합니다.open이 때 는 전략 코드 를 사용 하여 현재 실행 중인 때 K 라인Bar의 열기 값이다. 만약 시간 계열의 역사적 값을 참조하려면 사용되어야 한다.[]조작자. ▲Pine 정책이 어떤 K줄 Bar에서 실행될 때 사용된다.open[1]참조를 표시합니다.open현재 스크립트가 실행하는 K 라인 Bar의 전 K 라인 Bar의 오픈 가격 (즉, 지난 K 라인 사이클의 오픈 가격) 은 시퀀스에 있습니다.

  • 시간 계열의 변수는 계산에 매우 편리합니다. 이 함수들은ta.cum예를 들어:

    ta.cum
    
    Cumulative (total) sum of `source`. In other words it's a sum of all elements of `source`.
    ta.cum(source) → series float
    RETURNS
    Total sum series.
    ARGUMENTS
    source (series int/float)
    SEE ALSO
    math.sum
    

    테스트 코드:

    v1 = 1
    v2 = ta.cum(v1)
    plot(v1, title="v1")
    plot(v2, title="v2")
    plot(bar_index+1, title="bar_index")
    

    많은 것들이 있습니다ta.cum이러한 내장 함수는 시간 순서에서 데이터를 직접 처리할 수 있습니다.ta.cum즉, 입력된 변수를 K줄 Bar에 각각 대응하는 값으로 더하는 것입니다. 다음으로, 우리가 이해하기 쉬운 그래프를 사용합니다.

    전략 운영 과정 기본 변수 bar_index v1 v2
    이 전략은 K 라인 Bar에서 실행됩니다. 0 1 1
    이 전략은 2번 K줄 Bar에서 실행됩니다. 1 1 2
    전략은 3번 K줄 Bar에서 실행됩니다. 2 1 3
    전략은 N + 1 루트 K 라인 Bar에서 실행됩니다. N 1 N+1

    보시다시피, v1, v2, 심지어 bar_index도 시간 순서 구조이며, 각 Bar에 대응하는 데이터가 있습니다. 이 테스트 코드는 "실제 가격 모델"과 "폐쇄 가격 모델"을 사용하여 실시간 바를 차트에 표시하는지 여부만으로 구분합니다. 재검토 속도를 측정하기 위해 "폐쇄 가격 모델" 재검토 테스트를 사용합니다.

    img

    이 변수는 1 Bar에 1 이므로ta.cum(v1)함수는 첫 번째 K선 Bar에서 실행될 때 첫 번째 Bar만 있기 때문에 계산 결과는 1, 변수 v2를 부여한다. 그 때ta.cum(v1)두 번째 K 라인 Bar에 실행될 때, 이미 2개의 K 라인 Bar가 있습니다. (첫 번째 대응된 내장변수 bar_index은 0이고, 두 번째 대응된 내장변수 bar_index은 1) 따라서 계산 결과는 2이므로, 변수 v2를 부여합니다.bar_index0에서 시작해서bar_index + 1실제로는 K 라인 바의 수입니다.v2그리고bar_index이 글은 이쪽에서 읽었습니다.

    img

    그리고 저는 또한ta.cum내장 함수는 현재 그래프에 있는 모든 Bar의 종결값의 합을 계산하면 다음과 같이 쓸 수 있습니다.ta.cum(close)이 전략이 오른쪽 가장자리에 있는 실시간 바에 실행되면ta.cum(close)계산된 결과는 차트에서 모든 Bar의 종료 가격의 합입니다. (최우수 오른쪽으로 실행되지 않을 때, 현재 Bar에 추가됩니다.)

    시간 계열에 있는 변수는 또한 연산자를 사용하여 연산할 수 있습니다. 예를 들어 코드:ta.sma(high - low, 14)이 경우,high(K 라인 바 최고 가격) 빼기low(K 라인 바 최저 가격), 마지막 사용ta.sma함수는 평균값을 구합니다.

  • 함수 호출 결과 또한 시간 순서에서 값의 흔적을 남깁니다.

    v1 = ta.highest(high, 10)[1]
    v2 = ta.highest(high[1], 10)
    plot(v1, title="v1", overlay=true)
    plot(v2, title="v2", overlay=true)
    

    이 테스트 코드는 테스트를 수행하는 동안 다시 테스트를 실행합니다.v1그리고v2값은 동일하고, 그래프에 그려진 줄은 완전히 중첩된다. 함수 호출의 계산 결과는 시간 계열에 값의 흔적을 남깁니다. 예를 들어 코드ta.highest(high, 10)[1]그 중 하나는ta.highest(high, 10)함수 호출에서 계산된 결과는 또한 그것의 역사값을 참조하기 위해[1] 사용될 수 있다. 현재 Bar에 대한 이전 Bar 대응에 기초한 것이다.ta.highest(high, 10)이 계산은 다음과 같습니다.ta.highest(high[1], 10)그래서ta.highest(high[1], 10)그리고ta.highest(high, 10)[1]이 모든 것은 완전히 동등합니다.

    다른 도면 함수를 사용하여 정보를 출력합니다.

    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, overlay=true)
    plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green, overlay=true)
    

    시간 계열의 변수 a와 변수 b의 값이 해당 Bar의 위와 아래로 표시되는 것을 볼 수 있다. 이 도표 코드를 학습 과정에서 보존할 수 있다. 왜냐하면 테스트, 실험을 할 때 종종 관찰을 위해 차트에 정보를 출력해야 할 수 있기 때문이다.

    img

스크립트 구조

일반적인 구조

이 튜토리얼의 시작 부분에서 우리는 FMZ에서 Pine와 Trading View에서 Pine 언어 사용의 몇 가지 차이점을 요약했습니다.indicator()strategy()그리고 현재는 지원하지 않고 있습니다.library()물론, 이전 버전의 파인 스크립트와 호환하기 위해 다음과 같은 전략을 작성합니다.//@version=5indicator()strategy()하지만, 이 모든 것이 다른 방식으로 설정될 수 있습니다.strategy()함수에서 패러다임 설정을 전달합니다.

<version>
<declaration_statement>
<code>

<version>버전 제어 정보는 삭제할 수 있습니다.

참고자료

파인 언어 사용//단선 해설자로서, 파인어는 다선 해설자가 없기 때문에; FMZ는 해설자를 확장했다./**/여러 줄의 코멘트를 사용한다.

코드

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

  • 변수 선언
  • 변수의 재배정
  • 함수 선언
  • 내장 함수 호출, 사용자 정의 함수 호출
  • 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")

식별자 및 연산자

아이디

변수를 알기 전에 우리는 먼저 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시 표시함수그리고변수변수, 함수의 이름을 붙이기 위해 사용된 이름 ([[):함수이 글은 이 문자를 사용해서 문자를 표시하는 방법을 배우게 됩니다.

  • 1, 아이디는 대문자로 써야 합니다.(A-Z)또는 소문화(a-z)글자 또는 하부선(_)시작, 아이디의 첫 번째 문자.
  • 2는, 아이디의 첫 번째 문자를 다음 문자가 될 수 있습니다글자하부선또는숫자
  • 3, 아이디의 이름은 크게 작아 쓰여져 있습니다.

예를 들어, 다음과 같은 이름을 가진 아이디:

fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown  // 错误的命名!使用了数字字符作为标识符的开头字符

대부분의 프로그래밍 언어와 마찬가지로, 파인 언어에는 쓰기 제안이 있습니다. 일반적으로 식별자에 대한 명칭을 제안할 때:

  • 1, 모든 글자는 대문자로 쓰여져 있다.
  • 2, 사용작은 의 규칙다른 아이디에 사용되기도 합니다.
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0

연산자

연산자는 프로그래밍 언어에서 표현식을 구성하는 데 사용되는 몇 가지 연산 기호이며, 표현식은 우리가 정책을 작성할 때 어떤 연산 목적을 위해 설계된 계산 규칙이다. 파인 언어의 연산자는 기능에 따라 분류됩니다.

부여 연산자, 계산 연산자, 비교 연산자, 논리 연산자,? :삼각형 연산자.[]역사 참조 연산자.

연산 연산자*예를 들어, 트레이딩 뷰에서 파인 언어 연산자가 결과를 반환하는 것으로 인해 발생하는 유형의 문제와 구별되는 다음과 같은 테스트 코드가 있습니다.

//@version=5
indicator("")
lenInput = input.int(14, "Length")
factor = year > 2020 ? 3 : 1
adjustedLength = lenInput * factor
ma = ta.ema(close, adjustedLength)  // Compilation error!
plot(ma)

트레이딩 뷰에서 이 스크립트를 실행할 때 오류가 발생합니다.adjustedLength = lenInput * factor곱셈을 하면series int유형 ((시리즈), 그러나ta.ema함수의 두 번째 매개 변수는 이러한 유형을 지원하지 않습니다. 그러나 FMZ에서는 이러한 엄격한 제한이 없습니다. 위의 코드는 정상적으로 실행될 수 있습니다.

아래에서 우리는 다양한 연산자의 사용에 대해 함께 살펴보겠습니다.


할당 연산자

두 가지 종류의 부여 연산자가 있습니다.=:=우리는 이 강의의 시작 부분에서 몇 가지 예를 보았습니다.

=연산자는 변수를 초기화하거나 선언할 때 부여하는 데 사용됩니다.=초기화, 선언 부여 이후의 변수는 그 다음 각 바에 해당 값으로 시작됩니다. 이것들은 유효한 변수 선언입니다:

a = close           // 使用内置变量赋值给a
b = 10000           // 使用数值赋值
c = "test"          // 使用字符串赋值
d = color.green     // 使用颜色值赋值
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)

조심하세요a = close부여 문장, 각 Bar에 변수 a는 현재 그 Bar의 닫기 가격 ( close) 이다. 다른 변수.bcdFMZ에 있는 재검사 시스템에서 테스트할 수 있으며, 그림에서 결과를 볼 수 있다.

:=기존 변수에 값을 재입정하기 위해 사용되는데, 간단히 설명하면:=오퍼레이터는 이미 선언된, 초기화된 변수 값을 수정하는 데 사용됩니다. 사용된 경우:=오퍼레이터가 초기화되지 않거나 선언되지 않은 변수 부여에 오류를 일으킬 수 있습니다. 예를 들어:

a := 0

그래서,:=부여 동작자는 일반적으로 기존 변수를 재배치하는 데 사용됩니다. 예를 들어:

a = close > open 
b = 0 
if a
    b := b + 1

plot(b)

만약close > open(즉, 현재 BAR는 양선이고, a 변수는 true입니다. if 문장의 로컬 블록에 있는 코드를 실행합니다.b := b + 1, 지정 연산자를 사용:=b에 값을 다시 부여하여 1을 더합니다. 그리고 plot 함수를 사용하여 시간 계열의 각 BAR에 있는 변수 b의 값을 그래프에 그려 줄 수 있습니다.

우리는 양선BAR가 발생하면 b가 계속 1을 더할 것이라고 생각합니까? 물론 그렇지 않습니다. 여기서 우리는 변수 b를 선언하고, 0으로 초기화 할 때 키워드를 사용하지 않습니다.b=0이 코드의 실행 결과는 b 변수를 0으로 다시 설정하는 것입니다. 만약 a 변수가 사실이라면close > openb는 이 라운드에서 1을 더할 것이고, plot 함수 그래프에서 b는 1이 될 것입니다. 하지만 다음 라운드에서 b는 0으로 다시 할당됩니다.

두 개의 키워드를 확장해야 합니다.varvarip

  • var

    사실, 이 키워드는 이전 강의에서 본 적이 있고, 사용했지만, 당시에는 자세히 다루지 않았습니다.

    var는 배정 및 한 번에 초기화되는 변수에 사용되는 키워드이다. 일반적으로, 키워드를 포함하지 않는 var의 변수 부여 문법은 데이터를 업데이트할 때마다 변수의 값을 덮어 놓을 수 있다. 반대로, 키워드 var를 사용하여 배정 변수를 사용할 때, 데이터가 업데이트 되더라도 변수가 상태를 유지 할 수 있다.

    이 예제를 계속 사용하지만 b에var키워드:

    a = close > open 
    var b = 0 
    if a
        b := b + 1
    
    plot(b)
    

    var키워드는 b 변수가 초기 첫 번째 배정만 실행하도록 하고, 그 이후의 모든 실행 전략 논리에서는 b를 0으로 다시 설정하지 않기 때문에 실행 시에서 그려진 라인은 b를 현재 K 라인 BAR에서 나타난 선광 BAR의 수를 다시 측정하는 것으로 관찰할 수 있다.

    var 선언의 변수는 범위에 쓰일 수 있을 뿐만 아니라 코드 블록에도 쓰일 수 있습니다.

    strategy(overlay=true)
    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번째?? 녹색?? 의 종료 가격을 유지했다.

  • 다양성

    varip이 키워드를 처음 볼 때, 우리는 이 키워드의 설명을 살펴볼 수 있습니다.

    varip (var intrabar persist) 은 분배 및 한 번에 초기화되는 변수에 사용되는 키워드이다. var 키워드와 유사하지만 varip 선언을 사용하는 변수는 실시간 K줄 업데이트 사이에 값을 유지한다.

    이 글은 이보다 더 이해하기 어려운 글인가요? 괜찮습니다. 예를 들어서 설명하면 쉽게 이해할 수 있습니다.

    strategy(overlay=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
    i := i + 1
    ii := ii + 1
    

    이 테스트 코드는 "결결 가격 모델" 또는 "실제 가격 모델"에서 다르게 나타납니다.

    실시간 가격 모델: 우리가 전에 설명한 전략 실행 시기를 기억하십니까? 역사 BAR 단계, 실시간 BAR 단계로 나뉘어 있습니다.varvarip선언된 변수iii전략 코드 실행의 각 라운드마다 증가작업이 수행된다. 따라서 재검토 결과 K 라인 BAR에 표시된 숫자가 각각 1으로 증가하는 것을 볼 수 있다. 역사 K 라인 단계가 끝나고 실시간 K 라인 단계가 시작될 때 var,varip 선언의 변수가 다른 변화를 시작한다. 실시간 가격 모델이기 때문에, K 라인 BAR 내에서 가격 변화마다 전략 코드가 반복적으로 실행된다.i := i + 1그리고ii := ii + 1이차는 ii가 매번 수정되는 것이다. 하지만 i는 매번 수정되기는 하지만 다음 실행 라운드에서 정책 논리가 이전 값에 복귀한다. (이전에 "모델 실행"에서 설명한 회귀 메커니즘을 기억하십니까?) 현재 K 라인 BAR가 종료될 때까지 i의 값이 업데이트되지 않는다. (즉 다음 실행 라운드에서 정책 논리가 이전 값이 복귀되지 않는다.)

    매출 모델: 클로즈 프라이스 모델은 K 라인 BAR가 다닐 때마다 한 번 실행되는 전략적 논리이기 때문에, 클로즈 프라이스 모델에서, 역사 K 라인 단계와 실시간 K 라인 단계, var,varip 선언의 변수들은 위의 예제에서 증가하는 것과 완전히 일치하며, K 라인 BAR마다 증가하는 1이다.


연산 연산자
연산자 설명
+ 가파
- 법의 축소
* 곱하기
/ 예외
% 모형

+-오퍼레이터는 이진 오퍼레이터로 사용될 수도 있고, 이진 오퍼레이터로 사용될 수도 있다. 다른 연산 오퍼레이터는 이진 오퍼레이터로만 사용될 수 있으며, 이진 오퍼레이터로 사용될 경우 오류를 반환한다.

1, 연산 연산자의 양쪽은 숫자 유형이며, 결과는 숫자 유형, 전체형 또는 플로포트 숫자입니다. 2, 만약 어떤 연산자가 문자열이라면, 연산자는+, 계산 결과는 문자열이고, 숫자는 문자열 형태로 변환되고 문자열이 함께 겹쳐집니다. 다른 연산 연산자라면 문자열을 숫자로 변환하고, 연산을 시도합니다. 3, 만약 그 중 하나의 연산수가 na인 경우 계산 결과는 null값 na이며, FMZ에서 인쇄할 때 NaN을 표시한다.

a = 1 + 1 
b = 1 + 1.1
c = 1 + "1.1"
d = "1" + "1.1"
e = 1 + na 

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e)   
// a: 2 , b: 2.1 , c: 11.1 , d: 11.1 , e: NaN

FMZ의 파인 언어는 트레이딩 뷰의 파인 언어와 약간의 차이가 있습니다. FMZ의 파인 언어는 변수 타입에 대한 요구 사항에 대해 매우 엄격하지 않습니다. 예를 들어:

a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A" 

plot(a)
plot(b)
plot(c)

FMZ에서는 실행이 가능하지만, 트레이딩 뷰에서는 타입 오류를 나타낸다. 수사 연산자의 양쪽의 연산자 숫자가 문자열일 때, 시스템은 문자열을 숫자로 변환한 후에 계산한다. 비수수 문자열이 계산되지 않을 경우, 시스템 연산 결과는 null값이다.


비교 연산자

비교 연산자는 이진 연산자이다.

연산자 설명
< 이보다 작습니다.
> 더 큰
<= 이 값은
>= 더 큰 것은
== 동등합니다.
!= 불평등

예를 들어:

a = 1 > 2 
b = 1 < 2 
c = "1" <= 2 
d = "1" >= 2 
e = 1 == 1 
f = 2 != 1 
g = open > close 
h = na > 1 
i = 1 > na

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e, ", f:", f, ", g:", g, ", h:", h, ", i:", i)   
// a: false , b: true , c: true , d: false , e: true , f: true , g: false , h: false , i: false

비교 연산자는 매우 간단하지만 우리가 정책을 작성할 때 가장 많이 사용하는 연산자이기도 합니다.closeopen그리고 또 다른 연산 연산자와 마찬가지로, FMZ에서는 트레이딩 뷰의 파인과 구별되며, FMZ에는 특별히 엄격한 요구 유형이 없습니다.d = "1" >= 2FMZ에서는 오류가 발생하지 않습니다. 실행 시 문자열을 숫자로 변환하고 비교 작업을 수행합니다. 트레이딩 뷰에서는 오류가 발생합니다.


논리 연산자
연산자 코드 기호 설명
아니 아니 원자 조작자, 연산되지 않은
그리고 그리고 이차 연산자, () 와 연산
또는 또는 이차 연산자, 또는 연산자

논리 연산자에 대해 이야기한다면, 우리는 반드시 실제 값 테이블에 대해 이야기해야합니다. 고등학교에서 배운 것과 마찬가지로, 그러나 여기서 우리는 리코드 시스템에서 테스트를 수행합니다.

a = 1 == 1  // 使用比较运算符构成的表达式,结果为布尔值
b = 1 != 1
c = not b   // 逻辑非操作符
d = not a   // 逻辑非操作符

runtime.log("测试逻辑操作符:and", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a and c:", a and c)
runtime.log("a:", a, ", b:", b, ", a and b:", a and b)
runtime.log("b:", b, ", c:", c, ", b and c:", b and c)
runtime.log("d:", d, ", b:", b, ", d and b:", d and b)

runtime.log("测试逻辑操作符:or", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a or c:", a or c)
runtime.log("a:", a, ", b:", b, ", a or b:", a or b)
runtime.log("b:", b, ", c:", c, ", b or c:", b or c)
runtime.log("d:", d, ", b:", b, ", d or b:", d or b)

runtime.error("stop")

우리는 이 시스템을 사용했습니다.runtime.error("stop")문장은 인쇄 한 번 수행 한 후, 비정상적인 오류를 던지고 재검사를 중지하면 출력 정보를 관찰 할 수 있으며 인쇄 된 내용과 진위표가 실제로 동일하다는 것을 알 수 있습니다.


삼각형 연산자

삼중 연산자를 사용함? :그리고 연산자 조합으로 만들어진 삼각형 표현식condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse우리는 이전 강의에서 이미 익숙해져 있습니다. 삼중표현이라 불리는 삼중 연산자는 총 세 개의 연산자를 의미합니다.

condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse그리고,condition만약 true가 된다면, 표현의 값은:valueWhenConditionIsTrueᅳ 만약condition이 식의 값은valueWhenConditionIsFalse

이 글은 실제로 쓰일 수 있는 것이 아니지만, 예를 들어 설명할 수 있습니다.

a = close > open
b = a ? "阳线" : "阴线"
c = not a ? "阴线" : "阳线"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

만약 십자 항성을 맞게 되면 어떻게 되는지 상관없습니다. 삼자 표현식도 겹칠 수 있습니다. 이전 강의에서도 그렇게 했습니다.

a = close > open
b = a ? math.abs(close-open) > 30 ? "阳线" : "十字星" : math.abs(close-open) > 30 ? "阴线" : "十字星"
c = not a ? math.abs(close-open) > 30 ? "阴线" : "十字星" : math.abs(close-open) > 30 ? "阳线" : "十字星"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

이 모든 것은condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse그 중valueWhenConditionIsTruevalueWhenConditionIsFalse, 또 다른 삼자 표현식을 사용한다.


역사 연산자

역사 연산자를 사용함[], 참조 시간 계열의 역사 값. 이 역사 값은 스크립트가 실행될 때 현재 K 라인 BAR 이전에 변수의 K 라인 BAR의 값이다.[]연산자는 변수, 표현식, 함수 호출 후에 사용됩니다.[]이 괄호의 값은 우리가 참조하려는 역사적 데이터의 현재 K 라인 BAR의 이동량입니다. 예를 들어, 전 K 라인 BAR의 폐쇄 가격을 참조하면 다음과 같습니다.close[1]

이 글은 우리가 이전 강의에서 본 글과 비슷합니다.

high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)

[]연산자는 같은 값에 한 번만 사용이 가능하기 때문에 이렇게 작성하면 오류가 발생합니다.

a = close[1][2]   // 错误

여기 보실 수 있습니다. 몇몇 학생들은 이렇게 말할 것입니다.[]이 문서는 일련의 구조와 행렬의 구조를 거의 비슷하게 표현합니다. 다음은 파이인 언어의 일련과 배열의 차이를 보여주는 예입니다.

strategy("test", overlay=true)

a = close
b = close[1]
c = b[1]

plot(a, title="a")
plot(b, title="b")
plot(c, title="c")

하지만a = close[1][2]이 글은 잘못 쓰여졌지만:

b = close[1]
c = b[1]

이 문서는 보통의 수직으로 해석하면,b = close[1]b는 값에 따라 값이 되어야 합니다.c = b[1]b는 여전히 역사 연산자를 사용하여 다시 역사 값을 참조할 수 있다. 보시다시피, 파인 언어의 일련의 개념은 배열처럼 간단하지 않다. b에 할당된 마지막 Bar에 대한 역사값을 close로 이해할 수 있으며, b는 또한 시간 계열 구조 (time series) 이므로 그 역사값을 계속 참조할 수 있다. 그래서 우리는 그려진 세 줄 a, b, c에서 b줄은 a줄보다 1BAR, c줄은 b줄보다 1BAR, c줄은 a줄보다 2BAR 느린 것을 볼 수 있다.

우리는 그래프를 왼쪽 가장자리로 끌고 가서 첫 번째 K줄에서 b와 c의 값이 모두 null이라는 것을 볼 수 있습니다. 왜냐하면 스크립트가 첫 번째 K줄 BAR에서 실행될 때, 앞을 참조하는 한, 두 주기의 역사값은 존재하지 않기 때문입니다. 그래서 우리는 정책을 작성할 때 종종 주의해야 합니다.nanz이 함수들은 내장 함수들에 대해 판단합니다.nzna함수, 어떤 장을 기억하십니까?) 는 빈값을 구체적으로 다루는 경우입니다. 예를 들어:

close > nz(close[1], open)    // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量

이것은 빈값 ((na) 에 참조할 수 있는 처리이다.


연산자 우선 순위

우리는 이미 많은 파인 언어의 연산자를 배웠고, 이 연산자는 연산자와 연산자 수의 다양한 조합을 통해 표현식을 형성한다. 그렇다면 표현식에서 계산할 때, 이러한 연산들의 우선 순위는 무엇입니까? 우리가 학교에서 배운 네 번째 연산과 마찬가지로, 곱셈이 우선 순위를 가지고 있고, 곱셈이 우선 순위를 가지고 있고, 더하기 더하기 빼기도 계산하고 있습니다. 파인 언어의 표현식도 동일합니다.

우선순위 연산자
9 []
8 1개의 원수 연산자+-그리고not
7 */%
6 이분법 연산자+-
5 ><>=<=
4 ==!=
3 and
2 or
1 ?:

우선 순위가 높은 표현식 부분은 먼저 처리되며, 우선 순위가 같으면 왼쪽에서 오른쪽으로 처리됩니다.()이 부분의 표현식을 먼저 계산하도록 강요하는 포괄식이다.

변수

변수 선언

우리는 이미 표기符의 개념을 배웠고, 표기符은 변수의 이름을 사용하여 변수에 이름을 부여하는 것입니다. 그래서 우리는 또한 이렇게 말할 수 있습니다: 변수는 저장 값의 표기符입니다. 그렇다면 변수를 선언하는 방법은 무엇입니까?

  • 선언 모드: 변수를 선언할 때 가장 먼저 쓰는 것은 "선언 모드"입니다. 변수의 선언 모드는 세 가지로 나니다. 1, 키워드를 사용하세요varᅳ 2. 키워드를 사용하세요varipᅳ 3, 아무것도 쓰지 않습니다.

    varvarip키워드는 사실 우리는 이전 "인수 연산자" 섹션에서 이미 배웠고, 여기에 더 이상 언급되지 않습니다. 만약 변수의 선언 모형이 아무것도 쓰지 않는다면, 예를 들어 문장:i = 1, 사실 우리는 이전에 말했듯이, 이렇게 선언된 변수와 부여는 모든 K 라인 BAR에 실행됩니다.

  • 유형 FMZ의 파인 언어는 타입 요구 사항에 대해 엄격하지 않으며 일반적으로 생략할 수 있다. 그러나 트레이딩 뷰의 스크립트 정책에 호환하기 위해 변수를 선언할 때 타입을 가질 수도 있다. 예를 들어:

    int i = 0 
    float f = 1.1
    

    트레이딩 뷰의 타입은 좀 더 엄격한 요구 사항이며, 다음 코드를 트레이딩 뷰에서 사용하면 오류가 발생합니다:

    baseLine0 = na          // compile time error!
    
  • 아이디 아이디터는 변수 이름이며, 아이디터의 명칭은 이전 장에서 언급되어 왔으며, 다시 살펴볼 수 있습니다:https://www.fmz.com/bbs-topic/9390#标识符

요약하자면, 변수를 선언하면 다음과 같이 쓸 수 있습니다.

// [<declaration_mode>] [<type>] <identifier> = value 
   声明模式             类型     标识符       = 值

여기에서는 부여 연산자를 사용합니다.=변수를 선언할 때 변수에 부여한다. 부여할 때 값은 문자열, 숫자, 표현, 함수 호출,ifforwhile또는switch이 구조의 키워드, 문장 사용법은 후속 강의에서 자세히 설명할 것입니다. 사실 우리는 이전 강의에서 간단한 if 문장의 부여를 배웠고 다시 볼 수 있습니다.)

여기서 우리는 입력 함수를 설명하는데 초점을 맞추고 있습니다. 이 함수는 우리가 정책을 설계할 때 자주 사용하는 함수입니다. 또한 설계 정책에서 매우 중요한 함수입니다.

입력 함수:

input函数,参数defval、title、tooltip、inline、group

FMZ의 입력 함수는 트레이딩 뷰의 입력 함수와 약간 다릅니다. 그러나 이 함수는 전략 파라미터의 부여 입력으로 사용됩니다. 아래는 예를 통해 FMZ에서 입력 함수의 사용을 자세히 설명합니다.

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)

변수를 선언할 때 변수 부여에 자주 사용되는 것은 입력 함수입니다. FMZ에서 입력 함수는 FMZ 정책 인터페이스에서 정책 파라미터를 설정하는 컨트롤을 자동으로 그려냅니다. FMZ에서 지원되는 컨트롤은 현재 숫자 입력 상자, 텍스트 입력 상자, 드래그 아웃 상자, 풀 값 선택 등 기능이 있습니다. 또한 정책 파라미터 분할, 파라미터 설정 팁 텍스트 정보 등을 설정할 수 있습니다.

img

우리는 입력 함수의 몇 가지 주요 매개 변수를 소개합니다.

  • defval: 입력 함수에서 설정된 정책 매개 변수 옵션의 기본 값으로, 파이어 언어의 내장 변수, 숫자, 문자열을 지원합니다
  • title: 실제 디스크/중고된 정책 인터페이스에서 정책이 표시되는 매개 변수 이름.
  • 도구 팁: 정책 파라미터의 팁, 마우스가 정책 파라미터 위에 서 있을 때 이 파라미터가 설정된 텍스트 정보를 표시한다.
  • group: 정책 매개 변수 그룹 이름, 매개 변수 그룹을 지정할 수 있다.

파인 언어는 개별 변수 선언, 부여 이외에도 변수 집합을 선언하고 부여하는 글씨를 가지고 있습니다.

[变量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")

if 언어


더 많은