ในที่สุด SETTRADE ก็มี API (Python Edition Part 1)

Pitsanu Mukdaprakorn
5 min readApr 24, 2020

--

สำหรับผมเอง และนักพัฒนาระบบเทรดรายย่อยแล้ว ผมคิดว่านี่เป็นการก้าวกระโดดครั้งสำคัญกับการเทรดในตลาดหุ้นของไทยพอสมควร ในปัจจุบันการพัฒนาระบบเทรด หรือ Robot Trade ไม่ได้ทำยากลำบากเหมือนเมื่อก่อนแล้ว มีตัวช่วยอย่างมากมายในการพัฒนาทั้งสาย AI และ Quant ไม่ว่าจะเป็น Python, Amibroker หรือจะ MetaTrade แต่ปัญหาหลักดันกลับมาที่ตอนจะนำไปใช้งาน ซึ่งโบรกเกอร์บางเจ้า ก็ช่วยเหลือในการสร้างเครื่องมือมาเชื่อมต่อเพื่อให้นำไปใช้งานได้ แต่เส้นทางก็ไม่ได้โรยด้วยกลีบกุหลาบ เพราะการที่ Pipeline ของระบบส่งคำสั่งผ่านหลายจุดมาก ทำให้เกิดข้อผิดพลาดได้ง่ายเช่นกัน ในขณะที่ต่างประเทศหลายๆ โบรกเกอร์มี API ให้ใช้โดยตรง ทำให้ผู้พัฒนาระบบเทรดมีกำลังใจที่จะทำระบบกันต่อไป

หลายคนอ่านแล้วอาจจะสงสัยว่าอะไรคือ API ล่ะ…

เอาเป็นว่าในรายละเอียดผมขอไม่กล่าวถึงมากนัก ไม่งั้นมันคงยาวและสับสนกันไปใหญ่ เจ้าตัว API เปลี่ยนเสมือนท่อต่อตรงที่จะทำให้คุณส่งคำสั่งการซื้อขายไปยัง SETTRADE ได้เลย โดยไม่ต้องผ่านโปรแกรม หรือติดตั้ง Plug-in ให้วุ่นวายแบบเมื่อก่อน และจะมีการตอบสนองกลับทันทีว่าคำสั่งที่ส่งไปทำงานถูกต้อง หรือมีข้อผิดพลาดอะไร รวมถึงรองรับการใช้งานกับแทบทุกภาษา เช่น Python, GO, JS, C#, AFL(AmiBroker) และอื่นๆ อีกมากมาย

ก็เข้าเรื่องกันเลยดีกว่า…

ผมเริ่มต้นที่การเข้าไปศึกษาวิธีการใช้งานจาก https://developer.settrade.com/open-api/ ในนี้ก็จะมีเอกสารต่างๆ ที่จำเป็น, Endpoint ต่างๆ

ในปัจจุบัน (22 เมษายน 2563) ยังรองรับเฉพาะการเทรดในตลาดอนุพันธ์เท่านั้น ซึ่งผมคิดว่าคงไม่นานเกินรอ ของในตลาดหุ้นก็จะพร้อมให้เริ่มใช้

API ที่รองรับ ณ วันที่ 22 เมษายน 2563

เป็นที่น่าเสียดายว่า ส่วนนึงที่สำคัญ คือ ข้อมูลตลาด ยังไม่เปิดให้ใช้งาน ผมเลยยังไม่สามารถทดลองให้ดู ณ ตอนนี้ได้ แต่ผมคิดว่าหลายๆ คนน่าจะมีแหล่งข้อมูลกันอยู่แล้วล่ะ :)

ต่อไปมาดูว่ามีโบรกเกอร์เจ้าไหนเปิดให้ใช้บริการแล้วบ้าง

รายชื่อโบรกเกอร์ ผู้ให้บริการ API ณ วันที่ 22 เมษายน 2563

ผมต้องตกใจเล็กน้อย ที่มี Classic Ausiris เพียงเจ้าเดียวที่ให้บริการ API นี้ แต่ก็เป็นความโชคดีของที่ทาง DeeperTrade มีสายสัมพันธ์อยู่นิดหน่อยที่ทำให้การทดสอบนี้ไม่ติดปัญหาอะไรมากนัก ขอขอบคุณมา ณ ที่นี่ด้วยครับ ส่วนใครสนใจจะเปิดบัญชี ติดต่อทาง CAF ได้เลยครับ บอกว่าตามมาจากบทความของผม คุณจะได้รับค่าคอมฯ ที่แพงพิเศษครับ…
ล้อเล่นครับ 555

หลังจากนี้จะเป็นเนื้อหาในการพัฒนาแล้วนะครับ คนที่ไม่คุ้นเคยเลยอาจจะพบว่ามันเป็นภาษาต่างดาวที่ไม่ค่อยเข้าใจนัก แต่ก็ไม่ได้ลึกจนเกินไป ่สำหรับคนที่กำลังพัฒนาระบบ หรือคิดจะพัฒนา ไปต่อกันได้เลยครับ GO!!!…

