SETTRADE ก็มี API (Python Edition Part 2)

Pitsanu Mukdaprakorn
5 min readApr 27, 2020

--

บทความก่อนหน้านี้เราได้ทำการทดลองเชื่อม API ไปพอสมควรแล้ว แต่ยังไม่ได้ทดลองการส่ง Order เข้าสู่ตลาดจริงๆ เนื่องจากหมดเวลา และตลาดปิดไปเสียก่อน ใครที่ยังไม่รู้เรื่องว่าเราทำอะไรกันไปแล้วบ้าง ไปที่บทความก่อนหน้ากันได้เลยครับ ที่ Part 1

รอบนี้จะมาลองในหมวด DERIVATIVES API กันต่อนะครับ คราวที่แล้วเราจบกันไปที่ Get Account Info ครั้งนี้ต่อไปกับ Place Order กันเลย

ผมขอเริ่มลองจากการส่งคำสั่งแบบ Limit กันก่อน เพราะว่ามันจะไม่เสียเงิน…555
เอกสารจะมีข้อมูลที่จำเป็นในการใช้ดังนี้

ซึ่งอย่างแรกที่ผมเบอกว่าเลยผิดคือ Endpoint หรือ Request URL ครับ ผมลองอยู่หลายครั้งไม่มีอะไรตอบกลับมา แต่ไม่พบข้อผิดพลาด เลยลองเปลี่ยนจาก HTTP เป็น HTTPS จึงสามารถใช้งานได้ครับ ลองไปดูส่วนของ Body กันต่อ

ในส่วนของ Parameter ต่างๆ ไม่ว่าจะ pin, position, price หรืออื่นๆ น่าจะคุ้นเคยกันอยู่แล้ว ก็เรียกว่าลอกจาก Streaming กันมาเลย

ผมทำการส่งออเดอร์แบบ Limit ไปก่อน ด้วยการ Long ที่ราคา 800.0
ตรงคำสั่ง bypassWarning อันนี้ผมก็ไม่ทราบว่ามันมีเอาไว้ทำอะไรครับ แต่ถ้าเทียบกับโปรแกรม Streaming อาจจะเป็นการข้ามหน้าต่างที่เปิดขึ้นมาตอนเราสั่งเปิดออเดอร์ครับ

หากคำสั่งของเราสำเร็จ ก็จะมีหมายเลข Order ตอบกลับมาให้แบบง่ายๆ

กลับไปดูที่หน้าต่างของ Streaming ว่ามีการส่งออเดอร์ได้จริงหรือไม่ ซึ่งก็พบว่าถูกต้องตามที่ส่งไปครับ และหมายเลข (Order No.) ตรงกัน

ตอนนี้เรามีออเดอร์ในระบบแล้ว ก็ไปต่อกันที่คำสั่ง Get Order กันเลยครับ ว่าเราจะได้อะไรออกมา แต่ก่อนอื่น…อ่านเอกสารครับ

เนื่องจากเป็นคำสั่ง GET เลยจะไม่ซับซ้อนมาก ผมสังเกตพบอะไรบางอย่าง คำสั่งใดที่ใช้ GET เราจะใช้ HTTP ได้ แต่ถ้าเราจะใช้ POST จะต้องเปลี่ยนจากเอกสารเป็น HTTPS ครับ สุดท้ายที่ผมลองมาใช้ HTTPS ได้ทั้งหมดเลยครับ จึงขอเปลี่ยนเป็น HTTPS ให้หมดเลยล่ะกัน เพื่อลดความงุนงง ซึ่งระบบก็จะตอบกลับด้วยข้อมูลอันเยอะแยะมากมายดังนี้ ส่วนอันไหนเป็นอะไรน่าจะเข้าใจกันอยู่แล้ว

ผมลองคำสั่ง Get Portfolio แล้วไม่มีอะไรตอบกลับมาเลยแม้ว่าจะเปลี่ยน URL ก็แล้ว อาจจะกลับมาดูคำสั่งนี้ภายหลังครับ

คำสั่งต่อเป็นคือ List Order ครับ ซึ่งจะแสดง รายชื่อออเดอร์ของเราทั้งหมดครับ ข้อมูลที่ส่งกลับมาคล้ายๆ กับ Get Order แต่จะแสดงออเดอร์ทั้งหมดครับ ซึ่งของเรามีแค่ 1 อัน

ไหนๆ ล่ะ ผมสั่งเปิดอีกอันเลยล่ะกันครับที่ราคา 810.0 แล้วลองสั่ง List Order ใหม่อีกครั้ง แล้วก็พบว่า

