Экспорт на UDP порт
MoonBot может выводить рыночные данные (5-минутные свечи и все сделки по всем маркетам) на локальный UDP-порт (IP 127.0.0.1). Данные обновляются только по активным парам (BTC, USDT или ETH в зависимости от выбора в боте).
Бот также может принимать сигналы на покупку через UDP порт.
Данная функция находится в стадии альфа-теста.
Для включения зайти в настройки — специальные, поставить галочку «UDP Export».
Данные из бота пересылаются в двоичном формате пакетами по несколько элементов, в параметрах UDP указать порт 2000, размер буфера 65000. Массив свечей пересылается целиком при каждом обновлении раз в 5 минут; трейды пересылаются только новые, но в 1 пакете их может быть несколько.
Сигналы принимаются ботом на порту 1999 в простом текстовом формате. Принятые сигналы обрабатываются стратегией типа UDP
Пример сигнала: ‘Key=Test1 Coin=NEO Order=buy BuyPrice=0.0071’.
Расшифровка параметров:
Пример кода, поясняющий прием и обработку данных: (скачать архив с исходным кодом и готовым примером)
// structures
TOrderType = (O_SELL,O_BUY,O_BuyStop);
TUpdateKind = (UK_Candles, UK_Trades);
TUpdateHeader = packed record
Version: byte; // 1 byte — packet version, currently 1
TimeStamp: dword; // 4 bytes — Unix timestamp
Kind: TUpdateKind; // 1 byte — candles (0) or trades (1) inside
Coin: string[7]; // 7 bytes — coin ticker name
Count: word; // 2 bytes — elements count in the data array
reserved1: dword; // 4 bytes currently unused
reserved2: dword; // 4 bytes currently unused
end;
TTradeOrder = record // 8-bytes aligned
ID: integer;
Time: TDateTime;
Price: double;
Quantity: double;
BuyerID: integer;
reserved: integer;
OrderType: TOrderType;
FillType: byte; // 0 — PARTIAL, 1 — FULL
end;
TCandle = record
OpenP,CloseP,MaxP,MinP: double;
Vol: double;
Time: TDateTime;
end;
TTrades = array of TTradeOrder;
TCandles = array of TCandle;
// Data reading and handling
procedure TfrmUDPTest.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle);
var
hdr: TUpdateHeader;
Trades: TTrades;
Candles: TCandles;
begin
move(AData[0], hdr, SizeOf(hdr));
If hdr.Kind = UK_Trades then begin
SetLength(Trades, hdr.Count);
move(AData[SizeOf(hdr)], Trades[0], hdr.Count * SizeOf(TTradeOrder));
If SelectedCoin = hdr.Coin
then lPrice.Caption:=hdr.Coin + ‘ Last: ‘ + FloatToStr(Trades[hdr.Count — 1].Price);
end;
If hdr.Kind = UK_Candles then begin
SetLength(Candles, hdr.Count);
move(AData[SizeOf(hdr)], Candles[0], hdr.Count * SizeOf(TCandle));
lLastCandle.Caption:=’ Last candle: ‘ + hdr.Coin + ‘ 5m vol: ‘ + FloatToStr(Candles[hdr.Count — 1].Vol);
end;
lLastTrade.Caption:=Format(‘Last update: %s time: %d’, [hdr.Coin, hdr.TimeStamp]);
end;