콘텐츠로 이동

네트워크 접근

이 가이드는 인터넷에 접근할 수 있는 알고리즘을 생성하는 방법을 정의합니다. 아래는 이 API 기능에 대한 1분 요약입니다.

1분 만에 네트워크 접근!

  • 당신의 알고리즘 솔루션은 트레이딩 뉴스 웹사이트나 Forex 중심의 웹 API에서 정보를 가져올 수 있습니다. 이 기능을 사용하여 cBots, 플러그인 및 지표가 긴급한 실시간 이벤트와 정보에 반응하도록 보장하세요.
  • System.Text.JsonSystem.Text.Json.Serialization 네임스페이스의 메서드를 사용하여 JSON 파일로부터 객체를 빠르게 직렬화하거나 역직렬화할 수 있으며, 이를 통해 cBots이 엔드포인트를 쉽게 소비하고 유용한 정보를 처리할 수 있습니다.
  • WebSocket 프로토콜은 매번 HTTP 요청을 할 필요 없이 실시간으로 서비스로부터 데이터를 받을 수 있게 합니다. 웹소켓을 사용하여 웹 리소스와 알고리즘을 원활하게 통합하세요. WebSocketClient 클래스는 웹소켓 연결을 사용하는 데 필요한 모든 메서드와 매개변수를 포함하고 있습니다.
  • 웹소켓을 사용할 때 문자열과 원시 바이트 데이터를 보내고 받을 수 있습니다. 다양한 데이터 구조를 작업하고 이를 바이트로 직렬화하여 유용한 타사 서비스를 사용하세요.
  • AccessRights.None은 네트워크 기능에 충분합니다.

HTTP

새로운 Http 인터페이스는 구현 시 cBots 및 기타 유형의 알고리즘이 인터넷에 접근할 수 있도록 하는 여러 메서드를 포함하고 있습니다. 예를 들어 다음을 참조하세요:

  • HttpResponse Http.Get(string uri). 전달된 문자열 uri에 지정된 URI에 GET 요청을 수행하고 이 요청의 결과를 포함하는 HttpsResponse 객체를 반환합니다.

HttpsRequest 클래스는 POST 요청을 포함한 더 복잡한 요청을 수행할 수 있게 합니다. 이러한 요청을 수행하려면 HttpsRequest.Method 속성을 HttpMethod.Put 또는 HttpMethod.Patch와 같은 HttpMethod enum 값 중 하나로 설정하세요.

HttpsRequest.Uri 속성은 요청이 전송되는 URI를 포함하며 HttpsRequest.Body 속성을 사용하여 요청 본문을 설정할 수 있습니다. 아래는 HttpsRequest 객체를 사용하는 방법의 예입니다.

  • HttpResponse Http.Send(HttpRequest request). 이 메서드에 전달된 HttpsRequest 객체의 request.Uri 속성 값으로 지정된 URI에 요청을 수행합니다. 그 후, 이 요청의 결과를 포함하는 HttpsResponse 객체를 반환합니다. 요청 유형은 equest.Method 속성 값으로 설정됩니다.

백테스트 및 최적화에서의 네트워크 접근

Http 인터페이스의 모든 메서드는 백테스트 및 최적화에서 의도한 대로 작동합니다. 백테스트 또는 최적화에서 웹 리소스에 접근할 때, 이 리소스의 최신 버전이 요청되며 역사적 버전이 아닙니다.

예제 cBots 생성

GET 요청 수행

다음과 같은 작업을 수행하는 간단한 cBot을 생성할 것입니다:

  • GET 요청을 보내고 https://forexApiExample.com/v1/exchangerate의 API를 통해 JSON 파일에 접근합니다(이 API는 완전히 가짜임).
  • GET 응답이 성공적이면, cBot은 응답 본문을 사용자 정의 SymbolPrice 클래스의 객체로 역직렬화합니다(이 클래스는 데모 목적으로 생성됨).
  • API에 지정된 가격보다 약간 높은 가격으로 심볼에 대한 매도 지정가 주문을 제출합니다.

이 cBot은 완전히 가상입니다. 코드는 빌드되지만 어떤 의미 있는 작업도 수행하지 않습니다.

JSON 파일에서 문자열을 직렬화하거나 역직렬화하는 방법

우리 cBot의 코드에는 System.Text.JsonSystem.Text.Json.Serialization이라는 두 가지 중요한 using 문이 포함되어 있습니다. 이 네임스페이스는 JsonSerializer.Deserialize<T>()와 같은 JSON 파일에서 문자열을 쉽게 직렬화하고 역직렬화할 수 있는 여러 메서드를 포함하고 있습니다.

