소개
FMZ는 양적 거래 플랫폼으로서 주로 프로그래매틱 거래자를 대상으로 설계되었습니다. 하지만 기본적인 거래 터미널도 제공합니다. 기능은 간단하지만 가끔 매우 유용할 수 있습니다. 예를 들어, 거래소가 바빠서 열 수 없지만 API는 여전히 작동할 수 있는 경우 터미널을 사용하여 주문을 취소할 수 있습니다. , 주문을 하고, 견적 계정을 확인하는 등의 작업을 할 수 있습니다. 거래 터미널 경험을 개선하기 위해 플러그인 기능이 추가되었습니다. 때때로, 우리는 사다리 보류 주문, 아이스버그 주문, 원클릭 헤지, 원클릭 마감 등과 같이 거래를 돕기 위한 작은 기능이 필요합니다. 우리는 실제로 실행 로그를 볼 필요가 없습니다. 약간 번거롭습니다. 새로운 로봇을 만들려면 터미널에서 플러그인을 클릭하기만 하면 됩니다. 해당 기능을 즉시 실현할 수 있어 수동 거래를 크게 용이하게 할 수 있습니다. 플러그인 위치는 다음과 같습니다.
플러그인 원리
플러그인 작업에는 즉시 작업과 백그라운드 작업의 두 가지 모드가 있습니다. 백그라운드에서 실행하는 것은 로봇을 만드는 것과 같습니다(일반 요금이 적용됨). 즉각적 작동의 원칙은 디버깅 도구와 동일합니다. 거래 터미널 페이지의 관리자에게 코드 조각을 보내 실행하고 차트 및 표의 반환을 지원합니다(디버깅 도구도 현재 이를 지원하도록 업그레이드됨). ). 마찬가지로 5분 동안만 실행 가능하며, 무료이고 언어에 제한이 없습니다. 실행 시간이 매우 짧은 플러그인은 즉시 실행 모드를 사용할 수 있는 반면, 실행하는 데 시간이 오래 걸리는 복잡한 전략은 여전히 로봇을 실행해야 합니다.
정책을 작성할 때 정책 유형을 플러그인으로 선택해야 합니다. 플러그인의 메인 함수 반환값은 실행 후 터미널에 팝업으로 표시되며, 문자열, 그림, 표를 지원합니다. 플러그인 실행 중에는 로그를 볼 수 없으므로 플러그인의 실행 결과를 반환할 수 있습니다.
사용 방법
-
- 전략 추가
표시된 대로 검색창에서 직접 검색하세요.**거래 플러그인 유형 전략만 실행할 수 있습니다.**를 클릭한 다음 추가를 클릭합니다. 공개 플러그인은 Strategy Square에서 찾을 수 있습니다: https://www.fmz.com/square/21/1
-
- 플러그인을 실행하세요
전략을 클릭하여 매개변수 설정 인터페이스로 들어갑니다. 매개변수가 없으면 바로 실행됩니다. 거래 터미널에서 선택한 보관인, 거래 쌍, K-라인 기간은 기본적으로 해당하는 매개변수입니다. 실행 정책을 클릭해 실행을 시작하고, "지금 실행" 모드를 선택하세요(기본 실행 모드를 기억하세요). 플러그인은 로그를 표시하지 않습니다.
-
- 플러그인을 중지합니다.
플러그인을 중지하려면 아이콘을 클릭하세요. 모든 플러그인이 하나의 디버깅 도구 프로세스에서 실행되므로 모든 플러그인이 중지됩니다.
플러그인 사용 예
플러그인은 일정 시간 동안 코드를 실행하고 간단한 작업을 수행할 수 있습니다. 많은 경우, 수동으로 반복해야 하는 작업은 플러그인을 사용하여 구현할 수 있어 거래를 더 편리하게 만들 수 있습니다. 이하에서 구체적인 예를 들어 소개하고, 제공된 소스 코드를 참조하여 나만의 전략을 맞춤 설정할 수 있습니다.
지원 수동 선물 교차 기간 헤지
선물의 교차 기간 헤징은 매우 일반적인 전략입니다. 빈도가 높지 않기 때문에 많은 사람들이 수동으로 운영하여 롱 포지션을 취하려면 한 계약, 숏 포지션을 취하려면 한 계약이 필요하며, 가격 차이 추세를 분석할 수 있습니다. 거래 터미널에서 플러그인을 사용하면 에너지를 절약할 수 있습니다.
제가 가장 먼저 소개하고 싶은 것은 기간 간 가격 차이 플러그인입니다.
pine
var chart = {
__isStock: true,
title : { text : '差价分析图'},
xAxis: { type: 'datetime'},
yAxis : {
title: {text: '差价'},
opposite: false,
},
series : [
{name : "diff", data : []},
]
}
function main() {
exchange.SetContractType('quarter')
var recordsA = exchange.GetRecords(PERIOD_M5) //周期可以自行定制
exchange.SetContractType('this_week')
var recordsB = exchange.GetRecords(PERIOD_M5)
for(var i=0;i<Math.min(recordsA.length,recordsB.length);i++){
var diff = recordsA[recordsA.length-Math.min(recordsA.length,recordsB.length)+i].Close - recordsB[recordsB.length-Math.min(recordsA.length,recordsB.length)+i].Close
chart.series[0].data.push([recordsA[recordsA.length-Math.min(recordsA.length,recordsB.length)+i].Time, diff])
}
return chart
}
클릭 한 번으로 최근 기간 간 스프레드를 한눈에 볼 수 있습니다. 플러그인 소스 코드 복사 주소: https://www.fmz.com/strategy/187755

