파인 언어를 사용하여 반 자동 거래 도구를 작성

저자:리디아, 창작: 2022-11-08 09:56:48, 업데이트: 2023-09-15 20:52:26

img

완전히 자동화 된 거래를 위한 프로그램을 작성하는 트레이더가 점점 더 많아지고 있지만, 더 큰 그룹은 여전히 수동 트레이더입니다. 사실, 수동 주관적 트레이더는 주관적 거래에 도움을 줄 수있는 작은 도구를 작성할 수 있습니다. 예를 들어, 때로는 좋은 엔트리 포지션을 발견하고 초기 포지션에 고정 스톱 로스 및 트레일 수익을 설정 할 계획입니다. 그 다음 후속 시장 모니터링과 같은 더 많은 에너지 소모 요소를 생략하고, 자신의 설립 된 스톱 로스 및 트레이프 계획을 정확하게 따르고, 프로그램을 위해 시장 모니터링을 할 수 있습니다. 손해를 입는 것에 대한 스톱 로스, 승리에 대한 트레일 이익 베팅은 수동 거래에 도움이 됩니다.

매개 변수 설계

파인 언어를 사용하여 이러한 요구 사항을 설계하는 전략은 매우 간단합니다. 요구 사항에 따라 기능을 달성하기 위해 다음 매개 변수를 설계해야합니다.

  1. 오프셋 (offset): 후속 스톱프로프트가 트리거될 때, 스톱프로프트 라인을 구분하기 위해 가장 높은 가격과 가장 낮은 가격을 오프셋하는 오프셋 거리가 필요합니다.
  2. 한계: 제어하는 데 사용되는 매개 변수 - A. 직접 구매하기 위한 초기 기본 위치, B. 구매하기 위해 기다려야 할 특정 가격, C. 아무것도 하지 마십시오.
  3. 금액: 기본 포지션이 열릴 때 배치된 오더의 금액.
  4. 손실: 손실을 멈추는 지점
  5. 타겟 오프셋 (targetOffset): 트래일링 스톱프로프트가 발생했을 때 개시 가격을 상쇄하는 가격 차이.
  6. minTick: 가격 변동의 최소 단위.
  7. 방향: 기본 위치 개척 방향.

전략 설계

/*backtest
start: 2022-09-24 00:00:00
end: 2022-09-27 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["v_input_1",20],["v_input_2",0],["v_input_4",50],["v_input_5",20],["RunMode",1,358374],["ZPrecision",0,358374],["XPrecision",3,358374]]
*/

strategy("Tracking loss and profit stopping entrustment", overlay = true)

varip targetPrice = na
varip high_lowPrice = na
varip isTrade = false 
varip isAlert = false
varip isAlertMinTick = false
varip isAlertFinished = false 

varip offset = input(30, "offset", "Tracking stop loss and stop profit offset")
varip limit = input(-1, "limit", "Initial opening price: - 1 means no opening, 0 means immediate opening, and other specific values are price limits")
varip amount = input(1, "amount", "amount of opening positions")
varip loss = input(30, "loss", "stop loss")
varip targetOffset = input(30, "targetOffset", "trigger tracking profit and loss stop offset")
varip minTick = input(1, "minTick", "the minimum unit of price fluctuation")
tradeType = input.string("long", "direction", tooltip="order direction, long: go long, short: go short", options=["long", "short"])

if not barstate.ishistory and not isAlertMinTick
    runtime.log("check whether syminfo.mintick is correct! syminfo.mintick:", syminfo.mintick, "#FF0000")
    if syminfo.mintick < minTick 
        runtime.error("system syminfo.mintick < minTick parameter", "#FF0000")
    isAlertMinTick := true 

if not barstate.ishistory and limit == -1 and not isAlert
    runtime.log("No open price is set, current limit is -1 (to prevent false openings, initial default limit is -1), openings are prohibited", "#FF0000")
    isAlert := true 

if isTrade and strategy.position_size == 0 and not isAlertFinished
    runtime.log("All order processes executed, position is 0", "#FF0000")
    isAlertFinished := true 

