3
집중하다
1444
수행원

수동 거래를 용이하게 하기 위해 거래 터미널 플러그인을 사용하세요

만든 날짜: 2020-02-29 21:04:52, 업데이트 날짜: 2023-10-12 21:21:40
comments   2
hits   4054

[TOC] 수동 거래를 용이하게 하기 위해 거래 터미널 플러그인을 사용하세요

소개

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

수동 거래를 용이하게 하기 위해 거래 터미널 플러그인을 사용하세요

플러그인 원리

플러그인 작업에는 즉시 작업과 백그라운드 작업의 두 가지 모드가 있습니다. 백그라운드에서 실행하는 것은 로봇을 만드는 것과 같습니다(일반 요금이 적용됨). 즉각적 작동의 원칙은 디버깅 도구와 동일합니다. 거래 터미널 페이지의 관리자에게 코드 조각을 보내 실행하고 차트 및 표의 반환을 지원합니다(디버깅 도구도 현재 이를 지원하도록 업그레이드됨). ). 마찬가지로 5분 동안만 실행 가능하며, 무료이고 언어에 제한이 없습니다. 실행 시간이 매우 짧은 플러그인은 즉시 실행 모드를 사용할 수 있는 반면, 실행하는 데 시간이 오래 걸리는 복잡한 전략은 여전히 ​​로봇을 실행해야 합니다.

정책을 작성할 때 정책 유형을 플러그인으로 선택해야 합니다. 플러그인의 메인 함수 반환값은 실행 후 터미널에 팝업으로 표시되며, 문자열, 그림, 표를 지원합니다. 플러그인 실행 중에는 로그를 볼 수 없으므로 플러그인의 실행 결과를 반환할 수 있습니다.

사용 방법

  • 1. 전략 추가

표시된 대로 검색창에서 직접 검색하세요.거래 플러그인 유형 전략만 실행할 수 있습니다.를 클릭한 다음 추가를 클릭합니다. 공개 플러그인은 Strategy Square에서 찾을 수 있습니다: https://www.fmz.com/square/21/1

수동 거래를 용이하게 하기 위해 거래 터미널 플러그인을 사용하세요 수동 거래를 용이하게 하기 위해 거래 터미널 플러그인을 사용하세요

  • 2. 플러그인을 실행하세요

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

수동 거래를 용이하게 하기 위해 거래 터미널 플러그인을 사용하세요

  • 3. 플러그인을 중지합니다.

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

수동 거래를 용이하게 하기 위해 거래 터미널 플러그인을 사용하세요

플러그인 사용 예

플러그인은 일정 시간 동안 코드를 실행하고 간단한 작업을 수행할 수 있습니다. 많은 경우, 수동으로 반복해야 하는 작업은 플러그인을 사용하여 구현할 수 있어 거래를 더 편리하게 만들 수 있습니다. 이하에서 구체적인 예를 들어 소개하고, 제공된 소스 코드를 참조하여 나만의 전략을 맞춤 설정할 수 있습니다.

지원 수동 선물 교차 기간 헤지

선물의 교차 기간 헤징은 매우 일반적인 전략입니다. 빈도가 높지 않기 때문에 많은 사람들이 수동으로 운영하여 롱 포지션을 취하려면 한 계약, 숏 포지션을 취하려면 한 계약이 필요하며, 가격 차이 추세를 분석할 수 있습니다. 거래 터미널에서 플러그인을 사용하면 에너지를 절약할 수 있습니다.

제가 가장 먼저 소개하고 싶은 것은 기간 간 가격 차이 플러그인입니다.

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)
    }
}

요약하다

그렇게 많은 작은 기능을 본 후에는 여러분만의 아이디어가 생길 것입니다. 수동 거래를 용이하게 하기 위해 플러그인으로 작성하는 것이 좋습니다.