สอนการเขียนEA Forex การสร้าง EA นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 1 ปูพื้นฐานกันก่อน Forex EAตัวแรกสวัสดีครับท่านทั้งหลายที่สนใจใน
การสร้าง EA forex (Expert Adviser) เป็นของตัวเอง ก่อนอื่นต้องบอกกันก่อนว่า
ส่วนตัวผมนั้นไม่ได้เก่งเขียน
EA Forex ระดับเซียนที่จะมาสอนใครให้เขียนได้ ดังนั้นบทความของผมต่อไปจากนี้ จะเป็นการแบ่งปันประสบการณ์ซะมากกว่า
เพราะทฤษฏีหรือหลักการอะไรผมก็ไม่มี ดังนั้นถ้าท่านใดเห็นว่าตรงไหนผิด ตรงไหนถูกต้องมากกว่า ก็รบกวนแนะนำผมด้วยนะครับ
เอาละครับ บ่นไปสามบันทัดแล้ว เรามาเริ่มกันเลยดีกว่า ซึ่งแรกๆ ผมก็จะไปช้าหน่อยนะครับ เพราะถ้าพื้นไม่แน่นพอ บทต่อๆ ไปท่านจะงง อาจถึงขั้นธาตุไฟเข้าแทรกได้...
การทำงานของ Forex EA ใน Metatrader นั้น จะเป็นลักษณะ
Event Driven คือทำงานตามเหตุการณ์ต่างๆ
เหตุการร์ที่สำคัญๆ ของ EA มี 3 ตัวคือ Oninit, OnTick และ OnDeinit
-
OnInit เกิดขึ้นเมื่อ EA ถูกลากมาวางในกราฟ หรือเราเปลี่ยน Time Frame ของกราฟ เป็นต้น
-
OnTick เกิดเมื่อมีสัญญาณราคาส่งมาจากโบรคเกอร์ ถ้าเราเขียนโค้ดให้ทำงานในส่วนนี้ โค้ดของเราจะทำงานทุกๆ ครั้งที่มีสัญญาณจากโบรคเกอร์ ถึงแม้เราจะไม่กดปุ่ม Auto Trading ก็ตาม
-
OnDeInit เกิดขึ้นเมื่อ EA ถูกนำออกจากกราฟ หรือเราเปลี่ยน Time Frame ของกราฟ
นอกจากนี้ยังมีเหตุการณ์ อื่นๆ อีก เช่น
OnTimer หรือ
OnTester ซึ่งเอาไว้วันหลังก่อนนะครับ
ส่วนประกอบหลักๆ ที่สำคัญของภาษาโปรแกรม ไม่ว่าจะเป็นภาษาอะไรก็แล้วแต่ มันจะมีส่วนคำสั่งที่เรียกว่า Flow Control คือกลุ่มคำสั่งที่ใช้ควบคุมการทำงานของโปรแกรม
เช่น if...else, switch case เป็นต้น กลุ่มคำสั่งของการทำซ้ำ หรือที่เรียกว่า ลูป (Loop) ก็เช่น for หรือ while เดี๋ยวเราค่อยไปดูรายละเอียดของคำสั่งพวกนี้กันทีหลัง
นอกจากคำสั่งที่บอกไปแล้วนั้น ก็จะมีส่วนที่เอาไว้เก็บข้อมูลในโปรแกรม เราเรียกมันว่า ตัวแปร variable บางภาษาเขาก็เรียกว่า field หรือ properties ก็มี
ตัวแปรก็จะมีหลากหลายชนิด ซึ่งชนิดของตัวแปร เราเรียกมันว่า
Type แล้วมันก็จะแบ่งย่อยลงไปอีกคือ
primitive type และ
user-define type (อันนี้ผมจำไม่ได้ ว่าจริงๆ เรียกว่าอะไร มันคือชนิดของตัวแปรที่เราสร้างขึ้นเอง)
ชนิดของตัวแปรแบบ primitive สังเกตุง่ายๆ ก็คือชนิดของตัวแปรที่ภาษานั้นๆ มีให้เราเรียกใช้อยู่แล้วเช่น
- bool เป็นตัวแปรชนิด Boolean น่ะครับ อธิบายไงดี คือมันเก็บค่า true กับ false ครับ
- interger เป็นตัวแปรชนิดตัวเลขจำนวนเต็ม
- double เป็นตัวแปรชนิดทศนิยม
- char เป็นตัวแปรชนิดตัวอักษร หรืออักขระ
- string เป็นตัวแปรชนิดข้อความ ประมาณว่าเอาตัวแปรชนิด char มาเรียงๆ ต่อกัน
เรื่อง primitive type อ่านเสริมเอาใน wiki นะครับ
เหล่านี้เป็นแค่ส่วนหนึ่งเท่านั้นนะครับ ยกมาเป็นตัวอย่าง เฉยๆ เพราะน่าจะเจอบ่อยที่สุด ตัวแปรเหล่านี้เนี้ยมันมีความจุของแต่ละชนิดนะครับ บอกตรงๆ ณ ตรงนี้ว่าผมจำไม่ได้ 5555 ผมเขียนโปรแกรมมา 10 กว่าปีผมไม่เคยจำได้เลย ก็นั่นแหละครับ เปิด wiki เอาถ้าจำเป็นต้องใช้จริงๆ
ส่วนแบบ user define type นั้นก็ตามที่บอกครับ คือเราสร้างมันขึ้นมาใช้งานเองในโปรแกรม เช่น Struct หรือ Enum หรือ Class พวกนี้เอาไว้ผมไปอธิบายให้เห็นเป็น code น่าจะเข้าใจกว่า
จะมีอีกส่วนหนึ่งนะครับ เราเรียกมันว่า reserve words ก็คือ คำที่สงวนไว้เช่น if, while คือเราจะตั้งชื่อตัวแปรว่า if หรือ while ไม่ได้ เป็นต้น
การเขียน EA เราจะใช้ภาษา MQL4 นะครับ ซึ่งโครงสร้างภาษาของ MQL4 นี้มันเหมือนภาษา c, c++ นะครับ ถ้าใครเขียนเป็นเนี้ยก็สะบายเลย อย่าง ea ที่ผมเขียนให้ท่าน Admin ไปก็เขียนเป็น c เลย เป็น OOP (Object Oriented Programming) ด้วย
การประกาศตัวแปรรูปแบบคำสั่งคือ ชนิดข้อมูล ตามด้วยชื่อตัวแปร เช่น
int a; //ประกาศตัวแปร a เป็นชนิด integer
int arr[10]; //ประกาศตัวแปร arr เป็นอาร์เรย์ชนิด integer จำนวน 10 ช่อง
double price = 1.1542; //ประกาศตัวแปร price เป็นชนิด double และให้มีค่าเริ่มต้นเป็น 1.1542
bool useFixLot = true; //ประกาศตัวแปร useFixLot เป้นชนิด Boolean ให้ค่าเริ่มต้นเป็น true ถ้าไม่ระบุ ค่าเริ่มต้นจะเป็น false เสมอ
string comment="My EA version 1.0"; //ประกาศตัวแปร comment เป็นชนิด string
operand กับ
operator เอาแบบรวบๆ เลยนะครับ สมมติว่าเรามี a = b + 2
จะได้ว่า operand คือ a, b และ 2 ส่วน operator คือเครื่องหมาย = และเครื่องหมาย +
ตัว operator นั้นมี 3 แบบคือ
- Unary operators คือ operator ที่ต้องการ operand 1 ตัว เช่น i++
- Binary operators คือ operator ที่ต้องการ operand 2 ตัว เช่น a = 1
- Ternary operators คือ operator ที่ต้องการ operand 3 ตัว เช่น a = 3>2?"yes":"No" //ถ้า 3 มากกว่า 2 จริง ให้ a มีค่าเท่ากับ "Yes" ถ้าเท็จ ให้ a มีค่าเท่ากับ "No"
(
อ่านเพิ่มเรื่อง operator)
Operator ที่ใช้เปรียบเทียบทางตรรกะ เราจะใช้ควบคู่กับคำสั่งเงื่อนไขเช่นคำสั่ง if, while หรือ switch เป็นต้น
Operator ที่ใช้คำนวณทางคนิตศาสตร์
การใช้ if...else คำสั่ง if เอาไว้ตรวจสอบเงื่อนไขว่าเป็นจริงหรือไม่ รูปแบบคำสั่งจะเป็นแบบนี้:
if(เงื่อนไขที่ต้องการตรวจสอบ)
{
ถ้าเงื่อนไขที่ตรวจสอบนั้นเป็นจริง (true)
คำสั่งที่เราระบุไว้ ภายใน ปีกกา { ... } จะถูกทำงาน
}
else
{
ถ้าเงื่อนไขเป็นเท็จ (false)
คำสั่งที่เราระบุไว้ ภายใน ปีกกา { ... } ตรงนี้จะถูกทำงาน
}
ตัวอย่าง
if(myVar > 0)
{
Print("myVar greater than Zero.");
}
else
{
Print("myVar less or equal to Zero.");
}
การใช้งาน switch...caseนอกจาก if else แล้ว คำสั่งที่ใช้ในการตรวจสอบเงื่อนไขในโปรแกรมยังมี switch case อีก มันจะเหมือนกับเราเอา if else มาต่อๆ กันไปเรื่อยๆ
swtich(เงื่อนไข)
{
case กรณีที่ 1:
คำสั่งที่1;
break; //ก่อนจะขึ้น case ต่อไปตั้งสั่ง break เสมอ
case กรณีที่ /:
คำสั่งที่2;
break; //ก่อนจะขึ้น case ต่อไปตั้งสั่ง break เสมอ
case กรณีที่ 3:
คำสั่งที่3;
break; //ก่อนจะขึ้น case ต่อไปตั้งสั่ง break เสมอ
default:
คำสั่งที่4 //คำสั่งใน default นี้จะถูกกระทำถ้าเงื่อนไขของเราไม่ตรงกับกรณีใดๆ เลยข้างบน
break;
}
ตัวอย่าง
int num = 10;
switch(num%2)
{
case 0:
Print("Num is even");
break;
case 1:
Print("Num is odd");
break;
default:
Print("Impossible....!!!");
break;
}
ตัวอย่าง code ข้างบนนี้เป็นการเอา num มาหารเอาเศษด้วย 2 ถ้าได้เศษ 0 ก็ให้แสดงว่า Num เป็นจำนวนคู่ แต่ถ้าได้เศษเป็น 1 ให้แสดงว่า Num เป็นจำนวนคี่
ซึ่งเราสามารถเขียนโดยใช้ if else ได้เหมือนกัน
int num=10;
if((num%2) == 0)
{
Print("Num is even");
}
else if((num%2) > 0) // เขียนแบบนี้ก็ได้
{
Print("Num is odd");
}
else
{
Print("Impossible....!!!");
}
การทำซ้ำหรือการวนลูปการทำงานของคำสั่งลูปจะแบ่งออกเป็น 3 step คือ
1)กำหนเค่าเริ่มต้น (ข้อนี้ จะมีหรือไม่มีก็ได้)
2)ตรวจสอบเงื่อนไข
3)ถ้าเงื่อนไขเป็นจริงก็ทำคำสั่งใดๆ ในลูปแล้วกลับไปทำ ข้อ 2
ตัวอย่าง for loopfor(ส่วนกำหนดค่าเริ่มต้น;ส่วนตรวจสอบเงื่อนไข;ส่วนคำสั่ง1) //สั่งเกตุว่าแต่ละส่วนจะคั่นด้วย semi colon (
{
ส่วนคำสั่ง2
}
for(int i=0; i<10; i++)
{
Print(i);
}
อธิบายได้ว่า
int i=0; //ประกาศตัวแปรชนิด integer ชื่อว่า i
i<10; // ถ้า i มีค่าน้อยกว่า 10
i++; ให้เพิ่ม ค่าของ i บวกเพิ่มไป 1 ค่า (i = i+1)
ตัวอย่าง while loopwhile(เงื่อนไขที่ต้องการตรวจสอบ)
{
ถ้าเงื่อนไขเป็นจริง ให้ทำคำสั่งแล้วกลับไปเช็คเงื่อนไขว่ายังเป็นจรอง (true) อยู่หรือไม่
}
int i=0;
while(myVar = "Yes")
{
Print("Yes! and i = "+i);
i++; //หรือ i=i+1 หรือ i+=1 ให้ผลเหมือนกันครับ
}
จากตัวอย่างข้างบนเราจะเห็นความแตกต่างว่า for นั้นจะมีจำนวนการวนทำซ้ำที่ชัดเจน คือ 10 รอบ ส่วน while นั้นจะวนทำซ้ำไปเรื่อยๆ ไม่มีกำหนดตราบใดที่เงื่อนไขยังเป็นจริงอยู่
ซึ่งบางครั้งท่านอาจจะเจอ while(true) นั่นก็คือเขาต้องการให้วนซ้ำตลอดไปนั่นเอง (infinity loop)
Functionมาถึงเรื่องของ function กันบ้างนะครับก่อนอื่นเรามาดูส่วนประกอบของ function กันก่อน
void OnTick(void)
{
...
...
} void ตัวแรกนั้นเรียกว่า return type ครับ มันคือชนิดของข้อมูลที่ function จะคืนค่ากลับไป เช่น int, double แต่ตรงนี้คือ void คือ function นี้ไม่มีการคืนค่านั่นเองครับ
OnTick อันนี้คือชื่อ function ของเราครับ ตั้งชื่อเป็นอะไรก็ได้ แต่มีข้อห้ามคือ ห้ามขึ้นต้นด้วยตัวเลขครับ
void ตัวที่2 ในวงเล็บตรงนี้เรียกว่า signature ของ function ครับคือ ในภาษาโปรแกรมมิ่งหลายๆ ภาษาอนุญาตให้เราตั้งชื่อ function ซ้ำกันได้ครับ แต่ตรง signature นี้ต้องไม่เหมือนกัน เช่น void CalcuatePrice(int sl, int current_price) กับ void CalcuatePrice(int sl, double current_price) จะเห็นว่าชนิดตัวแปรของ parameter ต้องไม่เหมอนมือนกันครับ
//to be continued...
//TODO: อธิบาย function(ต่อ) การ new file และการอ่านราคาจากกราฟ หัวข้อที่เกี่ยวข้องกับการเขียน EA Forex การเขียน EA Forex บทที่ 1 :
การเขียนEA Forex การสร้าง EA นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 1 ปูพื้นฐานกันก่อน Forex EAตัวแรก การเขียน EA Forex บทที่ 2 :
การเขียน EA Forex การสร้าง EA นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 2 อ่านค่าจาก Indicator forex การเขียน EA Forex บทที่ 3 :
การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 3 การเขียนคำสั่งพื้นฐานที่เกี่ยวกับ Account การเขียน EA Forex บทที่ 4 :
การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 4 การเขียนคำสั่งที่เกี่ยวกับ Order ของ EA Forexการเขียน EA Forex บทที่ 5 :
การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 5 การเขียน EA forex เพื่อให้การแสดงผลบนกราฟการเขียน EA Forex บทที่ 6 :
การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 6 สร้าง EA Forex ให้เปิด Order จากเส้น EMAการเขียน EA Forex บทที่ 7 :
การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 7 การทดสอบ Back Test EA Forex 99.00 %VPS Forex สำหรับ รัน Forex EA :
ถ้าจะใช้ VPS forex รัน EA แนะนำที่นี่ครับ SocialVPS.Net ค่า Ping ต่ำและราคาถูกมากครับและสุดท้าย Myfxbook :
อย่าลืมเอา Port ของท่าน ใส่ ใน Myfxbook เพื่อติดตามผลนะครับ