Экспорт на UDP порт

Бот также может принимать сигналы на покупку через UDP порт.

Данная функция находится в стадии альфа-теста.

Для включения зайти в настройки — специальные, поставить галочку «UDP Export».

Данные из бота пересылаются в двоичном формате пакетами по несколько элементов, в параметрах UDP указать порт 2000, размер буфера 65000. Массив свечей пересылается целиком при каждом обновлении раз в 5 минут; трейды пересылаются только новые, но в 1 пакете их может быть несколько.

Сигналы принимаются ботом на порту 1999 в простом текстовом формате. Принятые сигналы обрабатываются стратегией типа UDP

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