เอ่อออ…ตังไม่พอ…ช่างมันล่ะกันครับ 555…

ผมไปสั่ง Change Order ต่อนะครับ เราลองเปลี่ยนราคาที่ LIMIT ไปที่ 815.0 ล่ะกันครับ มาดูว่าเราต้องส่งอะไรไปบ้าง

หลังจากส่งคำสั่งไปแล้ว อันนี้จะไม่มีอะไรตอบกลับมาเลยครับ นอกจาก Code ที่เป็นสถานะ 200 ซึ่งแปลว่าเรียบร้อยแล้ว ผมจึงกลับไปดูที่หน้า Streaming อีกครั้ง

โอเคครับ ตอนนี้ก็จะมาลอง Cancel Order กัน คำสั่งนี้ต้องการแค่ PIN อย่างเดียวเลยครับ รวมถึงไม่มีการตอบกลับมาเช่นกัน

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

ในส่วนของคำสั่ง Cancel Multiple Orders ไม่สามารถทดลองให้ดูแบบเต็มได้นะครับ เนื่องจาก Margin ไม่พอนั้นเอง ฮ่าาา…แต่ด้วยความสงสัยเลยลองเปิดออเดอร์ใหม่อีกครั้ง และลองยกเลิก ออเดอร์เดียวด้วยคำสั่ง Cancel Multiple Orders ดูครับ ซึ่งก็สามารถยกเลิกได้เช่นกัน

ในส่วนการสั่งงานเหมือนกับของ Cancel เลยครับ เราจะเพิ่ม Payload ในส่วนของรายชื่อออเดอร์ทั้งหมดไปเป็นแบบ Array ยกตัวอย่างเช่น มีเราออเดอร์หมายเลข 123456 และ 654321 ในส่วนของ Payload ก็จะหน้าต่างประมาณนี้

ในส่วนของการตอบรับว่าทำงานเรียบร้อยอันนี้จะส่งสถานะ 207 กลับมาในกรณีที่ทำงานถูกต้อง ซึ่งสถานะทั้งหมดสามารถดูได้จากที่นี่ครับ

ใกล้จะหมดแล้วนะครับสำหรับในหมวด Derivatives เหลือเพียงแค่คำสั่ง Get Portfolio ซึ่งยังไม่สามารถใช้ได้ตอนนี้ เนื่องจากยังไม่มี Position จริงๆ ถึงเวลาที่ต้องเสียเงินกันแล้วครับ วันนี้ผมจะไม่เสี่ยงหลับตาเปิดเอง จึงกระซิบไปถามกูรูว่าผมควรจะเสียเงิน…เอ้ย เปิดทางไหนดี ได้ความมาว่าควรจะรอย่อซักหน่อยแล้ว Long ไป แต่ผมว่าถ้ารอไป บทความนี้อาจจะยืดยาวไปอีกกว่าจะเสร็จ

เปิดมันเลยล่ะกัน!!!…

ปัญหามาล่ะครับ อะไรคือ “Message not readable”

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

ก็มาที่คำสั่ง Get Portfolio กันต่อครับ ก่อนหน้านี้อย่างที่บอกว่าผมได้ลองไปแล้ว แต่ไม่มีอะไรตอบกลับมา คราวนี้หลังจากเรามีสถานะแล้ว ลองดูว่าจะตอบกลับมาแบบไหนครับ

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

ในช่วงเวลาเบรก ผมก็ได้ย้อนกลับไปที่คำสั่งก่อนหน้า คือ Get Order และ List Order ทั้งสองคำสั่งนี้ยังสามารถใช้งานได้กับสถานะที่เปิดไปแล้ว ในส่วนของ List Order จะแสดงออกมาทั้งหมดทั้งสถานะที่ยกเลิก และกำลังเปิดอยู่

เดินทางมาถึงคำสั่งสุดท้ายในหมวดนี้แล้ว ก็คือ List Trade ซึ่งตอนนี้ผมมีสถานะเรียบร้อย ก็สามารถใช้หมายเลขสถานะที่เปิดด้วยมือไปได้เลยครับ การสั่งงานเหมือนกันทุกอย่าง แค่เปลี่ยน Endpoint แล้วผลลัพธ์ก็จะออกมาคล้ายๆ List Order แต่จะแสดงเฉพาะสถานะที่ Matched ไปแล้ว และรายละเอียดที่มากกว่า

