Протокол удалённого управления "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.
Заголовок
Порядок чтения:
-
Прочитать word ver (2 байта) – версия формата.
-
Прочитать 4 строки в UTF-8:
-
MarketName:- word L- L байт UTF-8;
-
MarketCurrency:- word L- L байт UTF-8;
-
PumpChannel (cfg.PumpChannel):- word L- L байт UTF-8;
-
bnMarketName:- word L- L байт UTF-8.
Интервал времени
Порядок чтения:
-
Прочитать StartTime (8 байт double, TDateTime);
-
Прочитать EndTime (8 байт double, TDateTime).
Линия исторических цен (HistoryPrice)
Элемент THistoricalPrice (исправление):
в потоке используется как пара (Time, Price), оба double.
Тип элемента:
-
8 байт: double Time;
-
8 байт: double Price.
Порядок чтения:
-
Прочитать integer N (4 байта) – количество элементов.
-
Если N > 0, прочитать N элементов подряд:
для i = 0..N-1: -
8 байт: Time[i];
-
8 байт: Price[i].
Ордера pData (если записывались)
В потоке это выглядит так как указано ниже\
Порядок чтения
-
Прочитать integer N (4 байта):
-
если при записи pData = nil, то N = 0 (дальше ордеров нет);
-
если pData <> nil, то N = 2 (ровно два ордера)
-
Если N > 0, читаем N=2 раза: Ордер на покупку и Ордер на продажу:
-
OrderID: TOrderUID = string[40]:
- 1 байт: Len (0..40)
- Len байт: данные идентификатора (однобайтные символы) (если хочется строго повторить Delphi ShortString, можно всегда читать 41 байт, но для разбора достаточно: 1 байт длины + Len байт данных) -
MeanPrice:
- 8 байт: double -
CreateTime:
- 8 байт: double (TDateTime) -
OpenTime:
- 8 байт: double (TDateTime) -
CloseTime:
- 8 байт: double (TDateTime)
Сделки на графике (Крестики, OrdersH)
Элемент THPackedHOrder:
-
8 байт: double Time (TDateTime)
-
8 байт: double Price (для продаж цена записывается со знаком «−»)
- 8 байт: double Time (TDateTime)- 8 байт: double Time (TDateTime)
Порядок чтения
-
Прочитать integer N (4 байта) – количество сделок.
-
Если N > 0, прочитать N элементов подряд:
для j = 0..N-1:
- 8 байт: Time[j]
- 8 байт: Price[j].
Блок дельт / объёмов (два варианта)
-
Last1mDelta – 8 байт;
-
Last5mDelta – 8 байт;
-
Last1hDelta – 8 байт;
-
Last3hDelta – 8 байт;
-
Last24hDelta – 8 байт;
-
PumpDelta1h – 8 байт;
-
DumpDelta1h – 8 байт;
-
hvol – 8 байт;
-
hvolFast – 8 байт;
-
TestPriceDown – 8 байт;
-
TestPriceUp – 8 байт;
-
IsMoonShot – 1 байт;
-
SessionProfit – 8 байт.
Линия средней цены по трейдам (ClosestPrices)
Элементы того же формата, что THistoricalPrice записи выше:
(Time, Price), оба double.
Тип элемента:
-
8 байт: double Time;
-
8 байт: double Price.
Порядок чтения
-
Прочитать integer N (4 байта) – количество точек.
-
Если 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 байта.
Порядок чтения
-
Прочитать integer N (4 байта) – количество мини-свечей.
-
Если N > 0, для каждой свечи (i = 0..N-1) прочитать:
-
Time – 8 байт (double, TDateTime);
-
Cnt – 4 байта (integer);
-
MinPrice – 8 байт (double);
-
MaxPrice – 8 байт (double);
-
BuyVol – 8 байт (double);
-
SellVol – 8 байт (double).
Итоговый порядок чтения файла
-
word ver;
-
UTF-8 строка MarketName;
-
UTF-8 строка MarketCurrency;
-
UTF-8 строка PumpChannel;
-
UTF-8 строка bnMarketName;
-
TDateTime StartTime (double);
-
TDateTime EndTime (double);
-
integer N_History;
-
N_History * (Time, Price) как double,double;
-
N_Orders * (OrderID string[40], MeanPrice, CreateTime, OpenTime, CloseTime);
-
integer N_Trades;
-
N_Trades * (Time, Price) как double,double;
-
Блок дельт/объёмов;
-
double SessionProfit;
-
integer N_ClosestPrices;
-
N_ClosestPrices * (Time, Price) как double,double;
-
integer N_SCandles;
-
N_SCandles * TMiniCandle (Time, Cnt, MinPrice, MaxPrice, BuyVol, SellVol).