К-линейная обработка данных в программируемых сделках

Автор:Маленькие мечты, Создано: 2019-08-13 11:11:38, Обновлено: 2023-10-20 20:06:13

img

К-линейная обработка данных в программируемых сделках

При написании программируемой стратегии торговли часто возникает потребность в использовании нестандартных циклов K-циклов, например, 12-минутных циклов K-циклов, 4-часовых циклов K-циклов, которые обычно не могут быть получены непосредственно. Ответ, конечно, есть. Нестандартные циклы могут быть получены с помощью данных более небольших циклов, объединенных в синтез, можно представить, что самая высокая цена в нескольких циклах рассчитывается как самая высокая цена после синтеза, минимальная цена рассчитывается как самая низкая цена после синтеза, цена открытия не изменяется. Вот как это было:

  • Подумайте.

    В качестве примера мы рассмотрим блокчейн-активный рынок BTC_USDT, который превращается из одного часа в четыре часа.

    img

    img

    img

    img

    Время Высокий Открыть Низкий Сбор
    2019.8.12 00:00 11447.07 11382.57 11367.2 11406.92
    2019.8.12 01:00 11420 11405.65 11366.6 11373.83
    2019.8.12 02:00 11419.24 11374.68 11365.51 11398.19
    2019.8.12 03:00 11407.88 11398.59 11369.7 11384.71

    Эти четыре 1-часовых цикла, которые мы собираем из одного корня 4-часового цикла, означают, что цена открытия на первом этапе 00:00: 11382.57. Цена закрытия - это цена закрытия последнего, то есть в 03:00:11384.71 Самые высокие цены найдите здесь самые высокие цены: 11447.07 Лучшие цены Найдите самые низкие цены здесь: 11365.51 4-часовой цикл. Начало времени 00:00 Начало времени 1-часовой линии K, то есть 2019.8.12 00:00 Суммы торгов за час (основное наблюдение за тем, как складываются цены, не показано в данных о торговле) здесь не делается.

    В результате, четырехчасовая линия K: Высота: 114477 Открытие: 11382.57 Низкий: 11365.51 Коллекция: 11384.71 Время: 08.12.2019.

    img

    Как видите, данные совпадают.

  • Создание программного обеспечения

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

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

      function GetNewCycleRecords (sourceRecords, targetCycle) {    // K线合成函数
          var ret = []
          
          // 首先获取源K线数据的周期
          if (!sourceRecords || sourceRecords.length < 2) {
              return null
          }
          var sourceLen = sourceRecords.length
          var sourceCycle = sourceRecords[sourceLen - 1].Time - sourceRecords[sourceLen - 2].Time
    
          if (targetCycle % sourceCycle != 0) {
              Log("targetCycle:", targetCycle)
              Log("sourceCycle:", sourceCycle)
              throw "targetCycle is not an integral multiple of sourceCycle."
          }
    
          if ((1000 * 60 * 60) % targetCycle != 0 && (1000 * 60 * 60 * 24) % targetCycle != 0) {
              Log("targetCycle:", targetCycle)
              Log("sourceCycle:", sourceCycle)
              Log((1000 * 60 * 60) % targetCycle, (1000 * 60 * 60 * 24) % targetCycle)
              throw "targetCycle cannot complete the cycle."
          }
    
          var multiple = targetCycle / sourceCycle
    
    
          var isBegin = false 
          var count = 0
          var high = 0 
          var low = 0 
          var open = 0
          var close = 0 
          var time = 0
          var vol = 0
          for (var i = 0 ; i < sourceLen ; i++) {
              // 获取 时区偏移数值
              var d = new Date()
              var n = d.getTimezoneOffset()
    
              if (((1000 * 60 * 60 * 24) - sourceRecords[i].Time % (1000 * 60 * 60 * 24) + (n * 1000 * 60)) % targetCycle == 0) {
                  isBegin = true
              }
    
              if (isBegin) {
                  if (count == 0) {
                      high = sourceRecords[i].High
                      low = sourceRecords[i].Low
                      open = sourceRecords[i].Open
                      close = sourceRecords[i].Close
                      time = sourceRecords[i].Time
                      vol = sourceRecords[i].Volume
    
                      count++
                  } else if (count < multiple) {
                      high = Math.max(high, sourceRecords[i].High)
                      low = Math.min(low, sourceRecords[i].Low)
                      close = sourceRecords[i].Close
                      vol += sourceRecords[i].Volume
    
                      count++
                  }
    
                  if (count == multiple || i == sourceLen - 1) {
                      ret.push({
                          High : high,
                          Low : low,
                          Open : open,
                          Close : close,
                          Time : time,
                          Volume : vol,
                      })
                      count = 0
                  }
              }
          }
    
          return ret 
      }
    
      // 测试
      function main () {
          while (true) {
              var r = exchange.GetRecords()                           // 原始数据,作为合成K线的基础K线数据,例如要合成4小时K线,可以用1小时K线作为原始数据。
              var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)      // 通过 GetNewCycleRecords 函数 传入 原始K线数据 r , 和目标周期, 1000 * 60 * 60 * 4 即 目标合成的周期 是4小时K线数据。
    
              $.PlotRecords(r2, "r2")                                 // 策略类库栏 可以勾选画线类库,调用 $.PlotRecords 画线类库 导出函数 画图。
              Sleep(1000)                                             // 每次循环间隔 1000 毫秒,防止访问K线接口获取数据过于频繁,导致交易所限制。
          }
      }
    

    Для того, чтобы синтезировать K-линии, нужны две вещи: первая - это сырьевые данные, то есть данные K-линий с небольшими циклами.var r = exchange.GetRecords()Полученные малые циклы K-линейные данные. Во-вторых, необходимо четко определить, насколько большим циклом является соединение, т.е. целевым циклом для синтеза K-линейных данных. Затем, используя алгоритм функции GetNewCycleRecords, можно наконец-то вернуть данные из синтезированной K-линейной структуры. Необходимо отметить следующее:

    • 1, целевой цикл не может быть меньше цикла K-строки, которую вы передаете в функцию GetNewCycleRecords в качестве источника данных. Это не может быть сделано с помощью небольших циклов, чтобы синтезировать данные с более маленькими циклами.

    • 2 ∞ Целевые циклы должны быть закрытыми. Что такое закрытие цикла? Проще говоря, в течение часа или дня цели цикла соединяются, образуя замкнутый цикл. Например: Например, линия K с 12-минутным циклом, начинающаяся с 0 минут 0 секунд в каждом часе (например, в 0 часа), первый цикл -00:00:00 ~ 00:12:00Второй цикл -00:12:00 ~ 00:24:00Третий цикл - это00:24:00 ~ 00:36:00Четвертый цикл - это00:36:00 ~ 00:48:00Пятый цикл.00:48:00 ~ 01:00:00В то же время, если вы хотите, чтобы ваш сайт стал более популярным, вы должны использовать его в течение одного часа.

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

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

    Сравнительный график биржimg

  • Структура данных, необходимая для конструирования с помощью K-линейных данных

    Часто люди спрашивают: "Как я могу вычислить среднюю цену для каждой линии K?"

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

    Например:talib.MAУравнительная показательная вычислительная функция имеет два параметра, первый параметр - данные, которые необходимо передать, а второй - параметр цикла показателя. Например, мы должны рассчитать показатели на следующем графике.img

    Цикл линии K составляет 4 часа. На графике биржи установлена средняя линия с параметром средней линии цикла 9. И источник данных, на который рассчитывается, является самой высокой ценой за бар.imgТо есть эта гама представляет собой гама, состоящая из показателей, которые составляют среднее расчетное значение наивысшей цены за 9 4-часовых циклов K-линии Bar.

    Мы сами создали данные, чтобы проверить, есть ли у них такие же результаты, как у графиков на биржах.

    var highs = []
    for (var i = 0 ; i < r2.length ; i++) {
        highs.push(r2[i].High)
    }
    

    Поскольку среднее значение наивысшей цены на каждый бар дает среднелинейный показатель. Тогда нужно сначала составить матрицу, в которой каждый элемент данных соответствует максимальной стоимости каждого бара. Вы можете видеть, что переменная highs начинается как пустая матрица, а затем мы переходим через переменную данных K-линий r2 (не помните r2? Посмотрите код в основной функции, которая синтезирует 4 часа K-линий выше). Читайте наивысшую цену r2 за Бар (т. е. r2[i].High, i принимает значения в диапазоне от 0 до r2.length - 1), затем push в highs.

    В данный момент highs можно передать в talib. MA вычисляет уравнение.

    Вот полный пример:

    function main () {
        while (true) {
            var r = exchange.GetRecords()
            var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)
            if (!r2) {
                continue
            }
            
            $.PlotRecords(r2, "r2")                                               // 画出K线
            
            var highs = []
            for (var i = 0 ; i < r2.length ; i++) {
                highs.push(r2[i].High)
            }
            
            var ma = talib.MA(highs, 9)                                           // 用均线指标函数 talib.MA 计算 均线指标
            $.PlotLine("high_MA9", ma[ma.length - 2], r2[r2.length - 2].Time)     // 使用画线类库把均线指标画在图表上
            
            Sleep(1000)
        }
    }
    

    Проверка выполнена:

    img

    Вы можете видеть, что среднелинейные показатели, на которых мыши останавливаются на графике,11466.9289

    Код, указанный выше, можно скопировать и использовать для выполнения тестов в политике.

  • Как получать данные K-линии на рынке цифровых денег

    Изобретатели квантовой платформы уже имеют встроенный интерфейс - функцию exchange.GetRecords, с помощью которой можно получить данные из K-линий. Ниже основное внимание уделяется непосредственному доступу к биржевым K-линейным интерфейсам для получения данных, поскольку иногда требуется указать параметры для получения большего количества K-линий, упакованных в интерфейс GetRecords. Обычно возвращается 100 штук. При первоначальном требовании к стратегии более 100 штук K-строки требуется собрать и ждать. Для того, чтобы политика работала как можно быстрее, можно самостоятельно упаковать функцию, напрямую зайти на K-линиевый интерфейс биржи и указать параметры для получения большего количества данных K-линии.

    Мы реализуем эту потребность, используя BTC_USDT как пример:

    Нажмите, чтобы найти API-документацию биржи и ознакомиться с описанием интерфейса K-линии:img

    https://api.huobi.pro/market/history/kline?period=1day&size=200&symbol=btcusdt
    

    Параметры:

    Имя параметра Тип Необходимо ли? Описание Признаки
    символ строка Истинно Сделка да БТКУСД, ЭТКУСД...
    Период строка Истинно Возвращается гранулированность времени данных, то есть промежуток времени между каждым блоком. 1 минута, 5 минут, 15 минут, 30 минут, 60 минут, 1 день, 1 месяц, 1 неделя, 1 год
    Размер цельное число ложный Возвращение строки данных K [1, 2000]

    Проверка кода:

    function GetRecords_Huobi (period, size, symbol) {
        var url = "https://api.huobi.pro/market/history/kline?" + "period=" + period + "&size=" + size + "&symbol=" + symbol
        var ret = HttpQuery(url)
        
        try {
            var jsonData = JSON.parse(ret)
            var records = []
            for (var i = jsonData.data.length - 1; i >= 0 ; i--) {
                records.push({
                    Time : jsonData.data[i].id * 1000,
                    High : jsonData.data[i].high,
                    Open : jsonData.data[i].open,
                    Low : jsonData.data[i].low,
                    Close : jsonData.data[i].close,
                    Volume : jsonData.data[i].vol,
                })
            }
            return records
        } catch (e) {
            Log(e)
        }
    }  
    
    
    function main() {
        var records = GetRecords_Huobi("1day", "300", "btcusdt")
        Log(records.length)
        $.PlotRecords(records, "K")
    }
    

    Например, вы можете получить доступ к интерфейсу торговой биржи в Python:

