Skip to main content

ขี้เกียจเฝ้ากราฟบิทคอยน์ใช่ไหม? มาเขียนโปรแกรมมาช่วยผ่อนแรงกัน!

ช่วงนี้ตลาดคริปโตกำลังเป็นขาขึ้นใครต้นทุนดีก็คงต้องเข้ามาดูราคาเรื่อย ๆ เพื่อ Take Profit หรือ Stop Loss ตามแผนที่วางไว้ หรือใครที่ตกรถก็คงเข้ามาดูเรื่อย ๆ เผื่อจะรอซื้อตอนย่อไว้ทำกำไรกับเขาบ้าง

เป็นที่รู้กันดีว่าตลาดคริปโตมีความผันผวนสูง แถมยังเปิด 24 ชั่วโมง บางทีราคาดันไปวิ่งตอนตี 3 หลับอยู่ก็พลาดโอกาสกันไป ยิ่งใครเล่นสั้นหรือใช้ Leverage สูง (+Position ใหญ่) พริบตาเดียวกำไรก็อาจกลับเป็นขาดทุน หรือโดนล้างพอร์ทได้

แต่จะมานั่งเฝ้ากราฟ 24 ชั่วโมงก็เป็นไปไม่ได้ เพราะคนเราก็ต้องนอน ถ้างั้นมีอะไรละที่ช่วยดูกราฟให้เราได้แถมยังไม่ต้องนอน นั่นก็คือคอมพิวเตอร์ยังไงละ! ในบทความนี้จะมาดูกันว่าเราจะเอาความรู้โปรแกรมมิ่งของเรามาช่วยเทรดได้อย่างไรบ้าง

เครื่องมือที่ใช้งาน

จะทำโปรเจคทั้งทีเลือกเครื่องมือดีมีชัยไปกว่าครึ่ง ซึ่งในรอบนี้เราจะเขียนด้วย JavaScript ภาษายอดนิยมที่ทำได้แทบจะทุกอย่าง

JavaScript ทำอะไรได้บ้าง?
_นักพัฒนาน้อยคนนักที่จะไม่รู้จัก JavaScript เพราะว่าจากการสำรวจของ Stack Overflow ในปี 2020…_medium.com

ในส่วนประกอบจะใช้งานไลบราลี 2 ตัวนี้เป็นหลัก:

  • CCXT — ติดต่อกับกระดานเทรด เช่น Binance, FTX เพื่อดึงข้อมูลราคา และส่งคำสั่งซื้อขาย
  • TechnicalIndicators — ตรวจจับรูปแบบแท่งเทียน/คำนวนอินดิเคเตอร์จากข้อมูลราคาที่ดึงมา

และอีก 2 ตัวนี้เพื่อความสะดวกในการพัฒนา/ทดสอบ:

  • asciichart — แสดงกราฟแบบ ASCII ลงบน Console
  • ansicolor — ให้ console.log ออกมาได้หลากสี

มาดึงราคากันเถอะ

ก่อนจะวิเคราะห์ได้ก็ต้องมีข้อมูลก่อนซึ่งจะใช้ไลบราลี CCXT ที่กล่าวถึงไปก่อนหน้านี้

หมายเหตุ: ในตัวอย่างแต่ละตัวจะมีการใช้ await ซึ่งใช้ได้จะต้องอยู่ภายใต้ฟังก์ชัน/เมธอดที่เป็น async เท่านั้น ดังนั้นจึงต้องครอบด้วย async IIFE

ดึงข้อมูลราคา

มาลองดูแบบง่าย ๆ ก่อนคือดึงราคาล่าสุดของแท่งเทียนปัจจุบัน เพียงแค่ระบุคู่เหรียญ และ Time Frame ที่ใช้ก็จะได้ราคามาแล้ว

ตัว CCXT จะคืนค่าออกมาเป็น Array ตามรูปแบบนี้:

[Timestamp, Open, High, Low, Close, Volume]

[ 1629936000000, 48973, 49352, 46250, 46783, 40325 ]

ซึ่งถ้าแท่งเทียนที่ดูอยู่เป็นแท่งล่าสุด ราคาปัจจุบันก็จะอยู่ใน Close หรือในตำแหน่งที่ 4 ของ Array (มีค่าเป็น 46783)

ในตัวอย่างนี้ได้ดึงข้อมูลจาก Binance จะดึงข้อมูลย้อนหลังได้ถึงปี 2017 ซึ่งเป็นปีที่เปิดให้บริการ ถ้าหากต้องการข้อมูลที่เก่ากว่านี้ให้เลือกใช้ Exchange เจ้าอื่น เช่น Coinbase ที่เปิดตัวในปี 2012

เอามาลงกราฟ

คราวนี้ลองดึงย้อนหลังสัก 120 วันมาลงกราฟดูบ้าง การดึงข้อมูลเหมือนเดิมเพียงแค่เปลี่ยนไปเลือกข้อมูล 120 ตัวล่าสุด และนำมาลงกราฟด้วย asciichart

เมื่อรันแล้วจะได้กราฟสวย ๆ ออกมาแบบนี้

