Open Forex4you Account

Server รัน EA 1000 / ปี

สั่งชื้อคู่มือการโปรแรกม MQL4

Author Topic: ช่วยดู script ที่ผมเขียนทีครับว่าต้องแก้ยังไง  (Read 13785 times)

dataxdata

  • Newbie
  • *
  • Posts: 35
สคริปต์ตัวนี้ไม่มีอะไรมากครับ ทำหน้าที่เหมือนการเปิด Stop Orders ทั่วไป สาเหตุที่ต้องเขียนเป็น ea ขึ้นมาเพราะว่า Broker เจ้ากรรมที่ใช้ปัจจุบันนั้น "ห้าม" ใช้ Buy/Sell Stop ครับ พูดง่ายๆคือส่งคำสั่งไปเมื่อไหร่แจ้งทันทีว่า Buy/Sell Stop Disabled คับ (ขออนุญาตไม่เอ่ยนาม Broker ครับ) อันนี้เป็นที่มาของการที่ต้องเขียน script ตัวนี้ครับ (ถ้าใครมีวิธีอื่นที่แก้ปัญหานี้ได้โปรดแนะนำด้วยครับว่าควรทำยังไง)

มาถึงแนวทางที่ผมเขียนครับ ผมเขียน ea ให้เรา input ราคาว่าเราอยากเปิด Buy/Sell Stop ตรงไหน TP ที่เท่าไหร่ SL เท่าไหร่ โดยรับเป็นค่า Extern เมื่อไหร่ก็ตามที่เราใส่ค่าลงเสร็จ ไปให้ ea แสดงเส้น Horizonline แสดงราคาที่เราต้องการ รวมถึง TP และ SL ที่กำหนด (พยายามทำให้เหมือน Stop Order จริงที่สุด) เมื่อกราฟวิ่งถึงราคาที่เราต้องการก็ให้เปิด Buy/Sell Order ตามปกติ สิ่งที่แตกต่างจาก Stop Order จริงๆ จะมี
1. ไม่แสดงตั๋ว Stop Order ให้ผู้ใช้งานเห็นเพราะไม่มีการส่งคำสั่งไปยัง Broker แต่ให้ ea เป็นคน monitor ราคาให้แทน ถ้าถึงราคาที่เราต้องการก็ส่งคำสั่ง buy/sell ปกติออกไป (แบบนี้ไม่มีสิทธิห้ามเราแน่นอน....ถ้าห้ามก็เลิกเทรดละคับ)
2. ใช้ Horizonline เป็น tricker ในการเปิด order ถ้าลบเส้นที่ ea เปิดไว้ไปก็จะไม่ทำงาน

สคริปต์ก็จะประมาณข้างล่างนี้ครับ

Quote
//+------------------------------------------------------------------+
//|                                                EA_STOP_ORDER.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