ระหว่างรอตลาดเปิด ผมขอไปไล่ในส่วนของหมวดสุดท้ายที่ชื่อว่า Derivatives (Market Rep) กันก่อนในส่วนของ 4 คำสั่งแรก ซึ่งน่าจะสามารถใช้งานได้ตอนตลาดปิด

สรุปแล้วว่า…ผมลองทั้ง Get Order, Get Portfolio, List Order, List Trade ทั้งหมดนี้พ่น Error Code = 403 ออกมาทุกคำสั่งเลยครับ เอาเป็นว่าผมน่าจะต้องข้ามทั้งหมวดนี้ไปเลย เพราะไม่รู้ว่าเอาไว้ทำอะไร และยังไม่สามารถใช้งานได้อีกด้วยครับ หรือถ้าใครสามารถใช้งานมันได้ มาคุยกันหน่อยครับ เผื่อบทความนี้จะได้สมบูรณ์ขึ้นไปอีก

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

ไม่เป็นไรครับ เราไปอ้อมๆ ก็ได้

ผมจะใช้วิธี LIMIT แทนแต่ให้มัน Match ทันทีที่ส่งไป โดยกำหนดราคาให้สูงกว่าราคาตลาดประมาณนึง แต่ในทางปฏิบัติจริงๆ ถ้ายังไม่มี API ในส่วนของราคาตลาดมา เราก็จะไม่สามารถล่วงรู้ราคาได้เลย… (Update:28–04–2020 ส่งราคาตลาดในอยู่ Part 3 ครับ)

ก็สมมุติว่ามันมีล่ะกันครับ…เพราะผมก็มี :)

ณ ตอนนี้ราคาตลาดอยู่ราวๆ 840 ผมจึงสั่ง LIMIT ไปที่ราคา 860 แทน ด้วย Payload ตามนี้ครับ

ระบบก็จะตอบเรามาด้วยหมายเลข Order และไปปรากฎที่ Streaming ทันที พร้อมกับสถานะที่เปิดไปแล้ว

สำหรับการเปิดแบบ LIMIT จำเป็นต้องมีข้อมูลที่ชื่อ validityType เสมอนะครับ ถ้าลืมตรงนี้ ก็ได้รับการตอบกลับเช่นนี้

ซึ่งการตอบกลับแบบนี้ ใช้กับทุกแบบที่เกิดการใช้ Parameter ต่างๆ ผิดครับ และนี่ก็เป็น Error ตลอดช่วงเวลาที่ผมพยาบามลองเปิดที่ราคาตลาดเช่นกัน ซึ่งเป็นไปได้สองอย่าง คือ API ยังไม่สมบูรณ์ หรือผมคงทำอะไรผิดซักอย่าง ซึ่งผมขอให้เป็นอย่างหลัง ถ้าให้ผมยืนงงในดงโควิดโดยที่ยังไม่สมบูรณ์ ผมคงจะโกรธมาก …555

แล้วเราก็จะมาปิดสถานะอันนี้ทิ้งไปซะ โดยการส่ง Order กลับด้านไปจากรอบที่แล้วตามสไตล์ Streaming ซึ่งเราก็จะส่ง SHORT แบบ LIMIT โดยที่ราคาต่ำกว่าราคาตลาดเล็กน้อย ตาม Payload ดังนี้

เป็นอันเรียบร้อยครับ ตอบกลับมาด้วยหมายเลข Order และใน Streaming ก็ทำการ Match เรียบร้อย

เมื่อเรียก Account Info ทุกอย่างก็คืนกลับสู่ปกติครับ

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

สุดท้ายนี้ต้องขอชมทาง SETTRADE ที่เล็งเห็นความต้องการของตลาดในอนาคตที่จะเกิดขึ้น ผมเข้าใจว่าในมุมมองการป้องกันความเสี่ยงก็สำคัญ แต่การจัดการเทรดด้วยระบบอัตโนมัติให้มาเข้าที่เข้าทาง ผมว่าน่าจะสามารถควบคุมได้ดีกว่าปล่อยให้ดำเนินการแบบโจรๆ อย่างที่เคยทำกันมา พอทุกอย่างเข้าสู่ระบบ ไม่ว่าจะการจำกัดการยิงไม้ที่มากเกินไป การเปิดในลักษณะที่ผิดปกติหรือผิดกฎ ก็สามารถยิ่งตรวจจับได้ง่ายยิ่งขึ้นไปอีก รวมถึงสิ่งน่าจะได้เพิ่มมากขึ้น คือ Volume ของคนที่มาใช้งาน เพราะการพัฒนาระบบเทรดในปัจจุบันมีเครื่องมืออีกมากมายคอยช่วยเหลือ เครื่องคอมพิวเตอร์ที่แรงขึ้นจนทำระบบที่ซับซ้อนได้ รวมถึงวิถีชีวิตของคนยุคใหม่ที่เวลาในการวิเคราะห์กราฟแทบจะไม่มี

