Sử dụng giao dịch đầu cuối plug-in để tạo điều kiện giao dịch thủ công

Tác giả:Tốt, Tạo: 2020-07-30 11:39:54, Cập nhật: 2023-10-25 19:56:42

img

Lời giới thiệu

FMZ.COM, như một nền tảng giao dịch định lượng, chủ yếu là để phục vụ các nhà giao dịch theo chương trình. Nhưng nó cũng cung cấp một đầu cuối giao dịch cơ bản. Mặc dù chức năng đơn giản, đôi khi nó có thể hữu ích. Ví dụ, nếu sàn giao dịch bận rộn và không thể vận hành, nhưng API vẫn hoạt động. Vào thời điểm này, bạn có thể rút lệnh, đặt lệnh và xem chúng thông qua đầu cuối. Để cải thiện trải nghiệm của đầu cuối giao dịch, plug-in bây giờ được thêm vào. Đôi khi, chúng ta cần một chức năng nhỏ để hỗ trợ giao dịch, chẳng hạn như các lệnh đang chờ đợi, các lệnh băng trôi, phòng hộ một nhấp chuột, các vị trí đóng một nhấp chuột và các hoạt động khác. Không cần phải xem nhật ký thực thi robot. Nó hơi khó khăn để tạo một đầu cuối mới. Chỉ cần nhấp vào plugin trong đầu cuối, Các chức năng tương ứng có thể được thực hiện ngay lập tức, có thể tạo điều kiện thuận lợi cho các giao dịch thủ công.

img

Nguyên tắc cắm

Có hai chế độ hoạt động plug-in, hoạt động ngay lập tức và hoạt động nền. Chạy trong nền tương đương với việc tạo ra một robot (thảm phí bình thường). Nguyên tắc hoạt động ngay lập tức giống như công cụ gỡ lỗi: gửi một đoạn mã đến docker của trang đầu cuối giao dịch để thực hiện, và hỗ trợ trả lại biểu đồ và bảng (công cụ gỡ lỗi hiện cũng được nâng cấp để hỗ trợ), điều tương tự chỉ có thể được thực hiện trong 5 phút, không có phí, không có hạn chế Ngôn ngữ. Plug-in có thời gian thực thi ngắn có thể sử dụng chế độ chạy ngay lập tức, trong khi các chiến lược chạy phức tạp và lâu dài vẫn cần phải chạy robot.

Khi viết một chiến lược, bạn cần phải chọn loại chiến lược như một plugin.mainchức năngreturncủa plug-in sẽ bật lên trong thiết bị đầu cuối sau khi hoạt động kết thúc, hỗ trợ chuỗi, vẽ và bảng.returnkết quả thực hiện của plug-in.

Cách sử dụng

  • Thêm chiến lược

Tìm kiếm trực tiếp trong hộp tìm kiếm như trong hình. Lưu ý rằng chỉ có thể chạy các chiến lược loại plugin giao dịch, sau đó nhấp vào Thêm. Các plugin công cộng có thể được tìm thấy trong Quảng trường Chiến lược:https://www.fmz.com/square/21/1

img img

  • Chạy plugin

Nhấp vào chiến lược để nhập giao diện thiết lập tham số. Nếu không có tham số, nó sẽ chạy trực tiếp. Docker, cặp giao dịch và thời gian K-line được chọn bởi đầu cuối giao dịch là các tham số tương ứng mặc định. Nhấp vào chiến lược thực thi để bắt đầu thực thi và chọn chế độ Execute Now (bạn có thể nhớ chế độ hoạt động mặc định). Plugin sẽ không hiển thị nhật ký.

img

  • Dừng plugin

Nhấp vào vị trí biểu tượng để dừng plugin. Vì tất cả các plugin được thực hiện trong quá trình công cụ gỡ lỗi, tất cả các plugin sẽ bị dừng.

img

Ví dụ về việc sử dụng plug-in

Plug-in có thể thực hiện mã trong một khoảng thời gian và thực hiện một số hoạt động đơn giản. Trong nhiều trường hợp, các hoạt động thủ công đòi hỏi các hoạt động lặp đi lặp lại có thể được thực hiện với plug-in để tạo điều kiện cho các giao dịch. Sau đây sẽ giới thiệu các ví dụ cụ thể, và mã nguồn được cung cấp có thể được sử dụng để tham khảo để tùy chỉnh chiến lược của riêng bạn.

