Вверх ↑
Этот топик читают: Гость
Ответов: 127
Рейтинг: 0
#1: 2021-04-04 10:48:22 ЛС | профиль | цитата
Собственно, задание в названии. Нужен websocket. Пишите цену, если это реально сделать.

карма: 0

0
Ответов: 127
Рейтинг: 0
#2: 2021-04-04 20:18:05 ЛС | профиль | цитата
Судя по поиску, сделать это невозможно или будет стоить как чугунный мост
карма: 0

0
Ответов: 168
Рейтинг: 7
#3: 2021-04-04 21:52:08 ЛС | профиль | цитата
Разжуй для непонятливых,скорее всего тебя не поняли, я например нихрена не понял как это вэб сокет,что и как ондолжен делать.
карма: 1

0
Ответов: 127
Рейтинг: 0
#4: 2021-04-05 05:58:06 ЛС | профиль | цитата
Понял.
Нужно получать в реальном времени данные из сервера. В моём случае из wss://stream.binance.com. Документация по api здесь.
карма: 0

0
Разработчик
Ответов: 4698
Рейтинг: 426
#5: 2021-04-05 14:28:19 ЛС | профиль | цитата
В данном случае, нужна документация не по конкретному API на базе websocket, а самого протокола websocket. Тут есть краткое описание, примеры и ссылка на RFC спецификации: https://ru.wikipedia.org/wiki/WebSocket.
Есть еще также реализация на C++, которую можно попытаться портировать на Delphi: https://gitlab.com/eidheim/Simple-WebSocket-Server/-/blob/master/server_ws.hpp. Но это дело кропотливое, не всякий возьмется, скорее всего. Я вот точно не возьмусь Но надеюсь ссылки помогут.
карма: 10
1
Голосовали:faniss
Ответов: 168
Рейтинг: 7
#6: 2021-04-05 20:20:34 ЛС | профиль | цитата
вроде понял,клиентом быть какого то спец-протокола по ip.Срочно надо?дело в том я занят уже в одном rt-проекте и когда освобожусь пока не знаю.
карма: 1

0
Ответов: 127
Рейтинг: 0
#7: 2021-04-05 21:14:58 ЛС | профиль | цитата
Особо не горит, ради такого дела можно и подождать
карма: 0

