트레이딩뷰에 오픈소스 전략이 폭발적으로 많고, 많은 훌륭한 전략, 아이디어, 지표가 실행되지 않는 것은 정말 유감입니다. 이것을 보는 것은 FMZ가 수량 거래 기술을 많은 거래자들에게 보급하기 위해 노력하는 것처럼 이러한 문제를 해결하려는 충동을 억제할 수 없다는 것입니다!
이 요구는 절대 참을 수 없습니다!
그래서 프로그래밍 개발 코드의 세계에서 산을 밟고, 수천 개의 산을 걷고, 9 * 9 = 81 덩굴을 통과하고, 수없이 많은 수면없는 밤을 지내고, 벽 모서리를 쌓아 놓은 후, 작은 산의 일반적인 붉은 황소 빈 상자를 쌓았습니다. 마침내 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="间距价格")
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의 실제 디스크, 재검토 도구, 수많은 기능과 파이인 언어의 간편한 사용이 함께, 호랑이처럼 될 수 있습니다! 매개 변수 설정, 재검토 구성 코드를 계산, 전체 코드는 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="间距价格")
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
: 키워드 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="网格数量")
: 20개로 설정하면 하나의 방향으로 20개의 그리드 포인트가 있습니다.var profit = input.int(-1, title="盈利价差") / syminfo.mintick
: 매거진의 매출을 제어하는 매개 변수를 설정합니다. 매거진의 매출은 매거진의 매출을 조절합니다.다음으로, 코드를 보세요:
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("参数错误")
즉, 만약 spacing, amount, numbers, profit 같은 매개 변수가 설정되지 않은 상태에서 기본값이 -1이면, 정책을 중지합니다.
가자!
if not barstate.ishistory and beginPrice == 0
beginPrice := close
이것은 정책이 실시간 K 라인 단계에 있고 beginPrice == 0에 있을 때, beginPrice에 변경값을 주어 현재 최신 가격으로 변경하는 것을 의미합니다. 정책이 정식으로 실행될 때, 초기 현재 가격은 그리드의 초기 가격으로 이해될 수 있습니다. 스크립트는 역사 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
이것은 파인 언어의 내장 변수입니다. 만약 현재의 BAR가 역사 단계의 BAR라면,barstate.ishistory
true가 되면 true가 되고, history가 아닌 BAR가 false가 된다. 그래서 not barstate.ishistory가 true가 되면 realtime 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가 아니라, 정책에 따라 주문에 붙여진 이름 또는 태그입니다.) 존재하지 않으면 문자열 "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 루킹을 사용하여 숫자의 값에 따라 루킹의 수를 결정합니다. 즉, 해당 숫자의 주문을 배치합니다. dir 파라미터에 따라 방향성을 설정합니다. findTradeId 함수를 사용하여 현재 격자 위치에 표시된 주문이 이미 열렸는지 확인하고 열리지 않은 상태에서만 계획 목록으로 내려갑니다.
이윤곡선을 보면 그 네트워크는 위험성이 있고 승부차기가 아니라 큰 규모에서 그 네트워크를 끌어올리는 것에 대한 상대적 위험성이 약간 낮다는 것을 알 수 있습니다.
그래서, 이 쉽게 배울 수 있는 파인 언어를 사용해서, 만약 당신이 아직 전략을 작성하지 않았다면,
스토커이러한 태아 교육 수준 교습은 몇 개 더 될 수 있습니까?
아트론감사합니다.
2009년꿈의 총 V5
발명가들의 수량화 - 작은 꿈예, B 스테이션에서 파이너 튜토리얼 시리즈가 만들어졌습니다:https://www.bilibili.com/video/BV1sU4y1B71i/
발명가들의 수량화 - 작은 꿈이 글은 제 생각에는 정말 좋은 글이라고 생각합니다.
발명가들의 수량화 - 작은 꿈B 방송국에는 PINE 언어 소개 영상도 있습니다.