Hỗ trợ giao dịch phòng hộ tương lai liên thời gian theo cách thủ công

Giao dịch phòng ngừa rủi ro giữa thời gian tương lai là một chiến lược rất phổ biến. Bởi vì tần số không quá cao, nhiều người sẽ vận hành nó bằng tay. Cần phải làm cho một hợp đồng dài và một hợp đồng ngắn, vì vậy tốt hơn là phân tích xu hướng lan rộng. Sử dụng plug-in trong đầu cuối giao dịch sẽ tiết kiệm năng lượng của bạn.

Sự giới thiệu đầu tiên là vẽ plugin chênh lệch giá giữa các giai đoạn:

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
}

Nhấp vào một lần, sự khác biệt giá giữa các giai đoạn gần đây là rõ ràng trong một cái nhìn, địa chỉ bản sao mã nguồn plug-in:https://www.fmz.com/strategy/187755

img

Với phân tích chênh lệch, nó được tìm thấy rằng chênh lệch đang hội tụ. Đó là một cơ hội để ngắn hợp đồng quý và đi dài cho tuần hiện tại. Đây là một cơ hội để sử dụng plug-in phòng hộ một nhấp chuột, một nhấp chuột sẽ tự động giúp bạn ngắn quý và dài hàng tuần, nhanh hơn so với hoạt động thủ công. Nguyên tắc thực hiện chiến lược là mở cùng một số vị trí với giá trượt. Bạn có thể chạy nhiều lần nữa để chậm đạt đến vị trí mong muốn của bạn để tránh ảnh hưởng đến thị trường. Bạn có thể thay đổi các thông số mặc định để đặt đơn đặt hàng nhanh hơn.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())
}

Chờ cho sự khác biệt giá hội tụ và bạn cần phải đóng vị trí, bạn có thể chạy plugin đóng một lần nhấp chuột để đóng vị trí càng nhanh càng tốt.

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

Plug-in để hỗ trợ giao dịch tại chỗ

Một trong những cách phổ biến nhất là ủy ban băng trôi, phân chia các đơn đặt hàng lớn thành các đơn đặt hàng nhỏ. Mặc dù nó có thể được chạy như một robot, nhưng một plug-in 5 phút thực sự là đủ. Có hai loại đơn đặt hàng băng trôi, một là nhận đơn đặt hàng và một là các đơn đặt hàng đang chờ xử lý. Nếu có phí ưu đãi, bạn có thể chọn các đơn đặt hàng đang chờ xử lý, có nghĩa là thời gian thực thi dài hơn.

Mã sau đây là mã nguồn của plug-in được ủy quyền bởi băng trôi:https://www.fmz.com/strategy/191771Để bán: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
        }
        
    }
}

Nó cũng là một cách để từ từ shipping sản phẩm để chiếm Mua 1 hoặc Bán 1 lớp giá mọi lúc, và tác động trên thị trường tương đối nhỏ. Có một số cải tiến cho chiến lược này. Bạn có thể tự thay đổi khối lượng giao dịch tối thiểu hoặc độ chính xác.

Mua:https://www.fmz.com/strategy/191582

Bán: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)
    }
}

Đôi khi, để bán tốt hơn giá vận chuyển hoặc chờ đợi một mất đặt hàng đang chờ, nhiều đơn đặt hàng có thể được đặt trong một khoảng thời gian nhất định.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'
}

Plug-in để hỗ trợ giao dịch tương lai hàng hóa

Phần mềm giao dịch tương lai được sử dụng phổ biến thường có nhiều chức năng lệnh chờ nâng cao, chẳng hạn như lệnh dừng lỗ đang chờ đợi, lệnh điều kiện đang chờ đợi, vv, có thể dễ dàng được viết dưới dạng plug-in.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)
    }
}

Tóm lại

Sau khi đọc rất nhiều chức năng nhỏ, bạn cũng nên có ý tưởng của riêng bạn.


Có liên quan

Thêm nữa