[TOC]
FMZ는 양적 거래 플랫폼으로, 주로 프로그래머 트레이더를 서비스하기 위해 제공된다. 그러나 또한 기본적인 거래 단말기를 제공합니다. 기능은 간단하지만 때로는 유용합니다. 예를 들어 거래소가 바쁘게 열 수 없으며 API는 여전히 작동 할 수 있습니다. 이 경우 단말기를 통해 환불, 주문, 거래 계좌 등을 확인할 수 있습니다. 거래 단말기의 경험을 개선하기 위해 플러그인 기능을 추가했습니다. 때로는 계단 힐링, 아이스크림 위탁, 한 키 헤딩, 한 키 평면 등의 작업을 지원하는 작은 기능이 필요합니다.
플러그인 실행에는 두 가지 모드가 있습니다. 즉석 실행과 배경 실행. 배경 실행은 로봇을 만드는 것과 같습니다. 즉석 실행과 디제이팅 도구의 원리는 동일합니다: 거래 단말 페이지로 코드 한 부분을 보내는 호스트가 실행하고, 회전 차트와 표를 지원합니다. 디제이팅 도구는 현재 업그레이드 된 지원도 있습니다. 마찬가지로 5 분 동안 실행 할 수 있습니다. 요금없이, 언어 제한이 없습니다. 실행 시간이 매우 짧은 플러그인은 즉각 실행 모드로 실행 될 수 있습니다. 복잡한, 오래 실행하는 전략이 필요하거나 로봇이 필요합니다.
정책 작성시에는 플러그인으로 정책 유형을 선택해야 합니다.플러그인의 main 함수 return의 결과는 실행이 끝나면 단말기에서 튀어나와 문자열, 도표, 테이블을 지원한다. 플러그인 실행이 로그를 볼 수 없기 때문에 플러그인의 실행 결과 return를 반환할 수 있다.
이 글은 Google 검색어에서 직접 검색하면참고로 트랜잭션 플러그인 타입 정책만 실행할 수 있습니다., 그리고 추가를 클릭합니다. 공개 플러그인은 전략 광장에서 찾을 수 있습니다: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분 플러그인이 실제로 충분합니다. 아이시만 위탁은 두 가지 종류가 있습니다. 하나는 식사单, 하나는 挂单, 절차 요금이 있다면 挂单을 선택할 수 있습니다.
다음 코드는 아이스크림이 플러그인 소스 코드를 구매하도록 위탁한 코드입니다: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)
}
}
이렇게 많은 작은 기능들을 보고, 당신은 당신의 아이디어를 가지고 있어야 하고, 어쩌면 플러그인을 작성하여 자신의 수동 거래를 편리하게 할 수도 있다.
초목거래소 문서를 확인하거나 거래소 고객 서비스를 문의하십시오.