거래 터미널 플러그인을 사용 하 여 수동 거래를 촉진

저자:선함, 2020-07-30 11:39:54, 업데이트: 2023-10-25 19:56:42

img

소개

FMZ.COM, 양적 거래 플랫폼으로서, 주로 프로그래밍 트레이더들에게 서비스를 제공하는 것입니다. 그러나 또한 기본적인 거래 단말기를 제공합니다. 기능이 간단하지만 때로는 유용 할 수 있습니다. 예를 들어, 거래소가 바쁘고 작동 할 수 없지만 API는 여전히 작동합니다. 이 시점에서 주문을 철회하고 주문을 배치하고 단말기를 통해 볼 수 있습니다. 거래 단말기의 경험을 개선하기 위해 플러그인이 추가됩니다. 때때로 우리는 사다리 대기 주문, 빙산 주문, 한 클릭 헤지, 한 클릭 닫기 위치 및 기타 작업과 같은 거래를 돕기 위해 작은 기능이 필요합니다. 로봇 실행 로그를 보는 것이 필요하지 않습니다. 새로운 로그를 만드는 것은 다소 번거롭습니다. 단말기에서 플러그인을 클릭하면 해당 기능을 즉시 구현 할 수 있습니다. 플러그인 위치는 다음과 같습니다.

img

플러그인 원칙

플러그인 운영에는 즉각적인 동작과 백그라운드 동작 두 가지 모드가 있습니다. 백그라운드에서 실행하는 것은 로봇을 만드는 것과 동등합니다. 즉각적인 동작의 원리는 디버깅 도구와 동일합니다: 실행을 위해 거래 터미널 페이지의 도커에 코드 한 조각을 보내고, 차트와 테이블을 반환하는 것을 지원합니다 (디버깅 도구는 현재 지원으로 업그레이드되었습니다). 동일한 것은 5 분 동안만 실행 될 수 있으며, 수수료, 제한이 없습니다. 짧은 실행 시간이있는 플러그인은 즉각적인 실행 모드를 사용할 수 있으며 복잡하고 장기적인 실행 전략은 여전히 로봇을 실행해야합니다.

전략을 작성할 때, 당신은 플러그인으로 전략 유형을 선택해야합니다.main기능return플러그인 실행이 로그를 볼 수 없기 때문에, 당신은 로그를 볼 수 있습니다return플러그인 실행 결과

사용 방법

  • 전략 추가

그림과 같이 검색 상자에서 직접 검색하십시오. 거래 플러그인 유형 전략만 실행할 수 있으므로 클릭하십시오. 공개 플러그인은 전략 광장에서 찾을 수 있습니다:https://www.fmz.com/square/21/1

img img

  • 플러그인을 실행

매개 변수 설정 인터페이스를 입력하기 위해 전략을 클릭하십시오. 매개 변수가 없으면 직접 실행됩니다. 거래 터미널에서 선택한 도커, 거래 쌍 및 K-라인 기간은 기본 대응 매개 변수입니다. 실행을 시작하기 위해 실행 전략을 클릭하고 Execute Now 모드를 선택하십시오. 플러그인은 로그를 표시하지 않습니다.

img

  • 플러그인을 중지

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

img

플러그인 사용 예

플러그인은 일정 기간 동안 코드를 실행하고 간단한 작업을 수행 할 수 있습니다. 많은 경우 반복 작업을 필요로하는 수동 작업은 거래를 용이하게하기 위해 플러그인을 통해 구현 할 수 있습니다. 다음에는 구체적인 예가 소개되며 제공 된 소스 코드는 참조로 사용하여 자신의 전략을 사용자 정의 할 수 있습니다.

수동 선물 간 시간적 헤지 거래 지원

미래에셋 간 시간적 헤지 거래는 매우 일반적인 전략입니다. 빈도가 매우 높지 않기 때문에 많은 사람들이 수동으로 작동합니다. 한 계약이 길고 한 계약이 짧아야하므로 스프레드 트렌드를 분석하는 것이 좋습니다. 거래 터미널에서 플러그인을 사용하면 에너지를 절약 할 수 있습니다.

첫 번째 소개는 기간 간 가격 차이 플러그인을 그리는 것입니다.

var chart = { 
   __isStock: true,    
   title : { text : 'Spread analysis chart'},                     
   xAxis: { type: 'datetime'},                 
   yAxis : {                                        
       title: {text: 'Spread'},                   
       opposite: false,                             
   },
   series : [                    
       {name : "diff", data : []}, 

   ]
}
function main() {
   exchange.SetContractType('quarter')
   var recordsA = exchange.GetRecords(PERIOD_M5) //Cycle can be customized
   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 'Unable to get ticker'}
        if(!pos || pos.length == 0 ){return 'No holding position'}
        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 'Unable to get account information'}
    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 is not connected!")
            Sleep(10000)
        }
        if(trade_amount >= Amount){
            Log('mission completed')
            return
        }
        Sleep(1000)
    }
}

요약하면

이렇게 많은 작은 기능을 읽은 후, 당신은 또한 자신의 아이디어를 가지고 있어야합니다. 당신은 당신의 수동 거래를 촉진하기 위해 플러그인을 작성하고 싶을 수 있습니다.


관련

더 많은