|
Post by Xa Em on May 31, 2016 13:50:01 GMT 7
bool CloseDeleteAllNonPending() { for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderMagicNumber()==Magic) { if(OrderSymbol()==Symbol()) { switch(OrderType()) { case OP_BUY : { if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),GetSlippage(OrderSymbol()),CLR_NONE)) return(false); }break; case OP_SELL : { if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),GetSlippage(OrderSymbol()),CLR_NONE)) return(false); }break; } } } } } return (true); } googledrive.com/host/0B7FGUzltsij5ZElEOWNnV19RMFU
|
|
|
Post by iamgotzaa on May 31, 2016 14:16:53 GMT 7
ก่อนอื่น แนะนำให้ ใส่ your code จะได้อ่านง่ายหน่อย //+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2012, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ bool CloseDeleteAllNonPending()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==Magic)
{
if(OrderSymbol()==Symbol())
{
switch(OrderType())
{
case OP_BUY :
{
if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),GetSlippage(OrderSymbol()),CLR_NONE))
return(false);
} break;
case OP_SELL :
{
if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),GetSlippage(OrderSymbol()),CLR_NONE))
return(false);
} break;
}
}
}
}
}
return (true);
} //+------------------------------------------------------------------+
Attachments:
|
|
|
Post by iamgotzaa on May 31, 2016 14:28:36 GMT 7
ต้องมาว่าด้วยการทำงาน main loop ของ mt4 ครับ
สงสัยไหมครับว่า ทำไม main loop ต้องเป็น OnTick()
เพราะว่า ทุกๆ tick data ที่วิ่งเข้า แต่ละ chart จะทริกเกอร์ให้ทำงานโค้ดที่อยู่ใน OnTick() ทีนี้ต้องมาดูว่า ถ้าโค้ดสั้นๆ mt4 ก็อาจจะทำงานได้ครบทุกบรรทัด ทันทีหลังจากที่มี tick เข้ามา
สมมติว่า โค้ด ปิดออเดอร์ทั้งหมด นั้นมีออเดอร์ที่ต้องปิดอยู่ 20 ออเดอร์ การทำงานคือ ส่ง OrderClose() ทีละอัน ถูกต้องนะครับ
หลังจากที่ tick เข้ามาโปรแกรม จะไปเริ่มต้นที่โค้ดบรรทัดแรกเลยทุกครั้ง
ดังนั้นอย่างโปรแกรมข้างบน ต้องวนลูป(สมมติ) 20 ครั้ง ถ้าส่งครั้งแรก แล้ว เซอเวอร์ช้า คำสั่งที่สอง ก็ช้าตาม หรือ อาจจะเกิดการส่งทับ ส่งแล้ว server ไม่ตอบสนองกลับ ก็จะข้ามออเดอร์นั้นไป การทำงานที่ต้องใช้เวลายาวๆอย่าง ส่งออเดอร์ ปิดออเดอร์ ถ้าเซอร์เวอร์ช้า หรือ เนทเต่า ก็จะใช้เวลานานไปด้วย ถ้าไม่ได้เขียนให้เช็คว่าปิดหมดจริงก็จะมีปัญหาว่า โปรแกรมทำงานแต่ปิดไม่หมดในรอบเดียว
หรือ tick เข้ามาถี่มากๆ เช่นช่วงข่าวออก เซอเวอร์ต้องตอบสนองออเดอร์จำนวนมากที่เข้าพร้อมๆกัน server busy ครับ
หรือ tick เข้ามาถี่มากๆ ดังนั้น มีเวลาให้ mt4 ทำงานแต่ละลูปน้อยลงด้วย ในขณะที่ส่งคำสั่งปิดต้องใช้เวลาเท่าๆกัน อาจจะปิดไปได้ 3 ออเดอร์ tick ใหม่ เข้ามาอีกแล้ว โปรแกรมก็ต้องไปเริ่มวนลูปใหม่ตั้งแต่ต้น
|
|
|
Post by iamgotzaa on May 31, 2016 14:30:09 GMT 7
ถ้าตามภาพผมว่า ต่างกันที่ Bid-Ask หรือ spread นั่นเองครับ
|
|
|
Post by Xa Em on Jun 1, 2016 11:20:52 GMT 7
ขอบคุณครับ ได้ความรู้เพิ่มอีก
|
|
|
Post by iamgotzaa on Jun 1, 2016 15:52:56 GMT 7
ขอบคุณครับ ได้ความรู้เพิ่มอีก
|
|