Дополнительные материалы
Экспорт на UDP порт
Терминал Moonbot может выводить рыночные данные (5-минутные свечи и все сделки по всем маркетам) на локальный UDP-порт (IP 127.0.0.1). Данные обновляются только по активным парам (BTC, USDT или ETH в зависимости от выбора в боте).
Бот также может принимать сигналы на покупку через UDP порт.
Для включения зайти в Настройки → Специальные → System и установить галочку 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 - цена, на которую будет выставлен Buy ордер. Если не задана, то будет использована настройка стратегии.
Пример кода, поясняющий приём и обработку данных: (скачать архив с исходным кодом и готовым примером 🔗https://moonbot.eu/files/udpTest.zip)
// 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;