EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: Alonepro 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);
}
//+------------------------------------------------------------------+
-
แล้วที่เขียนมานี่มันมีปัญหาอะไรครับ
-
คือว่ามันเปิด ชุดที่1 แล้วเปิด ชุดที่2
แต่ถ้า ชุดที่1 ปิดแล้ว แต่ชุดที่ 2 ยังไม่ปิด มันก็จะไม่เปิด ชุดที่ 1 อ่าครับ
-
งั้นหมายความว่าที่ถูกต้องคือ พอชุดที่ 1 ปิด ก็เปิดใหม่ได้เลยโดยไม่ต้องสนใจว่า ชุดที่ 2 ปิดแล้วยัง
if(total<Order_1&&ADX_M>25)//อันนี้ชุดที่หนึ่ง
มีตัวแปรอยู่แค่ 3 ตัว adx ไม่เกี่ยวแน่นอน เหลือแค่ 2 ตัว ลองดูซิครับมันผิดตรงไหน
-
ถ้าเราเพิ่ม MagicNumber เข้าไป ใน ชุดที่ 1
แล้วเพิ่มโค๊ด ตรวจ ออเดอร์ MagicNumber < Order_1 ใช้เปิดชุด 1
แบบนี้จะได้ใช้เปล่าครับ
หรือว่าต้องแก้อย่างอื่น(ผมไม่ค่อยมีความรู้ดานเขียนโปรแกรม เท่าไหร่ ;D)
-
ก่อนอื่นเรามาดูเงื่อนไขการเปิดออเดอร์ชุดที่ 1 ใหม่ครับ
if(total<Order_1&&ADX_M>25)
total มาจากจำนวนออเดอร์ทั้งหมดที่เปิดอยู่ แน่นอนรวมทั้งชุด 1 และชุด 2 รวมทั้งเทรดมือ และอีเออื่นเทรดด้วย
Order_1 อันนี้คือที่กำหนดไว้ว่าออเดอร์ชุด 1 จะให้เปิดเท่าไร
ตรงนี้อีเอมีออเดอร์ 2 ชุด แต่กลับเช็คเงื่อนไขจำนวนออเดอร์รวมกัน จึงทำให้ผิดพลาด
ดังนั้นวิธีแก้ ต้องแยกตัวแปรที่ใช้นับจำนวนออเดอร์ ชุด1 กับ ชุด2 ออกจากกัน
ที่ถามว่าถ้าเพิ่ม magicnumber เข้าไปจะได้ไหม
อันนี้ถูกต้องแล้วในกรณี เปิดออเดอร์ แต่ยังต้องทำในกรณี นับออเดอร์ ด้วยครับ
-
ผมลองไปอ่านหลายๆ กระทู้ ใน บอร์ด ดูแล้วลองเขียนตามแนวทางที่เคยมีคนโฟส ถามเอาไว้ แล้วลองเขียนๆ ดู
แต่มันเปิดเกินที่กำหนด หรือว่าผมเขียนตรงไหน ผิดก็ไม่รู้ ??? ??? ???
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);
}
//+------------------------------------------------------------------+
-
ดูด้วยตาเปล่าผมว่าถูกหมดแล้วนะครับ เดี๋ยวพรุ่งนี้ถ้าว่างจะลองเอาไปรันดู
แนะนำนิดนึง
ตัวแปร count เป้นจำนวนนับ ไม่มีทศนิยม ให้ใช้ int แทน double
ordersend ใส่ magicnumber_1 ลงไป อย่าใส่เลข 123
แล้วก้ไม่ต้องมี orderselect ตามหลัง เพราะจบแล้ว ไม่ได้ทำอะไรต่อ
-
ขอบคุณครับ ^^
-
ผมลองรันดูแล้วเปิดได้อย่างละ 1 ออเดอร์ รวมเป็น 2 ปกติดีครับ