ผู้เขียน หัวข้อ: Forex EA นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 1 ปูพื้นฐานกันก่อน  (อ่าน 1092 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

เข่งเปล่า

  • แม่ทัพเม่า แห่งไรเดอร์

  • ออฟไลน์
  • ****
  • 985
  • ความมีน้ำใจ
    29
« เมื่อ: 13, กันยายน 2017, 11:08:31 pm »


Share on your facebook
สวัสดีครับท่านทั้งหลายที่สนใจในการสร้าง Forex EA (Expert Adviser) เป็นของตัวเอง ก่อนอื่นต้องบอกกันก่อนว่า
ส่วนตัวผมนั้นไม่ได้เก่งเขียน Forex EA ระดับเซียนที่จะมาสอนใครให้เขียนได้ ดังนั้นบทความของผมต่อไปจากนี้ จะเป็นการแบ่งปันประสบการณ์ซะมากกว่า
เพราะทฤษฏีหรือหลักการอะไรผมก็ไม่มี ดังนั้นถ้าท่านใดเห็นว่าตรงไหนผิด ตรงไหนถูกต้องมากกว่า ก็รบกวนแนะนำผมด้วยนะครับ

เอาละครับ บ่นไปสามบันทัดแล้ว เรามาเริ่มกันเลยดีกว่า ซึ่งแรกๆ ผมก็จะไปช้าหน่อยนะครับ เพราะถ้าพื้นไม่แน่นพอ บทต่อๆ ไปท่านจะงง อาจถึงขั้นธาตุไฟเข้าแทรกได้... /*CC

การทำงานของ 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 loop

โค๊ด
for(ส่วนกำหนดค่าเริ่มต้น;ส่วนตรวจสอบเงื่อนไข;ส่วนคำสั่ง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 loop

โค๊ด
while(เงื่อนไขที่ต้องการตรวจสอบ)
{
 ถ้าเงื่อนไขเป็นจริง ให้ทำคำสั่งแล้วกลับไปเช็คเงื่อนไขว่ายังเป็นจรอง (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 และการอ่านราคาจากกราฟ
« แก้ไขครั้งสุดท้าย: 17, ธันวาคม 2017, 09:12:00 am โดย admin »

Advertisement

เทรดเดอร์สายเขียว

  • Admin
  • แม่ทัพเม่า แห่งไรเดอร์

  • ออฟไลน์
  • *
  • 2113
  • ความมีน้ำใจ
    182
« ตอบกลับ #1 เมื่อ: 13, กันยายน 2017, 11:58:19 pm »


Share on your facebook
 (TH)**  ขอเป็นกำลังใจให้นะครับ ผมกำลังศึกษาอยู่พอดีเลยครับ
เปิดตัว EA Automatic Trade 100% ตัวแรกและตัวเดียวของบอร์ดรายละเอียดที่นี่ครับhttps://traderider.com/index.php/topic,9067.msg184651.html#msg184651
แจ้งขอรับ EA Fibo Swing Traderider ได้ที่นี่ฮะhttps://traderider.com/index.php/topic,8582.msg174841.html#msg174841

เข่งเปล่า

  • แม่ทัพเม่า แห่งไรเดอร์

  • ออฟไลน์
  • ****
  • 985
  • ความมีน้ำใจ
    29
« ตอบกลับ #2 เมื่อ: 15, กันยายน 2017, 06:39:51 pm »


Share on your facebook
กำลังนั่งเขียนเนื้อหาเพิ่มเติมอยู่ครับ เมื่อวานไฟดับ อุปกรณ์เน็ตเวิร์คเจ้ง %%22

iRuler

  • Developer
  • แม่ทัพเม่า แห่งไรเดอร์

  • ออฟไลน์
  • *
  • 1022
  • ความมีน้ำใจ
    9
« ตอบกลับ #3 เมื่อ: 27, กันยายน 2017, 06:41:59 pm »


Share on your facebook
เดี๋ยวจะใส่ Format Code ให้ครับ )2:

rider

  • เม่าใหม่ ใจเกินร้อย

  • ออฟไลน์
  • *
  • 17
  • ความมีน้ำใจ
    3
« ตอบกลับ #4 เมื่อ: 29, กันยายน 2017, 10:28:30 pm »


Share on your facebook
วันนี้ผมมีประเด็นที่ต้องรบกวนสอบถามครับ คือ

เวลาเราเขียนโปรแกรม หากเราจะเอา indicator ที่ไม่ได้มาพร้อมกับโปรแกรม meta trade เราจะดึงมาใช้งานอย่างไรครับ เป็น indicator ที่ไปโหลดมาจากที่อื่น เช่น ชื่อ aNina    !svct เป็นต้นครับ (ชื่อสมมตินะ)


iRuler

  • Developer
  • แม่ทัพเม่า แห่งไรเดอร์

  • ออฟไลน์
  • *
  • 1022
  • ความมีน้ำใจ
    9
« ตอบกลับ #5 เมื่อ: 03, ตุลาคม 2017, 04:33:58 pm »


Share on your facebook
วันนี้ผมมีประเด็นที่ต้องรบกวนสอบถามครับ คือ

เวลาเราเขียนโปรแกรม หากเราจะเอา indicator ที่ไม่ได้มาพร้อมกับโปรแกรม meta trade เราจะดึงมาใช้งานอย่างไรครับ เป็น indicator ที่ไปโหลดมาจากที่อื่น เช่น ชื่อ aNina    !svct เป็นต้นครับ (ชื่อสมมตินะ)


https://traderider.com/index.php/topic,9088.msg185132.html


 Wan*/)

