avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1271
수행원

아직도 배우기 쉽고 사용하기 쉬운 Pine 언어를 사용하여 전략을 작성할 수 없다면...

만든 날짜: 2022-06-01 17:37:55, 업데이트 날짜: 2023-09-18 20:19:45
comments   6
hits   2992

아직도 배우기 쉽고 사용하기 쉬운 Pine 언어를 사용하여 전략을 작성할 수 없다면…

아직도 배우기 쉽고 사용하기 쉬운 Pine 언어를 사용하여 전략을 작성할 수 없다면…

TradingView에는 오픈소스 전략이 엄청나게 많습니다. 너무나 많은 훌륭한 전략, 아이디어, 지표를 실제로 적용할 수 없다는 것은 유감스러운 일입니다. 이를 보고, 많은 트레이더에게 양적 거래 기술을 대중화하는 데 전념하는 FMZ에서는 당연히 이러한 요구를 해결하려는 욕구를 억누를 수 없습니다!

이런 요구는 도저히 참을 수 없습니다!

그래서 저는 프로그래밍 코드의 세계에서 산과 강을 여행하며 9가지 경험을 했습니다.*9=81 피트, 셀 수 없이 많은 잠 못 이루는 밤을 견뎌낸 끝에 빈 레드불 캔이 한 구석에 산처럼 쌓였습니다. 마지막으로, FMZ는 Pine 언어와 호환되며, 모든 종류의 TradingView Pine 스크립트를 사용할 수 있습니다.

소나무 언어에 관해 말하자면, 저는 최근에야 스스로 그것을 배웠습니다. 하지만 솔직히 말해서, 양적 거래를 위한 Pine 언어는 정말 간단하고, 사용하기 쉬우며 배우기도 쉽습니다. 무엇? 믿지 못하시나요? 내가 당신을 위해 그리드 전략을 쓰는 것을 보세요~

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利价差") / syminfo.mintick

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

FMZ의 실시간 거래, 백테스팅 도구, 다양한 기능, 그리고 Pine 언어의 사용 편의성은 마치 호랑이에게 날개를 달아주는 것과 같습니다! 매개변수 설정과 백테스트 구성 코드를 포함하여 총 코드 수는 50줄을 초과하지 않습니다. 초보자는 더 이상 그리드 작성에 대해 걱정할 필요가 없습니다…

물론, 이 전략은 그리드 전략입니다. 그리드 전략에도 단점이 있으며, 돈을 찍어내는 기계가 보장되지는 않습니다. 핵심은 사용법과 매개변수에 있습니다. 이 부분에 대해서는 자세히 설명하지 않겠습니다. 전략을 쉽게 작성하고, 자신의 거래 논리를 구현하고, 자신의 전략을 작성하여 돈을 버는 방법에 대해 더 집중해 보겠습니다. 누구에게도 도움을 요청하지 않고도 기분이 너무 좋습니다! !

코드 설명

설명드리자면, 코드는 간단하고 이해하기 쉽습니다. 배우기 쉽고 사용하기 쉬운 Pine 언어를 사용하여 전략을 작성할 수 없다면, 저는…….. ……… …………………………..자세히 말씀드릴게요!

처음에/*backtest그리고*/래핑된 내용은 FMZ 백테스트 구성 코드이며, 이는 FMZ의 기능이며 Pine 언어의 내용은 아닙니다. 물론, 이 부분을 쓰지 않기로 선택할 수 있습니다. 백테스트를 할 때는 매개변수 컨트롤을 수동으로 클릭하여 백테스트 구성과 매개변수를 설정해야 합니다.

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

다음 코드:

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利点数") / syminfo.mintick
  • strategy(overlay=true): 스크립트의 일부 옵션을 설정하는 데 사용되며, overlay=true는 매개변수를 제공하는 것입니다.overlay차트의 주요 그림에 그림을 그리려면 true 값을 지정합니다(K-선 차트가 주요 그림이며, 이렇게 간단하게 이해할 수 있습니다).
  • varip beginPrice = 0: 변수 beginPrice는 키워드 varip을 사용하여 선언되고 초기에는 0 값이 할당됩니다. 이 값은 그리드의 초기 가격으로 사용됩니다.
  • var spacing = input.float(-1, title="间距价格"): 전략 매개변수를 설정합니다. 매개변수 이름은 “interval price”로, 각 그리드 포인트 사이의 간격입니다. 100으로 설정하면 가격이 100을 초과할 때마다 거래가 이루어진다는 의미입니다.
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"]): “방향”이라는 이름의 전략 매개변수가 설정되었습니다. 이 매개변수는 드롭다운 상자가 있는 옵션이며, 긴 것, 짧은 것 또는 둘 다를 선택할 수 있습니다. 이들은 각각 그리드가 롱으로만 거래됨, 숏으로만 거래됨, 롱과 숏이 모두 거래됨을 나타냅니다.
  • var amount = input.float(-1, title="下单量"): 각 그리드 포인트 거래에서 거래량을 제어하기 위한 매개변수를 설정합니다.
  • var numbers = input.int(-1, title="网格数量"): 그리드 포인트의 수입니다. 20으로 설정하면 한 방향으로 20개의 그리드 포인트가 있다는 의미입니다.
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintick: 각 그리드 지점의 위치가 닫힐 가격 차이를 제어하는 ​​매개변수를 설정합니다.

