<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>무엇이든올려봅니다.</title>
    <link>https://nextbrace.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 25 Jun 2026 12:00:13 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>비전공돌이</managingEditor>
    <item>
      <title>개발자 되는 방법 - 국비교육 vs 부트캠프 vs 독학</title>
      <link>https://nextbrace.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 최근에 블로그도 다시 시작하고, 이런 저런 곳에서 상담이나 질문들도 보고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 되고 싶은 분들이 제법 많아 보이더군요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 되고 싶다면 어떻게 해야 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 방법들을 알아보도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 전공&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 대학에서 전공을 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왠만큼 열심히 했다면 프로그래밍 능력은 갖추고 있을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;졸작이든 취업용 포트폴리오든 만들면서 기본적인 실력만 갖추고 있다면 취업 가능하겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 스펙(학교, 성적, 실력, 기타)을 갖추고 있다면 대기업이나 &quot;네카라쿠배&quot;에 공채를 노려볼 수도 있겠지요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실력이 부족하다면 다른 방법을 활용하면 됩니다. 비전공자보다는 유리할 겁니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 독학&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌면 가장 어려운 방법일지도 모르겠습니다. 하지만 불가능하지만도 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브에 무료 강좌도 많고 유료까지 고려하면 아주 많은 교육 컨텐츠들이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 본인의 의지도 있지만, 개발의 문제가 단순하지 않기 때문에 단방향의 듣기만 하는 교육이 생초보에게는 어려운 점이 많죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 비전공자나 생초보분들이 선택하기는 어려운 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 국비 교육&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국비 교육이 아무래도 흔합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자를 양성하는 국비교육은 아주 많고 무료에다가 용돈까지 주기도 하구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국비 교육은 국가 정책의 일환으로 (대부분) 무료로 교육을 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기간은 4개월 ~ 6개월이 보편적인 것 같구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학교나 직장처럼 9to6로 진행되는 경우가 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9시에 강의실에 들어가서 6시까지 진행하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출석율이 기준치이상이면 매월 수당 같은 돈이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약 30만원 전후로 알고 있는데, 수입이 없는 교육기간동안 상당한 도움이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지만 보면 아주 좋은 조건인 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 단점도 큽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 수업의 질이 편차만별입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강사도 제각각이고 강사의 수준도 그렇습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교육생들의 수준도 문제가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 비전공자들이고 프로그래밍에 아주 생초보인 경우가 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자의 소질이 전혀 없는 사람도 많구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그게 무슨 상관이냐고 하실 수도 있습니다만, 아주 큰 상관이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교육의 수준이 수강생들의 보편적인 수준에 맞춰서 진행되기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 2006년도에 국비 교육을 받아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 저에게는 도움이 안되어서 중간에 취업을 하면서 관뒀지요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 기억으로는 30명 중 개발자로 취업한 사람이 10명이 안되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 열심히 하는 사람은 개발자로 취업하였고 중소기업에서 경력 쌓다가 대기업 입사한 사람들도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열심히만 한다면 국비교육도 나쁜 선택은 아닐 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 부트캠프 &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부트캠프는 고품질, 고강도의 교육과정이라고 보면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 국비보다는 전문성이 있어 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 실무에서 수많은 신입 개발자를 만나보았는데, 국비학원 출신이 천차만별임에 비해 부트캠프쪽의 평균적인 실력은 낫다는 생각은 들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 비쌉니다. 적게는 500만원부터 1,000만원이 넘기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 취업 준비생이고 부모님의 후원이 있거나 모아놓은 돈이 있다면 미래를 위해 투자를 해볼 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 그게 아니면 역시 힘들겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 과외&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 분야든 과외가 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발쪽은 흔하진 않지만 또 없지만도 않은 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 좋은 선생님만 만난다면 개발실력은 쭉쭉 오를 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1:1로 맞춤 교육이 가능할테니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로 그런 선생님을 만나기는 쉽지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 선생님의 입장에서 생각을 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 풀타임으로 가르치면 3달이면 취업 가능한 수준으로 가르칠 자신이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 제 한달 급여가 최소 800만원이고 역할에 따라 1,000만원 이상을 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3달이면 2,400만원 이상입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수강생의 재능이나 기본기가 없다면 더 걸릴수도 있겠죠. 5달이 되면 4,000만원입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 그렇게 저를 풀타임으로 고용하는 사람은 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4명이 모여서 그룹과외로 진행한다고 쳐도 천만원씩은 내야하니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 부트캠프 비용보다 높으면 높지 낮지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 파트파임이라면 어떨까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 기준으로 시급이 얼마일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;45000원 ~ 60000원입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 매일 한 시간씩 한달에 20시간이라고 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5만원 * 20시간해서 백만원이라고 해보죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;낮은 가격이 아닙니다. 하지만 제 입장에서는 할까요? 안합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한시간으로 가르치는데에는 한계도 있고, 교육 준비에 필요한 시간도 있고 오프라인으로 만나려면 이동시간도 필요하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로는 매일 2시간씩 써야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;야근없는 프로젝트에서 800만원 받을 걸 900 받고 야근 조금 하는 프로젝트에 참여하는 것이 더 낫죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 배우는 사람은 너무 비싸서 안하고, 가르치는 사람은 번거로움 대비 비용이 낮아서 안합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 개발 과외가 흔하지 않은 것이겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 무엇이 가장 좋을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각자 사정에 따라 다를 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서도 말했지만 실력을 인정받는 개발자의 급여는 낮지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10년 후를 바라보고 더 빠른 실력 향상에 충분히 투자할 수 있는 금전적 여유가 있다면 부트캠프를 가시면 좋을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않다면 국비교육을 들어보는 것도 추천합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 열심히 하는 것은 어디나 마찬가지죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열심히 안할거면 개발자는 안하시는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 쉬운 직종은 아니거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 무엇보다 고민보다는 실행해보시길 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해봤는데 생각보다 프로그래밍이 재밌을 수도 있잖아요? 저절로 노력이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소질이 없다면? 후회없이 다른 일을 알아보면 되겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해볼까? 말까? 하면 어떻게 할까? 국비? 부트캠프?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면서 하루 이틀, 한달 두달...시간이 아깝죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 도전해보시고 좋은 개발자로 거듭 나시는 분들이 생겨나길 기원해봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실력있는 후배 개발자가 많으면 같은 업계에 있는 사람으로서 환영할 일이니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자의 삶/상식과 잡담 사이</category>
      <category>개발자</category>
      <category>개발자교육</category>
      <category>개발자되는방법</category>
      <category>개발자취업</category>
      <category>국비교육</category>
      <category>부트캠프</category>
      <author>비전공돌이</author>
      <guid isPermaLink="true">https://nextbrace.tistory.com/12</guid>
      <comments>https://nextbrace.tistory.com/12#entry12comment</comments>
      <pubDate>Thu, 11 Aug 2022 15:24:23 +0900</pubDate>
    </item>
    <item>
      <title>자동매매 프로그램 알고리즘 종류</title>
      <link>https://nextbrace.tistory.com/11</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;entrepreneur-g10e8aae35_1920.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co7ZGU/btrIWsnb7ho/Y5Kf641B6zliY3HyBGvWi1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co7ZGU/btrIWsnb7ho/Y5Kf641B6zliY3HyBGvWi1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co7ZGU/btrIWsnb7ho/Y5Kf641B6zliY3HyBGvWi1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco7ZGU%2FbtrIWsnb7ho%2FY5Kf641B6zliY3HyBGvWi1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;602&quot; data-filename=&quot;entrepreneur-g10e8aae35_1920.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 자동매매 프로그램들이 사용하는 전략이랄까요? 알고리즘이랄까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 사용하는 방법들에 대해 간략하게 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 잘 정리된 개념이나 용어적인 정리들이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 부분들은 구글에 검색해보면 많이 나옵니다. 제가 설명하기에 복잡하기도 하고, 역량도 좀 부족합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 저는 초급용으로 알기 쉬운 형태로 적어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용어들도 전문용어가 아닌 제 임의나 부르기 쉬운 용어들로 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 종류를 알아보기에 앞서 자동매매 프로그램의 목적을 살펴봐야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자동매매 프로그램의 목적&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람을 대신하여 매매를 한다.&lt;/li&gt;