다음은 우리 예제 cBot의 코드입니다:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NetworkAccessTest : Robot
    {

        protected override void OnStart()
        {

            var responseToGet = Http.Get("https://forexApiExample.com/v1/exchangerate");

            if (responseToGet.IsSuccessful)
            {
                var tradedSymbol = JsonSerializer.Deserialize<SymbolPrice>(responseToGet.Body);
                var result = PlaceLimitOrder(TradeType.Sell, tradedSymbol.SymbolName, 10000, tradedSymbol.ConversionRate + 0.15);

            }
        }
    }

    public class SymbolPrice
    {
        public string SymbolName { get; set; }
        public double ConversionRate { get; set; }
    }
}

이 cBot이 실제 API에 접근했다면 성공적으로 수행되었을 것입니다.

POST 요청 수행

다음과 같은 목표를 달성하는 더 고급 cBot을 생성할 수도 있습니다:

  • 동일한 가짜 API인 https://anotherForexApiExample.com/commodities/v1/getaccesstokenPOST 요청을 보냅니다. 이것은 이 API에 대한 액세스 토큰을 얻기 위해 수행됩니다.
  • 응답 본문의 토큰을 token 변수에 저장합니다.
  • token 변수의 값을 URI의 쿼리 매개변수로 전달하여 동일한 API에 GET 요청을 수행합니다(https://anotherForexApiExample.com/commodities/v1/getprices).
  • 위에서 논의한 JSON 직렬화를 사용하여 API에서 받은 가격보다 약간 낮은 가격으로 매수 역지정가 주문을 제출합니다.

다시 한 번, 이 cBot은 컴파일 시 어떤 의미 있는 작업도 수행하지 않습니다. 이것은 예제 목적으로만 존재합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NetworkAccessTestTwo : Robot
    {

        protected override void OnStart()
        {
            var uriForAccessToken = new Uri("https://anotherForexApiExample.com/commodities/v1/getaccesstoken");

            var postRequest = new HttpRequest(uriForAccessToken);

            postRequest.Method = HttpMethod.Post;

            var responseToPost = Http.Send(postRequest);

            var token = responseToPost.Body;

            var response = Http.Get($"https://anotherForexApiExample.com/commodities/v1/getprices?token={token}");

            if (response.IsSuccessful)
            {
                var tradedSymbol = JsonSerializer.Deserialize<SymbolPrice>(response.Body);

                var result = PlaceStopOrder(TradeType.Buy, tradedSymbol.SymbolName, 10000, tradedSymbol.ConversionRate - 0.15);

            }
        }
    }

    public class SymbolPrice
    {
        public string SymbolName { get; set; }
        public double ConversionRate { get; set; }
    }
}

WebSocket 클라이언트

Algo API는 누구나 웹소켓 연결을 사용하여 다양한 웹 서비스와 리소스를 사용할 수 있게 합니다. 네트워크 접근 기능에서 사용되는 HTTP 프로토콜과 비교하여 WebSocket 프로토콜은 더 빠르며 실시간으로 데이터를 받을 수 있습니다.

WebSocket 클라이언트 사용

WebSocket 클라이언트를 사용하는 것은 간단합니다:

  1. 웹소켓 연결을 위한 엔드포인트를 노출하는 서비스를 선택하세요.
  2. WebSocketClientOptions 클래스의 객체를 초기화하고 매개변수를 지정하여 클라이언트를 구성하세요.
  3. WebSocketClient 클래스의 객체를 초기화하고 이전에 생성한 옵션을 생성자에 전달하세요.
  4. Connect() 메서드를 사용하여 선택한 리소스에 연결하고 Send() 메서드를 통해 데이터를 보내세요.
  5. TextReceived()BinaryReceived() 이벤트 핸들러를 사용하여 WebSocket 클라이언트가 새 데이터를 받을 때 알고리즘이 수행해야 할 작업을 설정하세요.

아래에서는 웹소켓을 통해 가상의 경제 뉴스 서비스에 연결하는 간단한 cBot을 생성할 것입니다. cBot이 현재 연결된 심볼에 대한 새로운 뉴스가 게시되면 알고리즘은 뉴스 텍스트를 포함한 메시지 상자를 표시합니다.

참고

이 cBot은 예제 목적으로만 존재합니다. 성공적으로 빌드되지만 차트에 연결 시 어떤 작업도 수행하지 않습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class ExampleWebSocketBot : Robot
    {

        private static WebSocketClientOptions _webSocketClientOptions = new WebSocketClientOptions 
        {
            KeepAliveInterval = new TimeSpan(0, 1, 30),
            UseDefaultCredentials = true,
        };
        private WebSocketClient _webSocketClient = new WebSocketClient(_webSocketClientOptions);
        private readonly Uri _targetUri = new Uri("ws://amazingnews.com:8000");

        protected override void OnStart()
        {
            _webSocketClient.Connect(_targetUri);
            _webSocketClient.Send("Hello");
            _webSocketClient.TextReceived += NewsReceived;
        }

        protected override void OnStop()
        {
            _webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure);
        }

        private void NewsReceived(WebSocketClientTextReceivedEventArgs args) 
        {
            if (args.Text.Contains(SymbolName)) 
            {
                MessageBox.Show(args.Text, "News!", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
            }
        }
    }
}

