[TOC]

FMZ는 양적 거래 플랫폼으로서 주로 프로그래매틱 거래자를 대상으로 설계되었습니다. 하지만 기본적인 거래 터미널도 제공합니다. 기능은 간단하지만 가끔 매우 유용할 수 있습니다. 예를 들어, 거래소가 바빠서 열 수 없지만 API는 여전히 작동할 수 있는 경우 터미널을 사용하여 주문을 취소할 수 있습니다. , 주문을 하고, 견적 계정을 확인하는 등의 작업을 할 수 있습니다. 거래 터미널 경험을 개선하기 위해 플러그인 기능이 추가되었습니다. 때때로, 우리는 사다리 보류 주문, 아이스버그 주문, 원클릭 헤지, 원클릭 마감 등과 같이 거래를 돕기 위한 작은 기능이 필요합니다. 우리는 실제로 실행 로그를 볼 필요가 없습니다. 약간 번거롭습니다. 새로운 로봇을 만들려면 터미널에서 플러그인을 클릭하기만 하면 됩니다. 해당 기능을 즉시 실현할 수 있어 수동 거래를 크게 용이하게 할 수 있습니다. 플러그인 위치는 다음과 같습니다.

플러그인 작업에는 즉시 작업과 백그라운드 작업의 두 가지 모드가 있습니다. 백그라운드에서 실행하는 것은 로봇을 만드는 것과 같습니다(일반 요금이 적용됨). 즉각적 작동의 원칙은 디버깅 도구와 동일합니다. 거래 터미널 페이지의 관리자에게 코드 조각을 보내 실행하고 차트 및 표의 반환을 지원합니다(디버깅 도구도 현재 이를 지원하도록 업그레이드됨). ). 마찬가지로 5분 동안만 실행 가능하며, 무료이고 언어에 제한이 없습니다. 실행 시간이 매우 짧은 플러그인은 즉시 실행 모드를 사용할 수 있는 반면, 실행하는 데 시간이 오래 걸리는 복잡한 전략은 여전히 로봇을 실행해야 합니다.
정책을 작성할 때 정책 유형을 플러그인으로 선택해야 합니다. 플러그인의 메인 함수 반환값은 실행 후 터미널에 팝업으로 표시되며, 문자열, 그림, 표를 지원합니다. 플러그인 실행 중에는 로그를 볼 수 없으므로 플러그인의 실행 결과를 반환할 수 있습니다.
표시된 대로 검색창에서 직접 검색하세요.거래 플러그인 유형 전략만 실행할 수 있습니다.를 클릭한 다음 추가를 클릭합니다. 공개 플러그인은 Strategy Square에서 찾을 수 있습니다: https://www.fmz.com/square/21/1

전략을 클릭하여 매개변수 설정 인터페이스로 들어갑니다. 매개변수가 없으면 바로 실행됩니다. 거래 터미널에서 선택한 보관인, 거래 쌍, K-라인 기간은 기본적으로 해당하는 매개변수입니다. 실행 정책을 클릭해 실행을 시작하고, “지금 실행” 모드를 선택하세요(기본 실행 모드를 기억하세요). 플러그인은 로그를 표시하지 않습니다.

플러그인을 중지하려면 아이콘을 클릭하세요. 모든 플러그인이 하나의 디버깅 도구 프로세스에서 실행되므로 모든 플러그인이 중지됩니다.

플러그인은 일정 시간 동안 코드를 실행하고 간단한 작업을 수행할 수 있습니다. 많은 경우, 수동으로 반복해야 하는 작업은 플러그인을 사용하여 구현할 수 있어 거래를 더 편리하게 만들 수 있습니다. 이하에서 구체적인 예를 들어 소개하고, 제공된 소스 코드를 참조하여 나만의 전략을 맞춤 설정할 수 있습니다.
선물의 교차 기간 헤징은 매우 일반적인 전략입니다. 빈도가 높지 않기 때문에 많은 사람들이 수동으로 운영하여 롱 포지션을 취하려면 한 계약, 숏 포지션을 취하려면 한 계약이 필요하며, 가격 차이 추세를 분석할 수 있습니다. 거래 터미널에서 플러그인을 사용하면 에너지를 절약할 수 있습니다.
제가 가장 먼저 소개하고 싶은 것은 기간 간 가격 차이 플러그인입니다.
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
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())
}
가격 차이가 수렴할 때까지 기다리는 동안 포지션을 마감해야 하는 경우 원클릭 마감 플러그인을 실행하여 가장 빠른 속도로 포지션을 마감할 수 있습니다.
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
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
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
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
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)
}
}
그렇게 많은 작은 기능을 본 후에는 여러분만의 아이디어가 생길 것입니다. 수동 거래를 용이하게 하기 위해 플러그인으로 작성하는 것이 좋습니다.