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

만약 당신이 그렇게 쉽게 배우고 사용하기 쉬운 파이인 언어로 전략을 작성하는 방법을 모른다면...

저자:FMZ~리디아, 창작: 2023-02-16 14:55:00, 업데이트: 2023-09-18 20:18:52

img

만약 당신이 그렇게 쉽게 배우고 사용하기 쉬운 파이인 언어로 전략을 작성하는 방법을 모른다면...

트레이딩뷰에 있는 오픈 소스 전략의 수는 매우 많습니다. 많은 우수한 전략, 아이디어 및 지표가 실제 봇에서 사용할 수 없다는 것은 유감입니다. 이것을 보면서 많은 트레이더에게 양적 거래 기술을 대중화하는 데 헌신하는 FMZ는 자연스럽게 문제를 해결하려는 충동을 억제 할 수 없습니다!

이 경험 공유는 절대적으로 제공되어야 합니다!

그래서, 프로그래밍과 코드 개발의 세계를 여행하고, 9*9=81 pit을 통과하고, 수없이 많은 잠 없는 밤을 살아남고, 구석에 빈 레드불 캔의 산을 쌓은 후. 마지막으로, FMZ는 파이프 언어를 지원하고 호환하며, 모든 종류의 파이프 스크립트를 사용할 수 있습니다.

파인 언어에 관해서, 저는 최근에만 스스로 배웠지만 솔직히 말해서, 양적 거래에 사용되는 파인 언어는 사용하기 쉽고 배우기 쉽습니다. 뭐, 믿지 않니? 네, 네, 네, 네.

/*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="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit spreads") / syminfo.mintick

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("Parameter errors")

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 

// Real-time K-line stage
if not barstate.ishistory
    // Retrieve grid
    for i = 1 to numbers
        // Going long
        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)
        // Going short
        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의 실제 봇, 백테스팅 도구, 그리고 파이프 언어의 단순성과 결합된 수많은 기능은 훌륭한 추가입니다! 매개 변수 설정과 백테스팅 구성 코드를 포함하여, 전체 코드는 50 줄 미만입니다. 초보자를 위해 그리드 전략을 작성하는 데 더 이상 두통이 없습니다.

물론 이 전략은 격자 전략이며, 또한 결함이 있으며, 항상 승리하는 돈 인쇄 기계가 아닙니다. 열쇠는 사용과 매개 변수에 달려 있습니다. 우리는 자신의 거래 논리를 구현하기 위해 쉽게 전략을 작성하는 방법에 더 집중하고 전략을 작성하고 직접 거래함으로써 돈을 벌 것입니다. 도움을 요청하지 않는 것이 너무 멋집니다!

코드 설명

제가 여러분께 설명드리겠습니다. 코드는 간단하고 이해하기 쉽죠. 배우기 쉽고 사용하기 쉬운 파인 언어입니다.

내용/*backtest그리고*/시작에는 FMZ의 백테스트 구성 코드가 있습니다. 이것은 FMZ의 기능이고 파이프 언어의 내용이 아닙니다. 물론, 이 부분을 빼놓을 수 있습니다. 당신은 백테스트 구성과 매개 변수를 설정하기 위해 매개 변수 컨트롤을 수동으로 클릭합니다.

