[TOC]
FMZ является квантовой торговой платформой, в основном предназначенной для обслуживания программируемых трейдеров. FMZ также предоставляет базовые торговые терминалы, которые, хотя и просты в использовании, иногда могут быть полезны, например, если биржа занята, она не может быть открыта, а API все равно может работать, в этот момент через терминал можно снять, оформить заказ, просмотреть счета и т. д. Для совершенствования опыта торгового терминала теперь добавлены дополнительные функции.
Плагин работает в двух режимах: мгновенный и фоновый; мгновенный эквивалент создания бота ("обычная плата"); мгновенный и дешифровщик работают по одному принципу: отправка кода на страницу торгового терминала выполняется администратором, а также поддержка возвращения графиков и таблиц ("дешифровщик в настоящее время также поддерживается обновленной поддержкой); выполняется только в течение 5 минут, без платы, без ограничений на язык.
При написании политики необходимо выбрать тип политики в качестве плагина.Результаты возвращения основных функций плагина появляются в терминале после завершения его выполнения, поддерживая строки, диаграммы и таблицы.
Например, если вы хотите получить более полную информацию, то вы можете просто перейти в поисковую систему и получить более полную информацию.Обратите внимание, что можно запустить только политику типа плагина, а затем нажмите Add.Open Plugin, который можно найти на площади стратегии: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
С помощью анализа разницы вы обнаружите, что разница совпадает, это возможность сделать контракт на свободные кварталы, сделать несколько недель, это можно использовать с помощью плагина хеджирования одной кнопки, просто нажмите, автоматически поможет вам свободные кварталы на много недель, что намного быстрее, чем вручную.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)
}
}
}
}
Наиболее распространенным является Ice Mountain поручение, разобрать большую бумагу в листовки, хотя можно работать в роботе, но 5 минут встроенной в самом деле достаточно. 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)
}
}
Посмотрев на столько маленьких функций, вы должны иметь свои собственные идеи, почему бы не написать плагин для удобства ваших ручных сделок.
- Да, конечно.Что является причиной сообщения о ошибках? 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"}
ТраваПроверьте документы биржи или обратитесь в службу поддержки клиентов