스프레드 분석을 통해 스프레드가 수렴하는 것을 발견했는데, 이는 분기 계약을 숏 포지션하고 현재 주 계약을 롱 포지션할 수 있는 기회입니다. 이때 원클릭 헤지 플러그인을 사용할 수 있습니다. 한 번의 클릭으로 자동으로 분기 계약을 숏하고 현재 주를 롱하는 데 도움이 되며, 이는 수동 작업보다 빠릅니다. 꽤 많습니다. 전략의 구현 원칙은 슬리피지로 같은 수의 포지션을 여는 것입니다. 필요한 포지션에 천천히 도달하고 시장에 영향을 미치지 않도록 여러 번 실행할 수 있습니다. 기본 매개변수를 변경하여 더 빨리 주문을 할 수 있습니다. 전략 사본 주소: https://www.fmz.com/strategy/191348
javascript
function main(){
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
var ticker_A = exchange.GetTicker()
if(!ticker_A){return 'Unable to get quotes'}
exchange.SetDirection('buy')
var id_A = exchange.Buy(ticker_A.Sell+Slip, Amount)
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
var ticker_B = exchange.GetTicker()
if(!ticker_B){return 'Unable to get quotes'}
exchange.SetDirection('sell')
var id_B = exchange.Sell(ticker_B.Buy-Slip, Amount)
if(id_A){
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
exchange.CancelOrder(id_A)
}
if(id_B){
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
exchange.CancelOrder(id_B)
}
return 'Position: ' + JSON.stringify(exchange.GetPosition())
}
가격 차이가 수렴할 때까지 기다리는 동안 포지션을 마감해야 하는 경우 원클릭 마감 플러그인을 실행하여 가장 빠른 속도로 포지션을 마감할 수 있습니다.
pine
function main(){
while(ture){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){return '无法获取ticker'}
if(!pos || pos.length == 0 ){return '已无持仓'}
for(var i=0;i<pos.length;i++){
if(pos[i].Type == PD_LONG){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closebuy')
exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
}
if(pos[i].Type == PD_SHORT){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closesell')
exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
}
}
var orders = exchange.Getorders()
Sleep(500)
for(var j=0;j<orders.length;j++){
if(orders[i].Status == ORDER_STATE_PENDING){
exchange.CancelOrder(orders[i].Id)
}
}
}
}
지원 스팟 거래
가장 흔한 것은 아이스버그 주문으로, 대량 주문을 소량 주문으로 분할합니다. 로봇으로 실행할 수 있지만, 실제로는 5분 플러그인으로 충분합니다. 아이스버그 주문에는 두 가지 유형이 있는데, 하나는 주문을 받는 것이고 다른 하나는 주문을 하는 것입니다. 취급 수수료 할인이 있는 경우 주문을 하는 것을 선택할 수 있으며, 이는 실행 시간이 길어짐을 의미합니다.
다음 코드는 Iceberg Order Buying 플러그인의 소스 코드입니다: https://www.fmz.com/strategy/191771. 소스코드 판매: https://www.fmz.com/strategy/191772
pine
function main(){
var initAccount = _C(exchange.GetAccount)
while(true){
var account = _C(exchange.GetAccount)
var dealAmount = account.Stocks - initAccount.Stocks
var ticker = _C(exchange.GetTicker)
if(BUYAMOUNT - dealAmount >= BUYSIZE){
var id = exchange.Buy(ticker.Sell, BUYSIZE)
Sleep(INTERVAL*1000)
if(id){
exchange.CancelOrder(id) // May cause error log when the order is completed, which is all right.
}else{
throw 'buy error'
}
}else{
account = _C(exchange.GetAccount)
var avgCost = (initAccount.Balance - account.Balance)/(account.Stocks - initAccount.Stocks)
return 'Iceberg order to buy is done, avg cost is '+avgCost
}
}
}
항상 '하나 사거나 하나 팔기' 가격을 고수하는 것도 상품을 천천히 배송하는 방법으로, 시장에 미치는 영향이 비교적 작습니다. 이 전략에는 아직 개선할 부분이 있습니다. 최소 거래량이나 정확도를 수동으로 변경할 수 있습니다.
매수: https://www.fmz.com/strategy/191582 매도: https://www.fmz.com/strategy/191730
pine
function GetPrecision(){
var precision = {price:0, amount:0}
var depth = exchange.GetDepth()
for(var i=0;i<exchange.GetDepth().Asks.length;i++){
var amountPrecision = exchange.GetDepth().Asks[i].Amount.toString().indexOf('.') > -1 ? exchange.GetDepth().Asks[i].Amount.toString().split('.')[1].length : 0
precision.amount = Math.max(precision.amount,amountPrecision)
var pricePrecision = exchange.GetDepth().Asks[i].Price.toString().indexOf('.') > -1 ? exchange.GetDepth().Asks[i].Price.toString().split('.')[1].length : 0
precision.price = Math.max(precision.price,pricePrecision)
}
return precision
}
function main(){
var initAccount = exchange.GetAccount()
if(!initAccount){return '无法获取账户信息'}
var precision = GetPrecision()
var buyPrice = 0
var lastId = 0
var done = false
while(true){
var account = _C(exchange.GetAccount)
var dealAmount = account.Stocks - initAccount.Stocks
var ticker = _C(exchange.GetTicker)
if(BuyAmount - dealAmount > 1/Math.pow(10,precision.amount) && ticker.Buy > buyPrice){
if(lastId){exchange.CancelOrder(lastId)}
var id = exchange.Buy(ticker.Buy, _N(BuyAmount - dealAmount,precision.amount))
if(id){
lastId = id
}else{
done = true
}
}
if(BuyAmount - dealAmount <= 1/Math.pow(10,precision.amount)){done = true}
if(done){
var avgCost = (initAccount.Balance - account.Balance)/dealAmount
return 'order is done, avg cost is ' + avgCost // including fee cost
}
Sleep(Intervel*1000)
}
}
때로는 더 나은 가격에 판매하거나 할인 혜택을 기다리기 위해 특정 간격으로 여러 주문을 할 수 있습니다. 이 플러그인은 선물 보류 주문에도 사용할 수 있습니다. 소스코드 복사 주소: https://www.fmz.com/strategy/190017
pine
function main() {
var ticker = exchange.GetTicker()
if(!ticker){
return 'Unable to get price'
}
for(var i=0;i<N;i++){
if(Type == 0){
if(exchange.GetName().startsWith('Futures')){
exchange.SetDirection('buy')
}
exchange.Buy(Start_Price-i*Spread,Amount+i*Amount_Step)
}else if(Type == 1){
if(exchange.GetName().startsWith('Futures')){
exchange.SetDirection('sell')
}
exchange.Sell(Start_Price+i*Spread,Amount+i*Amount_Step)
}else if(Type == 2){
exchange.SetDirection('closesell')
exchange.Buy(Start_Price-i*Spread,Amount+i*Amount_Step)
}
else if(Type == 3){
exchange.SetDirection('closebuy')
exchange.Sell(Start_Price+i*Spread,Amount+i*Amount_Step)
}
Sleep(500)
}
return 'order complete'
}
지원형 상품선물거래
일반적으로 사용되는 선물 거래 소프트웨어에는 손절매 주문, 조건부 주문 등의 고급 주문 기능이 많이 들어 있으며, 이러한 기능은 플러그인에 쉽게 작성할 수 있습니다. 다음은 보류 중인 주문을 실행하자마자 바로 닫을 수 있는 플러그인입니다. 주소 복사: https://www.fmz.com/strategy/187736
pine
var buy = false
var trade_amount = 0
function main(){
while(true){
if(exchange.IO("status")){
exchange.SetContractType(Contract)
if(!buy){
buy = true
if(Direction == 0){
exchange.SetDirection('buy')
exchange.Buy(Open_Price, Amount)
}else{
exchange.SetDirection('sell')
exchange.Sell(Open_Price, Amount)
}
}
var pos = exchange.GetPosition()
if(pos && pos.length > 0){
for(var i=0;i<pos.length;i++){
if(pos[i].ContractType == Contract && pos[i].Type == Direction && pos[i].Amount-pos[i].FrozenAmount>0){
var cover_amount = math.min(Amount-trade_amount, pos[i].Amount-pos[i].FrozenAmount)
if(cover_amount >= 1){
trade_amount += cover_amount
if(Direction == 0){
exchange.SetDirection('closebuy_today')
exchange.Sell(Close_Price, cover_amount)
}else{
exchange.SetDirection('closesell_today')
exchange.Buy(Close_Price, cover_amount)
}
}
}
}
}
} else {
LogStatus(_D(), "未连接CTP !")
Sleep(10000)
}
if(trade_amount >= Amount){
Log('任务完成')
return
}
Sleep(1000)
}
}
요약하다
그렇게 많은 작은 기능을 본 후에는 여러분만의 아이디어가 생길 것입니다. 수동 거래를 용이하게 하기 위해 플러그인으로 작성하는 것이 좋습니다.
报错是什么原因?
Error: Futures_OP 0: 400: {"error_message":"Open orders exist","code":35017,"error_code":"35017","message":"Open orders exist"} Buy(5000, 0.1): 400: {"error_message":"order_size error","result":"true","error_code":"35063","order_id":"-1"}
- 1






