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