หน้าแรก การเทรดด้วยระบบ โพสต์

การสร้าง Expert Advisor ด้วย 2 MA Crossing สำหรับ MetaTrader 4

ไฟล์แนบ
34176.zip (2.06 KB, ดาวน์โหลด 0 ครั้ง)

วันนี้เราจะมาสร้าง Expert Advisor (EA) โดยเริ่มจากการกำหนดตัวแปรที่จำเป็นกันก่อนเลยครับ

//--- ตัวแปรที่ต้องกำหนด
input    int      period_ma_fast = 8;  //ช่วงเวลา Fast MA
input    int      period_ma_slow = 20;  //ช่วงเวลา Slow MA

input    double   takeProfit  = 20.0;  // Take Profit (pips)
input    double   stopLoss    = 20.0  // Stop Loss (pips)

input    double   lotSize     = 0.10  // ขนาดล็อต
input    double   minEquity   = 100.0;  //ทุนขั้นต่ำ ($)

input    int Slippage = 3       // Slippage
input    int MagicNumber = 889  //หมายเลข Magic


ต่อไปเราจะมากำหนดตัวแปรแบบ Global กันครับ โดยตัวแปรเหล่านี้จะสามารถเข้าถึงได้จากทุกฟังก์ชัน

//ตัวแปร Global
double   myPoint    = 0.0;
int      mySlippage = 0;
int      BuyTicket   = 0;
int      SellTicket  = 0;


เมื่อ EA ถูกเรียกใช้งาน ฟังก์ชันแรกที่ถูกเรียกคือ OnInit() ซึ่งเรามักจะใช้ฟังก์ชันนี้ในการตรวจสอบและกำหนดค่าตัวแปร global ที่จะใช้

int OnInit()
{
   //ตรวจสอบค่าตัวแปรอินพุต เราควรตรวจสอบทุกครั้งที่เริ่มต้น
   if (period_ma_fast >= period_ma_slow || takeProfit < 0.0 || stopLoss < 0.0 || lotSize < 0.01 || minEquity < 10){
      Alert("WARNING - ข้อมูลอินพุตไม่ถูกต้อง");
      return (INIT_PARAMETERS_INCORRECT);
   }
   
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(lotSize<min_volume)
   {
      string pesan =StringFormat("ขนาดล็อตน้อยกว่าขีดจำกัดที่กำหนดคือ %.2f",min_volume);
      Alert (pesan);
      return(INIT_PARAMETERS_INCORRECT);
   }
   
   myPoint = GetPipPoint(Symbol());
   mySlippage = GetSlippage(Symbol(),Slippage);

   return(INIT_SUCCEEDED);
}


เมื่อราคาตลาดเคลื่อนไหว (tick) ฟังก์ชัน OnTick() จะถูกเรียกใช้งานและทำการเรียกฟังก์ชันต่างๆ ภายในบล็อกนี้

ภายในฟังก์ชัน OnTick() จะมีการเรียกฟังก์ชัน checkMinEquity() เพื่อตรวจสอบความเพียงพอของทุนที่ใช้ในการเทรด หากทุนเพียงพอ (เกินกว่าทุนขั้นต่ำ) จะมีการประกาศตัวแปรสัญญาณ และตามด้วยการเรียกฟังก์ชัน NewCandle() เพื่อแจ้งว่าเมื่อไหร่มีการสร้างเทียนใหม่

ฟังก์ชัน getSignal() จะอ่านค่าจากทั้งสอง MA และส่งคืนข้อมูลสัญญาณว่าเกิดการข้ามขึ้นหรือลงเป็นสัญญาณในการซื้อ/ขาย

จากข้อมูลสัญญาณนี้ จะถูกส่งต่อไปยังฟังก์ชัน transaction() เพื่อเปิดตำแหน่งซื้อหรือขาย

และจะตามด้วยการเรียกฟังก์ชัน setTPSL() ซึ่งทำหน้าที่ในการกำหนดราคากำไรและราคาหยุดขาดทุน

ถ้าทุนไม่ถึงตามที่กำหนด จะมีการแจ้งเตือนและ EA จะหยุดทำงาน

void OnTick()
{
   if (cekMinEquity()){
      
      int signal = -1;
      bool isNewCandle = NewCandle(Period(), Symbol());
      
      signal = getSignal(isNewCandle);
      transaction(isNewCandle, signal);
      setTPSL();
      
      
   }else{
      //หยุดการเทรด เนื่องจากทุนไม่เพียงพอ
      Print("EA จะหยุดทำงานเนื่องจากทุนไม่เพียงพอ");
   }
}


ฟังก์ชันสำหรับการตั้งค่า setTPSL()

void setTPSL(){
   int   tOrder = 0;
   string   strMN = "", pair = "";
   double sl = 0.0, tp = 0.0;
   
   pair = Symbol();
   
   tOrder = OrdersTotal();
   for (int i=tOrder-1; i>=0; i--){
      bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      strMN = IntegerToString(OrderMagicNumber());
      if (StringFind(strMN, IntegerToString(MagicNumber), 0) == 0 && StringFind(OrderSymbol(), pair, 0) == 0 ){
         if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){
            if (takeProfit > 0) {
               tp = OrderOpenPrice() + (takeProfit * myPoint);
            }else{
               tp = OrderOpenPrice();
            }
            if (stopLoss > 0) {
               sl = OrderOpenPrice() - (stopLoss * myPoint);
            }else{
               sl = OrderStopLoss();
            }
            if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){
               if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)){
                  Print ("การปรับคำสั่งสำเร็จ");
               }
            }
         }
         if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){
            if (takeProfit > 0) {
               tp = OrderOpenPrice() - (takeProfit * myPoint);
            }else{
               tp = OrderOpenPrice();
            }
            if (stopLoss > 0) {
               sl = OrderOpenPrice() + (stopLoss * myPoint);
            }else{
               sl = OrderStopLoss();
            }
            if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){
               if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)){
                  Print ("การปรับคำสั่งสำเร็จ");
               }
            }
         }
         
      }//จบการตรวจสอบหมายเลข Magic และคู่
      
   }//จบการวนลูป
}


สำหรับการศึกษาและแบ่งปันในภาษาไทย สามารถเข้าร่วมกลุ่ม Telegram ของเราได้ที่ t.me/codeMQL


หากคุณกำลังมองหาแอปพลิเคชันที่จะช่วยสนับสนุนการเทรดของคุณ สามารถดาวน์โหลดแอป SignalForex ได้ที่ Play Store

https://play.google.com/store/apps/details?id=com.autobotfx.signalforex






    โพสต์ที่เกี่ยวข้อง

    ความคิดเห็น (0)