EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: Romio on สิงหาคม 16, 2010, 11:01:50 pm
-
คือผมเพิ่งหัดเขียนอีเอ เลยยังไม่รู้คำสั่งมากพอ
เข้าเรื่องเลยนะครับ สมมติว่าผมต้องการใช้คำสั่งในการเรียกค่า close จากกราฟเมื่อตอน 5 นาทีที่แล้วมาใส่ในตัวแปร คำสั่งคืออะไรครับ
แล้วถ้าเป็นค่า close จากกราฟ ณ ปัจจุบันหละครับ คำสั่งคืออะไรครับ
ขอบคุณมากๆเลยครับ อิอิ...
-
iClose(Symbol( ) ,PERIOD_M5,1); นี้คือการเรียกราคา close จากกราฟ 5 นาทีแท่งก่อนหน้าครับ
iClose(Symbol( ) ,PERIOD_M5,0); อันนี้เป็นการเรียกราคา close แท่งปัจจุบันแต่ระวังหน่อยนะครับกราฟแท่งปัจจุบันยังไม่จบค่าที่ได้จะเท่ากับราคาตอนนั่นนะครับ
-
ขอบคุณมากเลยครับ คุณ admin
อิอิ...
-
แล้วถ้าผมจะเรียก price ตอนที่เราเปิด order ละครับจะต้องใช้คำสั่งอะไรครับ
-
ใช้ฟังก์ชั่น OrderOpenPrice( ) แต่ก่อนใช้ฟังก์ชั่นนี้ต้องใช้ ฟังก์ชั่น OrderSelect ก่อนนะครับเช่น ตามตัวอย่างใน reference
if(OrderSelect(10, SELECT_BY_POS)==true)
Print("open price for the order 10 ",OrderOpenPrice());
else
Print("OrderSelect returned the error of ",GetLastError());
-
แล้วถ้าจะเก็บไว้ในตัวแปรอะครับ
ต้องทำยังไงอะครับ
-
ก็แค่สรังตัวแปรขึ้นมาตัวหนึ่งไงครับเอาไวรับค่า
เช่น
double open ;
OrderSelect(10, SELECT_BY_POS)
if(Order_Type==OP_SELL)
{
open = OrderOpenPrice();
}
-
อ่อ...ขอบคุณครับ อิอิ...
ถ้าจะไม่มี if ได้มั้ยครับ
double open ;
OrderSelect(10, SELECT_BY_POS);
open = OrderOpenPrice();
ถ้าใช้แบบนี้เลยจะได้มั้ยครับ
-
อ่อ...ขอบคุณครับ อิอิ...
ถ้าจะไม่มี if ได้มั้ยครับ
double open ;
OrderSelect(10, SELECT_BY_POS);
open = OrderOpenPrice();
ถ้าใช้แบบนี้เลยจะได้มั้ยครับ
จริงๆๆมันก็ใช้ได้หละครับแต่ที่แสดง if ให้ดูก้เพื่อทีหลังคุณจะมีเงื่อนไขอะไรมากขึ้นในการกรองข้อมูลแค่นั่นเอง
-
คือผมใส่เข้าไปแล้วมันเปิดแล้วปิดเลยครับ สำหรับ sell ครับ ส่วน buy มันไม่ยอมปิดให้เลยครับ ช่วยดูโค้ดให้หน่อยนะครับ อิอิ...จนปัญญาจริงๆ
int start()
{
double A, B, C, t, m, p, d, x, y, Lot;
int total;
int ticket;
//int ticket;
int SL = 100;
int TP = 15;
A = iClose(Symbol( ) ,PERIOD_M5,1); //5 minutes ago
B = iClose(Symbol( ) ,PERIOD_M5,0); //Present
t = Point*(-8); //SELL
m = Point*8; //BUY
d = B-A;
p = d/5;
Lot = 0.1;
total=OrdersTotal();
if(total<1)
{
if(p<0)
{
if(d<=t)
{
//SELL
ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Ask+Point*SL,Bid-Point*TP,"RangerTOX",0,0,Red);
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
//Reduce Loss
OrderSelect(ticket,SELECT_BY_POS);
C = OrderOpenPrice();
x = C+(Point*50);
if(B>C)
{
if(B>=x)
{
OrderClose(ticket,Lot,Bid,3,Red); //Close order
ticket = OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Bid-Point*70,Ask+Point*30,"RangerTOX",0,0,Green); //Open order "BUY"
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
}
}
}
}
if(p>0)
{
if(d>=m)
{
//BUY
ticket = OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Bid-Point*SL,Ask+Point*TP,"RangerTOX",0,0,Green);
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
//Reduce Loss
OrderSelect(ticket,SELECT_BY_POS);
C = OrderOpenPrice();
y = (C-(Point*50));
if(B<C)
{
if(B<=y)
{
OrderClose(ticket,Lot,Ask,3,Green); //Close order
ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Ask-Point*70,Bid+Point*50,"RangerTOX",0,0,Red); //Open order "SELL"
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
}
}
}
}
}
}
-
ดูแล้วยังงงๆ คือ ถ้าติดลบ 50 จุดให้ปิดใช่ป่าวครับ
การเขียนโปรแกรม ต้ิองเขียน flow chart ขึ้นมาก่อนแล้วก็เขียนคำสั่งหรือฟังก์ชั่น เพื่อทำตาม flow chart
เช่น เงื่อนไข การเปิด เมื่ออะไร...........................เปิดแล้วก็ออกจากฟังก์ชั่นนั้น แล้วต่อไปทำอะไร
ตรวจสอบว่า กำไร หรือ ขาดทุน ขาดทุนแล้วทำไรต่อ กำไรแล้วทำไรต่อ กำไรแล้วปิด ปิดแล้วมาเปิดใหม่
อ่านโค๊ดแล้วงงๆ อะครับ ทำไมใช้ ออร์เดอร์ซีเลค ต่อกันถึง 2 อัน
ยังไงลองเขียน Flow chart ขึ้นมาก่อนแล้ว จะเขียนได้ง่ายขึ้นเยอะ แล้วผิดพลาดก็หาทางแก้ได้อย่างรวดเร็วด้วยครับ
-
ครับผมเขียนตาม flow chart ครับซึ่งโครงสร้างของโปรแกรมคล้ายๆภาษา c , c++ แตกต่างกันเพียงแค่คำสั่ง
ซึ่งผมเองยังไม่รู้จักคำสั่งต่างๆมากพอครับ ต้องเรียนรู้อีกเยอะเลยครับ ต้องขอโทษด้วยครับที่ไม่ได้อธิบายการทำงาน
ของ ea
- เมื่อ ea เปิด sell แล้วเกิดติดลบเกิน 50 จุด ให้ปิด order แล้วเปิด buy ต่อ
- และอีกกรณีถ้าเมื่อ ea เปิด buy แล้วเกิดติดลบเกิน 50 จุด ให้ปิด order แล้วเปิด sell ต่อ
ส่วน OrderSelect นั้นผมลองใส่แค่อันเดียวแล้วมันไม่มีอะไรเกิดเลยครับ ก็เลยใส่เข้าไปอีกอันดู แล้ว sell ปิด order ได้
ส่วน buy ไม่มีอะไรเกิดขึ้นเลยคับ ช่วยหา bug ด้วยนะครับ อิอิ...
-
1 เปิดออร์เดอร์ เพราะอะไรก็ว่ากันไป
2 เมือเปิดแล้ว ให้เช็คออร์เดอร์ที่เปิดแล้ว ว่ากำไรหรือขาดทุน โดยเช็คจาก magic number หรือ ออร์เดอร์คอมเมนต์ก็ได้
เช่น จากข้อ 1 เราใส่ magic & comment ไว้
คำสั่งออร์เดอร์ซีเลค ให้ทำเป็น loop มันจะตรวจสอบทุกออร์เดอร์ ว่าใช่ตัวที่เราต้องการหรือไม่ในกรณีที่ max_trade มากกว่า 1
for (int I = 0; I < OrdersTotal(); I++)
{
OrderSelect(I, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && MagicNum == OrderMagicNumber()) -----------------ตรวจสอบซิมันใช่ของเราป่าว ถ้าใช่ให้มันทำไรดีหว่า
{
ทำตามนี้แล้วกัน
ตวจดูซิมันลบหรือบวกเท่าไหร่แล้ว
ถ้ามันบวกน๊ะ ปิดเลย หรือจะเลื่อน stop เป็นกำไรแล้วปล่อยยาวดีกว่ากำไรเห็นๆ
ถ้ามันลบน๊ะ เออดูซิ เกิน 50 จุดหรือยัง ถ้ายังก็ รอก่อนใกล้หมดตัวแล้ว ถ้าเกินแล้วปิดดีกว่า ก่อนจะหมดตรูดดด แล้วเปิดสวนเลยโดยใช้ ordertype()เช็ค
ถ้ามันเป็น op_buy น๊ะเราก็เปิดใหม่เป็น sell ซะ แล้วนั่งรอแป๊ปกราฟกลับมาทางเดิม ติดลบอีกละ(อะล้อเล่นครับ)
}
}
เอาแค่นี้ก่อน ถ้างงค่อยถามใหม่ครับ
-
โอ้...ขอบคุณมากๆๆครับ เอาไว้ลองทำพรุ่งนี้ละกัน วันนี้เหนื่อยมากเลยครับ ;D