อ้างอิง https://fxdreema.com/documentation/builder/indicators
บทแปลนี้เผยแพร่ในกลุ่ม fxDreema Discovery
Indicator ขอเรียกว่า อินดี้
จุดประสงค์ของอินดี้คือ ช่วยให้ข้อมูลกับเทรดเดอร์ในรูปแบบของ “วัตถุ” (object) ที่มองเห็นได้ชัดเจน เช่น สัญลักษณ์ลูกศร เส้นค่าเฉลี่ย หรือ Histogram แบบต่างๆ เพื่อช่วยให้ข้อมูลในการเทรด
fxDreema ไม่สามารถทำความเข้าใจ “วัตถุ” ที่อินดี้สร้างขึ้นได้โดยตรง
เนื่องจากการทำงานของ MT4/5 ต้องอ่านข้อมูล array ที่เรียกว่า “output buffers” หรือเรียกย่อๆ ว่า “buffer”เพื่อนำไปวาดสัญลักษณ์ให้อินดี้
fxDreema จึงใช้วิธีอ่านตัวแปร array “buffers” แทน ทำให้ fxDreema อ่านค่าอินดี้ออกมาเป็นตัวเลขเพื่อนำไปใช้ใน fxDreema ได้นั่นเอง
#folder ที่เก็บไฟล์อินดี้ ใน MT4/5 ใช้เมนู Files > Open Data Folder เพื่อเปิด folder เก็บข้อมูลหลักขึ้นมา แล้วไฟล์อินดี้จะอยู่ใน folder
- MT4: %Data Folder% \MQL4\Indicators\
- MT5: %Data Folder% \MQL5\Indicators\
#การใช้งานอินดี้ใน fxDreema
ยกตัวอย่างเช่น อินดี้ เส้น MA ตัวแปร buffer จะเก็บค่าตามตำแหน่งของแท่งเทียน
1 แท่งเทียน จึงมี 1 ค่า MA(Moving Average)
และโปรแกรม fxDreema จะเรียกแท่งเทียนใหม่ที่สุดที่ยังไม่จบแท่ง คือ “แท่ง 0” ส่วน แท่งที่เก่ากว่าเป็นแท่ง 1,2,3…N ไล่ย้อนกลับไปตามลำดับ
- ค่า MA ของแท่ง 0 คือ 1.3667
- ค่า MA ของแท่ง 1 คือ 1.3658
- ค่า MA ของแท่ง 2 คือ 1.3641
#ตัวอย่าง กรณีที่มีเส้น MA และ BB การอ่านค่าอินดี้ อินดี้ 1 เส้น จะมี buffer 1 ตัว ต่อ 1 แท่งเทียน
#วิธีสังเกตอินดี้แต่ละตัวมี buffer อะไรบ้าง
buffer มักจะมีจำนวนตรงกับเส้นหรือวัตถุ(object) ที่ปรากฏบนหน้าจอ ดังนั้นเข้าไปดูในส่วนของการกำหนดสีก็จะพบ buffer ที่เราสนใจ
ตัวอย่างในภาพ มี 3 buffer ลำดับ buffer จะเริ่มที่ 0,1,2 ตามลำดับ
- buffer 0 ใช้สำหรับ เส้นกึ่งกลาง
- buffer 1 ใช้สำหรับ บรรทัดบน
- buffer 2 ใช้สำหรับ บรรทัดล่าง
#ลูกศรในอินดี้ (ปรากฎตามสัญญาณของโปรแกรมเท่านั้น ไม่ได้แสดงผลต่อเนื่องทุกแท่งเทียนเหมือนเส้น MA)
อินดี้ที่แสดงผลออกมาเป็นลูกศร มักจะปรากฎตามสัญญาณบางแท่งเทียนเท่านั้น ลูกศรพวกนี้ทำงานยังไง?
MT4/5 วาดรูปจากข้อมูลใน buffer ภาพด้านล่างเป็นตัวอย่างของ MT4 ที่ดึงข้อมูลจาก buffer บนชาร์ตราคาได้อย่างไร ต้องกำหนดตัวแปร ENUM อย่างไร เพื่อให้ออกมาเป็น “วัตถุ” รูปแบบต่างๆ เช่น จุด เส้น ลูกศร Histogram
รายละเอียดเพิ่มเติม
ดังนั้นเราจะเห็นว่า MT4 ดึงข้อมูลจาก buffer มาแสดงผลเป็นวัตถุแท่งต่อแท่ง ส่วนที่ไม่ได้แสดงผล จึงเป็นการใส่ ค่าว่าง “EMPTY_VALUE” ลงใน buffer นั่นเอง เมื่อ MT4 เห็น “ค่าว่าง” ก็จะไม่แสดงผลออกมาในชาร์ตราคา
- 32 บิต (MetaTrader 4): EMPTY_VALUE เท่ากับ 2,147,483,647
- 64 บิต (MetaTrader 5): EMPTY_VALUE เท่ากับ 9,223,372,036,854,775,807
คำแนะนำ #1 กล่อง Condition ใน fxDreema หากเอามาเปรียบเทียบ ค่าใดๆ กับ EMPTY_VALUE ว่าเป็น “ว่างเปล่า” EMPTY หรือไม่ ผลลัพธ์คือ “ไม่ถูกต้อง” เพราะ EMPTY_VALUE ถือเป็นค่าๆ หนึ่ง การเปรียบเทียบ “ว่างเปล่า” จึง ไม่ถูกต้องนั่นเอง
คำแนะนำ #2 หากคาดหวังสัญญาณจากอินดี้ที่วาดลูกศรให้คุณ แต่คุณไม่พบ buffer นั้น เพราะการวาดลูกศร อาจเกิดหลังจากที่แท่งเทียนจบลง แท่ง 0 จึงไม่มีข้อมูลใน buffer ให้ลองเปลี่ยนมาใช้แท่ง 1 แทน
#เส้นและลูกศร แสดงบนชาร์ตราคา แต่ไม่มีข้อมูลใน buffer?
ใช่ มันเป็นไปได้ อินดิเคเตอร์บางตัววาด “วัตถุ” ลงบนชาร์ตราคาโดยตรง ส่วนใหญ่จะเป็นอินดี้ที่วาดเส้นเทรนไลน์ หรือลูกศร ตามสัญญาณอินดี้
ในกรณีนี้ไม่สามารถใช้ “buffer” เพื่อดึงค่าออกมาใช้งานได้
แต่สามารถดึงข้อมูลจาก “วัตถุ” ที่วาดไปแล้วได้ แม้ว่านี่จะไม่ใช่เรื่องง่ายก็ตาม
ในกรณีที่อินดี้วาด “วัตถุ” ลงไปโดยตรง และคุณเขียน EA มาเพื่ออ่าน “วัตถุ” จากอินดี้ประเภทนี้จะมีผลอาจไม่สามารถ Optimization ได้เนื่องจากข้อจำกัดบางประการของ MT4/5
รายละเอียด วัตถุบนชาร์ตราคา > https://fxdreema.com/documentation/builder/chart-objects
#ตรวจสอบข้อมูลใน buffer
Custom Indicators คือ อินดี้ที่หามาเอง ไม่ใช่อินดี้มาตรฐาน การใช้งานครั้งแรก คุณอาจไม่รู้ว่า buffer มีค่าอะไรบ้าง และจะใช้อินดี้สร้างกลยุทธ์ได้อย่างไร สามารถตรวจสอบได้อย่างง่ายดายด้วยกล่อง “Trace” (ติดตาม) https://fxdreema.com/demo/mt4-trace-multiple
กล่อง “Trace” ใช้กับตัวแปร หรือ buffer หลายค่าพร้อมกันได้ นอกจากนี้อินดี้อาจมีเส้นต่างๆ ที่ไม่แสดงผล แต่อย่างน้อยก็ดึงค่าออกมาแสดงผลเพื่อสังเกตได้
เมื่อ Backtest เราจะเห็นค่าต่างๆ แบบนี้
#เมื่อไหร่ที่อินดี้จะแสดงผลบนชาร์ตขึ้นมาเองอัตโนมัติ
เมื่อ backtest จบ
ไม่แปลกใจหรือ? ระหว่างที่ EA ทำการ Backtest ไม่มีอินดี้อะไรแสดงผลขึ้นมาบนชาร์ตราคาเลย แต่พอ bactest จบลงกลับมีอินดี้แสดงผลขึ้นมาเองอัตโนมัติ
EA หรือ Script ที่มีการใช้งานอินดี้ตัวใดๆ อินดี้ตัวนั้นจะถูกโหลดขึ้นมาเองอัตโนมัติ แต่ไม่แสดงผลบนชาร์ตราคา และเมื่อคุณเปิดอินดี้ตัวเดิมซ้ำขึ้นมาเพื่อตรวจสอบบนชาร์ตราคา อินดี้ที่คุณเปิด กับอินดี้ที่ EA ใช้จะถือเป็นคนละตัวกัน ดังนั้นต่อให้คุณแก้ไขค่าของอินดี้ที่คุณเปิดใหม่อย่างไร ก็ไม่ได้มีผลกระทบกับการทำงานของ EA เลย
#การนำอินดี้เข้ามาใช้งานใน fxDreema : Custom Indicators
ใน fxDreema คุณสามารถเพิ่มอินดี้เองลงในฐานข้อมูลของ fxDreema ก่อน เพื่อนำอินดี้ไปใช้ใน Project ได้อย่างง่ายดาย
ขั้นแรก ไปที่เมนูด้านบน “My Indicators” เพื่อเพิ่มอินดี้ใหม่ ต้องใช้ไฟล์ซอร์สโค้ด นามสกุล *.mq4 หรือ *.mq5 หากไม่มีซอร์สโค้ด ต้องกรอกข้อมูล buffer ที่จำเป็นทั้งหมดเอง
การเพิ่มอินดี้ใหม่ โดยการเลือกไฟล์ซอร์สโค้ด fxDreema จะทำการประมวลผลซอร์สโค้ดที่เบราว์เซอร์ คอมพิวเตอร์ของเรา แล้วส่งเฉพาะข้อมูลที่จำเป็นทั้งหมดไปยังเซิร์ฟเวอร์เท่านั้น โดยไม่ได้ส่งไฟล์ซอร์สโค้ดไปด้วย
- ชื่อ อินดี้- ต้องเหมือนกับชื่อไฟล์อินดี้ (ไม่มีนามสกุล) หากชื่อไฟล์คือ “Custom ATR.mq5” ให้เขียน “Custom ATR”
- พารามิเตอร์อินพุต – การนับและลำดับจะต้องถูกต้อง ไม่เช่นนั้น Custom Indicators จะโหลดไม่สำเร็จ ชื่อก็ควรเหมือนกันแต่ไม่เหมือนก็ได้ ประเภทข้อมูลควรเหมือนหรือใกล้เคียง
- บัฟเฟอร์เอาต์พุต – ตั้งตามชอบ ให้คุณเข้าใจละกัน
เมื่อเพิ่มอินดี้ใหม่เข้าไปสำเร็จ ก็จะสามารถใช้งานอินดี้ใหม่นั้นผ่านกล่อง “Condition”
#การเพิ่มอินดี้เอง Custom Indicator มี 2 วิธี คือ รับข้อมูลจากซอร์สโค้ด หรือจาก MT4/5
วิธีแรก รับข้อมูลจากซอร์สโค้ด
เปิดไฟล์ซอร์สโค้ดอินดี้ และหาตัวแปร โดยข้อมูลที่จำเป็นทั้งหมดจะอยู่ที่ด้านบนของซอร์สโค้ด เช่น
//+------------------------------------------------------------------+
//| Alligator.mq5 |
//| Copyright 2009-2017, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_LINE
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Lime
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_label1 "Jaws"
#property indicator_label2 "Teeth"
#property indicator_label3 "Lips"
//---- input parameters
input int InpJawsPeriod=13; // Jaws period
input int InpJawsShift=8; // Jaws shift
input int InpTeethPeriod=8; // Teeth period
input int InpTeethShift=5; // Teeth shift
input int InpLipsPeriod=5; // Lips period
input int InpLipsShift=3; // Lips shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Moving average method
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_MEDIAN; // Applied price
//---- indicator buffers
double ExtJaws[];
double ExtTeeth[];
double ExtLips[];
//---- handles for moving averages
int ExtJawsHandle;
int ExtTeethHandle;
int ExtLipsHandle;
//--- bars minimum for calculation
int ExtBarsMinimum;
มองหาตัวแปร input ที่จำเป็นต้องใช้งาน
input int InpJawsPeriod=13; // Jaws period
input int InpJawsShift=8; // Jaws shift
input int InpTeethPeriod=8; // Teeth period
input int InpTeethShift=5; // Teeth shift
input int InpLipsPeriod=5; // Lips period
input int InpLipsShift=3; // Lips shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Moving average method
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_MEDIAN; // Applied price
- คอลัมน์แรกที่ มองหา input ส่วนใหญ่จะเป็น global variable
- คอลัมน์ที่สอง มองไปทางขวา บรรทัดเดียวกัน คือ data type เช่น int, ENUM_MA_METHOD, ENUM_APPLIED_PRICE
- คอลัมน์ที่สาม คือชื่อตัวแปร InpJawsPeriod, InpJawsShift…
- คอลัมน์สุดท้าย คือ ค่าของตัวแปรนั้นๆ
- คอลัมน์ ถัดไปอาจจะมีหรือไม่มี คือคอมเม้นท์อธิบายตัวแปรนั้นๆ
ซอร์สโค้ดระบุจำนวน buffer output = 3 ชัดเจน นั่นคือ output ที่ได้จากอินดี้ ดึงค่านี้ไปทำงานต่อใน fxDreema ได้
#property indicator_buffers 3
#property indicator_plots 3
วิธีที่สอง รับข้อมูลจาก MT4/5
เปิดพารามิเตอร์อินดี้ พารามิเตอร์อินพุต อยู่ที่แท็บ Input
บัฟเฟอร์เอาท์พุต อยู่ใต้ แท็บ Colors
ประเภทข้อมูลของพารามิเตอร์อินพุตแต่ละตัวจะแสดงเป็นไอคอน
ความหมายของไอคอน
- int – ประเภทตัวเลข ตัวเลขจำนวนเต็ม เช่น 3
- double – ประเภทตัวเลข ตัวเลขทศนิยม เช่น 3.654
- bool – ประเภทบูลีน “จริง” True หรือ “เท็จ” False
- string – ข้อความ เช่น “Hello, World”
- datetime – ประเภทตัวเลข จริงๆ แล้วเป็นค่าจำนวนเต็ม แต่อนุญาตให้ใช้ประเภทข้อมูลนี้สำหรับพารามิเตอร์เวลา
- สี – ประเภทตัวเลขซึ่งเป็นค่าจำนวนเต็มเช่นกัน แต่ออกแบบมาเพื่ออธิบายสี
แปลโดย #นักแปลระบบเทรด HonyakuTrader.com
** ไม่รับรองความถูกต้องหรือความเสียหายอันเนื่องจากนำบทความไปใช้ จงรับผิดชอบด้วยตนเอง **