FMZ.COM,定量的な取引プラットフォームとして,主にプログラミングトレーダーにサービスを提供しています.しかし,基本的な取引ターミナルも提供しています. 機能はシンプルですが,時には便利です. たとえば,取引所が忙しくて操作できない場合でも,APIはまだ動作します. この時点で,注文を引き出し,注文を入れ,ターミナルを通じてそれらを表示することができます. 取引ターミナルの体験を改善するために,プラグインが追加されています. 時々,取引を支援する小さな機能が必要です. 例えば,階段の待機注文,氷山の注文,ワンクリックヘッジ,ワンクリック閉鎖ポジションなどの操作です. ロボット実行ログを見る必要はありません. 新しいロボットを作成するには少し面倒です. ターミナルのプラグインをクリックするだけで,対応する機能はすぐに実現され,手動取引を大幅に容易化できます. プラグインの位置は以下のとおりです:
プラグインの動作には,即時操作と背景操作の2つのモードがあります.バックグラウンドで実行することはロボット (通常の料金) を作成することに相当します.即時操作の原則はデバッグツールと同じです:実行のために取引ターミナルページのドッカーにコードを送信し,チャートとテーブルを返信するサポート (デバッグツールも現在サポートにアップグレードされています),同じものは5分間のみ実行できます.手数料,制限なし.短実行時間を持つプラグインは即時実行モードを使用することができ,複雑で長時間実行する戦略は依然としてロボットを実行する必要があります.
プラグインとして戦略の種類を選択する必要があります.main
機能return
ストリング,図面,テーブルをサポートする. プラグイン実行がログを見ることができないので,return
プラグインの実行結果
図のように検索ボックスで直接検索する. 取引プラグインタイプ戦略のみを実行できるので注意し,追加をクリックします. 公開プラグインは,戦略スクエアで見つけることができます:https://www.fmz.com/square/21/1
パラメータ設定インターフェースを入力するには,戦略をクリックします. パラメータがない場合は,直接実行されます. トレーディングターミナルが選択したドッカー,取引ペア,K-ライン期間がデフォルト対応するパラメータです. 実行を開始するには実行戦略をクリックし,
プラグインを停止するには,アイコンの位置をクリックします.すべてのプラグインはデバッグツールで実行されるので,すべてのプラグインは停止されます.
プラグインは,コードを一定の期間実行し,いくつかの簡単な操作を行うことができます.多くの場合,繰り返される操作を必要とする手動操作は,トランザクションを容易にするためにプラグインで実装できます.以下は具体的な例を紹介し,与えられたソースコードは参照として使用して,独自の戦略をカスタマイズすることができます.
期貨間隔ヘッジ取引は,非常に一般的な戦略です. 周波数が非常に高くないため,多くの人々が手動で操作します. 契約を長く,合約を短くすることが必要です. そのため,スプレッド傾向を分析するのが良いです. 取引ターミナル内のプラグインを使用すると,エネルギーを節約できます.
初期には,期間間の価格差のプラグインを描く必要があります.
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
スプレッド分析では,スプレッドが収束していることが判明.これは四半期契約をショートして,現在の週にロングに行く機会である.これはワンクリックヘージングプラグインを使用する機会であり,一クリックで自動的に四半期とロングをショートするのに役立ちます.これは手動操作よりも速くなります.戦略の実施原則は,同じ数のポジションをスライディング価格で開くことです.市場に影響を及ぼさないように,望むポジションにゆっくりと到達するために,さらに数回実行できます.注文を早くするためにデフォルトパラメータを変更することができます.戦略コピーアドレス: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分間のプラグインは実際に十分です. アイスバーグ・オーダーには2種類があります. 1つは注文を受け取り,もう1つは待機しているオーダーです. 優遇料がある場合は,待機しているオーダーを選択できます. つまり実行時間が長くなります.
次のコードは,氷山によって委託されたプラグインのソースコードです.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
}
}
}
この戦略にはいくつかの改善があります.最低取引量または精度を手動で変更できます.この戦略は,顧客が購入する1つまたは販売する1つの価格層を常に占めるようにゆっくりと商品を運ぶ方法でもあります.
購入する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)
}
}
手動取引を容易にするためのプラグインを書きたいかもしれません.