[TOC]

Là một nền tảng giao dịch định lượng, FMZ chủ yếu được thiết kế để phục vụ các nhà giao dịch theo chương trình. Nhưng nó cũng cung cấp một terminal giao dịch cơ bản. Mặc dù chức năng này đơn giản, nhưng đôi khi nó có thể rất hữu ích. Ví dụ, nếu sàn giao dịch bận và không thể mở, nhưng API vẫn có thể hoạt động, bạn có thể sử dụng terminal để hủy lệnh , đặt hàng và xem tài khoản Báo giá, v.v. Để cải thiện trải nghiệm giao dịch trên thiết bị đầu cuối, chức năng plug-in đã đượ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ư lệnh chờ thang, lệnh tảng băng trôi, phòng ngừa rủi ro một cú nhấp chuột, đóng một cú nhấp chuột, v.v. Chúng ta không thực sự cần phải xem nhật ký thực hiện. Nó hơi cồng kềnh để tạo một robot mới. Chỉ cần nhấp vào plug-in trong terminal. , bạn có thể nhận ra ngay các chức năng tương ứng, có thể tạo điều kiện thuận lợi cho giao dịch thủ công. Vị trí của plugin như sau:

Có hai chế độ hoạt động cắm thêm: hoạt động ngay lập tức và hoạt động nền. Chạy ở chế độ nền tương đương với việc tạo ra một con robot (áp dụng phí thông thường). Nguyên lý hoạt động tức thời giống như công cụ gỡ lỗi: gửi một đoạn mã đến người giám sát trang thiết bị đầu cuối giao dịch để thực thi và hỗ trợ trả về biểu đồ và bảng (công cụ gỡ lỗi hiện cũng được nâng cấp để hỗ trợ điều này ). Tương tự như vậy, nó chỉ có thể được thực hiện trong 5 phút, miễn phí và không giới hạn ngôn ngữ. Các plugin có thời gian thực thi rất ngắn có thể sử dụng chế độ chạy ngay lập tức, trong khi các chiến lược phức tạp đòi hỏi nhiều thời gian để chạy vẫn yêu cầu phải chạy robot.
Khi viết chính sách, bạn cần chọn loại chính sách là plug-in. Kết quả của hàm chính return của plugin sẽ hiện lên trong terminal sau khi chạy, hỗ trợ các chuỗi, bản vẽ và bảng. Vì không thể xem nhật ký trong quá trình thực thi plugin nên kết quả thực thi của plugin có thể được trả về.
Tìm kiếm trực tiếp trong hộp tìm kiếm như hình minh họa.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 khai có thể được tìm thấy trên Strategy Square: https://www.fmz.com/square/21/1

Nhấp vào chiến lược để 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. Người giám hộ, cặp giao dịch và thời kỳ K-line do thiết bị đầu cuối giao dịch chọn là các tham số tương ứng mặc định. Nhấp vào chính sách thực thi để bắt đầu thực thi và chọn chế độ “Thực thi ngay” (bạn có thể nhớ chế độ chạy mặc định). Plugin sẽ không hiển thị nhật ký.

Nhấp vào biểu tượng để dừng plug-in. Vì tất cả các plug-in đều được thực thi trong một quy trình công cụ gỡ lỗi nên tất cả các plug-in sẽ bị dừng.

Plugin có thể thực thi mã trong một khoảng thời gian và có thể thực hiện một số thao tác đơn giản. Nhiều lần, các thao tác cần lặp lại thủ công có thể được thực hiện bằng plugin, giúp giao dịch thuận tiện hơn. Phần sau đây sẽ giới thiệu nó bằng các ví dụ cụ thể và mã nguồn được cung cấp có thể được sử dụng làm tài liệu tham khảo để tùy chỉnh chiến lược của riêng bạn.
Phòng ngừa rủi ro kỳ hạn chéo của hợp đồng tương lai là một chiến lược rất phổ biến. Vì tần suất không cao nên nhiều người sẽ vận hành thủ công, yêu cầu một hợp đồng để mua và một hợp đồng để bán, và họ có thể phân tích xu hướng chênh lệch giá. Sử dụng plugin trong thiết bị giao dịch của bạn sẽ giúp bạn tiết kiệm năng lượng.
Điều đầu tiên tôi muốn giới thiệu là plug-in chênh lệch giá giữa các giai đoạn:
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
}
Chỉ cần một cú nhấp chuột, bạn có thể xem nhanh các mức chênh lệch giữa các kỳ gần đây. Địa chỉ sao chép mã nguồn của plugin: https://www.fmz.com/strategy/187755

Với phân tích chênh lệch, bạn thấy chênh lệch đang hội tụ, đây là cơ hội để bán khống hợp đồng quý và mua dài hạn tuần hiện tại. Lúc này, bạn có thể sử dụng plug-in phòng ngừa rủi ro một cú nhấp chuột. Chỉ cần một cú nhấp chuột, nó sẽ tự động giúp bạn bán khống hợp đồng quý và mua dài hạn hợp đồng tuần hiện tại, nhanh hơn thao tác thủ công. Khá nhiều. Nguyên tắc thực hiện của chiến lược là mở cùng một số vị thế với độ trượt giá. Bạn có thể chạy nhiều lần để từ từ đạt được vị thế cần thiết và tránh tác động đến thị trường. Bạn có thể thay đổi các thông số mặc định để đặt lệnh nhanh hơn. Địa chỉ bản sao chiến lược: 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())
}
Trong khi chờ chênh lệch giá hội tụ, nếu bạn cần đóng vị thế, bạn có thể chạy plugin đóng một cú nhấp chuột để đóng vị thế với 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)
}
}
}
}
Phổ biến nhất là lệnh tảng băng trôi, lệnh này chia các lệnh lớn thành các lệnh nhỏ. Mặc dù có thể chạy như một robot, nhưng thực ra chỉ cần cắm thêm 5 phút là đủ. Có hai loại lệnh tảng băng trôi, một là nhận lệnh và một là đặt lệnh. Nếu có chiết khấu phí xử lý, bạn có thể chọn đặt lệnh, nghĩa là thời gian thực hiện sẽ lâu hơn.
Mã sau đây là mã nguồn của Plugin mua lệnh 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 luôn giữ giá mua một hoặc bán một cũng là một cách vận chuyển hàng chậm, có tác động tương đối nhỏ đến thị trường. Vẫn còn một số lĩnh vực cần cải thiện trong chiến lược này. Bạn có thể thay đổi thủ công 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 '无法获取账户信息'}
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 được giá tốt hơn hoặc chờ giá hời, bạn có thể đặt nhiều lệnh ở một khoảng thời gian nhất định. Plugin này cũng có thể được sử dụng cho các lệnh chờ tương lai. Địa chỉ sao chép mã nguồn: 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'
}
Phần mềm giao dịch tương lai thường được sử dụng có nhiều chức năng đặt lệnh nâng cao, chẳng hạn như đặt lệnh dừng lỗ, đặt lệnh có điều kiện, v.v., có thể dễ dàng viết vào plug-in. Đây là một plug-in cho phép bạn đóng lệnh chờ ngay sau khi lệnh được thực hiện. Sao chép địa chỉ: 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)
}
}
Sau khi thấy nhiều chức năng nhỏ như vậy, bạn nên có ý tưởng riêng của mình. Bạn cũng có thể viết chúng thành các plug-in để tạo điều kiện thuận lợi cho giao dịch thủ công của mình.