Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: รบกวนผู้รู้ช่วยผมหน่อยครับ  (Read 9905 times)

Alonepro

  • Newbie
  • *
  • Posts: 16
รบกวนผู้รู้ช่วยผมหน่อยครับ
« on: มีนาคม 29, 2013, 03:10:52 am »
สวัดดีครับคือว่าต้องการให้ EA เปิด ออเดอร์ แยกกันแบบว่า
ชุดที่ 1
X>1 Buy
X<1 Sell

ชุดที่ 2

X<1 Buy
X>1 Sell
โดยให้
ชุดที่ 1 เปิดได้ไม่เกิน Order_1
ชุดที่ 2 เปิดได้ไม่เกิน Order_2
แต่ต้องเปิด ชุดแรกให้เต็มก่อนแล้วเปิดชุดสอง
แล้วผมต้องเพิมโค๊ดอะไรลงไป ตรงไหนหรือเปล่าครับ พอดีว่าพึ่งหัดเขียน

//+------------------------------------------------------------------+
extern double  Stop     = 5000;
extern double  Profit   = 100;
extern double  Order_1    = 1;
extern double  Order_2    = 2;
extern double  Maxlots  = 2;
extern double  ADX      =20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if(DayOfWeek()<=1 || DayOfWeek()>=5) return(0);
   int total;
   int ticket;
   double lots;
   double lots_A;
   double a,ADX_M,OrdType;

   OrdType = iCustom(NULL,0,"iFisher",0,0);
   ADX_M =iADX(NULL,0,ADX,PRICE_HIGH,MODE_MAIN,0);
   lots  = (AccountBalance()/ 2000.0);
   if(lots>Maxlots) lots =Maxlots;
   lots_A= lots/Order;
   if(lots_A<0.01) lots_A =0.01;
   total=OrdersTotal();
if(total<Order_1&&ADX_M>25)//อันนี้ชุดที่หนึ่ง
    {
      if( OrdType<0)
       {
         ticket=OrderSend(Symbol(),OP_SELL,lots_A,Bid,3,Ask+Point*Stop,Bid-Point*Profit,"Down_Ex",0,0,Red);
         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
        }
      if( OrdType>0)
       {
         ticket=OrderSend(Symbol(),OP_BUY,lots_A,Ask,3,Bid-Point*Stop,Ask+Point*Profit,"Up_Ex",0,0,Green);
         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
        }
    }
if(total<Order_2&&ADX_M>25)//อันนี้ชุดที่สอง
   {
      if( OrdType>0)
       {
         ticket=OrderSend(Symbol(),OP_SELL,lots_A*0.5,Bid,3,Ask+Point*Stop,Bid-Point*Profit*0.5,"Down_Ex",0,0,Red);
         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
        }
      if( OrdType<0)
       {
         ticket=OrderSend(Symbol(),OP_BUY,lots_A*0.5,Ask,3,Bid-Point*Stop,Ask+Point*Profit*0.5,"Up_Ex",0,0,Green);
         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
        }
    }
   return(0);

 }
//+------------------------------------------------------------------+
« Last Edit: มีนาคม 29, 2013, 08:46:18 am by Alonepro »

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: รบกวนผู้รู้ช่วยผมหน่อยครับ
« Reply #1 on: มีนาคม 30, 2013, 06:03:55 pm »
แล้วที่เขียนมานี่มันมีปัญหาอะไรครับ

Alonepro

  • Newbie
  • *
  • Posts: 16
Re: รบกวนผู้รู้ช่วยผมหน่อยครับ
« Reply #2 on: มีนาคม 30, 2013, 07:07:57 pm »
คือว่ามันเปิด ชุดที่1 แล้วเปิด ชุดที่2
แต่ถ้า ชุดที่1 ปิดแล้ว แต่ชุดที่ 2 ยังไม่ปิด มันก็จะไม่เปิด ชุดที่ 1 อ่าครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: รบกวนผู้รู้ช่วยผมหน่อยครับ
« Reply #3 on: มีนาคม 30, 2013, 07:41:46 pm »
งั้นหมายความว่าที่ถูกต้องคือ  พอชุดที่ 1 ปิด ก็เปิดใหม่ได้เลยโดยไม่ต้องสนใจว่า ชุดที่ 2 ปิดแล้วยัง