&lt;li&gt;뇌동매매를 하지 않는다.&lt;/li&gt;
&lt;li&gt;사람보다 빠르고 정확한 계산과 판단으로 매매를 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바라는 효과는 더 있을 수 있겠지만 결국 최종적으로 기대하는 목적은 이겁니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;사람보다 높은 수익률을 기대한다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 사람보다 높은 수익률을 기대하기 위해서는 어떻게 해야 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 정확한 판단으로 매매할 때마다 더 높은 수익을 남기면 되겠죠. 아니면 매매 횟수를 늘려 합계 수익이 커지도록 해도 되구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;그렇다면 무엇을 해야 하는가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 매매를 해야합니다. 자동매매 프로그램이잖아요. 자동으로 매매를 수행하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그의 다른 글을 보신 분들이라면 자동매매 프로그램 만들기 자체는 어렵지 않다는 것을 아실 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 수익률이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;언제 사서&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;언제 파나&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 바로 매매 전략이죠. 프로그래밍적으로는 알고리즘 또는 로직인 것이고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;어떤 전략들이 있나?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전략은 만들기 나름인데 제가 생각하는 큰 분류는 아래 두 가지입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예측에 의한 타점 매매&lt;/li&gt;
&lt;li&gt;단순 원칙에 의한 반복 매매&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 예측을 하여 그에 맞는 매매를 하는 전략이 있을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 기술적 분석을 통하여 상승, 혹은 하락을 예상합니다. 그에 맞추어 매매를 하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 MACD를 통해 골든크로스에 매수, 데드크로스에 매도하는 전략이 이에 속한다 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차트 데이터를 기반으로 앞으로 올라갈지 내려갈지에 따라 매매를 하는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 수익률은 얼마나 잘 맞는 예측 공식을 찾느냐에 따라 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(구현 난이도는 올라가지만) 복잡할 수도 있겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;일봉 MACD가 골크가 나고 거래량이 직전 5일 평균보다 10%이상 많아야하며 RSI가 40이하인 경우 매수한다.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;RSI가 70이상이거나 데크가 발생하면 전량 매도한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 만들 수도 있을 겁니다. 여기에 볼밴을 버무리거나 이평선들을 비교한다던지, 일봉 외에 주봉이나 월봉을 참조한다던지..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼마든지 복잡하게 만들수도 있습니다. 물론 복잡하다 하여 수익이 난다는 보장이 되는 것은 아니겠지만요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 예측 기반의 전략에는 매도 조건에 손절이 포함되는 경우가 보통입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 잘못 설정되면 손실 매매만 반복할 가능성도 있는 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예측 기반의 자동매매는 어렵습니다. 수익이 나는 조건을 찾기도 어렵지만 장에 따라 다르기도 하니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추세추종이나 역추세 전략들을 공부해보시면 좋을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람이 직접 매매하 면서 돈이 벌리는 전략이 있다면 그것을 프로그램으로 옮기는 것도 방법이겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 단순 원칙에 의한 반복매매란 어떤 개념일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시를 들어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 주식보단 코인을 주로 다루지만, 주식을 예로 들어보죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 삼성전자는 망하지 않을 것 같다는 생각이 들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오르기도 하고 내리기도 하겠지만 적금처럼 꾸준히 사다보면 언젠가 수익이 나는 때가 올 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이런 프로그램을 만들겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매수 조건 : 매일 삼성전자 주식을 1주씩 산다. 가격 등 다른 조건은 없이 무조건 산다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매도 조건 : 평균 단가의 50% 수익이 발생하면 절반 매도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 심플하죠? 이름을 붙이고 싶네요. &lt;b&gt;&quot;거북이의 승리 전략&quot;&lt;/b&gt;이라고 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거북이의 승리 전략은 오를 것인지 내릴 것인지 예측을 하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오르든 내리든 그저 매일 1주씩 매수를 할 뿐이죠. 내려가면 평단을 낮추게 될 것이구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언젠가 오르다보면 매도 조건에 해당하여 수익실현을 하게 될 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 거북이의 승리 전략은 제가 만들어서 테스트도 해봤었는데 말이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5년 이상을 보고 하락이나 상승에 신경쓰지 않는다면 나쁘지 않은 전략입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 한 가지 전제는 필요하죠. 투자하는 종목이 상장폐지되지 않아야 하며 가능하면 현재 수준의 기업가치를 유지해야 합니다. 그래야 수익이 발생할 기약없는 미래를 기다릴 수 있으니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 자동매매 봇이 많이 쓰는 전략이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마틴게일&lt;br /&gt;물리면 물타기를 통해 평단을 낮춰서 탈출하는 전략입니다.&lt;br /&gt;예를 들어 100원에 100주를 삽니다. 하락하여 90원이 되면 200주를 삽니다. 평단이 93.33원이 됩니다. 더 내려가서 80원이 되면 400주를 더 삽니다. 이런 식으로 2배수 물타기를 하는 것이죠. 그러다 반등하여 수익권이 되면 매도 합니다.&lt;br /&gt;&lt;br /&gt;무한대의 자금이 있다면 실패할 수 없는 전략이기도 하죠. 하지만 우리는 무한대의 자금이 없습니다. 그래서 조심해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그리드, 거미줄&lt;br /&gt;100원에 10주 삽니다. 이 10주는 105원에 매도를 걸어둡니다.&lt;br /&gt;90원이 되면 10주를 삽니다. 이 10주는 95원에 매도를 걸어둡니다.&lt;br /&gt;81원이 되면 10주를 삽니다. 이 10주는 85원에 매도를 걸어둡니다.&lt;br /&gt;이런 식으로 각각의 매수를 분리하여 거래를 하는 겁니다. 그러면 차트에 매수/매도 걸어둔 것이 거미줄처럼 보여지죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGbYih/btrIYn69GYK/UOI1td3z71c3yTxyn0jIbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGbYih/btrIYn69GYK/UOI1td3z71c3yTxyn0jIbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGbYih/btrIYn69GYK/UOI1td3z71c3yTxyn0jIbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGbYih%2FbtrIYn69GYK%2FUOI1td3z71c3yTxyn0jIbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;472&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;651&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 각각의 매수마다 수익실현을 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 처음 매수한 수량은 그 이상의 가격을 회복하지 않는다면 영원히 팔지 못하기도 할 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하락한 상태에서 매수/매도를 반복하여 수익실현을 반복하면 손실을 매꿀수도 있겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마틴게일이나 그리드는 모두 가격과 무관하게 매수를 하는 전략입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 시장이 박스권일 때 수익이 극대화되죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동매매 판매하는 상당수는 이 마틴게일과 그리드를 활용하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 전략을 가공없이 그대로 쓴다면 솔직히 별로 권해드리고 싶진 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 쓰시겠다면 특징을 알고 쓰시길 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마틴게일은 물타기를 몇번까지 할 것인지를 잘 계산해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리드는 박스를 그려보고 그 내에서 움직이도록 간격을 설정하면 좋겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에는 딥러닝을 통해 학습한 인공지능이 매매를 하는 방법도 있긴 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이건 좀 복잡합니다. 비용도 많이 들죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수익률은 어떤 학습모델로 어떤 데이터를 학습하는지에 따라 천차만별이겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글이 자동매매 프로그램을 만들고자 하는 분들에게 어떤 형태로 접근할지 도움이 되면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 만들어서 돈도 많이 버시면 좋겠네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 여러가지 알고리즘을 만들어 돌리고 있습니다만, 계속 더 나은 전략을 고민하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 모두 부자가 될 수 있길 바라며 마치겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자의 삶/코인</category>
      <category>자동매매 구현 방식</category>
      <category>자동매매 알고리즘</category>
      <category>자동매매 전략</category>
      <category>자동매매 프로그램</category>
      <author>비전공돌이</author>
      <guid isPermaLink="true">https://nextbrace.tistory.com/11</guid>
      <comments>https://nextbrace.tistory.com/11#entry11comment</comments>
      <pubDate>Sat, 6 Aug 2022 01:01:36 +0900</pubDate>
    </item>
    <item>
      <title>풀스택(full-stack) 개발자란? 2편</title>
      <link>https://nextbrace.tistory.com/10</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;몇 일전에 적었던 풀스택 개발자에 대한 글의 조회수가 조금 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nextbrace.tistory.com/4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2022.07.29 - [개발자의 삶/상식과 잡담 사이] - 풀스택(full-stack) 개발자란?&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1659671420616&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;풀스택(full-stack) 개발자란?&quot; data-og-description=&quot;요즘 여기저기 풀 스택 개발자라는 말을 많이 듣습니다. 저 역시 자칭, 타칭 풀 스택 개발자라고 여겨지고 있죠. 그렇다면 풀스택 개발자란 어떤 의미일까요? 구글에서 검색하면 가장 먼저 나오&quot; data-og-host=&quot;nextbrace.tistory.com&quot; data-og-source-url=&quot;https://nextbrace.tistory.com/4&quot; data-og-url=&quot;https://nextbrace.tistory.com/4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ulHNn/hyPkzLc0pI/Kr9wwfnB3fMHK4ljbA6x4K/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320,https://scrap.kakaocdn.net/dn/kkyhJ/hyPjlA1v7D/NKoXhHj72FW9RkkTwcSsak/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320,https://scrap.kakaocdn.net/dn/dnXKoO/hyPkAwzKSs/RzrM5H2IKnGc0XMfVmSQok/img.png?width=1710&amp;amp;height=684&amp;amp;face=0_0_1710_684&quot;&gt;&lt;a href=&quot;https://nextbrace.tistory.com/4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nextbrace.tistory.com/4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ulHNn/hyPkzLc0pI/Kr9wwfnB3fMHK4ljbA6x4K/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320,https://scrap.kakaocdn.net/dn/kkyhJ/hyPjlA1v7D/NKoXhHj72FW9RkkTwcSsak/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320,https://scrap.kakaocdn.net/dn/dnXKoO/hyPkAwzKSs/RzrM5H2IKnGc0XMfVmSQok/img.png?width=1710&amp;amp;height=684&amp;amp;face=0_0_1710_684');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;풀스택(full-stack) 개발자란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;요즘 여기저기 풀 스택 개발자라는 말을 많이 듣습니다. 저 역시 자칭, 타칭 풀 스택 개발자라고 여겨지고 있죠. 그렇다면 풀스택 개발자란 어떤 의미일까요? 구글에서 검색하면 가장 먼저 나오&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nextbrace.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 다른 글을 적다가 풀스택이란 단어가 들어가길래 간단하게 적었던 글이었는데, 약간은 의외였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 2편으로 조금 상세하게 개인의 생각을 첨가하여 적어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;full-stack developer라는 말은 제가 개발을 처음 시작했을 때만 하더라도 들어보지 못한 단어였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 순간부터 풀스택 풀스택 하더군요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나씩 접근해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹사이트를 만드는 일을 한다고 생각해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소수의 회사를 제외하면 대부분은 별도의 프로젝트로 진행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IT조직이 충분한 회사라면 각 팀에서 필요한 직원을 차출하여 TF(Task Force, 특별히 구성된 임시 팀)를 구성하게 됩니다. 자사의 인적 자원이 충분하지 않다면 외주를 맡기기도 합니다. 모든 회사가 IT회사도 아니며, IT회사여도 실무 프로그래머가 충분한 경우는 많지 않기 때문에 보통은 외주 발주 형태로 진행을 하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 외주 발주를 통해 웹사이트를 만드는 프로젝트를 보통 SI(System Integration) 사업이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(원래 의미는 시스템 통합으로 어떤 시스템을 개발, 구축하는 것 자체를 의미합니다만, 국내에서는 의미가 조금 한정되었습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 SI 사업에서의 조직 구성은 어떤 형태로 진행될까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 프로젝트의 성향이나 어떤 시스템이냐에 따라 달라지긴 합니다만, 보편적으로는 유사한 경우가 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;PM&lt;br /&gt;프로젝트 매니저. 해당 프로젝트를 총괄하는 책임자를 의미합니다. 경우에 따라 발주사에서 PM을 맡는 경우도 있고 수행사에서 맡는 경우도 있습니다. 예산부터 일정, 인력 등을 관리하는 일을 하며, 스포츠에 비유하면 감독과 같은 역할입니다.&lt;br /&gt;큰 프로젝트의 경우 PM 한명이 모두 수행하기 어려울 수 있습니다. 이럴 때는 PMO(Project Management Officer)로 여러명이 해당 역할을 수행하기도 합니다. 이 경우에도 PMO의 수장을 PM이라고 하긴 합니다.&lt;/li&gt;
