Type/to search
3
Follow
1503
Followers
Используйте плагины торгового терминала для упрощения ручной торговли
Discussions
Created 2020-02-29 21:04:52  Updated 2023-10-12 21:21:40
 2
 4401

img

Введение

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

img

Принцип плагина

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

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

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

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

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

img
img

    1. Запустите плагин.

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

img

    1. Остановите плагин.

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

img

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

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

Вспомогательное ручное фьючерсное кросс-периодное хеджирование

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

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

pine
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

javascript
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()) }

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

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

Следующий код является исходным кодом плагина Iceberg Order Buying: https://www.fmz.com/strategy/191771. Продать исходный код: https://www.fmz.com/strategy/191772

pine
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

pine
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

pine
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

pine
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) } }

Подвести итог

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

Related Recommendations
Comment
All comments (2)

    报错是什么原因?
    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"}

    6 years ago

    检查交易所文档或者咨询交易所客服

    6 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)