#!python3
import json
import urllib2

def GetRecords_Huobi(period, size, symbol):
    headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    url = "https://api.huobi.pro/market/history/kline?" + "period=" + period + "&size=" + size + "&symbol=" + symbol
    request = urllib2.Request(url)  
    request.add_header('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6')  
    opener = urllib2.build_opener()  
    f= opener.open(request)  
    ret = f.read().decode('utf-8')  
    
    try :
        jsonData = json.loads(ret)
        
        records = []
        for i in range(len(jsonData["data"]) - 1, -1, -1):
            records.append({
                "Time" : jsonData["data"][i]["id"] * 1000, 
                "High" : jsonData["data"][i]["high"], 
                "Open" : jsonData["data"][i]["open"], 
                "Low" : jsonData["data"][i]["low"], 
                "Close" : jsonData["data"][i]["close"], 
                "Volume" : jsonData["data"][i]["vol"], 
            })
        return records
    except Exception as e:
        Log(e)
        
def main():
    r = GetRecords_Huobi("1day", "300", "btcusdt")
    Log(len(r))
    ext.PlotRecords(r, "K")   # 需要引用Python画线类库


Например, в Python-версии можно получить доступ к интерфейсу K-линии:

#!python3
import json
import urllib2

def GetRecords_Huobi(period, size, symbol):
    headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    url = "https://api.binance.com/api/v3/klines?symbol=" + symbol + "&interval=" + period
    request = urllib2.Request(url)  
    request.add_header('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6')  
    opener = urllib2.build_opener()  
    f= opener.open(request)  
    ret = f.read().decode('utf-8')  
    try :
        jsonData = json.loads(ret)
        
        records = []
        for i in range(len(jsonData)):
            records.append({
                "Time" : float(jsonData[i][0]),
                "High" : float(jsonData[i][2]), 
                "Open" : float(jsonData[i][1]), 
                "Low" : float(jsonData[i][3]), 
                "Close" : float(jsonData[i][4]), 
                "Volume" : float(jsonData[i][5]), 
            })
        return records
    except Exception as e:
        Log(e)
        