if(total<Order_1&&ADX_M>25)//อันนี้ชุดที่หนึ่ง

มีตัวแปรอยู่แค่ 3 ตัว adx ไม่เกี่ยวแน่นอน เหลือแค่ 2 ตัว ลองดูซิครับมันผิดตรงไหน

Alonepro

  • Newbie
  • *
  • Posts: 16
Re: รบกวนผู้รู้ช่วยผมหน่อยครับ
« Reply #4 on: มีนาคม 30, 2013, 08:17:30 pm »
ถ้าเราเพิ่ม MagicNumber เข้าไป ใน ชุดที่ 1

แล้วเพิ่มโค๊ด ตรวจ ออเดอร์ MagicNumber < Order_1 ใช้เปิดชุด 1
แบบนี้จะได้ใช้เปล่าครับ
หรือว่าต้องแก้อย่างอื่น(ผมไม่ค่อยมีความรู้ดานเขียนโปรแกรม เท่าไหร่  ;D)

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: รบกวนผู้รู้ช่วยผมหน่อยครับ
« Reply #5 on: มีนาคม 30, 2013, 08:36:27 pm »
ก่อนอื่นเรามาดูเงื่อนไขการเปิดออเดอร์ชุดที่ 1 ใหม่ครับ

if(total<Order_1&&ADX_M>25)

total มาจากจำนวนออเดอร์ทั้งหมดที่เปิดอยู่  แน่นอนรวมทั้งชุด 1 และชุด 2 รวมทั้งเทรดมือ และอีเออื่นเทรดด้วย

Order_1  อันนี้คือที่กำหนดไว้ว่าออเดอร์ชุด 1 จะให้เปิดเท่าไร
ตรงนี้อีเอมีออเดอร์ 2 ชุด  แต่กลับเช็คเงื่อนไขจำนวนออเดอร์รวมกัน  จึงทำให้ผิดพลาด

ดังนั้นวิธีแก้  ต้องแยกตัวแปรที่ใช้นับจำนวนออเดอร์ ชุด1 กับ ชุด2 ออกจากกัน

ที่ถามว่าถ้าเพิ่ม magicnumber เข้าไปจะได้ไหม
อันนี้ถูกต้องแล้วในกรณี เปิดออเดอร์  แต่ยังต้องทำในกรณี นับออเดอร์ ด้วยครับ

Alonepro

  • Newbie
  • *
  • Posts: 16
Re: รบกวนผู้รู้ช่วยผมหน่อยครับ
« Reply #6 on: มีนาคม 30, 2013, 09:54:08 pm »
ผมลองไปอ่านหลายๆ กระทู้ ใน บอร์ด ดูแล้วลองเขียนตามแนวทางที่เคยมีคนโฟส ถามเอาไว้ แล้วลองเขียนๆ ดู
แต่มันเปิดเกินที่กำหนด หรือว่าผมเขียนตรงไหน ผิดก็ไม่รู้  ??? ??? ???
count_1 = 0
count_2 = 0
count_M = 0
3 ตัวนี้ค่าเป็น 0 ตลอดเลยอ่าครับ