การทดสอบครั้งนี้ผมจะใช้ภาษา Python ในการทดสอบเป็นหลัก เนื่องจากเป็นภาษาที่ผมใช้ในการพัฒนาระบบเทรด ใครสนใจจะเริ่มพัฒนาด้วยภาษา Python ก็สอบถามได้ที่ stock2morrow เลยครับ มีคอร์สสอนเบื้องต้นอยู่ (Tie-in ไม่แบบไม่เนียน…)

เราก็เริ่มทำตามขั้นตอนที่อยู่ในเว็บเลยครับ
1. เปิดบัญชีกับโบรกเกอร์
2. เข้าสู่ระบบ ทาง https://www.settrade.com/member_login.jsp
3. เลือกไปที่ Manage API user ตรงเมนูด้านซ้าย

โอเคครับ ปัญหาแรกมาล่ะ…

หน้าจอแสดงข้อความยังไม่มีสิทธิในการเข้าถึง API

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

ได้รับสิทธิในการเข้าถึงแล้ว

ไม่รอช้ากด Generate key ได้เลยครับ เราก็จะได้ Key ยาวๆ มาสองชุด เก็บรักษายิ่งชีพ เพราะผมคิดว่าถ้าใครได้ Key ชุดนี้ไป กับ PIN จะเข้ายึดพอร์ตของเราได้เลย แต่ถ้าหาย หรือว่าลืม ก็สามารถสั่ง Generate ใหม่ได้เช่นกันครับ

Generate คีย์สำเร็จ

Endpoint ต่างๆ ในการใช้งานทางเว็บก็รวบรวมไว้ให้แล้วครับ ซึ่งผมดูแล้วว่าค่อนข้างโอเค หลักๆ ก็จะแบ่งออกเป็น สี่หมวดคำสั่ง คือ DERIVATIVES API, DERIVATIVES API (Market Rep), USER MANAGEMENT API และ AUTHENTICATION MANAGEMENT API

ตอนยังไม่รู้ว่า Market Rep คืออะไร และมีบาง Endpoint ที่เหมือนกับ Derivatives อีกด้วย ไว้เดี๋ยวไปลองกันทีหลัง

ในการเรียกใช้ API ขั้นตอนแรกเราต้องทำการ Login เพื่อขอ Access Token ก่อนเป็นอย่างแรกตามเอกสาร แล้วจึงนำไปใช้งานได้ แล้วผมก็พบปัญหาแรก คือในส่วนของ signature ที่เราจำเป็นต้องส่งเข้าสู่ระบบ มันจะต้องผ่านกระบวนการทำด้วยฟังก์ชั่นที่แนบมาให้ซึ่งดันเป็นภาษา Java ผมเข้าใจว่าอาจจะเป็นวิธีป้องกันอีกชั้นนึงบางอย่าง แต่เอาเป็นว่าเริ่มต้นก็ขัดใจกันเล็กน้อยพอเป็นพิธี

ผมเห็นเมนูอีกอันนึงในการเชื่อมต่อ คือ การเชื่อมต่อผ่าน Client Proxy อันนี้จะตัดปัญหาอันแสนปวดหัวของการใช้ภาษาอื่นๆ ในการพัฒนาไปได้ เพราะไม่ต้องยุ่งกับส่วนของการเข้ารหัสขอ Token และการ Refresh เลย ก็เป็นอีกทางนึงที่แนะนำครับ

เนื่องจากผมไม่สะดวกที่จะเอาตัว Client มารันใน Localhost เพิ่มเติม เอาเป็นว่าผมลองวิธีที่ลำบากที่สุดเลยล่ะกันครับ คือ ยิงตรงเข้าสู่ Server เลย โดยไม่ผ่าน Client Proxy ที่ให้มา เริ่มด้วยการแปลงฟังก์ชั่นการเข้ารหัสแสนงงไปเป็น Python ก่อน

ยอมรับตรงๆ ว่ากว่าจะได้ 3บรรทัดในการเข้ารหัสมา ก็คือเลือดตาแทบกระเด็น กินเวลาทั้งวันเนื่องด้วยผมแทบไม่มีความรู้เรื่อง Java เลย รวมถึงการเข้ารหัสแบบ ECDSA ด้วย รู้อย่างเดียวว่ามันอยู่ใน Crypto Currency เรียกว่าต้องรวบรัดหลักสูตร Java in 1 day กันเลย สำหรับผมคิดว่านี่อาจจะเป็นการต่อ API เข้าโบรกเกอร์แบบยากที่สุดที่เคยทำมาเลยล่ะกัน งั้นสบายใจกันได้ครับว่ามันจะปลอดภัยอย่างแน่นอน เพราะผมเองก็เกือบเข้าไปเทรดบัญชีตัวเองไม่ได้เหมือนกัน….

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