def main():
    r = GetRecords_Huobi("1m", "300", "BTCUSDT")
    Log(len(r))
    ext.PlotRecords(r, "K")   # 需要引用Python画线类库


img

img

Как вы можете видеть в журнале, расшифровка records.length составляет 300, то есть количество баров данных records.K в строке 300.img


Связанные

Больше

БэмсменыМожет ли постмейстер исправить проблему? Невозможно составить k-день за 3 часа или за 6 часов.

Бэмсменыif (((1000 * 60 * 60 * 24) - sourceRecords[i].Time % (1000 * 60 * 60 * 24) + (n * 1000 * 60)) % targetCycle == 0) { isBegin = истинно {y:bi} В этом предложении есть проблема, потому что вы не можете составить k-день на 3 часа или 6 часов, вы можете составить k-день на 1 час, 2 часа и 4 часа.

xis2004Если мы хотим сканировать всю историю одного вида, можно ли сканировать всю историю одного вида?

УиллзхангСпасибо за ответ.

УиллзхангКак лучше обрабатывать данные, если вы хотите больше 300 бит? Например, 1000 K-линий данных.

Маленькие мечтыХорошо, время от времени меняю.

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

Маленькие мечтыЕсли превысить максимальное количество возвратов, поддерживаемое интерфейсом биржи, это позволит собрать только достаточное количество данных K-линий.