ในขณะที่ API ตัวนี้อยู่ในระหว่างการพัฒนาผมอยากให้มีการปรับปรุงในบางส่วนจะได้มีความสมบูรณ์ เพราะเท่าที่ทดลองมาทั้งหมด การติดๆ ขัดๆ เกิดจากเอกสารที่ค่อนข้างจะพิการหน่อยๆ หรือการตอบกลับแบบตบหน้าเราโดยไม่พูดซักคำ

ผมขอสรุปเป็นข้อๆ มีอะไรที่ผมพบว่ามันไม่ถูกต้องอยู่บ้าง จะได้ระมัดระวังกันหากยังไม่มีใครแก้ไขครับ
1. Endpoints (URL) ต่างๆ ผมใช้ https แทนที่ http ทั้งหมดเลยนะครับ สามารถใช้งานได้ ซึ่งบางอันบังคับว่าต้องเป็น https ด้วย แต่ในเอกสารเป็น http แต่ถ้าใครใช้ client proxy ให้ใช้ http ทั้งหมดนะครับ
2. ตัวอย่างคำสั่งส่วนมากจะไม่ค่อยสมบูรณ์ เช่น ตอนผมส่ง ‘LIMIT’ ขณะที่เอกสารเขียนให้ใส่ ‘LIMIT (Limit)’ ถ้าใครไม่คุ้นเคยกับการทำ API ก็อาจจะติดขัดเป็นเวลานานได้ ผมเองก็ติดครับ แต่มันไม่ค่อยสมเหตุสมผลเลยใส่ LIMIT เฉยๆ ไป ซึ่งตรงนี้มีเยอะมากครับ ในคำอธิบายมันดีที่ใส่รายละเอียดตัวย่อต่างๆ แต่ในตัวอย่างควรเป็น Syntax จริงๆ ที่สามารถใช้งานได้ ไม่ใช่การลอกมาทั้งหมด
3. การตอบกลับควรบอกอะไรผู้ใช้งานมากกว่านี้ ไม่ว่าจะขาด Parameters ตัวไหนไป หรือค่าที่ตัวไหนไม่ถูกต้อง จะได้แก้ไขและไปต่อกันได้ทันที รวมถึง Parameters ที่จำเป็นต้องใส่ (Required) ยังมีความสับสน เช่น การใช้งาน LIMIT ที่ต้องมี validityType เสมอ แต่ ValidityType กลายเป็นข้อมูลที่ Not Required ซะงั้น ซึ่งในมุมมองผมทำได้สองอย่าง คือ ใส่มันมัน Required ซะ หรือไม่ก็ควรจะตอบกลับมาว่า LIMIT ต้องมี ValidityType ก็ได้เช่นกัน
4. อันนี้ผมมาเพิ่มหลังจาก Publish ไปแล้ว และนึกขึ้นได้ คือ ตั้งแต่ผมลองทั้งวันไม่เคยใช้คำสั่ง Refresh Token เลยครับ คิดว่า

สำหรับการเชื่อมต่อ API ที่ผ่านมา ผมขอยกย่องของ Oanda เลยครับ ทำเอกสารไว้ได้ดีมาก รายละเอียดครบถ้วนแบบแทบไม่มีหลงทางกันเลย

สุดท้ายนี้หวังว่าบทความนี้จะเป็นประโยชน์กับทุกๆ คนนะครับ ตอนนี้ผมคงนั่งทำตัว Wrapper ไปก่อน แล้วถ้าเสร็จเมื่อไหร่มาต่อกันในบทความต่อไปครับ ไม่รู้ว่า API Part 3 หรือว่า Wrapper จะมาถึงก่อนกัน 555 และเหมือนเดิมครับ โค้ทถูกวางในใน Github เรียบร้อยแล้ว เอาไปเล่นกันได้เลยครับ

อ่อ…สรุปแล้วว่าการเขียนบทความนี้ ใช้งบประมาณไป 3,181.22 บาท :(

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

ปล. ข้อมูลอ้างอิงทั้งหมด ณ วันที่ 27 เมษายน 2020

--

--