트레이딩 터미널 플러그인을 사용하여 수동 거래를 편리하게 합니다.

저자:초목, 2020-02-29 21:04:52, 업데이트: 2023-10-12 21:21:40

[TOC]img

자막

FMZ는 양적 거래 플랫폼으로, 주로 프로그래머 트레이더를 서비스하기 위해 제공된다. 그러나 또한 기본적인 거래 단말기를 제공합니다. 기능은 간단하지만 때로는 유용합니다. 예를 들어 거래소가 바쁘게 열 수 없으며 API는 여전히 작동 할 수 있습니다. 이 경우 단말기를 통해 환불, 주문, 거래 계좌 등을 확인할 수 있습니다. 거래 단말기의 경험을 개선하기 위해 플러그인 기능을 추가했습니다. 때로는 계단 힐링, 아이스크림 위탁, 한 키 헤딩, 한 키 평면 등의 작업을 지원하는 작은 기능이 필요합니다.

img

플러그인 원리

플러그인 실행에는 두 가지 모드가 있습니다. 즉석 실행과 배경 실행. 배경 실행은 로봇을 만드는 것과 같습니다. 즉석 실행과 디제이팅 도구의 원리는 동일합니다: 거래 단말 페이지로 코드 한 부분을 보내는 호스트가 실행하고, 회전 차트와 표를 지원합니다. 디제이팅 도구는 현재 업그레이드 된 지원도 있습니다. 마찬가지로 5 분 동안 실행 할 수 있습니다. 요금없이, 언어 제한이 없습니다. 실행 시간이 매우 짧은 플러그인은 즉각 실행 모드로 실행 될 수 있습니다. 복잡한, 오래 실행하는 전략이 필요하거나 로봇이 필요합니다.

정책 작성시에는 플러그인으로 정책 유형을 선택해야 합니다.플러그인의 main 함수 return의 결과는 실행이 끝나면 단말기에서 튀어나와 문자열, 도표, 테이블을 지원한다. 플러그인 실행이 로그를 볼 수 없기 때문에 플러그인의 실행 결과 return를 반환할 수 있다.

사용 방법

  • 1.添加策略

이 글은 Google 검색어에서 직접 검색하면참고로 트랜잭션 플러그인 타입 정책만 실행할 수 있습니다., 그리고 추가를 클릭합니다. 공개 플러그인은 전략 광장에서 찾을 수 있습니다:https://www.fmz.com/square/21/1

img img

  • 2.运行插件

클릭하는 정책은 매개 변수 설정 인터페이스에 들어가면, 매개 변수가 없는 경우 직접 실행되며, 거래 단말기가 선택한 관리자, 거래 쌍, K 라인 주기가 기본으로 해당되는 매개 변수입니다. 클릭하는 실행 정책은 실행을 시작합니다.

img

  • 3.停止插件

표시 위치를 클릭하면 플러그인을 중지합니다. 모든 플러그인이 디버깅 도구 프로세스에서 실행되기 때문에 모든 플러그인을 중지합니다.

img

플러그인 사용 예

플러그인은 일정 기간 동안 코드를 실행할 수 있으며, 간단한 작업을 수행 할 수 있으며, 수동 작업을 반복해야하는 작업이 종종 플러그인을 통해 구현 될 수 있으며 거래가 용이합니다. 아래는 구체적인 사례로 소개되며, 제공 된 소스 코드는 참조로 자신의 전략을 사용자 지정 할 수 있습니다.

보조 수동 선물 연장 헤딩

미래에 대한 연장 헤딩은 매우 일반적인 전략입니다. 빈도가 높지 않기 때문에 많은 사람들이 수동으로 작동합니다. 더 많은 계약이 필요하고, 계약이 비공개되어 있으며, 다른 가격의 움직임을 분석해야합니다. 거래 단말기에서 플러그인을 사용하면 에너지를 절약 할 수 있습니다.

이 글의 첫 번째 내용은 그림의 시간 간격 플러그인입니다.

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 img

격차 분석을 통해 격차가 모이고 있다는 것을 발견하고, 빈 쿼터 계약을 하고, 주중을 할 수 있는 기회이다. 이것은 하나의 버튼 헤지 플러그인을 사용하여 클릭하면 자동으로 빈 쿼터 주중을 도와줄 수 있으며, 수동 조작보다 훨씬 빠르다. 전략의 구현 원칙은 슬라이드 가격으로 같은 수의 포지션을 열고, 여러 번 더 실행할 수 있으며, 천천히 자신이 원하는 포지션을 달성하여 시장을 충격을 피하고, 기본 매개 변수를 변경하여 더 빠른 속도를 얻을 수 있다. 전략 복제 주소: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)
    }
}

요약

이렇게 많은 작은 기능들을 보고, 당신은 당신의 아이디어를 가지고 있어야 하고, 어쩌면 플러그인을 작성하여 자신의 수동 거래를 편리하게 할 수도 있다.


관련

더 많은

왜 잘못 보고되는 걸까요? 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"}

초목거래소 문서를 확인하거나 거래소 고객 서비스를 문의하십시오.