กองทุน SPDR GOLD SHARES
ถือทองก่อนหน้า
ถือทองล่าสุด
0.00
*หน่วยตัน / ราคาอ้างอิงล่าสุดจากสมาคมค้าทองคำ
สถิติกองทุน SPDR
ราคาทองคำแท่ง 96.5%
ราคาอ้างอิงล่าสุดจากสมาคมค้าทองคำ
ครั้งที่
ราคาก่อนหน้า
ราคาล่าสุด
0
(หน่วย บาท*) / อัปเดตล่าสุดเมื่อวันที่ 13 ก.ค. 2566 เวลา 13:04 น.
สถิติราคาทองคำ ไทย

สอนการเขียนEA Forex การสร้าง EA นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 1 ปูพื้นฐานกันก่อน Forex EAตัวแรก

  • 12 replies
  • 40,392 views
สอนการเขียนEA Forex การสร้าง EA นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 1 ปูพื้นฐานกันก่อน Forex EAตัวแรก

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

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

การประกาศตัวแปร
รูปแบบคำสั่งคือ ชนิดข้อมูล ตามด้วยชื่อตัวแปร เช่น
โค๊ด [Select]

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 เอาไว้ตรวจสอบเงื่อนไขว่าเป็นจริงหรือไม่ รูปแบบคำสั่งจะเป็นแบบนี้:
โค๊ด [Select]
if(เงื่อนไขที่ต้องการตรวจสอบ)
{
  ถ้าเงื่อนไขที่ตรวจสอบนั้นเป็นจริง (true)
  คำสั่งที่เราระบุไว้ ภายใน ปีกกา { ... } จะถูกทำงาน
}
else
{
   ถ้าเงื่อนไขเป็นเท็จ (false)
   คำสั่งที่เราระบุไว้ ภายใน ปีกกา { ... } ตรงนี้จะถูกทำงาน
}


ตัวอย่าง
โค๊ด [Select]
if(myVar > 0)
{
   Print("myVar greater than Zero.");
}
else
{
   Print("myVar less or equal to Zero.");
}


การใช้งาน switch...case
นอกจาก if else แล้ว คำสั่งที่ใช้ในการตรวจสอบเงื่อนไขในโปรแกรมยังมี switch case อีก มันจะเหมือนกับเราเอา if else มาต่อๆ กันไปเรื่อยๆ
โค๊ด [Select]

swtich(เงื่อนไข)
{
  case กรณีที่ 1:
    คำสั่งที่1;
    break; //ก่อนจะขึ้น case ต่อไปตั้งสั่ง break เสมอ
  case กรณีที่ /:
    คำสั่งที่2;
    break; //ก่อนจะขึ้น case ต่อไปตั้งสั่ง break เสมอ
  case กรณีที่ 3:
    คำสั่งที่3;
    break; //ก่อนจะขึ้น case ต่อไปตั้งสั่ง break เสมอ
  default:
    คำสั่งที่4 //คำสั่งใน default นี้จะถูกกระทำถ้าเงื่อนไขของเราไม่ตรงกับกรณีใดๆ เลยข้างบน
    break;
}


ตัวอย่าง
โค๊ด [Select]

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 ได้เหมือนกัน
โค๊ด [Select]
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

โค๊ด [Select]
for(ส่วนกำหนดค่าเริ่มต้น;ส่วนตรวจสอบเงื่อนไข;ส่วนคำสั่ง1) //สั่งเกตุว่าแต่ละส่วนจะคั่นด้วย semi colon (
{
ส่วนคำสั่ง2
}


โค๊ด [Select]
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

โค๊ด [Select]
while(เงื่อนไขที่ต้องการตรวจสอบ)
{
ถ้าเงื่อนไขเป็นจริง ให้ทำคำสั่งแล้วกลับไปเช็คเงื่อนไขว่ายังเป็นจรอง (true) อยู่หรือไม่
}


โค๊ด [Select]
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 เพื่อติดตามผลนะครับ

 (TH)**  ขอเป็นกำลังใจให้นะครับ ผมกำลังศึกษาอยู่พอดีเลยครับ

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

*

iRuler

  • 1,282
เดี๋ยวจะใส่ Format Code ให้ครับ )2:

*

rider

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

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


*

iRuler

  • 1,282
อ้างจาก: rider ที่ 29, กันยายน  2017, 10:28:30 PM
วันนี้ผมมีประเด็นที่ต้องรบกวนสอบถามครับ คือ

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


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


Wan*/)

*

ประพัฒน์.

 Thor 1 ขอบคุณมากครับ

*

isuccess


*

isuccess

สวัสดีครับสมาชิกใหม่ครับ
ขอรบกวนซักนิสสสครับ
กำลังหัดเขียนโปรแกรมอยู่ครับ
แต่อ่านแล้ว...อ่านอีกยังงงๆอยู่
เลยจะขอปรึกษาด้วยครับ
เวลาอยากให้โปรแกนมเช็คจำนวน 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

  • 1,282
ให้ check OrderSymbol()==Symbol() ด้วยครับ

*

isuccess


*

Annie285

สวัสดีค่า รบกวนสอบถามหน่อยค่ะ พอดีเพิ่งเริ่มหัดเขียน EA

- Print นี่มีความหมายยังไงคะ
- รบกวนสอบถามความหมายของ EA ข้างล่างนี่ค่ะ
void OnTick()
  {
//---
   if(ClearAllPending == true)
      ClearPending();
   else
      CheckKZM();
      //Print(NormalizeDouble(Ask*100*Point,Digits));
  }
//+------------------------------------------------------------------+
void CheckKZM()
{
            for(double i = NormalizeDouble(MinPrice,Digits);i<NormalizeDouble(MaxPrice,Digits);i=NormalizeDouble(i+(PipStep*Point),Digits))
            {                       
               //Print(i);
               if(HavePending(i) == false){
                  OpenPending(i);
               }           
            }                   
}
//+------------------------------------------------------------------+
bool HavePending(double price)
{
            for(int b=OrdersTotal()-1;b>=0;b--)
            {
               if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
                {
                  if(OrderMagicNumber() == MagicNumber)
                  {
                        if (OrderOpenPrice() == price )
                           return(true);                 
                  }
                }
             }
      return(false);
}
//+------------------------------------------------------------------+

 )2: ขอบคุณสำหรับความรู้ครับ