extern bool    BuyStop              = true;
extern double  BuyStop_Price        = 0;
extern double  BuyStop_Lots         = 0.1;
extern double  BuyStop_TakeProfit   = 0;
extern double  BuyStop_StopLoss     = 0;
extern int     BuyStop_Pips         = 5;
extern bool    SellStop             = true;
extern double  SellStop_Price       = 0;   
extern double  SellStop_Lots        = 0.1;
extern double  SellStop_TakeProfit  = 0;
extern double  SellStop_StopLoss    = 0;
extern int     SellStop_Pips        = 5;

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
   {
      return(0);
   }

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
   {
      return(0);
   }

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int start()
   {
      int MagicNumber1 = 349102101;
      int MagicNumber2 = 349102202;
         
      if(BuyStop_Price == 0)
         {
            ObjectDelete("EA_BuyStop");
            ObjectDelete("EA_BuyStop_StopLoss");
            ObjectDelete("EA_BuyStop_TakeProfit");
               
         }
      if(SellStop_Price == 0)
         {
            ObjectDelete("EA_SellStop");
            ObjectDelete("EA_SellStop_StopLoss");
            ObjectDelete("EA_SellStop_TakeProfit");
         }
         
      if((BuyStop == true) && (BuyStop_Price != 0) && (BuyStop_Price > Ask))
         {
            if(ObjectFind("EA_BuyStop") != 0)
               {
                  ObjectCreate("EA_BuyStop", OBJ_HLINE, 0, Time[0], BuyStop_Price);
                  ObjectSet("EA_BuyStop", OBJPROP_STYLE, STYLE_DASHDOT);
                  ObjectSet("EA_BuyStop", OBJPROP_COLOR, White);
                  ObjectSetText("EA_BuyStop", "EA_BuyStop", 10, "Tahoma", White);
                  if(BuyStop_StopLoss != 0)
                     {
                        ObjectCreate("EA_BuyStop_StopLoss", OBJ_HLINE, 0, Time[0], BuyStop_StopLoss);
                        ObjectSet("EA_BuyStop_StopLoss", OBJPROP_STYLE, STYLE_DASHDOT);
                        ObjectSet("EA_BuyStop_StopLoss", OBJPROP_COLOR, Red);
                     }
                  if(BuyStop_TakeProfit != 0)
                     {
                        ObjectCreate("EA_BuyStop_TakeProfit", OBJ_HLINE, 0, Time[0], BuyStop_TakeProfit);
                        ObjectSet("EA_BuyStop_TakeProfit", OBJPROP_STYLE, STYLE_DASHDOT);
                        ObjectSet("EA_BuyStop_TakeProfit", OBJPROP_COLOR, Red);
                     }
               }
            else
               {
                  ObjectMove("EA_BuyStop",0,Time[0], BuyStop_Price);
                  ObjectMove("EA_BuyStop_StopLoss",0,Time[0], BuyStop_StopLoss);
                  ObjectMove("EA_BuyStop_TakeProfit",0,Time[0], BuyStop_TakeProfit);
               }
         }
      if((ObjectFind("EA_BuyStop") == 0) && (Ask > BuyStop_Price))
         {
            OrderSend(Symbol(),OP_BUY,BuyStop_Lots,Ask,BuyStop_Pips,BuyStop_StopLoss,BuyStop_TakeProfit,"Open_BuyStop_by_EA",MagicNumber1,0,NULL);
            BuyStop_Price = 0;
            //if(s1count > 0)
               //{
                  ObjectDelete("EA_BuyStop");
                  ObjectDelete("EA_BuyStop_StopLoss");
                  ObjectDelete("EA_BuyStop_TakeProfit");
               //}
         }
         
         
      if((SellStop == true) && (SellStop_Price != 0) && (SellStop_Price < Bid))
         {
            if(ObjectFind("EA_SellStop") != 0)
               {
                  ObjectCreate("EA_SellStop", OBJ_HLINE, 0, Time[0], SellStop_Price);
                  ObjectSet("EA_SellStop", OBJPROP_STYLE, STYLE_DASHDOT);
                  ObjectSet("EA_SellStop", OBJPROP_COLOR, White);
                  ObjectSetText("EA_SellStop", "EA_SellStop", 10, "Tahoma", White);
                  if(SellStop_StopLoss != 0)
                     {
                        ObjectCreate("EA_SellStop_StopLoss", OBJ_HLINE, 0, Time[0], SellStop_StopLoss);
                        ObjectSet("EA_SellStop_StopLoss", OBJPROP_STYLE, STYLE_DASHDOT);
                        ObjectSet("EA_SellStop_StopLoss", OBJPROP_COLOR, Red);
                     }
                  if(SellStop_TakeProfit != 0)
                     {
                        ObjectCreate("EA_SellStop_TakeProfit", OBJ_HLINE, 0, Time[0], SellStop_TakeProfit);
                        ObjectSet("EA_SellStop_TakeProfit", OBJPROP_STYLE, STYLE_DASHDOT);
                        ObjectSet("EA_SellStop_TakeProfit", OBJPROP_COLOR, Red);
                     }
               }
            else
               {
                  ObjectMove("EA_SellStop",0,Time[0], SellStop_Price);
                  if(SellStop_StopLoss != 0)
                     {
                        ObjectMove("EA_SellStop_StopLoss",0,Time[0], SellStop_StopLoss);
                     }
                  if(SellStop_TakeProfit != 0)
                     {
                        ObjectMove("EA_SellStop_TakeProfit",0,Time[0], SellStop_TakeProfit);
                     }
               }
         }
      if((ObjectFind("EA_SellStop") == 0) && (Bid < SellStop_Price))
         {     
            OrderSend(Symbol(),OP_SELL,SellStop_Lots,Bid,SellStop_Pips,SellStop_StopLoss,SellStop_TakeProfit,"Open_SellStop_by_EA",MagicNumber2,0,NULL);
            SellStop_Price = 0;
            //if(s2count > 0)
            //{
               ObjectDelete("EA_SellStop");
               ObjectDelete("EA_SellStop_StopLoss");
               ObjectDelete("EA_SellStop_TakeProfit");
            //}
         }
      return(0);
   }