다음으로, 코드를 살펴보세요.

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

즉, 간격, 양, 숫자, 이익 등의 매개변수 중 하나라도 설정하지 않으면 기본값은 -1이 되어 전략이 중단됩니다(매개변수를 설정하지 않고는 돌아다닐 수 없죠 ~ 하하!)

Go on !

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

이는 전략이 실시간 K-라인 단계에 있고 beginPrice == 0인 경우 beginPrice 값을 현재 최신 가격으로 수정한다는 것을 의미합니다. 전략이 공식적으로 실행될 때는 초기 현재 가격이 그리드의 초기 가격이라는 것을 알 수 있습니다. 스크립트에 역사적 K-라인 BAR 단계가 있기 때문에 전략은 역사적 BAR 단계에서 논리를 실행합니다. 역사적 BAR에 그리드를 배치하는 것은 확실히 의미가 없습니다.

과거 BAR 단계란 무엇입니까?

간단한 예를 들어보자면, 현재 A에서 전략이 실행되기 시작하고, 전략은 100개의 K-line BAR로 데이터를 얻습니다. 시간이 지남에 따라 100개의 BAR는 확실히 101, 102… N이 될 것입니다. A 시점부터 실행할 경우, 101번째 BAR은 실시간 K-라인 단계이며, 이는 가장 최신 실시간 데이터입니다. 따라서 1번째 BAR에서 100번째 BAR까지는 모두 지나간 역사적 시장 조건이지만, 이 전략도 이러한 역사적 시장 조건을 기반으로 실행될 것이므로 이 단계는 역사적 K-라인 단계입니다.

barstate.ishistory이것은 Pine 언어의 내장 변수입니다. 현재 BAR이 과거 BAR인 경우,barstate.ishistory과거 BAR이 아니면 거짓입니다. 따라서 barstate.ishistory가 true가 아닌 경우에는 실시간 K-라인 단계에 있습니다.

다음으로, 우리는 함수를 생성했습니다.

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

이 함수의 기능은 현재 열려 있는 모든 주문에 특정 ID가 있는지 확인하는 것입니다. 존재하는 경우 findTradeId 함수는 호출될 때 기존 주문의 ID를 반환합니다(이 ID는 주문 ID가 아님에 유의하세요). 거래소이지만 전략에 의해 주문에 할당된 ID) 또는 레이블로 해석되는 경우 존재하지 않으면 문자열 “notFound”를 반환합니다.

다음으로, 메쉬 시트를 시작합니다.

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

for 루프는 numbers 매개변수 값에 따라 루프 횟수를 결정하고, 즉, 해당하는 개수의 순서를 정렬하는 데 사용됩니다. dir 매개변수에 따라 방향을 설정합니다. findTradeId 함수를 사용하여 현재 그리드 위치에 있는 레이블의 주문이 열렸는지 확인합니다. 계획된 주문은 열지 않은 경우에만 실행하세요(열렸다면 중복 주문을 실행할 수 없습니다). 주문할 때 strategy.order 함수를 사용하여 limit 매개변수를 지정하여 계획 주문을 합니다. 계획주문을 하는 동시에 해당 마감주문을 합니다. 포지션을 마감하려면 strategy.exit 함수를 사용하고, profit 매개변수를 지정하고, 이익 포인트를 지정하세요.

아직도 배우기 쉽고 사용하기 쉬운 Pine 언어를 사용하여 전략을 작성할 수 없다면…

아직도 배우기 쉽고 사용하기 쉬운 Pine 언어를 사용하여 전략을 작성할 수 없다면…

아직도 배우기 쉽고 사용하기 쉬운 Pine 언어를 사용하여 전략을 작성할 수 없다면…

아직도 배우기 쉽고 사용하기 쉬운 Pine 언어를 사용하여 전략을 작성할 수 없다면…

수익률 곡선만 봐도 그리드에도 위험이 있고, 반드시 이긴다는 보장은 없다는 걸 알 수 있다. 그리드를 대규모로 확대하면 위험이 상대적으로 작아질 뿐이다.

글쎄요, 아직도 배우기 쉽고 사용하기 쉬운 Pine 언어로 전략을 작성할 수 없다면…