&lt;li&gt;PL&lt;br /&gt;Project Leader. 단어는 PM보다 높아보이지만 실제로는 중간 관리자입니다.&lt;br /&gt;보통은 프로젝트 내부에서 팀이나 파트를 나누면 해당 파트의 리더급 인력을 의미합니다. 실무자들과 PM 사이에서 일하게 되므로 관리자적인 능력이 요구되는 것은 당연합니다. 하지만 실무자들에게 인정받으려면 실무(보통은 개발)도 아주 잘 해야 합니다.&lt;/li&gt;
&lt;li&gt;기획자&lt;br /&gt;세분하면 또 나눠지겠으나 보통은 해당 시스템을 어떻게 만들지를 업무적으로 설계하는 사람입니다. 업무와 요건 분석을 통하여 디자이너, 개발자이 이해할 수 있는 기획서를 만들게 됩니다.&lt;/li&gt;
&lt;li&gt;디자이너&lt;br /&gt;UI가 없는 시스템이 아니라면 눈으로 보이는 부분을 담당합니다. 웹에서는 퍼블리싱까지 함께 하기도 합니다만, 최근에는 세분화되어 분리된 경우가 많습니다.&lt;/li&gt;
&lt;li&gt;DBA&lt;br /&gt;데이터베이스 관련된 업무를 합니다. 최근에는 DA와 구분하기도 합니다. 구분을 하지 않는다면 DB설계부터 설정, 튜닝까지 담당합니다.&lt;/li&gt;
&lt;li&gt;아키텍트 &lt;br /&gt;TA, AA, SA 등이 있습니다. 하는 일은 좀 다르지만 설계를 담당합니다. 어떤 기술을 사용할지부터 서버 구성은 어떻게 할 것인지, 네트워크 구성부터 어떤 SW를 사용할지도 결정하게 됩니다.&lt;/li&gt;
&lt;li&gt;개발자&lt;br /&gt;개발자는 이제 흔히 말하는 프로그래밍을 하는 사람입니다. 그런데 범위가 워낙 크다보니 분야를 나누게 됩니다.&lt;/li&gt;
&lt;li&gt;프론트엔드 개발자&lt;br /&gt;사용자에게 보이는 화면을 개발하는 사람입니다. 웹사이트에서는 실제 눈에 보이는 페이지들이 이 프론트엔드에 속합니다.&lt;br /&gt;앱의 경우에도 프론트엔드로 볼 수도 있지만, 기술셋이 다르기 때문에 앱 개발자는 따로 두는 경우가 대부분입니다.&lt;/li&gt;
&lt;li&gt;백엔드 개발자&lt;br /&gt;프론트엔드가 실제 눈에 보이는 화면이라면, 눈에 보이지는 않지만 데이터 처리 등을 담당하는 사람입니다.&lt;/li&gt;
&lt;li&gt;기타&lt;br /&gt;SE(System Engineer), NE(Network Engineer) 등등등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세분화 하면 끝도 없습니다. 보통의 경우에는 위와 같은 역할들이 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정한 하나의 스킬에 특화된 사람은 전문가라고 부를 수 있을 겁니다.예를 들어 DBA는 DB의 전문가겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자의 경우는 C++전문가, 파이썬 전문가가 있을 수 있을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 SI사업, 즉 웹사이트를 구축하는 경우에는 개발자 단위에서 전문가를 특별하게 어필하지 않는 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특별한 기술이 중요한 경우에는 그런 사람을 찾기도 합니다만, 보통은 어떤 기술의 전문가보다는 풀스택 개발자를 선호하는 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 그럴까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 시스템을 구성하는데 필요한 기술이 엄청 많습니다. 다른 역할도 그렇지만 개발 범위는 점점 더 넓어지고 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 10개 분야가 필요한 시스템이라고 해보겠습니다. 가장 좋은 것은 각 분야의 전문가 10명을 찾는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 SI 프로젝트의 특성 때문에 그게 힘듭니다. 하청 구조는 언급하지 않더라도, 애초에 고정팀이 아니라 TF형태로 임시로 모이는 조직입니다. 검증된 각 분야의 전문가를 뽑는 것이 쉬운 일이 아니죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 전문가는 비쌉니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10개 분야 중 1~5까지는 매우 어려운 업무라고 하겠습니다. 나머지는 상대적으로 쉽거나 사용하는 비중이 크지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나만 잘하는 전문가 5명은 아무리봐도 과한 것 같네요. 풀스택 개발자 2명이면 될 것 같습니다. 그게 더 싸기도 하구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 프로젝트에서는 설계도 가능하고 DB도, 백엔드도 프론트엔드도 가능한 사람이 있으면 좋겠거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인건비, 공간비용(책상자리), 부대비용 등 모두 절약할 수 있으니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 형태로 풀스택 개발자를 필요로 하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 보면 풀스택 개발자가 악용되는 경우라고 볼 수도 있겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 풀스택이어서 저런 업무에 투입되는 것이 아니고, 업체에서 비용을 줄이기 위하여 풀스택을 강요하여 만들어지기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(사실 한국의 풀스택 개발자 상당수는 이렇게 시작되었을 겁니다. 저도 그렇구요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바람직한 풀스택 개발자는 어떤 형태일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히 말하는 T자형 인재가 있을 겁니다. 한 가지의 깊이있는 전문 분야와 넓은 지식을 두루 갖춘 인재이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 T자형 인재의 개발자 버전이 바로 풀스택이 아닐까 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상적이라면 모든 분야에서 깊이까지 있는 개발자면 좋겠지요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 그건 불가능합니다. 천부적인 스포츠선수도 자기 종목만 잘하는 법이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 다른 종목도 연습하면 '쉽게 잘 할 수' 있는 역량은 있을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 풀스택 개발자가 필요한 경우는 언제일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 빛을 발하는 곳은 스타트업이 아닐까 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 스타트업에서 일을 해보니 어느 분야든 왠만큼 할 수 있어서 참 다행이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직원을 고용할 여력도 없을 뿐더러, 시간은 더더욱 없습니다. 빠르게 구현을 해야하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스스로 모든 부분을 이해하고 있고 설계할 수 있으며 개발까지 가능하니 의사결정도 빠릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로는 SI에서 PL이나 아키텍트 역할도 잘 수행할 수 있을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많이 알수록 시행착오를 줄일 수 있으니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 개발자는 풀스택을 추구해야 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 생각에는 반드시는 아니지만, 대체적으로는 그렇다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술도 유행을 타며 몸값도 유동적입니다. 대우를 받고 일하는 것이 좋으니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 풀스택 개발자가 되려면 어떻게 해야할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답도 왕도도 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 깊은 우물을 판 이후에 다른 곳을 파도 됩니다. 끝까지 파본 경험으로 더 쉽고 빠르게 팔 수 있을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 경험을 위주로 해도 됩니다. 지뢰찾기 게임 하다보면 어느 순간 한번에 넓게 맞춰지는 것처럼 한번에 깨달음을 얻기도 하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 자신의 환경에서 최선을 다하는 것이 좋겠다는 생각이 듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하는 업무에 집중하며 그 기술을 더 깊이 이해하는 것도 좋고, 여가시간을 활용하여 새로운 기술을 습득해나가도 좋겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노력하는 개발자는 결국 풀스택으로 갈 수밖에 없다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀스택이란 단어에 집중하기보다는 꾸준히 노력하는 개발자가 된다면, 저절로 따라오는 수식어이지 않을까 하는 생각이 드네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 더더욱 노력해야겠다는 다짐을 하며 글을 마치겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자의 삶/상식과 잡담 사이</category>
      <category>full-stack</category>
      <category>FullStack</category>
      <category>풀스택 개발자</category>
      <author>비전공돌이</author>
      <guid isPermaLink="true">https://nextbrace.tistory.com/10</guid>
      <comments>https://nextbrace.tistory.com/10#entry10comment</comments>
      <pubDate>Fri, 5 Aug 2022 14:28:19 +0900</pubDate>
    </item>
    <item>
      <title>Nodejs 바이낸스 API 연동 - 매도 주문</title>
      <link>https://nextbrace.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 어제에 이어 binance api를 활용하여 매도 주문을 넣어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;buy(symbol, quoteOrderQty) {
    client.newOrder(symbol, 'BUY', 'MARKET', {
        quoteOrderQty: quoteOrderQty
    }).then((response) =&amp;gt; {
        console.info(response.data)
    }).catch(error =&amp;gt; console.error(error))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어제 매수 부분을 위와 같이 바꿨었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매도도 비슷하게 해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;sell(symbol, quantity, price) {
    client.newOrder(symbol, 'SELL', 'LIMIT', {
        quantity: quantity,
        price: price,
        timeInForce: 'GTC'
    }).then((response) =&amp;gt; {
        console.info(response.data)
    }).catch(error =&amp;gt; console.error(error))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매도는 시장가인 MARKET 대신에 지정가인 LIMIT으로 해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLs6Dg/btrIYnYGHNg/4bXZrfDgnkrtyKGxb5XzI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLs6Dg/btrIYnYGHNg/4bXZrfDgnkrtyKGxb5XzI0/img.png&quot; data-alt=&quot;type에 따른 필수 파라미터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLs6Dg/btrIYnYGHNg/4bXZrfDgnkrtyKGxb5XzI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLs6Dg%2FbtrIYnYGHNg%2F4bXZrfDgnkrtyKGxb5XzI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1230&quot; height=&quot;786&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;type에 따른 필수 파라미터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스 문서를 보면 timeInForce, quantity, price 3가지가 필수라고 하네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;판매할 수량, 판매할 가격, 그리고 timeInForce.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DT8nM/btrI0efSPKM/R1gqbNlVxQIQP8AZ8TGLO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DT8nM/btrI0efSPKM/R1gqbNlVxQIQP8AZ8TGLO0/img.png&quot; data-alt=&quot;Time in force 종류와 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DT8nM/btrI0efSPKM/R1gqbNlVxQIQP8AZ8TGLO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDT8nM%2FbtrI0efSPKM%2FR1gqbNlVxQIQP8AZ8TGLO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1222&quot; height=&quot;666&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Time in force 종류와 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;timeInForce는 해당 주문이 얼마나 유효한지에 대한 설정이라고 보시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 모르겠으면 GTC로 지정하면 됩니다. 이게 일반적인 주문 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문을 넣으면 체결되거나 취소하기 전까지 주문이 유효하게 남아있게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쨌든 이제 팔아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test.js를 통해 매도 주문을 넣겠습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Trade = require(&quot;./trade&quot;)

let trade = new Trade()

// trade.buy('BTCUSDT', '11')
trade.sell('BTCUSDT', 0.00000001, 30000)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 BTC를 1 사토시(=0.0000001) 를 30k에 지정가로 주문합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659625558655&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node test.js&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2296&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwbkCm/btrI0fy6pQw/7bPBKPN3mzYAsW82Q2TKk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwbkCm/btrI0fy6pQw/7bPBKPN3mzYAsW82Q2TKk1/img.png&quot; data-alt=&quot;실행 결과 에러&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwbkCm/btrI0fy6pQw/7bPBKPN3mzYAsW82Q2TKk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwbkCm%2FbtrI0fy6pQw%2F7bPBKPN3mzYAsW82Q2TKk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2296&quot; height=&quot;968&quot; data-origin-width=&quot;2296&quot; data-origin-height=&quot;968&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과 에러&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상대로 오류가 발생했습니다. 저만 예상했나요? ㅎㅎ&lt;/p&gt;
&lt;pre id=&quot;code_1659625777887&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    data: {
      code: -1100,
      msg: &quot;Illegal characters found in parameter 'quantity'; legal range is '^([0-9]{1,20})(\\.[0-9]{1,20})?$'.&quot;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류 응답 중 data 부분을 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;code와 msg가 있습니다. 이번 오휴는 quantity가 잘 못 되었나 봅니다...?.....??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 예상 밖이네요. 이걸 원했던 것이 아닌데;;&lt;/p&gt;
&lt;pre id=&quot;code_1659625907975&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// trade.sell('BTCUSDT', 0.00000001, 30000)
trade.sell('BTCUSDT', '0.00000001', '30000')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파라미터는 문자열로 넘겨야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 실행하면 제가 원하던 오류가 나옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659626004384&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data: { code: -1013, msg: 'Filter failure: LOT_SIZE' }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 바이낸스가 주문하기가 좀 까다로운 편입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filter 항목이 많아서 그걸 다 맞춰주어야 하거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 오휴는 LOT_SIZE 필터와 맞지 않다고 오류가 발생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스 문서에 필터에 대한 &lt;a href=&quot;https://binance-docs.github.io/apidocs/spot/en/#filters&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;페이지&lt;/a&gt;가 따로 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LOT_SIZE에 대한 설명은 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byt6k5/btrI0e1gEu7/1G4fLM7HOC9lCOkT3Vctt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byt6k5/btrI0e1gEu7/1G4fLM7HOC9lCOkT3Vctt1/img.png&quot; data-alt=&quot;바이낸스 LOT_SIZE filter 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byt6k5/btrI0e1gEu7/1G4fLM7HOC9lCOkT3Vctt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyt6k5%2FbtrI0e1gEu7%2F1G4fLM7HOC9lCOkT3Vctt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1388&quot; height=&quot;620&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바이낸스 LOT_SIZE filter 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3가지 기준이 있네요. minQty, maxQty, stepSize인데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수량 최소치와 최대치가 있다는 얘기입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stepSize는 주문할 수 있는 단위가 정해져 있다는 거고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 조건을 맞춰서 주문을 넣어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그럼 조건에 맞도록 수치를 조정해 봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수량을 몇 개로 하면 될까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네, 거기 3번째 줄 안경 쓴 학생. 정답입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모릅니다. 코인마다 제각각인데 다 외울 수도 없고 모를 수밖에 없죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 바이낸스가 조회할 수 있도록 API를 제공하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trade.js에 buy, sell에 이어 하나를 더 추가해봅시다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;exchangeInfo(symbol) {
    client.exchangeInfo({symbol: symbol})
        .then((response) =&amp;gt; {
            console.info(JSON.stringify(response.data))
        }).catch(error =&amp;gt; console.error(error))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 심볼에 대한 정보를 조회할 수 있을 겁니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659626859862&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// trade.buy('BTCUSDT', '11')
// trade.sell('BTCUSDT', '0.00000001', '30000')
trade.exchangeInfo('BTCUSDT')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test.js에 위와 같이 호출하도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659627019665&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{&quot;timezone&quot;:&quot;UTC&quot;,&quot;serverTime&quot;:1659626967105,&quot;rateLimits&quot;:[{&quot;rateLimitType&quot;:&quot;REQUEST_WEIGHT&quot;,&quot;interval&quot;:&quot;MINUTE&quot;,&quot;intervalNum&quot;:1,&quot;limit&quot;:1200},{&quot;rateLimitType&quot;:&quot;ORDERS&quot;,&quot;interval&quot;:&quot;SECOND&quot;,&quot;intervalNum&quot;:10,&quot;limit&quot;:50},{&quot;rateLimitType&quot;:&quot;ORDERS&quot;,&quot;interval&quot;:&quot;DAY&quot;,&quot;intervalNum&quot;:1,&quot;limit&quot;:160000},{&quot;rateLimitType&quot;:&quot;RAW_REQUESTS&quot;,&quot;interval&quot;:&quot;MINUTE&quot;,&quot;intervalNum&quot;:5,&quot;limit&quot;:6100}],&quot;exchangeFilters&quot;:[],&quot;symbols&quot;:[{&quot;symbol&quot;:&quot;BTCUSDT&quot;,&quot;status&quot;:&quot;TRADING&quot;,&quot;baseAsset&quot;:&quot;BTC&quot;,&quot;baseAssetPrecision&quot;:8,&quot;quoteAsset&quot;:&quot;USDT&quot;,&quot;quotePrecision&quot;:8,&quot;quoteAssetPrecision&quot;:8,&quot;baseCommissionPrecision&quot;:8,&quot;quoteCommissionPrecision&quot;:8,&quot;orderTypes&quot;:[&quot;LIMIT&quot;,&quot;LIMIT_MAKER&quot;,&quot;MARKET&quot;,&quot;STOP_LOSS_LIMIT&quot;,&quot;TAKE_PROFIT_LIMIT&quot;],&quot;icebergAllowed&quot;:true,&quot;ocoAllowed&quot;:true,&quot;quoteOrderQtyMarketAllowed&quot;:true,&quot;allowTrailingStop&quot;:true,&quot;cancelReplaceAllowed&quot;:true,&quot;isSpotTradingAllowed&quot;:true,&quot;isMarginTradingAllowed&quot;:true,&quot;filters&quot;:[{&quot;filterType&quot;:&quot;PRICE_FILTER&quot;,&quot;minPrice&quot;:&quot;0.01000000&quot;,&quot;maxPrice&quot;:&quot;1000000.00000000&quot;,&quot;tickSize&quot;:&quot;0.01000000&quot;},{&quot;filterType&quot;:&quot;PERCENT_PRICE&quot;,&quot;multiplierUp&quot;:&quot;5&quot;,&quot;multiplierDown&quot;:&quot;0.2&quot;,&quot;avgPriceMins&quot;:5},{&quot;filterType&quot;:&quot;LOT_SIZE&quot;,&quot;minQty&quot;:&quot;0.00001000&quot;,&quot;maxQty&quot;:&quot;9000.00000000&quot;,&quot;stepSize&quot;:&quot;0.00001000&quot;},{&quot;filterType&quot;:&quot;MIN_NOTIONAL&quot;,&quot;minNotional&quot;:&quot;10.00000000&quot;,&quot;applyToMarket&quot;:true,&quot;avgPriceMins&quot;:5},{&quot;filterType&quot;:&quot;ICEBERG_PARTS&quot;,&quot;limit&quot;:10},{&quot;filterType&quot;:&quot;MARKET_LOT_SIZE&quot;,&quot;minQty&quot;:&quot;0.00000000&quot;,&quot;maxQty&quot;:&quot;292.86757363&quot;,&quot;stepSize&quot;:&quot;0.00000000&quot;},{&quot;filterType&quot;:&quot;TRAILING_DELTA&quot;,&quot;minTrailingAboveDelta&quot;:10,&quot;maxTrailingAboveDelta&quot;:2000,&quot;minTrailingBelowDelta&quot;:10,&quot;maxTrailingBelowDelta&quot;:2000},{&quot;filterType&quot;:&quot;MAX_NUM_ORDERS&quot;,&quot;maxNumOrders&quot;:200},{&quot;filterType&quot;:&quot;MAX_NUM_ALGO_ORDERS&quot;,&quot;maxNumAlgoOrders&quot;:5}],&quot;permissions&quot;:[&quot;SPOT&quot;,&quot;MARGIN&quot;,&quot;TRD_GRP_004&quot;]}]}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길어서 JSON.stringify를 했더니 한눈에 잘 안 들어오네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wsthO/btrIVgTOjL8/siGnQl5td96B3JRSwCBiD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wsthO/btrIVgTOjL8/siGnQl5td96B3JRSwCBiD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wsthO/btrIVgTOjL8/siGnQl5td96B3JRSwCBiD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwsthO%2FbtrIVgTOjL8%2FsiGnQl5td96B3JRSwCBiD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;254&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 데이터 구조를 가집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중에서 symbols는 api를 호출할 때 넣었던 심볼 수만큼 배열로 응답하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 BTCUSDT 하나만 넣었었죠. 그래서 사이즈가 [1]입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;symbols 항목을 펼쳐보면, 하위에 많은 정보들이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 의미가 있겠지만, 지금은 filters 부분만 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b40EdO/btrIYmlcGFC/TpFgNrtqV2oobJ4CuMSyl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b40EdO/btrIYmlcGFC/TpFgNrtqV2oobJ4CuMSyl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b40EdO/btrIYmlcGFC/TpFgNrtqV2oobJ4CuMSyl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb40EdO%2FbtrIYmlcGFC%2FTpFgNrtqV2oobJ4CuMSyl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;550&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 가지 필터들이 있지만, filterType이 LOT_SIZE인 항목만 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소 수량이 0.00001개네요. 최대는 9000개인데 9천 BTC가 얼마야? 부럽네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문 단위도 최소 수량과 동일하게 0.00001입니다. 제 경험상 최소 수량과 주문 단위는 같더라고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아닐 수도 있으니 항상 체크해보세요.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쨌든 0.00001개는 팔아야 한다는 말이네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 그렇게 팔면 팔릴까요? 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659627566723&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;trade.sell('BTCUSDT', '0.00001', '30000')&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1659627592103&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data: { code: -1013, msg: 'Filter failure: MIN_NOTIONAL' }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 MIN_NOTIONAL 필터에 걸렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 다시 살펴봐야겠죠? 설명과 API 조회해서 찾아보시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말하자면 최소 주문금액을 충족하지 못했습니다. 바이낸스는 10달러가 최소 주문금액입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;30000 USDT * 0.00001개 = 0.3 USDT 밖에 안됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 조회하면 최소 10 이상이어야 한다고 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 가격을 올리던지 수량을 올려야겠죠? 수량을 0.0004로 늘려보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 12 달러 정도로 계산되니까 주문이 들어갈 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659627968256&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  symbol: 'BTCUSDT',
  orderId: 12143700038,
  orderListId: -1,
  clientOrderId: 'Uz7v57KvGL3B5Dl1hPKMk8',
  transactTime: 1659627954207,
  price: '30000.00000000',
  origQty: '0.00040000',
  executedQty: '0.00000000',
  cummulativeQuoteQty: '0.00000000',
  status: 'NEW',
  timeInForce: 'GTC',
  type: 'LIMIT',
  side: 'SELL',
  fills: []
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짜잔! 성공입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고 보면 별거 아닌 바이낸스 필터인데, 저는 처음에 이 부분이 참 번거롭더라고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러분은 이 글 참조하셔서 쉽게 넘어가시길 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스 매도 주문도 해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더불어 바이낸스 API 호출 시 fliters 제약에 대한 부분도 살펴보았고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글은 뭘로 할지 조금 고민이긴 하네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 동작하는 봇을 만들어 나가는 글을 적어볼까 싶기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바로 바이낸스 API 연계하는 부분을 먼저 해볼까 싶기도 하네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭐가 되었든 가급적 꾸준하게 글을 적도록 하겠습니다.&lt;/p&gt;</description>
      <category>개발자의 삶/코인</category>
      <category>API</category>
      <category>binance</category>
      <category>Filters</category>
      <category>바이낸스</category>
      <category>봇</category>
      <category>자동매매</category>
      <category>자동매매프로그램</category>
      <author>비전공돌이</author>
      <guid isPermaLink="true">https://nextbrace.tistory.com/9</guid>
      <comments>https://nextbrace.tistory.com/9#entry9comment</comments>
      <pubDate>Fri, 5 Aug 2022 00:53:28 +0900</pubDate>
    </item>
    <item>
      <title>Nodejs 바이낸스 API 연동 - 매수 주문</title>
      <link>https://nextbrace.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어제에 이어 오늘은 node.js로 binance api 연계를 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 trade.js라는 파일을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일을 아래와 같이 약간 구조화를 하겠습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;const API_KEY = require(&quot;./apikey.json&quot;)
const { Spot } = require('@binance/connector')

const client = new Spot(API_KEY.BINANCE_API_KEY, API_KEY.BINANCE_API_SECRET)

class Trade {

}

module.exports = Trade
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apikey와 binance connector는 어차피 쓸거니 미리 선언해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;client도 마찬가지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 class를 만들어봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 클래스 내부에 매수, 매도 function을 만들 생각입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 골격부터 만들어볼까요?&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;class Trade {

    buy() {
        console.log(&quot;buy&quot;)
    }

    sell() {
        console.log(&quot;sell&quot;)
    }
}

module.exports = Trade&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;buy와 sell을 만들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인을 해봐야겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test.js 파일을 만들고 아래와 같이 입력합니다.&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;const Trade = require(&quot;./trade&quot;)

let trade = new Trade()

trade.buy()
trade.sell()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1659536002896&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node test.js&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행을 해봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIlNY7/btrIPXs10pQ/5cfA3mKyfwXjGFz2wN9z0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIlNY7/btrIPXs10pQ/5cfA3mKyfwXjGFz2wN9z0k/img.png&quot; data-alt=&quot;test.js 실행결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIlNY7/btrIPXs10pQ/5cfA3mKyfwXjGFz2wN9z0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIlNY7%2FbtrIPXs10pQ%2F5cfA3mKyfwXjGFz2wN9z0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;190&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;test.js 실행결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 호출되고 찍히는 것을 확인할 수 있네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 코인을 한번 사보도록 하죠. buy를 아래와 같이 수정합니다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;buy() {
    client.newOrder('BTCUSDT', 'BUY', 'MARKET', {
        quoteOrderQty: '11.54877342'
    }).then((response) =&amp;gt; {
        console.info(response.data)
    }).catch(error =&amp;gt; console.error(error))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미를 설명하자면..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BTCUSDT : BTC를 USDT로 거래하는 마켓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BUY : 사겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MARKET : 시장가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;quoteOrderQty : 이 금액만큼 최대한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, USDT 11.54877342를 가지고 시장가로 살 수 있는 최대한의 BTC를 사겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 의미가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;USDT 11.54877342는 별 의미가 있는 건 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어제 포스팅을 보시면 아실 텐데.. 제가 가진 USDT 수량이 이 정도더라고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 항목들은 &lt;a href=&quot;https://binance-docs.github.io/apidocs/spot/en/#new-order-trade&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; 바이낸스 API Document&lt;/a&gt;를 참조하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 이미지와 같은 파라미터들을 조합해서 사용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;1504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tznuu/btrITpoOYmV/agKgkFgdbMXlfOhqX12pE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tznuu/btrITpoOYmV/agKgkFgdbMXlfOhqX12pE0/img.png&quot; data-alt=&quot;바이낸스 New Order API 파라미터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tznuu/btrITpoOYmV/agKgkFgdbMXlfOhqX12pE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftznuu%2FbtrITpoOYmV%2FagKgkFgdbMXlfOhqX12pE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1622&quot; height=&quot;1504&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;1504&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바이낸스 New Order API 파라미터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쨌든 이제 실행해봅시다. 아까 만든 test.js를 다시 호출합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659536928071&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node test.js&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1659536946903&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  symbol: 'BTCUSDT',
  orderId: 12111913769,
  orderListId: -1,
  clientOrderId: 'YfGnexWUOXzHYsJpq3iRiC',
  transactTime: 1659536870908,
  price: '0.00000000',
  origQty: '0.00049000',
  executedQty: '0.00049000',
  cummulativeQuoteQty: '11.43084740',
  status: 'FILLED',
  timeInForce: 'GTC',
  type: 'MARKET',
  side: 'BUY',
  fills: [
    {
      price: '23328.26000000',
      qty: '0.00049000',
      commission: '0.00000000',
      commissionAsset: 'BTC',
      tradeId: 1566363391
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 결과가 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 정상적으로 잘  매수되었습니다. 각각의 응답 항목 역시 바이낸스 공식 문서를 보시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요한 항목 몇 가지를 언급하면..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;executedQty는 수량입니다. 0.00049 BTC가 매수되었나 봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cummulativeQuoteQty는 사용한 금액입니다. 11.43084740 USDT가 사용되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문 넣을 때 11.54877342 USDT만큼 사겠다고 했으나, 그걸로 살 수 있는 최대를 사니 잔돈이 좀 남았겠네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 fills는 주문이 체결된 건수와 내용입니다. 이번엔 1건으로 처리되었네요. 큰 금액으로 거래하면 여러 건으로 분할하여 매매되기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 여기서는 수수료를 확인할 수 있습니다. 이번엔 수수료가 안 들었네요. 바이낸스가 일부 페어들에 대하여 수수료를 받지 않고 있어서 그런 듯합니다. 보통은 수수료가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;commissionAsset이 어떤 코인으로 수수료를 받았는지를 나타냅니다. 바이낸스의 수수료 방식은 업비트와 조금 다릅니다. 사용자에게 주어야 할 코인에서 수수료를 빼고 주는 방식을 사용합니다. 매수할 때는 사려는 코인에서 수수료만큼 빼고 주죠. 반대로 매도할 때는 판매된 금액을 줄 때 수수료를 빼고 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 거래되는 페어, 위의 경우에 BTC나 USDT가 아닌 다른 코인으로 수수료가 지불되는 경우도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인이 계정 설정에서 BNB로 수수료를 지불하도록 설정한 경우에는 매수/매도 모두 BNB로 수수료가 지불됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그럼 실제로도 매수가 잘 되었는지 확인해야겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스에서 확인을 해봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2774&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOstdp/btrINt0xof6/xFKLfWRpHLGESV7YvYcxZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOstdp/btrINt0xof6/xFKLfWRpHLGESV7YvYcxZ1/img.png&quot; data-alt=&quot;Order History&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOstdp/btrINt0xof6/xFKLfWRpHLGESV7YvYcxZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOstdp%2FbtrINt0xof6%2FxFKLfWRpHLGESV7YvYcxZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2774&quot; height=&quot;826&quot; data-origin-width=&quot;2774&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Order History&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 데이터로 매수된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어제 만들었던 asset.js를 통해 API로 계좌도 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9b9oD/btrISAcV2yJ/QEm6gMHrtJLUGmfLLKJEq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9b9oD/btrISAcV2yJ/QEm6gMHrtJLUGmfLLKJEq0/img.png&quot; data-alt=&quot;계좌 잔액 조회&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9b9oD/btrISAcV2yJ/QEm6gMHrtJLUGmfLLKJEq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9b9oD%2FbtrISAcV2yJ%2FQEm6gMHrtJLUGmfLLKJEq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;980&quot; height=&quot;414&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;계좌 잔액 조회&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 다른 자동매매 프로그램이 계속 돌아가고 있어서 다른 코인들의 수량은 어제와 차이가 있을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 USDT는 사용하지 않기 때문에 아까 얘기했던 11.54877342를 보유하고 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그중에 11.43084740을 매수에 사용했고, 남은 수량이 0.11792602개가 맞는 것 같네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 node.js를 통해 바이낸스 매수주문을 넣어보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 여기서 끝내면 좀 아쉽네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 하드코딩했던 파라미터 항목들을 변수나 인자로 꺼내보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;buy(symbol, quoteOrderQty) {
    client.newOrder(symbol, 'BUY', 'MARKET', {
        quoteOrderQty: quoteOrderQty
    }).then((response) =&amp;gt; {
        console.info(response.data)
    }).catch(error =&amp;gt; console.error(error))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 저는 시장가 주문만 할 예정이니까 이렇게만 바꾸겠습니다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;trade.buy('BTCUSDT', '11')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 호출할 때 위와 같이 호출을 하면 되겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동매매 프로그램을 만든다면, 본인이 하고자 하는 매매법에 따라 API의 파라미터를 적절하게 조합해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래대로라면 범용으로 사용 가능하도록 모듈화를 해야겠지요. 하지만 바이낸스 커넥터가 이미 그 역할을 하게 구현이 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니 우리는 필요할 때 필요한 파라미터를 조합해서 호출만 하면 되죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매도도 거의 유사하긴 합니다. 하지만 오늘은 매수까지만 하겠습니다. 매도는 내일!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자의 삶/코인</category>
      <category>API</category>
      <category>binance</category>
      <category>node.js</category>
      <category>nodejs</category>
      <category>바이낸스</category>
      <category>자동매매</category>
      <category>프로그램매매</category>
      <author>비전공돌이</author>
      <guid isPermaLink="true">https://nextbrace.tistory.com/8</guid>
      <comments>https://nextbrace.tistory.com/8#entry8comment</comments>
      <pubDate>Thu, 4 Aug 2022 00:02:29 +0900</pubDate>
    </item>
    <item>
      <title>Nodejs로 바이낸스 API 연동을 해봅시다.</title>
      <link>https://nextbrace.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;사실 제가 코인 자동매매 프로그램을 만들기 시작한것은 꽤 오래되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작년 10월에 &lt;a href=&quot;https://nextbrace.tistory.com/3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;자바로 연동하는 글&lt;/a&gt;을 하나 적은 적이 있긴 합니다만, 사실은 그보다 훨씬 더 전부터 시작했었죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 빗썸에서 자동매매를 만들었고, 이 후 업비트, 그리고 그 이후에 바이낸스까지 만들어보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작할 당시에는 개발자의 호기심이 더 컸어요. 잘 된다면 밥값 정도 벌리면 괜찮겠다는 생각이었죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌다보니 지금은 본업도, 재테크도 모두 자동매매 프로그램을 이용하고 있게 되었네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사설이 길었네요. 어쨌든 이번에는 node.js로 바이낸스 API 연동을 해볼 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 이미 해봤지만 이 글을 보시는 분들이 따라하실 수 있게 샘플 코드를 만들어 볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8V2eW/btrIFIiPrLW/eA4FpKpyUlcmYOShqJxSu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8V2eW/btrIFIiPrLW/eA4FpKpyUlcmYOShqJxSu0/img.png&quot; data-alt=&quot;디렉토리 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8V2eW/btrIFIiPrLW/eA4FpKpyUlcmYOShqJxSu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8V2eW%2FbtrIFIiPrLW%2FeA4FpKpyUlcmYOShqJxSu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;738&quot; height=&quot;88&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;디렉토리 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 사용할 디렉토리를 하나 만듭니다. 이름은 상관없어요. 본인이 하고 싶은대로 하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 binanceNodeBot이라고 만들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음..참고로 제가 노드 강의를 하진 않을 겁니다. nodejs는 어느정도 다루실 수 있다는 전제로 작성된 글입니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 코드를 작성할 건데요. 편하신 방식으로 하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 웹스톰을 사용하겠습니다. 저는 있는 김에 쓰는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료버전으로는 vscode가 훌륭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IDE에서 해당 디렉토리를 열어봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3584&quot; data-origin-height=&quot;2150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btjOQc/btrINu49HFs/SKlUnMlujuWHL6z9s1mvCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btjOQc/btrINu49HFs/SKlUnMlujuWHL6z9s1mvCk/img.png&quot; data-alt=&quot;workspace로 사용할 디렉토리를 열어보세요.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btjOQc/btrINu49HFs/SKlUnMlujuWHL6z9s1mvCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtjOQc%2FbtrINu49HFs%2FSKlUnMlujuWHL6z9s1mvCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3584&quot; height=&quot;2150&quot; data-origin-width=&quot;3584&quot; data-origin-height=&quot;2150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;workspace로 사용할 디렉토리를 열어보세요.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 아무것도 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 하나 만듭니다. 저는 asset.js라고 만들었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1E0lU/btrIJ64wkIL/7vyyiwB6R1ChYwwksWgAiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1E0lU/btrIJ64wkIL/7vyyiwB6R1ChYwwksWgAiK/img.png&quot; data-alt=&quot;첫 번째 파일. asset.js&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1E0lU/btrIJ64wkIL/7vyyiwB6R1ChYwwksWgAiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1E0lU%2FbtrIJ64wkIL%2F7vyyiwB6R1ChYwwksWgAiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1222&quot; height=&quot;332&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;첫 번째 파일. asset.js&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일명에서 추측이 가능하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인의 계좌를 조회하는 기능을 만들어 볼 생각입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 테스트를 테스트를 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1659453001843&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log('hello')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 넣고 터미널에서 node asset.js 라고 입력해봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MEbUq/btrINtZsRHi/Ck1x5ae9PkwdB2IX3a3w21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MEbUq/btrINtZsRHi/Ck1x5ae9PkwdB2IX3a3w21/img.png&quot; data-alt=&quot;teminal을 통해 실행한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MEbUq/btrINtZsRHi/Ck1x5ae9PkwdB2IX3a3w21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMEbUq%2FbtrINtZsRHi%2FCk1x5ae9PkwdB2IX3a3w21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1032&quot; height=&quot;262&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;teminal을 통해 실행한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 hello가 출력되는 것을 보실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 저는 웹스톰에 Terminal 창을 이용했습니다. vscode에도 터미널 창이 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IDE 수준이 아닌 에디터 수준으로 코딩 하시는 분들은 일반 터미널에서 파일이 위치한 경로에서 명령을 실행해도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 node 명령어가 없다면 node.js 설치가 안된 상태입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node.js 설치와 기초 강좌를 좀 보고 오시길 권해드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그러면 다음 단계로 넘어가 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스는 node.js용 connector가 있습니다. 터미널에서 아래 명령어를 입력해주세요.&lt;/p&gt;
&lt;pre id=&quot;code_1659453745008&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 치면 프롬프트로 이름부터 물어보는데...적당히 전부 엔터 쳐도 됩니다. 그러면 package.json 파일이 생성될 거에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후에 아래 명령어를 다시 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659453398838&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install @binance/connector&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음..노드 초보자분들이 이해하기 쉽게 설명드리면...바이낸스 API를 사용하기 위한 라이브러리 혹은 SDK를 추가한다고 보시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 package.json 파일에 다음과 같은 항목이 추가됩니다.&lt;/p&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;&quot;dependencies&quot;: {
  &quot;@binance/connector&quot;: &quot;^1.12.0&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 준비는 끝났습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 계좌를 조회하는 코드를 짜보도록 합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 apikey.json으로 파일을 하나 만들겠습니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;{
  &quot;BINANCE_API_KEY&quot;: &quot;본인의 API KEY를 입력하세요.&quot;,
  &quot;BINANCE_API_SECRET&quot;: &quot;본인의 API SECRET을 입력하세요.&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 JSON 형태로 key 정보를 입력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 asset.js 파일을 다시 열겠습니다.&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;const API_KEY = require(&quot;./apikey.json&quot;)
const { Spot } = require('@binance/connector')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 위에 위와 같이 입력합니다. 저는 cjs 스타일로 작성했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스 커넥터와 apikey.json 파일을 불러온 것이 보이네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;const client = new Spot(API_KEY.BINANCE_API_KEY, API_KEY.BINANCE_API_SECRET)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 바이낸스 spot client를 선언합니다. 여기에 apikey.json의 파일에 작성한 항목이 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 클라이언트를 사용해 계좌를 조회해보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;const API_KEY = require(&quot;./apikey.json&quot;)
const { Spot } = require('@binance/connector')

const client = new Spot(API_KEY.BINANCE_API_KEY, API_KEY.BINANCE_API_SECRET)

client.userAsset()
.then((response) =&amp;gt; {
    console.log(response)
})
.catch(error =&amp;gt; console.error(error))&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1659454790942&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node asset.js&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yREKU/btrIOQT8HbC/iwucRFoEZ8vgfoKKGbXEF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yREKU/btrIOQT8HbC/iwucRFoEZ8vgfoKKGbXEF1/img.png&quot; data-alt=&quot;실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yREKU/btrIOQT8HbC/iwucRFoEZ8vgfoKKGbXEF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyREKU%2FbtrIOQT8HbC%2FiwucRFoEZ8vgfoKKGbXEF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;860&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부만 스샷했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해더부터 이런 저런 데이터들이 잔뜩 포함되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 우리는 위에 보이는 data 항목이 필요합니다. 아래처럼 바꿔봅니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;const API_KEY = require(&quot;./apikey.json&quot;)
const { Spot } = require('@binance/connector')

const client = new Spot(API_KEY.BINANCE_API_KEY, API_KEY.BINANCE_API_SECRET)

client.userAsset()
.then((response) =&amp;gt; {
    // console.log(response.data)
    response.data.forEach((c) =&amp;gt; {
        console.log(`asset : ${c.asset}, 수량 : ${c.free}`)
    })
})
.catch(error =&amp;gt; console.error(error))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cncpfq/btrIMCJbrBc/V4xEkk3n0KJQrMGuYVMnEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cncpfq/btrIMCJbrBc/V4xEkk3n0KJQrMGuYVMnEK/img.png&quot; data-alt=&quot;실행 결과로 코인 수량이 보여집니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cncpfq/btrIMCJbrBc/V4xEkk3n0KJQrMGuYVMnEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcncpfq%2FbtrIMCJbrBc%2FV4xEkk3n0KJQrMGuYVMnEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;982&quot; height=&quot;410&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 결과로 코인 수량이 보여집니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 바이낸스의 계좌를 조회해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스는 커넥터가 잘 만들어져 있기 때문에 API 연계 자체는 매우 쉬운 편입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에서는 매수와 매도 기능도 구현을 해보도록 하겠습니다.&lt;/p&gt;</description>
      <category>개발자의 삶/코인</category>
      <category>API</category>
      <category>API 연동</category>
      <category>binance</category>
      <category>바이낸스</category>
      <category>바이낸스 api</category>
      <category>바이낸스 자동매매 api</category>
      <author>비전공돌이</author>
      <guid isPermaLink="true">https://nextbrace.tistory.com/7</guid>
      <comments>https://nextbrace.tistory.com/7#entry7comment</comments>
      <pubDate>Wed, 3 Aug 2022 00:49:28 +0900</pubDate>
    </item>
    <item>
      <title>바이낸스 API 연동을 위한 API KEY 발급 방법</title>
      <link>https://nextbrace.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt; Binance API을 연계하기 위해서는 먼저 API KEY를 발급 받아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스에 로그인을 먼저 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래와 같이 사람 모양 하위에 나오는 API Management 메뉴로 들어갑니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;1317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bULmuj/btrILfOcY9t/rMtUTMOKPYCQVT1Dp6gTLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bULmuj/btrILfOcY9t/rMtUTMOKPYCQVT1Dp6gTLk/img.png&quot; data-alt=&quot;바이낸스 API Management 메뉴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bULmuj/btrILfOcY9t/rMtUTMOKPYCQVT1Dp6gTLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbULmuj%2FbtrILfOcY9t%2FrMtUTMOKPYCQVT1Dp6gTLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1317&quot; height=&quot;1317&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;1317&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바이낸스 API Management 메뉴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;들어가서 우상단에 Create API를 누르면..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zmmot/btrINujL5DH/26NkhEG6O2LpiGJHwZK3i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zmmot/btrINujL5DH/26NkhEG6O2LpiGJHwZK3i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zmmot/btrINujL5DH/26NkhEG6O2LpiGJHwZK3i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzmmot%2FbtrINujL5DH%2F26NkhEG6O2LpiGJHwZK3i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;468&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 이름을 입력하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next 후 퍼즐 맞추고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인 인증을 하면..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2772&quot; data-origin-height=&quot;1102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Gtu8/btrIPXFxSdW/xDDwnHlEeUzFXNfInq2Bkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Gtu8/btrIPXFxSdW/xDDwnHlEeUzFXNfInq2Bkk/img.png&quot; data-alt=&quot;바이낸스 API Key 발급&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Gtu8/btrIPXFxSdW/xDDwnHlEeUzFXNfInq2Bkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Gtu8%2FbtrIPXFxSdW%2FxDDwnHlEeUzFXNfInq2Bkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2772&quot; height=&quot;1102&quot; data-origin-width=&quot;2772&quot; data-origin-height=&quot;1102&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바이낸스 API Key 발급&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 API Key가 발급 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Secret Key도 함께 나오게 됩니다. 그리고 이 항목은 아마 처음에만 보여질 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 다시 볼 수 없으니 미리 복사해주셔야 합니다. 단, 유출되지 않도록 조심하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 첫 번째 Enable Reading 옵션은 체크가 되어 있습니다. 조회권한이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현물 거래를 하실거면 두 번째 Enable Spot &amp;amp; Margin Trading을 체크 하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선물 거래는 Enable Futures 체크하시면 되구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램으로 출금도 하실거면 Enable Withdrawals 체크하시면 되는데...꼭 필요하지 않으면 안하시는 것이 좋겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래쪽에 IP access restrictions 항목이 있는데, IP를 지정하면 해당 IP에서만 API Key가 동작하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가급적 지정해주시는 것이 좋겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 했으면 이제 프로그램으로 매매할 준비가 된 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 서드파티 프로그램들도 이 방식으로 동작하기도 하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동매매 프로그램들도 모두 이 방식이구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니 권한 부여할 때 신경 써서 하셔야 합니다. 매매까지는 필요하지만 출금 권한 부여했다가 탈취 당할 수도 있으니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상 바이낸스 API 연동을 위해 API Key 발급 방법이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자의 삶/코인</category>
      <category>API</category>
      <category>binance</category>
      <category>바이낸스</category>
      <author>비전공돌이</author>
      <guid isPermaLink="true">https://nextbrace.tistory.com/6</guid>
      <comments>https://nextbrace.tistory.com/6#entry6comment</comments>
      <pubDate>Wed, 3 Aug 2022 00:08:30 +0900</pubDate>
    </item>
    <item>
      <title>윷놀이의 도,개,걸,윷,모 확률을 구하라!</title>
      <link>https://nextbrace.tistory.com/5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 심심풀이로 윷놀이를 할 때 도개걸윷모 확률을 구해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딱히 생각을 해보지 않았다면, 모두 동일한 확률이지 않을까 했을 수도 있을 텐데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 개발자라면?!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉬는 시간에 잠시 확률을 계산해보아도 좋겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 아주 단순한 수학 문제이므로 개발자가 아니어도 쉽게 구할 수 있을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윷은 앞면과 뒷면이 나올 수 있는 나무 막대기입니다. 나무 막대기를 깎거나 쪼개서 쉽게 만들 수 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 다이소 가서 사는 게 훨씬 쉽겠지만요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윷가락은 총 4개를 던져서 그 조합에 따라 도개걸윷모가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 앞과 뒤를 기호로 표시해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞●&amp;nbsp; 뒤○&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도 : ●●●○&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개 : ●●○○&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;걸 : ●○○○&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윷 : ○○○○&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모 : ●●●●&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 5가지의 경우가 생깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 확률은 어떨까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 경우의 수를 펼쳐서 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윷가락은 총 4개입니다. A, B, C, D라고 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 앞이나 뒤가 나올 수 있죠.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 309px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 71px;&quot; rowspan=&quot;4&quot;&gt;&lt;b&gt;도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 17px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 17px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 17px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 17px;&quot;&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 108px;&quot; rowspan=&quot;6&quot;&gt;&lt;b&gt;개&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 72px;&quot; rowspan=&quot;4&quot;&gt;걸&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 20px;&quot;&gt;윷&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 20px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 20px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 20px;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 20px;&quot;&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 20px;&quot;&gt;모&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 20px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 20px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 20px;&quot;&gt;●&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 20px;&quot;&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무식하게 조합을 다 찾아보니 위와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;산술적으로는 앞 또는 뒤. 2가지 확률이 나오는 4개이므로 2*2*2*2 = 16가지의 경우의 수가 발생하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 전체 경우의 수는 16가지이고요. 도개걸윷모를 세어봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도 : 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개 : 6&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;걸 : 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윷 : 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모 : 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확률로 바꿔봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도 : 4/16 == 25%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개 : 6/16 == 37.5%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;걸 : 4/16 == 25%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윷 : 1/16 == 6.25%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모 : 1/16 == 6.25%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 쉽죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 아주 단순한 확률 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문제풀이를 프로그램 언어로 하면 그것이 바로 프로그래밍입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그걸 작성하는 사람이 프로그래머, 즉 개발자고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩 강의였다면 이제 실제 코드를 작성해서 구해보겠지만, 이 글에선 그냥 말만으로 끝내겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 하나 더!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 윷놀이에서 확률이 위에 구했던 것도 같을까요?!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자의 덕목 중 하나. 의심 또 의심.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1090&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E73ZB/btrIGyOEr6L/0IK38g7bQNF2WdCB1GIORK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E73ZB/btrIGyOEr6L/0IK38g7bQNF2WdCB1GIORK/img.jpg&quot; data-alt=&quot;프로그래머의 의심&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E73ZB/btrIGyOEr6L/0IK38g7bQNF2WdCB1GIORK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE73ZB%2FbtrIGyOEr6L%2F0IK38g7bQNF2WdCB1GIORK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1090&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1090&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로그래머의 의심&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 윷놀이를 많이 해보았기 때문에, 저 확률이 잘 맞지 않다고 느껴졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;문제는 뭘까요?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음의 전제부터 놓친 부분이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윷가락은 앞면과 뒷면 중 하나가 나온다. 하지만 그 확률은 동일할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답은 동일하지 않다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 내용은 뉴스로도 검색이 되네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://news.kbs.co.kr/news/view.do?ncd=5117251&quot;&gt;https://news.kbs.co.kr/news/view.do?ncd=5117251&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1659424914121&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;&amp;lsquo;윷&amp;rsquo;이냐, &amp;lsquo;모&amp;rsquo;냐&amp;hellip;그것이 과학이다&quot; data-og-description=&quot;설 연휴 잘 쇠고 계신가요. 코로나19로 지치고 방역지침에 위축됐어도 명절은 반갑습니다. 예로부터 설에는...&quot; data-og-host=&quot;news.kbs.co.kr&quot; data-og-source-url=&quot;https://news.kbs.co.kr/news/view.do?ncd=5117251&quot; data-og-url=&quot;https://news.kbs.co.kr/news/view.do?ncd=5117251&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AIYCz/hyPje7HgwV/qPw7rX0AzQ7jHKKGxZukt0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/hJKQA/hyPjeGCYmn/yKXEeM6cik5Q5eGZGzoQN1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/cHlhYk/hyPjpnQww8/G2thqJg1kn3ISGkyKw4Xn1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://news.kbs.co.kr/news/view.do?ncd=5117251&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://news.kbs.co.kr/news/view.do?ncd=5117251&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AIYCz/hyPje7HgwV/qPw7rX0AzQ7jHKKGxZukt0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/hJKQA/hyPjeGCYmn/yKXEeM6cik5Q5eGZGzoQN1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/cHlhYk/hyPjpnQww8/G2thqJg1kn3ISGkyKw4Xn1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;윷&amp;rsquo;이냐, &amp;lsquo;모&amp;rsquo;냐&amp;hellip;그것이 과학이다&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;설 연휴 잘 쇠고 계신가요. 코로나19로 지치고 방역지침에 위축됐어도 명절은 반갑습니다. 예로부터 설에는...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;news.kbs.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 의심을 하고 허점이 없는지 확인을 해서 오류나 버그를 줄이는 것이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트, QA 등의 절차도 있지만 개발자 스스로도 예상치 못한 상황을 항상 염두에 두고 생각하는 습관이 필요한 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자라면 이 글은 너무 당연하고 뻔한 얘기였을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자를 꿈꾸는 학생이 이 글을 읽고 쉽게 이해되었다면 개발자로 소질이 있을 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아님 말고...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;향후에 뭔가 강좌를 적는다면 이 문제를 코드로 풀어보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자의 삶/상식과 잡담 사이</category>
      <category>개발자 자질</category>
      <category>윷놀이</category>
      <category>윷놀이 확률</category>
      <category>확률 계산</category>
      <author>비전공돌이</author>
      <guid isPermaLink="true">https://nextbrace.tistory.com/5</guid>
      <comments>https://nextbrace.tistory.com/5#entry5comment</comments>
      <pubDate>Tue, 2 Aug 2022 16:27:32 +0900</pubDate>
    </item>
    <item>
      <title>풀스택(full-stack) 개발자란?</title>
      <link>https://nextbrace.tistory.com/4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 여기저기 풀 스택 개발자라는 말을 많이 듣습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 역시 자칭, 타칭 풀 스택 개발자라고 여겨지고 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 풀스택 개발자란 어떤 의미일까요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7nLPK/btrIvTq4s2X/Yqqa0zsNkjYqqJ4DM44OSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7nLPK/btrIvTq4s2X/Yqqa0zsNkjYqqJ4DM44OSK/img.png&quot; data-alt=&quot;구글에서 풀스택 개발자 검색 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7nLPK/btrIvTq4s2X/Yqqa0zsNkjYqqJ4DM44OSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7nLPK%2FbtrIvTq4s2X%2FYqqa0zsNkjYqqJ4DM44OSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1710&quot; height=&quot;684&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구글에서 풀스택 개발자 검색 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글에서 검색하면 가장 먼저 나오는 aws의 설명이 나름 타당하다고 생각됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 얘기해 왠만한 시스템을 혼자서 구축 가능한 개발자란 말이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 모든 언어를 알아야 하는 것은 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해를 하고 있느냐가 첫 번째이며, 어떤 언어로든 모든 부분의 구현이 가능하냐가 두 번째입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 한동안 대한민국에서 표준처럼 군림했던 java, spring, jsp, jquery를 이용하여 웹사이트를 혼자서 만들 수 있는 사람이 있다고 하겠습니다. 이 사람은 풀 스택 개발자일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴 수도 있겠지만 사실 좀 부족하다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사람이 다른 환경으로도 동일한 웹사이트를 만들 수 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진정한 풀스택 개발자라면 새로운 기술 셋을 빠르게 습득하여 적응하고 활용할 수 있을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 자바를 유지하고 클라이언트는 리액트로 만들어야 한다고 가정하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 개발자는 못한다고 할겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 자칭 풀스택 개발자인 저는 어떨까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트를 학습할 시간만 주어지면 충분히 가능하다고 말하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 학습에 필요한 시간이 그리 길진 않을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 노드로 바뀐다고 해도 마찬가지겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 위에서 언급된 것처럼 &quot;모든 기술군&quot;에 대한 이해입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에는 기본적인 서버 세팅, 운영도 포함됩니다. 데이터베이스도 마찬가지구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀스택 개발자를 아주 까다롭게 따지면, 정말이지 찾아보기 힘들 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 조금 관대하게 보고 싶습니다. 그래야 저 같은 사람도 풀스택 개발자에 포함될 수 있는 거구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;know-how의 시대에서 know-where의 시대, know-why의 시대로 변화했으니까 말이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자의 삶/상식과 잡담 사이</category>
      <category>full-stack</category>
      <category>풀스택</category>
      <category>풀스택개발자</category>
      <author>비전공돌이</author>
      <guid isPermaLink="true">https://nextbrace.tistory.com/4</guid>
      <comments>https://nextbrace.tistory.com/4#entry4comment</comments>
      <pubDate>Fri, 29 Jul 2022 19:11:18 +0900</pubDate>
    </item>
    <item>
      <title>JAVA로 바이낸스(binance) API 활용하여 매매 프로그램 작성 1</title>
      <link>https://nextbrace.tistory.com/3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;주식도 하고 코인도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 주식도 잃고 코인도 잃었어요. ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명색이 개발자이니 자동매매 프로그램을 만들어봐야겠다는 생각을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 빗썸 API를 활용하여 로직을 구현했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후에 업비트 쪽 거래 로직을 구현했구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에는 바이낸스 매매 프로그램을 작성했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 생각하는 자동 매매 프로그램은 크게 다음 조건을 충족해야 할 것 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사람이 직접 매수/매도를 하지 않아도 프로그램을 실행해두면 자동으로 매수/매도를 진행한다.&lt;/li&gt;
&lt;li&gt;자동으로 사고 팔면서 수익을 발생시킨다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 1번만 구현을 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자분들은 아시겠지만, 그냥 API 연동만 했다는 이야기죠 ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 수익을 발생시키기 위해서는 언제 사고, 언제 팔지에 대한 명확한 규칙을 정하고 그것을 로직으로 구현해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이 규칙을 세우는 것이 어렵더군요. 저는 그 부분에 대한 해답을 아직 못찾았어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쨌든 1번이 되어야 2번에 대한 로직도 가능하니까, 1번을 어떻게 하는지 설명해보고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빗썸, 업비트는 나중에 적을게요. 먼저 가장 최근에 구현한 바이낸스부터 적어봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 자바가 가장 익숙해서 자바로 개발했습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 바이낸스 API Key를 발급 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 정리된 블로그가 많으므로 제가 따로 적진 않겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.google.com/search?client=safari&amp;amp;rls=en&amp;amp;q=%EB%B0%94%EC%9D%B4%EB%82%B8%EC%8A%A4+api+key&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8&quot;&gt;https://www.google.com/search?client=safari&amp;amp;rls=en&amp;amp;q=%EB%B0%94%EC%9D%B4%EB%82%B8%EC%8A%A4+api+key&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 포스팅에서는 바이낸스에 가진 코인 수량을 조회하는 로직을 다루겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 API 스펙과 가이드는 바이낸스 공식 문서를 참조하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://binance-docs.github.io/apidocs/spot/en/#change-log&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://binance-docs.github.io/apidocs/spot/en/#change-log&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1633580571833&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Binance API Documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;binance-docs.github.io&quot; data-og-source-url=&quot;https://binance-docs.github.io/apidocs/spot/en/#change-log&quot; data-og-url=&quot;https://binance-docs.github.io/apidocs/spot/en/#change-log&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://binance-docs.github.io/apidocs/spot/en/#change-log&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://binance-docs.github.io/apidocs/spot/en/#change-log&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Binance API Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;binance-docs.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 지갑을 조회하는 부분이므로 당연히 인증이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증은 HMAC SHA256으로 하도록 되어있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633580822413&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Mac hmacSha256 = Mac.getInstance(&quot;HmacSHA256&quot;);
SecretKeySpec secKey = new SecretKeySpec(secretKey.getBytes(), &quot;HmacSHA256&quot;);
hmacSha256.init(secKey);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 secretKey는 처음에 언급한 API Key 발급시에 함께 알려주는Secret Key를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 형태로 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apiKey 예시 : vmPUZE6mv9SD5VNHk4HlWFsOr6aKE2zvsw0MuIgwCIPy6utIco14y7Ju91duEh8A&lt;br /&gt;secretKey 예시 : NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저의 경우에는 스프링을 사용하므로 아래와 같이 변수 선언을 해두었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633581063281&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Value(&quot;${restapi.binance.accessKey}&quot;)
private String accessKey;

@Value(&quot;${restapi.binance.secretKey}&quot;)
private String secretKey;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로퍼티에 해당 key를 암호화하여 입력해두었구요. 복호화 key는 jvm 옵션으로 넣도록 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 관련 포스팅이 아니므로 따로 설명하진 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 거래소도 그렇지만 바이낸스 API 중에 GET 방식의 API와 POST 방식의 API가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조회성 API들은 GET으로 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 다룰 계좌 조회도 GET 방식입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;782&quot; width=&quot;448&quot; height=&quot;311&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PX2Op/btrg1ZFhJyl/6E7P7fV521wDd0otdtklRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PX2Op/btrg1ZFhJyl/6E7P7fV521wDd0otdtklRK/img.png&quot; data-alt=&quot;바이낸스 API 문서 중 계좌 조회 부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PX2Op/btrg1ZFhJyl/6E7P7fV521wDd0otdtklRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPX2Op%2Fbtrg1ZFhJyl%2F6E7P7fV521wDd0otdtklRK%2Fimg.png&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;782&quot; width=&quot;448&quot; height=&quot;311&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바이낸스 API 문서 중 계좌 조회 부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/api/v3/account&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HMAC SHA256&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;timestamp YES (Mandatory)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 이렇게 4가지 항목이 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET 방식으로 요청을 해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호출할 API URL은 /api/v3/account 이구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 언급한 HMAC SHA256 인증을 태워야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 필수 파라미터는 timestamp 하나네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET 방식의 인증은 어떻게 수행할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 언급한 인증 로직에서 선언한 hmacSha256 변수가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 변수를 이용하여 파라미터를 해싱합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 해싱값을 &lt;span style=&quot;color: #6a8759;&quot;&gt;signature&lt;/span&gt;라는 파라미터에 추가로 넣어주면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633581992602&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String actualSign = new String(Hex.encodeHex(hmacSha256.doFinal(queryString.getBytes())));
queryString = queryString + &quot;&amp;amp;signature=&quot; + actualSign;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 파라미터를 이용해 API를 호출하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633582051840&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String serverUrl = &quot;https://api.binance.com&quot;;

HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(serverUrl + &quot;/api/v3/account?&quot; + queryString);
request.addHeader(&quot;Content-Type&quot;, &quot;application/json&quot;);
request.addHeader(&quot;X-MBX-APIKEY&quot;, accessKey);

HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();

String entityString = EntityUtils.toString(entity, &quot;UTF-8&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 한가지 설명을 안했네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;accessKey는 해더에 세팅합니다. 위 로직에 &quot;&lt;span style=&quot;color: #6a8759;&quot;&gt;X-MBX-APIKEY&quot;&amp;nbsp;&lt;/span&gt;부분 참조하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파라미터에 대해 부연 설명을 하자면...&lt;/p&gt;
&lt;pre id=&quot;code_1633582354146&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String timestamp = Long.toString(System.currentTimeMillis())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 현재 시간을 long 타입의 문자열로 추출하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증이 없이 호출한다면 아래와 같이 되겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;/api/v3/account?timestamp=1499827319559&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 파라미터 부분을 해싱을 해서 추가하면...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;/api/v3/account?&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;timestamp=&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;1499827319559&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;amp;signature=c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 호출하게되면 json 형태로 응답이 오게 됩니다. (제 계좌 아닙니다. 공식 문서의 샘플이에요. 이 정도 비트 있었으면 좋겠네요 ㅎㅎ)&lt;/p&gt;
&lt;pre id=&quot;code_1633582771969&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;makerCommission&quot;: 15,
  &quot;takerCommission&quot;: 15,
  &quot;buyerCommission&quot;: 0,
  &quot;sellerCommission&quot;: 0,
  &quot;canTrade&quot;: true,
  &quot;canWithdraw&quot;: true,
  &quot;canDeposit&quot;: true,
  &quot;updateTime&quot;: 123456789,
  &quot;accountType&quot;: &quot;SPOT&quot;,
  &quot;balances&quot;: [
    {
      &quot;asset&quot;: &quot;BTC&quot;,
      &quot;free&quot;: &quot;4723846.89208129&quot;,
      &quot;locked&quot;: &quot;0.00000000&quot;
    },
    {
      &quot;asset&quot;: &quot;LTC&quot;,
      &quot;free&quot;: &quot;4763368.68006011&quot;,
      &quot;locked&quot;: &quot;0.00000000&quot;
    }
  ],
  &quot;permissions&quot;: [
    &quot;SPOT&quot;
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 balances 부분에 본인이 보유한 코인이 나오게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633582905426&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;JSONParser jsonParser = new JSONParser();
JSONObject account = (JSONObject) jsonParser.parse(entityString);

JSONArray balances = (JSONArray) account.get(&quot;balances&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 파싱해서 사용하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보유한 코인에 대해서만 나올 것 같았는데, 전체 코인이 다 내려오더군요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;free 또는 locked가 0보다 큰 것만 보시면 될 듯 하네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 free와 locked는 모두 보유한 코인 수량인데, locked는 매도를 걸어둔 수량 등을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 본인의 계좌를 조회하여 코인의 수량을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 조회성 API는 모두 동일 방식으로 구현하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 번에는 특정 코인의 현재가 조회하는 부분을 포스팅할게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 매매 API도 설명할 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 성투 하시길....&lt;/p&gt;</description>
      <category>개발자의 삶/코인</category>
      <category>binance</category>
      <category>Java</category>
      <category>바이낸스</category>
      <category>블록체인</category>
      <category>자동매매</category>
      <category>자동매매프로그램</category>
      <category>자바</category>
      <category>코인</category>
      <category>프로그램</category>
      <author>비전공돌이</author>
      <guid isPermaLink="true">https://nextbrace.tistory.com/3</guid>
      <comments>https://nextbrace.tistory.com/3#entry3comment</comments>
      <pubDate>Thu, 7 Oct 2021 14:10:12 +0900</pubDate>
    </item>
  </channel>
</rss>