//+------------------------------------------------------------------+

ทดสอบในเบื้องต้นใน demo พบว่าใช้งานได้ครับ ออกมาคล้ายๆการเปิดด้วย Stop Order จริง.....แต่มีปัญหาคือ เมื่อเปลี่ยน timeframe แล้วตัว ea เริ่มทำงานใหม่ครับ ยกตัวอย่างนะครับ
1. ผมตั้งค่า default ราคาไว้ที่ 0
2. ผมเปิดกราฟ M15 ไว้และเริ่มป้อนราคา buy stop ไปที่ 1400
3. ea เริ่มทำงานโดยสร้าง Hline ให้เห็นใน M15
4. เมื่อราคาวิ่งมาถึง 1400 ตั๋วถูกเปิดตามปกติ
5. ลองเปลี่ยนไปดูกราฟใน H4 ea เริ่มสร้าง Hline ที่ราคา 1400 ให้อีกรอบ

สิ่งที่ผมอยากได้คือ
1. ea ทำงานคล้าย Stop Order มากที่สุด
2.1 ให้ ea ทำงานครั้งเดียวโดยไม่สนใจว่าจะเปลี่ยนไปดู timeframe ไหนสมมติเปิดตั๋วใน M15 พอเปลี่ยนไป H4 ก็ไม่ต้องทำงานอีก (ไม่เอาแบบล็อคว่าทำงานได้เฉพาะใน timeframe ที่กำหนด) หรือ
2.2 ให้ ea reset เป็นค่า default ทุกครั้งที่เปลี่ยน timeframe จะให้มันทำงานก็ค่อยไปเริ่มป้อนค่าใหม่

รบกวนขอคำแนะนำด้วยครับว่าต้องแก้ script อย่างไรให้ได้ตามที่ต้องการครับ

ปล. หรือมีวิธีไหนง่ายกว่านี้โปรดชี้ทางสว่างให้ด้วยครับ......แหะๆๆๆ ^_^

ขอบคุณล่วงหน้าครับ
Name: Ataporn.Tap
Rank : Newbie Trader (- -,)

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
เขียนข้อมูลของ Order ที่จะเปิดเก็บลงไฟล์ครับ แล้วให้ EA เรียกขึ้นมาเมื่อราคาถึงเส้นที่กำหนดครับ ใช้หลักการเขียนไฟล์ ช่วยครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
อีเอไม่มีตัวแปรซักกะตัวเลยนี่ครับ  พอกดเปลี่ยน tf ก็เท่ากับว่าสั่งให้มันเริ่มรันใหม่  มันก็เลยเทรดใหม่

ลองใส่ตัวแปรไปควบคุมซักตัวครับ

dataxdata

  • Newbie
  • *
  • Posts: 35
ขอบคุณท่าน admin และท่าน D_Diamond  ครับ พอจะนึกภาพออกแล้วครับ

ขอถามเพิ่มนะครับ มีวิธีไหนที่จะทำการ reset external variable ที่เรากำหนดโดยไม่ต้องกดปุ่ม reset ไหมคับ?
Name: Ataporn.Tap
Rank : Newbie Trader (- -,)

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ขอบคุณท่าน admin และท่าน D_Diamond  ครับ พอจะนึกภาพออกแล้วครับ

ขอถามเพิ่มนะครับ มีวิธีไหนที่จะทำการ reset external variable ที่เรากำหนดโดยไม่ต้องกดปุ่ม reset ไหมคับ?

เขียน code ล้างค่าใน
int deinit()
  {
//----
  // ตัวแปรที่จะให้ล้างค่าครับ   
//----
   return(0);
  }