Упрощение ручной торговли с помощью терминальных плагинов

Автор:Трава, Создано: 2020-02-29 21:04:52, Обновлено: 2023-10-12 21:21:40

[TOC]img

Описание

FMZ является квантовой торговой платформой, в основном предназначенной для обслуживания программируемых трейдеров. FMZ также предоставляет базовые торговые терминалы, которые, хотя и просты в использовании, иногда могут быть полезны, например, если биржа занята, она не может быть открыта, а API все равно может работать, в этот момент через терминал можно снять, оформить заказ, просмотреть счета и т. д. Для совершенствования опыта торгового терминала теперь добавлены дополнительные функции.

img

Принципы плагинов

Плагин работает в двух режимах: мгновенный и фоновый; мгновенный эквивалент создания бота ("обычная плата"); мгновенный и дешифровщик работают по одному принципу: отправка кода на страницу торгового терминала выполняется администратором, а также поддержка возвращения графиков и таблиц ("дешифровщик в настоящее время также поддерживается обновленной поддержкой); выполняется только в течение 5 минут, без платы, без ограничений на язык.

При написании политики необходимо выбрать тип политики в качестве плагина.Результаты возвращения основных функций плагина появляются в терминале после завершения его выполнения, поддерживая строки, диаграммы и таблицы.

Использование

  • 1.添加策略

Например, если вы хотите получить более полную информацию, то вы можете просто перейти в поисковую систему и получить более полную информацию.Обратите внимание, что можно запустить только политику типа плагина, а затем нажмите Add.Open Plugin, который можно найти на площади стратегии:https://www.fmz.com/square/21/1

img img

  • 2.运行插件

Нажатие политики сразу же вводит в интерфейс настройки параметров, в случае отсутствия параметров будет выполнено напрямую, а выбранный трейдинговым терминалом хозяин, транзакционная пара, K-линейный цикл являются соответствующими параметрами по умолчанию. Нажатие политики выполнения начнет выполнение, при выборе режима выполнения параметров ("запомнить режим выполнения по умолчанию") не будет отображаться журнал.

img

  • 3.停止插件

Нажатие на указание местоположения останавливает плагин, поскольку все плагины выполняются в процессе одного инструмента декомпанирования.

img

Примеры использования плагинов

Плагины могут выполнять некоторое время кода, выполнять некоторые простые операции, часто ручные операции, которые требуют повторного выполнения, могут быть реализованы с помощью плагинов, что облегчает торговлю. Ниже приведены конкретные примеры.

Подсобные ручные фьючерсные хеджировки

Фьючерсные хеджировки - это очень распространенная стратегия, и поскольку частота не очень высока, многие люди будут работать вручную, требуя одного контракта, чтобы сделать больше, один контракт, чтобы сделать больше, а также хорошо проанализировать движение дифференциации. Использование плагина в торговом терминале сэкономит вам энергию.

Первое, что мы сделаем, - это покажем вам плагин для ценообразования:

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 img

С помощью анализа разницы вы обнаружите, что разница совпадает, это возможность сделать контракт на свободные кварталы, сделать несколько недель, это можно использовать с помощью плагина хеджирования одной кнопки, просто нажмите, автоматически поможет вам свободные кварталы на много недель, что намного быстрее, чем вручную.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"}

ТраваПроверьте документы биржи или обратитесь в службу поддержки клиентов