---
id: mooncmd-protocol-description
title: "Описание протокола \"MoonCDM\""
section: documentation
category: "Дополнительные материалы / Протокол удалённого управления \"MoonCMD\""
url: https://moonbot.pro/ru/documentation/mooncmd-remote-control-protocol/mooncmd-protocol-description
locale: ru
status: published
updated_at: 2026-07-04T11:07:48+00:00
---

# Описание протокола "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).