if not barstate.ishistory and not isTrade and limit != -1
    if limit == 0 
        strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount)
    else if limit > 0 
        strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount, limit=limit)
    
    if tradeType == "long"
        targetPrice := (limit == 0 ? close : limit) + targetOffset
    else 
        targetPrice := (limit == 0 ? close : limit) - targetOffset
    strategy.exit("exit", "open", amount, loss=loss, trail_price=targetPrice, trail_offset=offset)
    runtime.log("The price per point is:", syminfo.mintick, ", current close:", close)
    isTrade := true 

if ((close > targetPrice and strategy.position_size > 0) or (close < targetPrice and strategy.position_size < 0)) and not barstate.ishistory
    high_lowPrice := na(high_lowPrice) ? close : high_lowPrice
    if strategy.position_size > 0 
        high_lowPrice := close > high_lowPrice ? close : high_lowPrice
    else 
        high_lowPrice := close < high_lowPrice ? close : high_lowPrice

plot(targetPrice, "trail_price trigger line")    
plot(strategy.position_size!=0 ? high_lowPrice : na, "current highest/lowest price")
plot(strategy.position_size!=0 ? (strategy.position_size > 0 ? high_lowPrice-syminfo.mintick*offset : high_lowPrice+syminfo.mintick*offset) : na, "moving stop loss trigger line")

전략의 설계는 복잡하지 않지만, 그것은 "실제 가격 모델"으로 설정되어야합니다. 왜냐하면 가격은 모든 순간에 모니터링되어야하기 때문입니다.

img

스톱 손실은 포인트 (minTick) 로 표현되고 오프셋도 포인트 (minTick) 로 표현된다는 점에 유의하십시오. 타겟 오프셋 후속 스톱 노프치 트리거 라인의 오프셋은 가격 거리의 관점에서 표현됩니다 (예를 들어, 거리를 위해 RMB30로 설정됩니다). minTick이 1일 때, 30은 거리를 위해 RMB30을 의미합니다.

이 수수료 전략은 초기 기본 포지션뿐만 아니라 초기 기본 포지션도 짧게 할 수 있도록 설계되었습니다.

설계 구현을 다음과 같이 보여드리겠습니다.

1. 전략이 실행되면 기본 포지션은 즉시 열리고 입력되며 그 다음 매개 변수에 따라 손실 중지 및 추적 스톱 이윤이 설정됩니다.

img

방향은 길게 설정, 한계 매개 변수는 0으로 설정, 즉, 전략이 실행되고 즉시 길게 입력하고, 금액은 1로 설정, 즉, 전략은 1 계약의 위치를 열 수 있습니다.

img

2. 제한 매개 변수를 지정, 입력 가격을 지정

다른 매개 변수 설정은 변경되지 않습니다. 지정된 한계 매개 변수 값은: 1276

img

3. 기본 한계 매개 변수는 -1, 아무것도 작동하지 않고 사고로 포지션 개척을 방지합니다

img

파인 언어 전략을 사용할 때 minTick 데이터에 특별한 주의를 기울이는 것이 중요합니다. 시스템 내의 정확한 가격 minTick 수는 매개 변수에서 가격 통화 정확성과 관련이 있습니다.

img

매개 변수 Pricing Currency Accuracy은 0으로 설정되어 있으며, 이는 가격 데이터 값이 한 자리까지 정확하다는 것을 의미합니다. 그러면 최소 가격 변화 단위는 1입니다. 일부 매개 변수는 정확한 minTicks 수와 관련이 있기 때문에 추가적인 주의가 필요합니다.

자, 위의 것은 이 반 자동 수수료 전략의 전체 디자인입니다. 비록 나는 또한 실제 봇 거래에 사용한다. 그러나 이러한 도구는 또한 이해하기 위해 자신의 거래 습관에 따라 사용되어야 합니다. 특정 수정, 최적화는 스스로 수행 할 수 있습니다. 여기 전략 코드는 공개 공유, 교환 학습 디자인과 논리만을 위한 것입니다.

우리가 볼 수 있듯이, 파인 언어는 사용하기 매우 쉽고, 그것은 편리하고 쉽게 배울 수 있습니다. 우리는 복잡한 프로그래밍에 대해 걱정할 필요 없이, 우리가 원하는 도구를 신속하게 설계 하 고 FMZ 양적 거래 플랫폼에서 양적 거래를 더 쉽게 하기 위해 파인 언어를 사용할 수 있습니다.


관련

더 많은