กราฟราคาปิดย้อนหลัง 120 วัน


ตรวจหารูปแบบแท่งเทียน

รูปแบบแท่งเทียนก็เป็นสิ่งหลายคนดูเพื่อหาจุดที่อาจเป็นจุดกลับตัวของราคาได้ แต่รูปแบบมันก็หลายรูปเหลือเกิน แถมยังไม่แน่ใจอีกว่าที่ดูอยู่มันเป็นรูปแบบนั้นจริง ๆ หรือเปล่า

แท่งเทียนแบบ Bullish Engulfing

อย่างในรูปภาพด้านบนก็เป็นแท่งเทียน BTC/USDT ของวันที่ 20-21/07/2021 ที่เป็นรูปแบบ Bullish Engulfing คราวนี้เราลองเอาข้อมูลสองแท่งนี้ไปเขียนโค้ดตรวจกัน

เริ่มจากดึงข้อมูล OHLCV ของวันที่ 20-21 มาแล้วนำไปป้อนใส่ฟังก์ชัน bullishEngulfingPatternของไลบราลี TechnicalIndicatorsให้ตรวจสอบ ซึ่งผลที่ได้ก็ออกมาเป็น true ยืนยันว่าแท่งนั้นเป็น Bullish Engulfing Pattern


กราฟพร้อมอินดิเคเตอร์ แต่รกไปแบบนี้ก็ไม่ไหว

คำนวณค่าอินดิเคเตอร์

สายเทคนิคนอกจากดูกราฟแท่งเทียนแล้ว ก็คงดูอินดิเคเตอร์ต่าง ๆ เช่น MA, RSI, MACD ประกอบการตัดสินใจ แต่รู้หรือไม่ว่าข้อมูลเหล่านั้นต่างถูกคำนวนออกมาจากค่า OHLCV (Open/High/Low/Close/Volume) ของแต่ละแท่งเทียนในกราฟ

อย่างเช่น MA หรือ Moving Average ก็จะเป็นการหาค่าเฉลี่ยของราคาย้อนหลังตามช่วงเวลาที่กำหนด เช่น MA(5) ใน TF Day ค่าที่เห็นก็จะเป็นราคาเฉลี่ยของ 5 วันที่แล้วนั่นเอง จากสูตรจะเห็นได้ว่าเป็นแบบเดียวกับการหาค่าเฉลี่ยทั่วไปเลย

(ผลรวมของราคา 5 วัน) / 5 = ค่าเฉลี่ยย้อนหลัง 5 วัน

(47,800 + 47,068 + 46,973 + 45,901 + 44,695) / 5 = 46,487.4

แต่อย่าลืมไปว่ามีไลบราลี TechnicalIndicators มาช่วยคำนวนให้อยู่ ดังนั้นไม่ต้องเข้าใจวิธีการคำนวนก็ได้ ขอแค่ทราบวัตถุประสงค์ของอินดิเคเตอร์นั้นเพื่อที่จะได้นำมาประยุกต์ใช้ให้ถูกก็พอ

คำนวณอินดิเคเตอร์ RSI

อินดิเคเตอร์ตัวอย่างที่เลือกใช้จะเป็น RSI หรือ Relative Strength Index ที่ใช้วัดการแกว่งตัวของราคา ค่าที่ออกมาจะอยู่ในช่วง 0-100 โดยหากค่ามากว่า 70 จะถือว่าอยู่ในเขต Overbought หรือซื้อมากเกินไป และถ้าหากต่ำว่า 30 จะอยู่ในเขต Oversold หรือขายมากเกินไป

ตัวโค้ดก็เหมือนกับตอนดึงราคา แต่เพียงแค่นำราคาที่ได้นำไปให้ไลบราลี TechnicalIndicators คำนวนให้ก่อน

ประกอบร่างกราฟราคากับกราฟ RSI

ตอนนี้เห็นแต่ตัวเลขเดี๋ยวจะไม่เห็นภาพ เอามาประกอบกันแล้วแสดงเป็นกราฟกันหน่อย โดยได้เขียนฟังก์ชันเพิ่มเติมสำหรับแสดงกราฟราคา กับกราฟ RSI แยกออกมาดังนี้

โดยในส่วนของข้อมูลและคำนวน RSI ทำเหมือนเดิมทั้งหมด เพียงแค่นำไปแสดงผลเป็นกราฟด้วยฟังก์ชันด้านบนเท่านั้น

ได้ออกมาเป็นกราฟสวย ๆ แบบนี้ ถ้าดูดี ๆ จะเห็นว่าหลายวันที่ผ่านมา RSI เข้าไปในเขต Overbought (> 70) และก็ยังมี Bearish Divergence อีกด้วย (ราคาสูงขึ้น แต่ RSI ต่ำลง)


นำไปประยุกต์ใช้(ช่วย)เฝ้ากราฟ