/*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="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit points") / syminfo.mintick
  • strategy(overlay=true): 그것은 스크립트의 일부 옵션을 설정하는 데 사용됩니다, overlay=true, 이는 매개 변수에 true 값을 부여하는 것입니다.overlay, 그래프를 그리는 때, 그것은 주요 차트에 그려집니다 (K-라인 차트는 주요 차트입니다, 그렇게 간단하게 이해할 수 있습니다).
  • varip beginPrice = 0: 변수 beginPrice는 키워드 varip로 시작값이 0으로 선언되며 그릴의 시작값으로 사용됩니다.
  • var spacing = input.float(-1, title="Spacing prices"): 전략 매개 변수를 설정합니다. 매개 변수 이름은 spacing price입니다. 이는 각 그리드 포인트의 거리를 나타냅니다. 100을 설정하면 가격이 100에서 한 번 거래된다는 것을 의미합니다.
  • var dir = input.string("long", title="Directions", options = ["long", "short", "both"]): direction라는 전략 매개 변수를 설정합니다. 이 매개 변수는 길고 짧고 둘 다의 옵션이 있는 드롭다운 박스입니다. 즉, 그리드는 각각 길고 짧고 둘 다입니다.
  • var amount = input.float(-1, title="Order quantity"): 각 그리드 포인트 거래에서 거래량을 제어하는 매개 변수를 설정합니다.
  • var numbers = input.int(-1, title="Number of grids"): 그리드 포인트의 수는, 20을 설정하면 한 방향으로 20개의 그리드 포인트입니다.
  • var profit = input.int(-1, title="Profit spreads") / syminfo.mintick: 포지션을 닫기 전에 각 그리드 포인트 포지션의 이익 마진을 제어하는 매개 변수를 설정합니다.

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

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("Parameter errors")

즉, 간격, 금액, 숫자, 이익과 같은 매개 변수가 설정되지 않으면 기본값은 -1이고 전략은 멈출 것입니다 (매개 변수를 설정하지 않고는 맹목적으로 작동할 수 없습니다)

가자!

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

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

역사적인 BAR 단계는 무엇일까요?

간단한 예를 들어, 현재 순간 A에서 전략이 실행되기 시작하고, 전략은 100 K-라인 BAR의 데이터를 얻습니다. 시간이 지남에 따라 100 BAR는 101, 102...N이됩니다. A 순간부터 실행되기 시작하면 101 번째 BAR는 실시간 K-라인 단계이며, 이 시간은 최신 실시간 데이터입니다. 다음 1 번째 BAR에서 100 번째 BAR까지, 이것들은 지난 역사적 시장 가격이지만 전략은 또한 이러한 역사적 시장 가격에 실행됩니다. 따라서이 단계는 역사적 K-라인 단계입니다.

barstate.ishistory이것은 파이어 언어의 내장 변수입니다.barstate.ishistory현재 BAR가 역사적인 BAR라면 true이고, 역사적인 BAR가 아닌 경우 false입니다. 그래서 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가 아니라 전략에 의해 명령에 주어진 이름 또는 라벨로 이해됩니다.)

다음 단계는 그리드 시트를 시작하는 것입니다.

// Real-time K-line stage
if not barstate.ishistory
    // Retrieve grid
    for i = 1 to numbers
        // Going long
        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)
        // Going short
        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 루프는 사용되며, 루프의 수는 숫자 매개 변수의 값에 따라 결정됩니다. 즉, 해당 수의 주문이 배치됩니다. dir 매개 변수에 따라 방향을 설정하십시오. 현재 그리드 위치에서 레이블의 주문이 열렸는지 여부를 확인하기 위해 findTradeId 함수를 사용하며, 오픈 포지션이 없으면 계획된 주문을 할 수 없습니다. 주문을 할 때, 계획된 주문으로 제한 매개 변수를 지정하기 위해 strategy.order 함수를 사용하십시오. 계획된 주문을 할 때 해당 종료 명령을 배치하십시오. 종료 명령은strategy.exit함수, 이윤 매개 변수를 지정하고 이윤 포인트를 지정합니다.

img

img

이윤 곡선을 보면, 그 네트워크 또한 위험하다는 것을 알 수 있습니다. 그것은 보장된 승리가 아닙니다. 단지 그 네트워크를 대규모로 확장하는 위험이 조금 더 작다는 것입니다.

만약 당신이 그렇게 쉽게 배울 수 있고 사용하기 쉬운 파인 언어로 전략을 작성하는 방법을 모른다면,


관련

더 많은