ประพัฒน์ ประเชิญ

  • เม่าใหม่ ใจเกินร้อย

  • ออฟไลน์
  • *
  • 2
  • ความมีน้ำใจ
    0
« ตอบกลับ #6 เมื่อ: 17, ตุลาคม 2017, 08:00:26 pm »


Share on your facebook
 Thor 1 ขอบคุณมากครับ
**ธอร์** สอนเทรด FOREX ฟรี LINE : franky072 **ธอร์ทุบ** **ธอร์** สอนเทรด FOREX ฟรี LINE : franky072 **ธอร์ทุบ**

isuccess

  • เม่าใหม่ ใจเกินร้อย

  • ออนไลน์
  • *
  • 16
  • ความมีน้ำใจ
    1
« ตอบกลับ #7 เมื่อ: 07, ธันวาคม 2017, 01:23:05 pm »


Share on your facebook
 thank**

isuccess

  • เม่าใหม่ ใจเกินร้อย

  • ออนไลน์
  • *
  • 16
  • ความมีน้ำใจ
    1
« ตอบกลับ #8 เมื่อ: 08, ธันวาคม 2017, 02:57:46 am »


Share on your facebook
สวัสดีครับสมาชิกใหม่ครับ
ขอรบกวนซักนิสสสครับ
กำลังหัดเขียนโปรแกรมอยู่ครับ
แต่อ่านแล้ว...อ่านอีกยังงงๆอยู่
เลยจะขอปรึกษาด้วยครับ
เวลาอยากให้โปรแกนมเช็คจำนวน order ที่เปิดอยู่ใช้คำสั่งแบบนี้ถูกมั้ยครับ
void OnDeinit(const int reason)
{
   //ลบข้อความที่ค้างบนจอออก
   Comment("");
}

/*+------------------------------------------------------------------+
     ฟังก์ชัน จำนวนคำสั่งซื้อขายที่เปิดค้าอยู่()  ทำหน้าที่นับจำนวนคำสั่งซื้อขายที่เปิดโดย EA ชุดนี้ที่ยังเปิดค้างอยู่
  +------------------------------------------------------------------+*/
int OrderOpenStatus()
{
   int OrderLoopCount  = 0;
   int OrderOverAll    = OrdersTotal();
   int OrderQty        = 0;

   for (OrderLoopCount = 0;
        OrderLoopCount<OrderOverAll;
        OrderLoopCount++)
   {
      //เลือกนับเฉพาะ Order ที่เปิดด้วย MyFastSlowMAThaiEA
      if(!OrderSelect(OrderLoopCount, SELECT_BY_POS, MODE_TRADES))
         continue;
      if ((OrderComment() == EaName)&& (OrderMagicNumber() == MagicNumberA))
      {
         OrderQty++;
      }
   }
   return(OrderQty);
}

iRuler

  • Developer
  • แม่ทัพเม่า แห่งไรเดอร์

  • ออฟไลน์
  • *
  • 1022
  • ความมีน้ำใจ
    9
« ตอบกลับ #9 เมื่อ: 17, ธันวาคม 2017, 08:30:11 am »


Share on your facebook
ให้ check OrderSymbol()==Symbol() ด้วยครับ


 

ข่าวสารฟอเร็กซ์

forex factory daliyfx investing netdania bloomberg

เว็บไซต์เพื่อนบ้าน

forexstartup.net

บทเรียนพื้นฐาน

forex grade 1 forex grade 2 forex grade 3 forex grade 4 forex grade 5 forex grade 6 forex grade 7 forex grade 8

โบรคเกอร์แนะนำ

exness xm fbs fxprimus tickmill fxpremax fxpro nordfx GKFXPRIME