[TOC]
FMZは,定量化取引プラットフォームとして,主に程序化トレーダーにサービスを提供するものである.しかし,基本的な取引端末も提供している.機能はシンプルであるが,時には大きな役目を果たすこともあります.例えば,取引所は忙しいので開けないが,APIは動作できる.この時点で端末を通じて引き出し,注文,経理帳簿などを見ることができます.取引端末の体験を完善するために,プラグイン機能が追加されています.時には,階段を吊るし,氷山委託,1キンのヘッジ,1キンの平衡などの操作などの取引を支援する小さな機能が必要になります.日記を実行し,新しいロボットを構築することは少し面倒です.端末に直接プラグインし,すぐに対応する機能を実現することができます.
プラグインの実行には2つのモードがあります.即時実行とバックグラウンド実行. バックグラウンド実行はボット作成と同等である (通常の料金). 即時実行の原理とデュッキングツールは同じです:取引端末ページにコードを送信するホストによって実行され,戻りグラフと表 (デュッキングツールは現在もサポートがアップグレードされています) がサポートされています. 同じことが5分しか実行できません. 料金なし,言語制限はありません.
プラグインとしてポリシーのタイプを選択する必要があります.プラグインのmain関数returnの結果は,実行終了後に端末にポップアップし,文字列,図形,表をサポートします.プラグインの実行がログを見ることができないため,プラグインの実行結果returnを返します.
検索ボックスに直接検索すると,取引プラグインのタイプポリシーのみを実行します.公開プラグインは,戦略広場で見ることができます.https://www.fmz.com/square/21/1
クリックする方針は,パラメータ設定インターフェースに入ると,パラメータがない場合は直接実行され,取引端末が選択した托管者,取引対,K線周期はデフォルトの対応パラメータである. クリックする実行方針は実行を開始し,選択したパラメータで即座にパームモードを実行します.プラグインはログを表示しません.
図示位置をクリックするとプラグインを停止します.すべてのプラグインがデュバッグツールプロセスで実行されているため,すべてのプラグインを停止します.
プラグインは,しばらくのコードを実行することができ,いくつかの簡単な操作を実行することができ,多くの場合,手動操作を繰り返す必要がある操作は,プラグインで実現され,取引が容易である. 以下は具体的な例で紹介され,与えられたソースコードは参照として独自の戦略をカスタマイズすることができます.
フューチャー・クロス期間のヘッジは一般的な戦略であり,頻度があまり高くないため,多くの人が手動操作し,契約を多めにしたり,契約を空くしたり,差異の動きを分析したりする必要があります.
画期差のプラグインを紹介します.
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
差額分析により,差額が収束していることが判明し,空き四半期契約,多日週間の契約を行う機会である.これは,ヘッジプラグインをクリックする1つのボタンを使用して,空き四半期多日週間の契約を自動的に行うことができます. 手動操作よりもはるかに速く. 戦略の実装原理は,同じ数のポジションを開設する価格を滑らせ,数回以上実行することができ,ゆっくりと自分の必要なポジションに到達し,市場への衝撃を避け,デフォルトパラメータを変更して,より速い速度を達成することができます. 戦略コピーアドレス: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分間のプラグインは実際には十分である.氷山委託には2つの種類があります.
プラグインのソースコードを購入するために下記のコードが Ice Mountain に委ねられています.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)
}
}
この小さな機能を見て,あなたは自分のアイデアを持っているはずです. 簡単に手動的な取引を行うためのプラグインを書いてみましょう.
シイイイイ誤報の原因は? エラー: 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"}
小草取引所の書類をチェックしたり,取引所の顧客サービスに相談したり