ส่วนตัวผมว่าระดับความปลอดภัย มันเยอะเกินความจำเป็น…

หลังจากลองเชื่อมต่อสำเร็จแล้ว เราก็จะได้รหัสมาอีกสองชุดไว้นำไปใช้งาน

ขอ Token สำเร็จ

แต่ถ้าเราทำอะไรไม่ถูกต้องซักอย่าง เช่น เข้ารหัสผิด เราจะได้การตอบกลับที่เป็น Error มาแทน

เกิดข้อผิดพลาดในการขอ Token

อีกสิ่งนึงที่ทางผู้จัดทำแจ้งไว้ในเอกสาร ในกรณีที่เราจะทำการเชื่อมต่อเป็นระยะเวลานาน เช่น ตรวจสอบราคา สถานะต่างๆ เป็นระยะๆ เราจะไม่สามารถเชื่อมต่อได้ถ้าหาก Token ที่ขอเอาไว้เกิดหมดอายุขึ้นมาก่อน สิ่งที่ต้องทำเป็นระยะ คือการ Refresh Token หลังจากผมทำการเฝ้าดูหน้าต่าง Client Proxy ก็พบว่า มันจะทำการ Refresh ทุกๆ 6 นาที ถ้าให้เดาจากตัวแปรที่บอกว่าจะหมดอายุใน 432000 น่าจะหมายถึง 432,000 Milliseconds หรือ 7 นาที กว่าๆ

สำหรับการ Refresh Token ในเอกสารกำหนดว่าเราต้องมีค่าต่างๆ ดังนี้

แล้วคำถามก็ผุดขึ้นมาว่า “อะไรคือ Service Code ฟ่ะ”

ผมเลยกลับไปนั่งเฝ้า Proxy Client อีกครั้ง และพบว่ามันถูกแทนด้วยคำว่า “ALGO” เลยต้องย้อนกลับไปดู URL ที่เรียก Token อีกครั้ง แล้วจึงพบว่าเป็น “ALGO” มาตั้งแต่แรก

หลังจาก Refresh สำเร็จ เราก็จะได้การตอบกลับมาเช่นกัน

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

ถ้าดูตามหมวด API ทั้งหมด จะเห็นว่าผมได้ทดสอบของหมวด Authentication หมดแล้ว ต่อไปจะลองทดสอบในส่วนของหมวด User Management กันครับ ก็จะมีทั้งหมด 6 ฟังก์ชั่นด้วยกัน

ลองคำสั่งแรกกัน Get Curret User ว่าจะได้อะไรออกมาบ้าง ว่าแล้วก็ส่องเอกสารหน่อย

ผมติดตรงนี้อยู่ซักแปปนึง มันขึ้น Error 401 ซึ่งตามเอกสารแสดงว่าเราไม่ได้ล๊อกอิน

จึงพบว่ายังไม่ได้เอา Access Token ไปใช้งานเลย ถ้าย้อนไปดูในเอกสารแล้วจะพบว่ามีการแจ้งอยู่ว่าเราต้องนำไปใช้งาน

ตรงนี้ผมคิดว่าจริงๆ แล้วควรจะใส่ไปซักหน่อยว่ามันเป็น Request Header ที่จำเป็นต้องมี เอกสารจะได้สมบูรณ์มากขึ้นไปอีกครับ

เมื่อสำเร็จแล้วก็ได้ข้อมูลต่างๆ ออกมาตามด้านล่างครับ บอกรายละเอียดบัญชีต่างๆ ซึ่งถ้ามีหลายๆ บัญชี ผมคิดว่าข้อมูลก็จะยาวตามจำนวนบัญชีที่เรามี

ไปต่อที่คำสั่ง Get Default Account By System (ชื่อยาวจัง) อันนี้จะเห็น Parameter ตัวนึงที่ชื่อว่า System ID ซึ่งตอนแรกผมก็ไม่ทราบว่าจะต้องหามาจากไหน แต่ก็เลื่อนไปเห็นคำสั่งก่อนหน้าจึงเห็นว่า System ID ถูกกระบุมาในข้อมูลที่ส่งกลับมาตอนเรียก Get Current User ก็แอบให้งมอยู่พักนึงนะเนี่ย 55…

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

คำสั่ง Get Role ที่ผมไม่ทราบว่ามันคืออะไร และมีประโยชน์ยังไงเหมือนกันครับ อาจจะเอาไว้บอกว่าคุณกำลังเล่นบทบาทอะไรอยู่ ตำรวจ นักสืบ หรือหมอ…..กลับไปที่เรื่องของเราดีกว่า ก็จะได้ผลประมาณนี้ครับ