0
Ответов: 321
Рейтинг: 10
#8: 2021-04-10 01:31:46 ЛС | профиль | цитата
Как вариант, можно купить vds/vps хостинг.
Может где-то есть и виртуальный, с открытыми портами и CLI.
Поставить WS и TCP сервера (https://github.com/walkor/Workerman)
И ретранслировать WS-соединение через TCP, а на ПК принимать всё через штатный компонент TCP_Client.
карма: 1

1
Голосовали:faniss
Ответов: 70
Рейтинг: 1
#9: 2021-07-12 15:26:19 ЛС | профиль | цитата
Подниму тему, так как тоже появилась надобность в данном компоненте а точнее "клиента WebSocket", Разумеется за деньги.

Может эта ссылка упростит : https://example-code.com/delphiDll/binance_trade_stream.asp

Редактировалось 1 раз(а), последний 2021-07-12 16:15:36
карма: 1

0
Ответов: 782
Рейтинг: 168
#10: 2021-07-12 20:58:44 ЛС | профиль | цитата
Pavel, может быть вам в этом направлении двигаться?
Add(MainForm,2953706,84,77)
{
Visible=1
link(onCreate,12356033:doString,[])
}
Add(LinkTip,4440906,315,56)
{
Link="https://github.com/binance/binance-spot-api-docs/blob/master/rest-api.md"
Font=[MS Sans Serif,8,0,16711680,1]
}
Add(LinkTip,2530333,315,77)
{
Link="https://stackoverflow.com/questions/48187292/powershell-script-restful-api-binance-uri-structure"
Font=[MS Sans Serif,8,0,16711680,1]
}
Add(LinkTip,4112222,315,98)
{
Link="https://blog.p-difm.com/new-order-with-api-binance-and-powershell/"
Font=[MS Sans Serif,8,0,16711680,1]
}
Add(LinkTip,5735257,315,119)
{
Link="https://blog.p-difm.com/interact-with-your-binance-account-using-the-api-and-powershell/"
Font=[MS Sans Serif,8,0,16711680,1]
}
Add(FormatStr,12356033,133,91)
{
Mask="function Get-Price{\r\n <#\r\n .SYNOPSIS\r\n Return the price of the symbol passed in paramater\r\n\r\n .PARAMETER Symbol\r\n Indicate the pair of which you wish to obtain the price\r\n \r\n .PARAMETER Decimal\r\n The number of decimal places in the price of the crypto\r\n\r\n .EXAMPLE\r\n Get-Price -Symbol CVCUSDT -Decimal 5\r\n\r\n .EXAMPLE\r\n $Tickers = Get-Price\r\n #>\r\n\r\n [cmdletbinding()]\r\n param(\r\n [Parameter(Mandatory=$false)] \r\n [string]$Symbol,\r\n\r\n [Parameter(Mandatory=$false)]\r\n [ValidateSet(0,1,2,3,4,5,6,7,8)]\r\n [string]$Decimal = 3\r\n )\r\n\r\n BEGIN{\r\n if($PSBoundParameters.ContainsKey('Symbol')){\r\n $URL = "https://api.binance.com/api/v3/ticker/price?symbol=" + $Symbol\r\n }\r\n else{\r\n $URL = "https://api.binance.com/api/v3/ticker/price"\r\n }\r\n }\r\n \r\n PROCESS{\r\n $Ticker = curl $URL -Method get \r\n $Ticker = $Ticker.Content | ConvertFrom-Json\r\n }\r\n\r\n END{\r\n if($PSBoundParameters.ContainsKey('Symbol')){\r\n return [math]::Round($Ticker.Price, $Decimal)\r\n }\r\n else{\r\n return $Ticker\r\n }\r\n }\r\n}\r\n\r\n\r\nGet-Price | Out-GridView -Wait"
link(onFString,1335603:doReplace,[])
}
Add(WinExec,2400366,231,77)
{
FileName="POWERSHELL"
Mode=0
Action="runas"
Point(doConsoleExec)
Point(onConsoleTerminate)
link(onConsoleTerminate,2953706:doClose,[(277,97)(277,69)(74,69)(74,104)])
}
Add(Replace,1335603,182,91)
{
SubStr="""
DestStr="'"
link(onReplace,2400366:doConsoleExec,[])
}


Тоже самое но на стандартных компонентах
Add(MainForm,2953706,35,105)
{
link(onCreate,572158:doDownload,[])
}
Add(HTTP_Get,572158,98,119)
{
URL="https://api.binance.com/api/v3/ticker/price"
link(onDownload,11088056:doConvert,[])
}
Add(StreamConvertor,11088056,154,126)
{
Mode=6
link(onResult,6921208:doSearch,[])
}
Add(BlockFind,6921208,217,126)
{
IncludeBlock=1
StartBlock="{"
EndBlock="}"
link(onSearch,15146236:doMTString,[])
}
Add(MTStrTbl,7276875,203,266)
{
Left=405
Top=210
Align=5
Name="asd"
Columns=#6:symbol|5:price|
link(CodePageSet,16214834:GetData,[])
}
Add(MST_RowAction,7049544,336,112)
{
MSTControl="asd"
}
Add(MT_String,15146236,280,112)
{
Delimeter=","
link(onResult,7049544:doRowAction,[])
}
Add(Replace,10639956,322,210)
{
SubStr="""
link(onReplace,16214834:doData,[(361,216)(361,202)(193,202)(193,216)])
}
Add(EventFromData,16214834,203,210)
{
link(onEvent,16522996:doSplit,[])
}
Add(StrPart,16522996,266,210)
{
Char=":"
link(onSplit,10639956:doReplace,[])
}


Редактировалось 1 раз(а), последний 2021-07-12 22:00:52
карма: 15

0
Ответов: 70
Рейтинг: 1
#11: 2021-07-13 00:11:27 ЛС | профиль | цитата
Gunta, Спасибо за примеры, но API не подходит:
1) Скорость маленькая
2)если мониторить все монеты одновременно (тиковые цены, Объём покупок и продаж,число сделок, Объём в стакане пары покупки и продажи, 1м,5м,1ч......свечи,.....)
то быстро исчерпается лимит запросов ( Чем больше данных в запросе приходит от сервера бинанс, тем больше вес у этого запроса )
ну и соответственно, бинанс сделал строгий лимит по весу и количеству на эти запросы
1200 единиц веса запроса в минуту (обратите внимание: этот показатель не обязательно соответствует 1200 запросам)
50 ордеров за 10 секунд
160 000 ордеров за сутки

Вто время как websocket позволяет в реальном времени следить за любым количеством и объемом данных.
карма: 1