//==========================
extern double  Stop     = 5000;
extern double  Profit   = 100;
extern double  Profit_A   = 50;
extern double  Order_M    = 3;
extern double  Order_1    = 1;
extern double  Order_2    = 1;
extern double  Maxlots  = 2;
extern double  ADX      =20;
extern double  Ma_F     =20;
extern double MagicNumber_1 = 123;
extern double MagicNumber_2 = 345;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
if(DayOfWeek()<=1 || DayOfWeek()>=5) return(0);
   int ticket;
   double lots;
   double lots_A;
   double a,ADX_M,OrdType,iSAR_1;
   double count_1, count_2, count_M;
   OrdType = iCustom(NULL,0,"iFisher",0,0);
   a = 0-0.2;
   ADX_M =iADX(NULL,0,ADX,PRICE_HIGH,MODE_MAIN,0);
   lots  = (AccountBalance()/ 2000.0);
   if(lots>Maxlots) lots =Maxlots;
   lots_A= lots/Order_1;
   if(lots_A<0.01) lots_A =0.01;
   Comment(
"count_1 = ",count_1,
"count_2 = ",count_2,
"count_M= ",count_M);
  
//---------------------------------เพิ่มตรงนี้เข้าไป
   int total=OrdersTotal();
  
   for(int S=0;S<total;S++)
         {
            OrderSelect(S,SELECT_BY_POS,MODE_TRADES);
                        
            if( OrderSymbol()==Symbol() && (OrderMagicNumber() == MagicNumber_1 || OrderMagicNumber() == MagicNumber_2) )
               {
                  count_M++;
                  if ( OrderMagicNumber() == MagicNumber_1 ) count_1++;
                  if ( OrderMagicNumber() == MagicNumber_2 ) count_2++;
               }
         }
//=======================================
if(count_M < Order_M )
     {if(count_1<Order_1&&ADX_M>25)
      {
      if( OrdType>0)
       {
         ticket=OrderSend(Symbol(),OP_SELL,lots_A,Bid,3,Ask+Point*Stop,Bid-Point*Profit,"Down_Ex",123,0,Red);
         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
        }
      if( OrdType<0)
       {
         ticket=OrderSend(Symbol(),OP_BUY,lots_A,Ask,3,Bid-Point*Stop,Ask+Point*Profit,"Up_Ex",123,0,Green);
         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
        }
       }
     if(count_2<Order_2&&ADX_M>25)
     {
      if( OrdType<0)
       {
         ticket=OrderSend(Symbol(),OP_SELL,lots_A*0.5,Bid,3,Ask+Point*Stop,Bid-Point*Profit_A,"Down_Ex",345,0,Yellow);
         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
        }
      if( OrdType>0)
       {
         ticket=OrderSend(Symbol(),OP_BUY,lots_A*0.5,Ask,3,Bid-Point*Stop,Ask+Point*Profit_A,"Up_Ex",345,0,Blue);
         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
         }
      }
     }
      return(0);
   }

//+------------------------------------------------------------------+
« Last Edit: มีนาคม 30, 2013, 10:14:56 pm by Alonepro »

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: รบกวนผู้รู้ช่วยผมหน่อยครับ
« Reply #7 on: มีนาคม 30, 2013, 11:43:19 pm »
ดูด้วยตาเปล่าผมว่าถูกหมดแล้วนะครับ เดี๋ยวพรุ่งนี้ถ้าว่างจะลองเอาไปรันดู

แนะนำนิดนึง
ตัวแปร count เป้นจำนวนนับ ไม่มีทศนิยม ให้ใช้ int แทน double
ordersend ใส่ magicnumber_1 ลงไป อย่าใส่เลข 123
แล้วก้ไม่ต้องมี orderselect ตามหลัง  เพราะจบแล้ว ไม่ได้ทำอะไรต่อ

Alonepro

  • Newbie
  • *
  • Posts: 16
Re: รบกวนผู้รู้ช่วยผมหน่อยครับ
« Reply #8 on: มีนาคม 30, 2013, 11:57:35 pm »
ขอบคุณครับ ^^

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: รบกวนผู้รู้ช่วยผมหน่อยครับ
« Reply #9 on: มีนาคม 31, 2013, 10:45:56 am »
ผมลองรันดูแล้วเปิดได้อย่างละ 1 ออเดอร์ รวมเป็น 2 ปกติดีครับ