อีกหนึ่งคำสั่งที่ไม่รู้ว่าคืออะไร คือ Get Trader Id รู้แต่สิ่งที่มันแจ้งกลับมาคือ…

ต่อไปเป็นคำสั่ง List Accounts ชื่อก็บอกว่าน่าจะแสดงรายละเอียดบัญชีของเราทั้งหมดครับ ออกมาเป็นเช่นนี้

ผมคิดว่ามันก็เหมือนกับคำสั่ง Get Current User โดยตัดข้อมูล เฉพาะส่วน Account มา

ต่อไปเป็นคำสั่งสำคัญที่น่าจะได้ใช้งานครับ มันคือคำสั่ง Verify Pin ใช้เพื่อตรวจสอบว่า PIN ที่เราใช้กรอกในโปรแกรม Streaming สามารถใช้งานได้ แต่แล้วก็เกิดปัญหาบางอย่าง

ผมไล่ดูโปรแกรมทุกอย่าง รวมถึงเอกสารทั้งหมด จึงพบอะไรบางอย่าง ว่า URL ที่บอกในหน้าวิธียืนยันตัวตน ใช้ HTTPS แต่ในขณะที่ ในข้อมูลในเอกสารดันเป็น HTTP เฉยๆ

ผมจึงได้ลองเปลี่ยน URL ตรงนี้จากตามเอกสารด้านล่าง เป็น HTTPS แทน

แล้วท้ายที่สุดเราก็พบตัวคนร้าย…

การตอบกลับมาก็ง่ายๆ แค่นี้เลยครับ ว่า PIN ของเรานั้นถูกต้อง

ตอนนี้ผมก็พร้อมแล้วที่จะเรียกคำสั่งแรกในหมวด Derivatives คือ Get Account Info

หลังจากเราเรียกฟังก์ชั่นนี้แล้ว ก็จะแสดงรายละเอียดของบัญชีเราขึ้นมาตามด้านล่างครับ ถือว่าครบถ้วนอยู่ เพราะจริงๆ ผมก็ใช้แค่พวก Equity กับ Balance ครับ

บัญชีนี้ไม่มีใช้งานมาระยะนึงแล้ว ก็ว่าจะนำเงินเข้าไปทดสอบ API ไม่มาก แต่ดันจังหวะพอดีกับทาง TFex ขึ้น Margin เรียกว่าเป็นการทดสอบ API ที่มีราคาจริงๆ นี่ยังไม่รวมว่าตอนทดสอบซื้อ-ขาย จะเกิดอะไรขึ้นอีก…

มาลองคำสั่งเกี่ยวกับการเทรดกันเลย…

ผมขอเริ่มด้วยการเปิด Order แบบปกติด้วยมือก่อนผ่าน Streaming ก่อน เพื่อลดปัญหาที่อาจจะเกิดขึ้นระหว่างทางได้ และผมอยากจะรู้วิธีปิด Position ก่อนที่จะเปิด เพื่อลดความสูญเสียที่จะเกิดขึ้น

หลังจากเปิดแล้ว ก็ลองสั่ง Get Account Info อีกครั้ง ก็พบว่าค่าต่างๆ เปลี่ยนไปแล้ว มีการแสดง Margin ที่ใช้ไป รวมถึง Equity ด้วย จึงนำกลับมาเทียบกับสิ่งที่เห็นบน Streaming พบว่าค่าที่ได้ก็มีความแตกต่างกันเล็กน้อย อาจจะด้วยการ Refresh ที่ไม่ตรงกันครับ แต่ถือว่าถูกต้อง

ผมถือ Position นี้ตั้งแต่ตอนเที่ยงๆ และในขณะนี้ก็ใกล้เวลาปิดตลาดแล้วเป็นวันศุกร์ด้วย ผมจะคงต้องหยุดไว้ที่ตรงนี้ก่อน เนื่องจากฟังก์ชั่นอื่นๆ คงไม่สามารถใช้งานได้ตอนตลาดปิด

ยังไงพบกันใน Part 2 ครับ ที่จะเอาฟังก์ชั่นในการเทรดมาลองใช้งาน สำหรับใครที่สนใจจะเอาไปพัฒนาต่อ ผมได้วาง Code ของ Python ที่ทดสอบในบทความนี้ไว้ให้แล้วใน GitHub อาจจะเลอะๆ นิดหน่อยนะครับ ไว้ดูเป็นแนวทาง ตอนนี้ผมกำลังให้ฝ่าย R&D ทำตัว Lib ที่จะ Wrapper ฟังก์ชั่นต่างๆ ให้มันกระซับมากขึ้น อาจจะใช้เวลาหน่อยครับ เพราะ R&D ก็คือผมเอง…555

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

…ขอกำไรจงอยู่คู่กับท่าน…ราตรีสวัสดิ์ครับ

--

--