ตอนนี้เรามีทั้งข้อมูลราคา, ข้อมูลรูปแบบแท่งเทียน และข้อมูลอินดิเคเตอร์แล้ว ก็ถึงเวลาเอาข้อมูลเหล่านี้ไปใช้ให้เกิดประโยชน์ ให้มัน(ช่วย)เฝ้ากราฟให้เรา ซึ่งก็นำไปประยุกต์ได้หลายอย่าง เช่น:

  • แจ้งเตือนเมื่อราคาถึงจุดที่กำหนดไว้ เพื่อที่จะได้ไม่พลาดเมื่อราคาถึงแนวรับ/ต้านสำคัญ
  • แจ้งเตือนเมื่อเจอรูปแบบแท่งเทียนกลับตัว
  • แจ้งเตือนเมื่อราคาเปลี่ยนแปลงเกิน 5% ภายใน 1 ชั่วโมง
  • ทำ Backtest วิเคราะห์กลยุทธ์ของเรา
  • ดีงราคามาลงใน Excel เพื่อคำนวนมูลค่าของพอร์ท

หรือถ้าใครมีกลยุทธ์การเทรดที่มั่นใจว่าใช้งานได้ จะทำเป็นบอทช่วยส่งคำสั่งซื้อ/ขายเลยก็ได้ เช่น:

  • MACD ตัดขึ้นเส้น Signal / Center Line ส่งคำสั่งซื้อ
  • MACD ตัดลงเส้น Signal / Center Line ส่งคำสั่งขาย

ตัวอย่างการส่งคำสั่งซื้อ BTC ที่ราคา 64,000 USDT (จำเป็นต้องระบุ API Key ก่อน)

ในภาพแสดงให้เห็นว่าถ้า All In ตอน MACD ตัดขึ้นวันที่ 01/05/2021 ที่ราคา 57,800 ซึ่งตอนนี้ (27/08/21) ผ่านมา 117 วันก็ยังไม่หลุดดอยเลย

หมายเหตุ — กลยุทธ์นี้เป็นการใช้งาน MACD ที่ผิด แต่ยกตัวอย่างมาเนื่องจากเป็นกลยุทธ์ที่ง่าย (แต่ผิด อย่าทำตาม!)


เอาไปทำงานที่ไหน/บนไหนดี?

ตัวอย่างการประยุกต์ใช้บางตัวที่ไม่จำเป็นต้องทำงานตลอดเวลา หรือขึ้นอยู่กับเวลา เช่น ทำ Backtest หรือใช้ดึงราคา ก็จะทำเป็นเว็บไซต์/แอปฯ ไว้ใช้งานก็ได้

แต่สำหรับตัวที่ไว้แจ้งเตือน หรือส่งคำสั่งซื้อ/ขายอัตโนมัติพวกนี้จะต้องทำงานตลอดเวลา ก็มีตัวเลือกอยู่หลายทาง เช่น:

  • รันแลัวเปิดคอมทิ้งไว้ทั้งวัน (เปลืองไฟ)
  • รันบน Raspberry Pi (หรืออื่น ๆ ที่ใกล้เคียง)
  • รันบน Cloud Functions เช่น Firebase Functions, AWS Lambda, Azure Functions โดยสั่งให้ทำงานทุก ๆ 1 นาที (หรือแล้วแต่กรณีไป)

โดยตัวเลือกที่ดูจะเหมาะที่สุดก็คือรันบน ​Cloud Functions เพราะไม่จำเป็นต้องมาดูแลอุปกรณ์เอง ไม่ต้องกลัวเครื่องดับ, ไฟตก หรือเน็ตหลุด และแต่ละเจ้าส่วนใหญ่จะมี Free Tier ให้ใช้งานอยู่แล้ว ซึ่งถ้าบริหารทรัพยากรดี ๆ ก็เหมือนกับได้ใช้ฟรีเลย


ตัวอย่าง: แจ้งเตือนราคาบน Firebase Functions

ตัวอย่างนี้เป็นบอทแจ้งเตือนเมื่อราคาถึงจุดที่กำหนด ให้ทำงานบน Firebase Functions หลักการทำงานง่าย ๆ คือ:

  • ให้ทำงานทุก ๆ 5 นาที เพื่อตรวจสอบราคา
  • ในแต่ละครั้งของการทำงานให้ตรวจสอบแท่งเทียนแท่งล่าสุด ตามเงื่อนไขว่ามีจุดไหนไปแตะราคาที่กำหนดไว้หรือไม่
  • หากตรงตามเงื่อนไข: ส่งเข้า LINE Notify เพื่อแจ้งเตือน
  • หากไม่ตรงตามเงื่อนไข: ไม่ต้องทำอะไร

เมื่อนำขึ้นไปบน Firebase Functions ได้แล้วที่เหลือก็แค่นั่งรอการแจ้งเตือนเท่านั้น เพียงเท่านี้ก็จะไม่ต้องมานั่งจ้องกราฟ ดูราคาบ่อย ๆ อีกแล้ว แจ้งเตือนมาเมื่อไรก็ค่อยเข้าไปดู ทั้งประหยัดเวลา, ไม่ต้องมากังวลใจ แถมยังได้ฝึกเขียนโค้ดอีกด้วย!


อ้างอิง