Быстро внедрить полуавтоматический инструмент количественной торговли

Автор:Доброта, Создано: 2020-08-30 10:11:02, Обновлено: 2023-10-08 19:54:06

img

Быстро внедрить полуавтоматический инструмент количественной торговли

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

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

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

Межвременный арбитраж - очень простая концепция.

Концепция межвременного арбитража

  • Цитата из Википедии

In economics and finance, arbitrage is the practice of taking advantage of a price difference between two or more markets: striking a combination of matching deals that capitalize upon the imbalance, the profit being the difference between the market prices at which the unit is traded. When used by academics, an arbitrage is a transaction that involves no negative cash flow at any probabilistic or temporal state and a positive cash flow in at least one state; in simple terms, it is the possibility of a risk-free profit after transaction costs. For example, an arbitrage opportunity is present when there is the opportunity to instantaneously buy something for a low price and sell it for a higher price.

Разработка стратегии

Рамочная стратегия заключается в следующем:

Function main(){
     While(true){
         If(exchange.IO("status")){ // Determine the connection status of the CTP protocol.
             LogStatus(_D(), "Already connected to CTP !") // Market Opening time, login connection is normal.
         } else {
             LogStatus(_D(), "CTP not connected!") // Not logged in to the trading front end.
         }
     }
}

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

Function main(){
     While(true){
         If(exchange.IO("status")){ // Determine the connection status of the CTP protocol.
             exchange.SetContractType("rb2001") // Set the far month contract
             Var tickerA = exchange.GetTicker() // far-month contract quote data
            
             exchange.SetContractType("rb1910") // Set the near month contract
             Var tickerB = exchange.GetTicker() // near-month contract quote data
            
             Var diff = tickerA.Last - tickerB.Last
             $.PlotLine("diff", diff)

             LogStatus(_D(), "Already connected to CTP !") // Market Opening time, login connection is normal.
         } else {
             LogStatus(_D(), "CTP not connected!") // Not logged in to the trading front end.
         }
     }
}

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

img

Интерактивная часть

На странице редактирования стратегии вы можете добавить интерактивные элементы управления непосредственно в стратегию:

img

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

После захвата команды различные команды могут обрабатываться по-разному.

Торговая часть кода может быть упакована с помощью функции Commodity Futures Trading Class Library.var q = $.NewTaskQueue()для создания объекта управления транзакциейq(заявляется как глобальная переменная).

var cmd = GetCommand()
if (cmd) {
    if (cmd == "plusHedge") {
        q.pushTask(exchange, "rb2001", "sell", 1, function(task, ret) {
            Log(task.desc, ret)
            if (ret) {
                q.pushTask(exchange, "rb1910", "buy", 1, 123, function(task, ret) {
                    Log("q", task.desc, ret, task.arg)
                })
            }
        })
    } else if (cmd == "minusHedge") {
        q.pushTask(exchange, "rb2001", "buy", 1, function(task, ret) {
            Log(task.desc, ret)
            if (ret) {
                q.pushTask(exchange, "rb1910", "sell", 1, 123, function(task, ret) {
                    Log("q", task.desc, ret, task.arg)
                })
            }
        })
    } else if (cmd == "coverPlus") {
        q.pushTask(exchange, "rb2001", "closesell", 1, function(task, ret) {
            Log(task.desc, ret)
            if (ret) {
                q.pushTask(exchange, "rb1910", "closebuy", 1, 123, function(task, ret) {
                    Log("q", task.desc, ret, task.arg)
                })
            }
        })
    } else if (cmd == "coverMinus") {
        q.pushTask(exchange, "rb2001", "closebuy", 1, function(task, ret) {
            Log(task.desc, ret)
            if (ret) {
                q.pushTask(exchange, "rb1910", "closesell", 1, 123, function(task, ret) {
                    Log("q", task.desc, ret, task.arg)
                })
            }
        })
    }
}
q.poll()

Связанные

Больше