Использование плагина торгового терминала для облегчения ручной торговли

Автор:Доброта, Создано: 2020-07-30 11:39:54, Обновлено: 2023-10-25 19:56:42

img

Введение

FMZ.COM, как количественная торговая платформа, предназначена в основном для обслуживания программируемых трейдеров. Но она также предоставляет базовый торговый терминал. Хотя функция проста, иногда она может быть полезна. Например, если биржа занята и не может работать, но API все равно работает. В это время вы можете снять заказы, размещать заказы и просматривать их через терминал. Для улучшения опыта торгового терминала теперь добавляются плагины. Иногда нам нужна небольшая функция для оказания помощи в транзакции, такая как ожидаемые заказы лестницы, заказы айсберга, хеджирование одним щелчком мыши, закрытие позиций одним щелчком мыши и другие операции. Не нужно смотреть на журнал выполнения роботов. Создание нового плагина немного обременительно. Просто нажмите плагин в терминале, Соответствующие функции могут быть реализованы сразу, что может значительно облегчить ручные транзакции. Местоположение плагина выглядит следующим образом:

img

Принцип подключения

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

При написании стратегии, вы должны выбрать тип стратегии в качестве плагина.mainФункцияreturnиз плагина появится в терминале после завершения операции, поддерживая строки, чертежи и таблицы.returnрезультат выполнения плагина.

Как использовать

  • Добавить стратегию

Поиск непосредственно в поисковом поле, как показано на рисунке. Обратите внимание, что можно запустить только стратегии типа торгового плагина, а затем нажмите Добавить. Публичные плагины можно найти в Strategy Square:https://www.fmz.com/square/21/1

img img

  • Запустить плагин

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

img

  • Остановить плагин

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

img

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

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

Помощь в ручной торговле фьючерсами с временным хеджированием

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

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

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

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

Следующий код является исходным кодом плагина по заказу айсберга: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)
    }
}

Подводя итог

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


Связанные

Больше