• [C#] 마셜하지 않고 Ls증권 dll api 이용하기

    c++ 코드를 c#으로 쓰려면 marshal을 하는 게 흔한 방법이다. 그런데 이게 좀 느리다. 하지만 대부분의 경우에는 특별히 문제가 되지는 않는다. ls증권과 키움증권의 api들은 모두 x86으로만 작동하고 WinUi를 완전하게 지원하지 않는다. 그래서 이들을 이용한 producer 앱을 만들고 있다. consumer 앱들은 x64 WinUi로 만든다. named pipe를 쓰면 편한데 이거도 좀 느리다. 4천 개 넘는 종목들의 체결, 호가,…

  • Ls증권 프로그램 매매와 실제 체결 사이의 시간 차이

    272,208,000원 어치 매도는 212주의 금액이다. 프로그램 매도를 한 시간부터 거슬러 같은 수의 매도 수량을 찾아 보면 프로그램 매도 21초 전부터 8초 전 사이에 있다. 증권회사들은 대이터에 자기 서버의 시간을 저장한다. 따라서 논리적으로는 거래소가 생산한 대이터의 시간이 증권회사들마다 다를 수 있다. 하지만 거의 같다. 거래소들과 증권회사들 사이의 전송 속도에 의미 있는 차이가 없기 때문이다. 따라서 위의…

  • c# DllImport 대신 LibraryImport

    최신 비주얼 스투디오는 DllImport를 쓰면 LibraryImport로 바꾸라고 경고한다. 전자는 오래되었고 느리기 때문이다. LibraryImport의 기본 형태는 아래와 같다. access modifier는 생략할 수 없다. 정적으로만 이용할 수 있으므로 static으로 해야 한다. 컴파일러가 다른 파일에 자동으로 코드를 추가할 거라 partial로 해야 한다. 정수와 달리 bool이나 string은 마셜을 해야 한다. unmanaged의 정수와 .네트의 그것은 구조가 같지만 bool과 string은 그렇지…

  • c# ls증권 etk_decompress 예제

    ls증권의 rest api는 10분 200번 제한이 없어서 좋지만 서버로 하여금 압축하여 보내게 할 수가 없다. 레스트representational state transfer는 월드 와이드 웹에서 오가는 전송이다.

  • c# fixed byte 배열에 대이터 넣기

    예를 들어 ls증권 api의 경우 오래 전 버전의 비주얼 스투디오로 만들어 utf를 쓰지 않고 unified hangul code로 보낸다. 이 코드를 code page 949(cp949)나 windows-949 등으로 부른다. 949는 그냥 여러 코드 패이지들 가운데 구분하기 위한 identifier다. 오래된 거고 지금은 거의 쓰지 않는다. 최근 버전의 .네트는 utf만 지원하여 위 코드 패이지로 인코드나 디코드를 하려면 encoding provider라는 걸…

  • c# value 타입 배열 만들기

    배열은 레퍼런스 타입이다. 레퍼런스 타입은 메모리 매핑을 할 수 없다. 블리터블이 아니기 때문이다. 컴퓨터에서 map은 지도를 그린다는 뜻이 아니다. (transitive, followed by a “to” phrase) To create a direct relationship to; to create a correspondence with.wiktionary 직역을 하면 대응하게 만든다는 의미다. 쉽게 설명하면 이미 메모리에 있는 물리적 바이트를 가리키는 포인터를 추가로 만드는 행위다. 예를 들어…

  • WinUi ContentDialog await를 ContentDialogButtonClickDeferral로 제어하기

    WinUi의 ContentDialog는 특이하게 작동한다. 버튼 클릭 이벤트 메떠드에 await가 있으면 다이어로그를 닫고 기다린다. await가 작동하는 동안 메시지를 출력하는 등의 작업을 원칙적으로 할 수 없다. await가 작동하는 동안 다이어로그를 사라지지 않게 하려면 ContentDialogButtonClickDeferral를 써야 한다.