0
Ответов: 782
Рейтинг: 168
#12: 2021-07-13 08:22:13 ЛС | профиль | цитата
Pavel, на сколько я понял, получить данные через websocket можно как-то так
Add(MainForm,2953706,70,140)
{
Caption="Test WebSocket Connections"
link(onCreate,12356033:doString,[])
}
Add(FormatStr,12356033,119,154)
{
Mask="$client_id = [System.GUID]::NewGuid()\r\n\r\n$recv_queue = New-Object 'System.Collections.Concurrent.ConcurrentQueue[String]'\r\n$send_queue = New-Object 'System.Collections.Concurrent.ConcurrentQueue[String]'\r\n\r\n$ws = New-Object Net.WebSockets.ClientWebSocket\r\n$cts = New-Object Threading.CancellationTokenSource\r\n$ct = New-Object Threading.CancellationToken($false)\r\n\r\n$connectTask = $ws.ConnectAsync("%1", $cts.Token)\r\n\r\n\r\ndo { Sleep(1) }\r\nuntil ($connectTask.IsCompleted)\r\n\r\n$recv_job = {\r\n param($ws, $client_id, $recv_queue)\r\n\r\n $buffer = [Net.WebSockets.WebSocket]::CreateClientBuffer(1024,1024)\r\n $ct = [Threading.CancellationToken]::new($false)\r\n $taskResult = $null\r\n\r\n while ($ws.State -eq [Net.WebSockets.WebSocketState]::Open) {\r\n $jsonResult = ""\r\n do {\r\n $taskResult = $ws.ReceiveAsync($buffer, $ct)\r\n while (-not $taskResult.IsCompleted -and $ws.State -eq [Net.WebSockets.WebSocketState]::Open) {\r\n [Threading.Thread]::Sleep(10)\r\n }\r\n\r\n $jsonResult += [Text.Encoding]::UTF8.GetString($buffer, 0, $taskResult.Result.Count)\r\n } until (\r\n $ws.State -ne [Net.WebSockets.WebSocketState]::Open -or $taskResult.Result.EndOfMessage\r\n )\r\n\r\n if (-not [string]::IsNullOrEmpty($jsonResult)) {\r\n #"Received message(s): $jsonResult" | Out-File -FilePath "logs.txt" -Append\r\n $recv_queue.Enqueue($jsonResult)\r\n }\r\n }\r\n }\r\n\r\n $send_job = {\r\n param($ws, $client_id, $send_queue)\r\n\r\n $ct = New-Object Threading.CancellationToken($false)\r\n $workitem = $null\r\n while ($ws.State -eq [Net.WebSockets.WebSocketState]::Open){\r\n if ($send_queue.TryDequeue([ref] $workitem)) {\r\n #"Sending message: $workitem" | Out-File -FilePath "logs.txt" -Append\r\n\r\n [ArraySegment[byte]]$msg = [Text.Encoding]::UTF8.GetBytes($workitem)\r\n $ws.SendAsync(\r\n $msg,\r\n [System.Net.WebSockets.WebSocketMessageType]::Binary,\r\n $true,\r\n $ct\r\n ).GetAwaiter().GetResult() | Out-Null\r\n }\r\n }\r\n }\r\n\r\n$recv_runspace = [PowerShell]::Create()\r\n$recv_runspace.AddScript($recv_job).\r\n AddParameter("ws", $ws).\r\n AddParameter("client_id", $client_id).\r\n AddParameter("recv_queue", $recv_queue).BeginInvoke() | Out-Null\r\n\r\n$send_runspace = [PowerShell]::Create()\r\n$send_runspace.AddScript($send_job).\r\n AddParameter("ws", $ws).\r\n AddParameter("client_id", $client_id).\r\n AddParameter("send_queue", $send_queue).BeginInvoke() | Out-Null\r\n\r\ntry {\r\n do {\r\n $msg = $null\r\n while ($recv_queue.TryDequeue([ref] $msg)) {\r\n $msg \r\n $hash = @{\r\n ClientID = $client_id\r\n Payload = "Wat"\r\n }\r\n\r\n $test_payload = New-Object PSObject -Property $hash\r\n $json = ConvertTo-Json $test_payload\r\n $send_queue.Enqueue($json)\r\n }\r\n } until ($ws.State -ne [Net.WebSockets.WebSocketState]::Open)\r\n}\r\nfinally {\r\n $closetask = $ws.CloseAsync(\r\n [System.Net.WebSockets.WebSocketCloseStatus]::Empty,\r\n "",\r\n $ct\r\n )\r\n\r\n do { Sleep(1) }\r\n until ($closetask.IsCompleted)\r\n $ws.Dispose()\r\n\r\n $recv_runspace.Stop()\r\n $recv_runspace.Dispose()\r\n\r\n $send_runspace.Stop()\r\n $send_runspace.Dispose()\r\n}"
link(onFString,1335603:doReplace,[])
link(Str1,3081994:Text,[])
}
Add(WinExec,2400366,217,140)
{
FileName="POWERSHELL"
Mode=0
Action="runas"
Point(doConsoleExec)
Point(onConsoleResult)
Point(onConsoleTerminate)
link(onConsoleResult,7504290:doCharset,[])
link(onConsoleTerminate,2953706:doClose,[(256,167)(256,195)(60,195)(60,167)])
}
Add(Replace,1335603,168,154)
{
SubStr="""
DestStr="'"
link(onReplace,2400366:doConsoleExec,[])
}
Add(Charset,7504290,280,154)
{
link(onCharset,9397794:doAdd,[])
}
Add(Memo,9397794,329,154)
{
Left=550
Top=160
Align=5
ScrollBars=3
}
Add(LinkTip,1754118,63,63)
{
Link="https://docs.binance.org/api-reference/dex-api/ws-connection.html"
Font=[MS Sans Serif,8,0,16711680,1]
}
Add(VisualStrings,15578961,133,21)
{
Lines=#46:wss://stream.binance.com:9443/ws/bnbbtc@ticker|
Width=333
}
Add(LinkTip,8580031,63,77)
{
Link="https://github.com/binance/binance-spot-api-docs/blob/master/web-socket-streams.md"
Font=[MS Sans Serif,8,0,16711680,1]
}
Add(VisualStrings,3081994,119,105)
{
Lines=#52:wss://testnet-dex.binance.org/api/ws/$all@allTickers|
Width=270
}


После запуска нужно немного подождать для устаноки соединения.

Редактировалось 3 раз(а), последний 2021-07-13 08:54:39
карма: 15

1
Голосовали:Pavel
Ответов: 70
Рейтинг: 1
#13: 2021-07-13 10:19:43 ЛС | профиль | цитата
Gunta, не получается проверить , после компиляции в консоли тишина. (ждал более минуты )

Снимок.PNG
карма: 1

0
Ответов: 782
Рейтинг: 168
#14: 2021-07-13 10:57:46 ЛС | профиль | цитата
Pavel писал(а):
Gunta, не получается проверить , после компиляции в консоли тишина. (ждал более минуты )

Странно, у меня всё работает, данные идут непрерывно.
Снимок.PNG
Какая у тебя система?

Попробуй, что будет писать в Memo?
Add(MainForm,2953706,70,140)
{
Caption="Test WebSocket Connections"
link(onCreate,12356033:doString,[])
}
Add(FormatStr,12356033,119,154)
{
Mask="$client_id = [System.GUID]::NewGuid()\r\n\r\n$recv_queue = New-Object 'System.Collections.Concurrent.ConcurrentQueue[String]'\r\n$send_queue = New-Object 'System.Collections.Concurrent.ConcurrentQueue[String]'\r\n\r\n$ws = New-Object Net.WebSockets.ClientWebSocket\r\n$cts = New-Object Threading.CancellationTokenSource\r\n$ct = New-Object Threading.CancellationToken($false)\r\n\r\n$connectTask = $ws.ConnectAsync("%1", $cts.Token)\r\n\r\n\r\ndo { Sleep(1) }\r\nuntil ($connectTask.IsCompleted)\r\n\r\n$recv_job = {\r\n param($ws, $client_id, $recv_queue)\r\n\r\n $buffer = [Net.WebSockets.WebSocket]::CreateClientBuffer(1024,1024)\r\n $ct = [Threading.CancellationToken]::new($false)\r\n $taskResult = $null\r\n\r\n while ($ws.State -eq [Net.WebSockets.WebSocketState]::Open) {\r\n $jsonResult = ""\r\n do {\r\n $taskResult = $ws.ReceiveAsync($buffer, $ct)\r\n while (-not $taskResult.IsCompleted -and $ws.State -eq [Net.WebSockets.WebSocketState]::Open) {\r\n [Threading.Thread]::Sleep(10)\r\n }\r\n\r\n $jsonResult += [Text.Encoding]::UTF8.GetString($buffer, 0, $taskResult.Result.Count)\r\n } until (\r\n $ws.State -ne [Net.WebSockets.WebSocketState]::Open -or $taskResult.Result.EndOfMessage\r\n )\r\n\r\n if (-not [string]::IsNullOrEmpty($jsonResult)) {\r\n #"Received message(s): $jsonResult" | Out-File -FilePath "logs.txt" -Append\r\n $recv_queue.Enqueue($jsonResult)\r\n }\r\n }\r\n }\r\n\r\n $send_job = {\r\n param($ws, $client_id, $send_queue)\r\n\r\n $ct = New-Object Threading.CancellationToken($false)\r\n $workitem = $null\r\n while ($ws.State -eq [Net.WebSockets.WebSocketState]::Open){\r\n if ($send_queue.TryDequeue([ref] $workitem)) {\r\n #"Sending message: $workitem" | Out-File -FilePath "logs.txt" -Append\r\n\r\n [ArraySegment[byte]]$msg = [Text.Encoding]::UTF8.GetBytes($workitem)\r\n $ws.SendAsync(\r\n $msg,\r\n [System.Net.WebSockets.WebSocketMessageType]::Binary,\r\n $true,\r\n $ct\r\n ).GetAwaiter().GetResult() | Out-Null\r\n }\r\n }\r\n }\r\n\r\n$recv_runspace = [PowerShell]::Create()\r\n$recv_runspace.AddScript($recv_job).\r\n AddParameter("ws", $ws).\r\n AddParameter("client_id", $client_id).\r\n AddParameter("recv_queue", $recv_queue).BeginInvoke() | Out-Null\r\n\r\n$send_runspace = [PowerShell]::Create()\r\n$send_runspace.AddScript($send_job).\r\n AddParameter("ws", $ws).\r\n AddParameter("client_id", $client_id).\r\n AddParameter("send_queue", $send_queue).BeginInvoke() | Out-Null\r\n\r\ntry {\r\n do {\r\n $msg = $null\r\n while ($recv_queue.TryDequeue([ref] $msg)) {\r\n $msg \r\n $hash = @{\r\n ClientID = $client_id\r\n Payload = "Wat"\r\n }\r\n\r\n $test_payload = New-Object PSObject -Property $hash\r\n $json = ConvertTo-Json $test_payload\r\n $send_queue.Enqueue($json)\r\n }\r\n } until ($ws.State -ne [Net.WebSockets.WebSocketState]::Open)\r\n}\r\nfinally {\r\n $closetask = $ws.CloseAsync(\r\n [System.Net.WebSockets.WebSocketCloseStatus]::Empty,\r\n "",\r\n $ct\r\n )\r\n\r\n do { Sleep(1) }\r\n until ($closetask.IsCompleted)\r\n $ws.Dispose()\r\n\r\n $recv_runspace.Stop()\r\n $recv_runspace.Dispose()\r\n\r\n $send_runspace.Stop()\r\n $send_runspace.Dispose()\r\n}"
link(onFString,1335603:doReplace,[])
link(Str1,6027970:Text,[])
}
Add(WinExec,2400366,217,140)
{
FileName="POWERSHELL"
Mode=0
Action="runas"
Point(doConsoleExec)
Point(onConsoleResult)
Point(onConsoleError)
Point(onConsoleTerminate)
link(onConsoleResult,14970828:doWork2,[])
link(onConsoleError,14970828:doWork3,[(263,167)])
link(onConsoleTerminate,2953706:doClose,[(256,174)(256,195)(60,195)(60,167)])
}
Add(Replace,1335603,168,154)
{
SubStr="""
DestStr="'"
link(onReplace,2400366:doConsoleExec,[])
}
Add(Charset,7504290,280,154)
{
link(onCharset,9397794:doAdd,[])
}
Add(Memo,9397794,329,154)
{
Left=550
Top=160
Align=5
ScrollBars=3
}
Add(VisualStrings,6027970,119,105)
{
Lines=#50:wss://ws.coincap.io/prices?assets=bitcoin,ethereum|
Width=270
}
Add(HubEx,14970828,259,154)
{
link(onEvent,7504290:doCharset,[])
}


Снимок2.PNG

Редактировалось 2 раз(а), последний 2021-07-13 11:04:47
карма: 15

0
Ответов: 70
Рейтинг: 1
#15: 2021-07-13 11:09:23 ЛС | профиль | цитата
Gunta, Win7, Есть выход из этой ситуации ?
Снимок.PNG

Обновил PowerShell не помогло (:
Снимок.PNG

Судя по твоему скриншоту это то что нужно!
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)