Sử dụng plugin giao dịch để dễ dàng giao dịch thủ công

Tác giả:Cỏ nhỏ, Tạo: 2020-02-29 21:04:52, Cập nhật: 2023-10-12 21:21:40

[TOC]img

Địa chỉ

FMZ là 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 lập trình. Nhưng nó cũng cung cấp một thiết bị đầu cuối giao dịch cơ bản, mặc dù chức năng đơn giản, nhưng đôi khi cũng có thể rất hữu ích, ví dụ như sàn giao dịch bận rộn không thể mở, nhưng API vẫn có thể hoạt động, trong đó bạn có thể rút tiền, đặt hàng, xem tài khoản giao dịch, v.v.

img

Nguyên tắc plugin

Plugin chạy theo hai chế độ, chạy ngay lập tức và chạy nền. chạy nền tương đương với việc tạo robot (chi phí bình thường). chạy ngay lập tức cũng giống như công cụ debugging: gửi một đoạn mã đến trang cuối giao dịch và hỗ trợ biểu đồ và bảng trở lại (các công cụ debugging hiện cũng được nâng cấp hỗ trợ), cũng chỉ thực hiện trong 5 phút, không tính phí, không giới hạn ngôn ngữ.

Khi viết chính sách, bạn cần chọn kiểu chính sách là plugin.Kết quả của hàm main return của plugin sẽ xuất hiện ở đầu cuối, hỗ trợ các chuỗi, biểu đồ và bảng. Vì plugin không thể nhìn thấy nhật ký, bạn có thể trả về kết quả của plugin.

Cách sử dụng

  • 1.添加策略

Nếu bạn tìm kiếm trực tiếp trong hộp tìm kiếm, bạn sẽ tìm thấy một số hình ảnh trên trang web của bạn.Lưu ý chỉ chạy chính sách kiểu plugin giao dịchSau đó, bấm vào Add.Open Plugin để truy cập vào quảng trường chiến lược:https://www.fmz.com/square/21/1

img img

  • 2.运行插件

Khi nhấp vào chính sách, bạn sẽ vào giao diện cài đặt tham số, nếu không có tham số, nó sẽ chạy trực tiếp, và các nhà quản lý, cặp giao dịch, chu kỳ dòng K được chọn bởi thiết lập. Nhấp vào chính sách thực thi sẽ bắt đầu thực hiện, và nếu chọn chế độ chạy ngay lập tức, bạn sẽ không hiển thị nhật ký.

img

  • 3.停止插件

Nhấp vào vị trí hiển thị sẽ dừng tất cả các plugin, vì tất cả các plugin được thực hiện trong một quá trình Debug Tool.

img

Ví dụ sử dụng plugin

Plugin có thể thực hiện mã trong một thời gian, có thể thực hiện một số hoạt động đơn giản, nhiều lần các hoạt động thủ công cần phải được thực hiện nhiều lần có thể được thực hiện bằng plugin, dễ dàng giao dịch. Dưới đây sẽ giới thiệu bằng các ví dụ cụ thể, mã nguồn được cung cấp để tham khảo tùy chỉnh chính sách của riêng bạn.

Hỗ trợ giao dịch tương lai tay

Nhanh chóng, bạn có thể sử dụng các tiện ích để kiểm soát các giao dịch giao dịch, bao gồm cả giao dịch giao dịch, giao dịch giao dịch, giao dịch giao dịch.

Trước tiên, chúng tôi sẽ giới thiệu thêm một plugin giá chênh lệch thời gian:

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
}

Nhấp vào, bạn sẽ thấy một cái nhìn nhanh về các mức chênh lệch giữa các khoảng thời gian gần đây và địa chỉ sao chép mã nguồn của plugin:https://www.fmz.com/strategy/187755 img

Với phân tích chênh lệch, phát hiện chênh lệch đang thu hẹp, là một cơ hội để làm hợp đồng quý trống, làm nhiều ngày trong tuần, đây là cơ hội có thể sử dụng một nút đầu mối, nhấp vào, tự động giúp bạn bán quý trống nhiều ngày trong tuần, nhanh hơn nhiều so với thao tác thủ công.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ờ giá chênh lệch tụt lại, cần ngang hàng, có thể chạy plugin ngang hàng một nút, ngang hàng tốc độ nhanh nhất.


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

Trợ giúp giao dịch trực tiếp

Thông thường nhất là Ice Mountain ủy nhiệm, để tách đơn lớn thành các đơn nhỏ, mặc dù có thể chạy như một robot, nhưng 5 phút plugin thực sự là đủ. Ice Mountain ủy nhiệm có hai loại, một là ăn đơn, một là đơn treo, nếu có ưu đãi phí thủ tục, bạn có thể chọn đơn treo, đó là thời gian thực hiện lâu hơn.

Sau đây là mã để mua mã nguồn cho plugin của Iceberg:https://www.fmz.com/strategy/191771◎ Bán mã nguồ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
        }
        
    }
}

Việc nắm giữ một hoặc bán một cũng là một cách để chuyển giao chậm và có tác động nhỏ hơn đến thị trường. Chiến lược này cũng có một số điểm cải thiện, thay đổi số lượng giao dịch tối thiểu hoặc độ chính xác một cách thủ công. Mua:https://www.fmz.com/strategy/191582Bá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 '无法获取账户信息'}
    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 một giá giao hàng tốt hơn hoặc để đặt hàng chờ trục trặc, nhiều đơn đặt hàng có thể được treo theo 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'
}

Giao dịch tương lai hàng hóa hỗ trợ

Phần mềm giao dịch tương lai thường được sử dụng với nhiều tính năng giao dịch cổ phiếu cao cấp, chẳng hạn như giao dịch cổ phiếu dừng, giao dịch cổ phiếu điều kiện, v.v.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)
    }
}

Tóm lại

Sau khi nhìn vào những tính năng nhỏ như vậy, bạn nên có ý tưởng của riêng mình, có lẽ bạn nên viết một plugin để thuận tiện cho giao dịch thủ công của bạn.


Có liên quan

Thêm nữa

chiyimjjcnTại sao lại có những thông tin sai? 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"}

Cỏ nhỏKiểm tra tài liệu của sàn giao dịch hoặc tham khảo dịch vụ khách hàng của sàn giao dịch