Протокол удалённого управления "MoonCMD"

Быстрый поиск по статье

Описание протокола "MoonCDM"

Базовые типы


Порядок байт: little-endian для всех числовых типов.


Типы:


  • word – 2 байта (UInt16);

  • integer – 4 байта (Int32);

  • double – 8 байт (IEEE 754, Float64);

  • boolean – 1 байт (0 = false, 1 = true);

  • TDateTime – 8 байт (double), количество суток с 30.12.1899:
    0.0 = 30.12.1899 00:00
    1.0 = 31.12.1899 00:00
    0.5 = 30.12.1899 12:00 и т.п.


Короткая строка (ShortString):
- string[40] = 41 байт:
1 байт длины Len (0..40), затем Len байт символов (ANSI / однобайтная кодировка).

UTF-8 строки (WriteStringToStreamUtf8):
- 2 байта: word L – длина данных строки в байтах
- L байт: UTF-8 без BOM.


Заголовок


Порядок чтения:


  1. Прочитать word ver (2 байта) – версия формата.

  2. Прочитать 4 строки в UTF-8:

    1. MarketName:- word L- L байт UTF-8;

    2. MarketCurrency:- word L- L байт UTF-8;

    3. PumpChannel (cfg.PumpChannel):- word L- L байт UTF-8;

    4. bnMarketName:- word L- L байт UTF-8.


Интервал времени


Порядок чтения:


  1. Прочитать StartTime (8 байт double, TDateTime);

  2. Прочитать EndTime (8 байт double, TDateTime).


Линия исторических цен (HistoryPrice)


Элемент THistoricalPrice (исправление):
в потоке используется как пара (Time, Price), оба double.


Тип элемента:


  • 8 байт: double Time;

  • 8 байт: double Price.


Порядок чтения:


  1. Прочитать integer N (4 байта) – количество элементов.

  2. Если N > 0, прочитать N элементов подряд:
    для i = 0..N-1:

    1. 8 байт: Time[i];

    2. 8 байт: Price[i].


Ордера pData (если записывались)


В потоке это выглядит так как указано ниже\


Порядок чтения


  1. Прочитать integer N (4 байта):

    1. если при записи pData = nil, то N = 0 (дальше ордеров нет);

    2. если pData <> nil, то N = 2 (ровно два ордера)

  2. Если N > 0, читаем N=2 раза: Ордер на покупку и Ордер на продажу:

    1. OrderID: TOrderUID = string[40]:
      - 1 байт: Len (0..40)
      - Len байт: данные идентификатора (однобайтные символы) (если хочется строго повторить Delphi ShortString, можно всегда читать 41 байт, но для разбора достаточно: 1 байт длины + Len байт данных)

    2. MeanPrice:
      - 8 байт: double

    3. CreateTime:
      - 8 байт: double (TDateTime)

    4. OpenTime:
      - 8 байт: double (TDateTime)

    5. CloseTime:
      - 8 байт: double (TDateTime)


Сделки на графике (Крестики, OrdersH)


Элемент THPackedHOrder:


  • 8 байт: double Time (TDateTime)

  • 8 байт: double Price (для продаж цена записывается со знаком «−»)


- 8 байт: double Time (TDateTime)- 8 байт: double Time (TDateTime)


Порядок чтения


  1. Прочитать integer N (4 байта) – количество сделок.

  2. Если N > 0, прочитать N элементов подряд:
    для j = 0..N-1:
    - 8 байт: Time[j]
    - 8 байт: Price[j].


Блок дельт / объёмов (два варианта)


  1. Last1mDelta – 8 байт;

  2. Last5mDelta – 8 байт;

  3. Last1hDelta – 8 байт;

  4. Last3hDelta – 8 байт;

  5. Last24hDelta – 8 байт;

  6. PumpDelta1h – 8 байт;

  7. DumpDelta1h – 8 байт;

  8. hvol – 8 байт;

  9. hvolFast – 8 байт;

  10. TestPriceDown – 8 байт;

  11. TestPriceUp – 8 байт;

  12. IsMoonShot – 1 байт;

  13. SessionProfit – 8 байт. 


Линия средней цены по трейдам (ClosestPrices)


Элементы того же формата, что THistoricalPrice записи выше:
(Time, Price), оба double.


Тип элемента:


  • 8 байт: double Time;

  • 8 байт: double Price.


Порядок чтения


  1. Прочитать integer N (4 байта) – количество точек.

  2. Если N > 0, прочитать N элементов подряд:
    для k = 0..N-1:
    - 8 байт: Time[k]
    - 8 байт: Price[k].
    (В коде сначала пишут N=0, затем сами элементы, потом возвращаются и переписывают N.
    Читателю важен уже финальный вид: количество и N элементов.)


Мини-свечи (SCandles)


Структура TMiniCandle:


  • 8 байт: Time – TDateTime (double);

  • 4 байта: Cnt – integer (Int32);

  • 8 байт: MinPrice – double;

  •  8 байт: MaxPrice – double;

  • 8 байт: BuyVol – double;

  • 8 байт: SellVol – double.


Размер одного элемента TMiniCandle = 44 байта.


Порядок чтения


  1. Прочитать integer N (4 байта) – количество мини-свечей.

  2. Если N > 0, для каждой свечи (i = 0..N-1) прочитать:

    1. Time – 8 байт (double, TDateTime);

    2. Cnt – 4 байта (integer);

    3. MinPrice – 8 байт (double);

    4.  MaxPrice – 8 байт (double);

    5. BuyVol – 8 байт (double);

    6. SellVol – 8 байт (double).


Итоговый порядок чтения файла


  1. word ver;

  2. UTF-8 строка MarketName;

  3. UTF-8 строка MarketCurrency;

  4. UTF-8 строка PumpChannel;

  5. UTF-8 строка bnMarketName;

  6. TDateTime StartTime (double);

  7. TDateTime EndTime (double);

  8. integer N_History;

  9. N_History * (Time, Price) как double,double;

  10. N_Orders * (OrderID string[40], MeanPrice, CreateTime, OpenTime, CloseTime);

  11. integer N_Trades;

  12. N_Trades * (Time, Price) как double,double;

  13. Блок дельт/объёмов;

  14. double SessionProfit;

  15. integer N_ClosestPrices;

  16. N_ClosestPrices * (Time, Price) как double,double;

  17. integer N_SCandles;

  18. N_SCandles * TMiniCandle (Time, Cnt, MinPrice, MaxPrice, BuyVol, SellVol).