보시다시피, 우리 코드는 매우 간결하며 WebSocketClient.TextReceived 이벤트를 처리하여 메시지 상자를 표시할 수 있습니다. 우리 cBot은 서비스로부터 정보를 적극적으로 요청하지 않습니다. 대신, 새로운 정보가 제공될 때 동적으로 반응합니다.

경고

웹소켓 클라이언트가 어떤 이유로든 연결이 끊어지면(예: 서버 측 오류로 인해 keep-alive 간격이 초과된 경우), WebSocketClient.Connect() 메서드를 다시 호출해야 합니다. 이러한 경우를 프로그래밍적으로 처리하려면 WebSocketClient.Disconnected 이벤트를 사용하세요.

WebSocket의 장점

WebSocket은 웹에서 새로운 데이터에 실시간으로 반응할 수 있게 해주기 때문에, 알고리즘에 대해 자율적으로 알림을 보낼 수 있는 타사 서비스와 통합하기에 완벽합니다. 다음은 WebSocket 클라이언트를 사용할 수 있는 웹 리소스의 몇 가지 예입니다.

  • 경제 뉴스 캘린더. 새로운 뉴스가 발표되면, 알고리즘이 주요 정보가 포함된 메시지 박스를 표시할 수 있습니다.
  • 생성형 AI 서비스. AI 서비스가 프롬프트에 대한 응답을 제공하기 시작하면, 완전한 응답을 기다릴 필요 없이 단어별로 결과를 표시할 수 있습니다.
  • 알고리즘이 연결된 심볼과 관련된 모든 심볼의 가격 스트림. 가격이 업데이트되면, 알고리즘 사용자에게 즉시 정확하게 표시됩니다.
  • 트레이딩에 초점을 맞춘 소셜 미디어 네트워크. 특정 심볼에 대한 새로운 메시지가 게시되면, 알고리즘이 해당 내용을 사용자에게 표시할 수 있습니다.

일반적으로, WebSocket 연결은 일반 HTTPS에 비해 다음과 같은 장점을 제공합니다:

  • WebSocket 연결은 더 효율적입니다. HTTP 요청은 헤더와 같은 추가 데이터를 포함해야 합니다. WebSocket을 사용하면 연결이 한 번만 설정되며, 이후에는 중복 데이터를 보낼 필요가 없습니다.
  • WebSocket 연결은 향상된 동시성을 제공합니다. HTTP 요청을 보낸 후 응답을 기다리는 동안 알고리즘 작업을 중단할 필요가 없습니다. WebSocket을 사용하면 언제든지 데이터를 보내고 받을 수 있으며 비동기적으로 처리할 수 있습니다.

WebSocket 클라이언트를 사용하면 모든 유형의 알고리즘이 웹 리소스와 동적으로 상호작용할 수 있으며, 이 상호작용은 HTTP를 사용하는 것보다 더 빠르고 효율적입니다. WebSocket 클라이언트를 사용하여 타사 서비스와 통합된 강력한 알고리즘을 구축하세요.

네트워크 접근 및 AccessRights 속성

간단히 말해, AccessRights enum은 알고리즘이 cTrader 외부의 데이터(예: 로컬 머신의 파일 시스템)에 접근할 수 있는지 여부를 정의합니다. 이 튜토리얼에서 더 자세히 알아볼 수 있습니다.

AccessRightsAccessRights.FullAccess로 설정하면 알고리즘이 고급 작업(예: Windows 레지스트리에서 정보를 가져오기)을 수행할 수 있습니다. 그러나 최종 사용자는 cBot이나 지표에 완전한 접근 권한을 부여하는 것이 데이터 유출로 이어질 수 있기 때문에 위험하다고 생각할 수 있습니다.

결과적으로, 알고리즘 제품을 다른 사람과 공유하려는 경우 AccessRights.None이 일반적으로 가장 합리적인 옵션입니다. 그러나 이 옵션을 선택하더라도, cTrader 제품은 웹에 자유롭게 접근할 수 있습니다. cTrader Algo API에 네트워크 접근 기능이 추가됨에 따라, cBot이 인터넷 리소스와 작업하기 위해 AccessRights 속성을 AccessRights.FullAccess로 설정할 필요가 없어졌습니다.

이는 알고리즘 개발자가 다른 트레이더에게 배포할 cTrader 제품을 코딩할 때 기회를 크게 확장합니다.

요약

결론적으로, 네트워크 접근은 추가적인 위험 없이 알고리즘이 수행할 수 있는 작업의 수를 크게 확장할 수 있는 강력한 기능입니다.