Экспорт на 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’.

Расшифровка параметров:

  • Key= ключ, по которому будет выбрана стратегия в боте с соотв. полем ChannelKey (в примере на картинке выше это Test1).
  • Coin= монета
  • Order=
  • buy — команда на покупку
  • sell — активация продажи на ранее купленной в боте монете (купленной по любой стратегии, не обязательно UDP)
  • BuyPrice= цена ордера на покупку. Если не задана, будет использована настройка стратегии

Пример кода, поясняющий прием и обработку данных: (скачать архив с исходным кодом и готовым примером)

 // 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;