//+------------------------------------------------------------------+
//|
My EMA200 SmoothedHighLowMA MACD and RSI Thai EA.mq4 |
//|
Copyright 2016, ธาวินทร์
ลีลาคุณารักษ์ |
//|
https://yesterday-in-my-life.blogsport.com |
//+------------------------------------------------------------------+
#property
copyright "Copyright 2016, ธาวินทร์
ลีลาคุณารักษ์"
#property
link "https://yesterday-in-my-life.blogsport.com"
#property
version "1.00"
#property
description "อนุญาตให้ปรับปรุงแก้ไข,
คัดลอก,
จำหน่าย,
จ่าย, แจก,
อธิบายรายละเอียด
หรือเผยแพร่"
#property
description "ได้อย่างถูกต้องตามกฏหมาย
โดยไม่ต้องขออนุญาตจากผู้พัฒนา"
#property
description "และไม่จำเป็นต้องแสดงรายละเอียดผู้พัฒนา"
string
ปรับปรุงครั้งล่าสุด =
"๑ มีนาคม พ.ศ.
๒๕๕๙ เวลา ๑๗.๐๐
น.";
//---
input parameters
input
double MinimumLotSize =0.01;
//ขนาดล็อตต่ำสุดที่ต้องการ
input
double MaximumRisk =0.02;
//เปอร์เซ็นต์ความเสี่ยงที่ยอมรับได้
input
int MaxTrade =3;
//จำนวนคำสั่งซื้อ/ขายสูงสุด
input
int TakeProfit =400; //จำนวน
pip ที่ต้องการปิด
order เมื่อมีกำไร
input
int StopLoss =0; //จำนวน
pip ที่ต้องการปิด
order เมื่อขาดทุน
input
bool UseAutoStopLoss =true; //ใช้ระบบตั้ง
Stop Loss อัตโนมัติ
input
int TrailingStopStart =150; //จุดเริ่มต้นตั้ง
Trailing Stop
นับจากเริ่มเปิดคำสั่งซื้อ/ขาย
input
int TrailingStop =20; //ขนาดของ
Trailing Stop หน่วยเป็น
pip
input
bool OpenAllOrder =true;
//เปิดคำสังซื้อขายพร้อมกันทั้งหมด
input
bool FridayNotOpenOrder =false;
//ไม่เปิดคำสั่งซื้อขายในวันศุกร์
input
bool FridayCloseAllPositiveOrder =true;
//ปิดคำสั่งซื้อขายที่ได้กำไรในวันศุกร์
input
bool AllProfitPositiveCloseAll =false;
//ปิดคำสั่งซื้อขายถ้าผลกำไรเป็นบวกทั้งหมด
/*+------------------------------------------------------------------+
ตัวแปรรวม
global variabel
+------------------------------------------------------------------+*/
string
ชื่อEA =
"MyEMA200SmHLMA_MACDRSI_ThaiEA"; //สำหรับใสใน
Comment ตอนเปิดคำสั่งซื้อขาย
int
เลขประจำEA
= 022559; //เลข Magic
Number ประจำ EA
string
ข้อความแสดงบนจอ;
//ใช้เก็บข้อความสำหรับแสดงสถานะการทำงานของ
EA บนจอภาพ
string
วันเดือนปีปัจจุบัน;
//วันเดือนปีปัจจุบัน
/*+------------------------------------------------------------------+
ฟังก์ชัน
หาจำนวนตัดขาดทุนที่เหมาะสม()
ทำหน้าที่หาจำนวน pip
สำหรับการตัดขาดทุน หรือ
Stop Loss ใหม่
+------------------------------------------------------------------+*/
int
หาจำนวนตัดขาดทุนที่เหมาะสม(double
EMA200)
{
int
จำนวนตัดขาดทุนที่คำนวณได้
= StopLoss;
int
ระยะห่างจากราคาถึงแนวต้าน;
if
(UseAutoStopLoss) {
if
(EMA200 < Low[0]) //ขาขึ้น
{
//ระยะจากราคาปัจจบันไปถึง
EMA200
ระยะห่างจากราคาถึงแนวต้าน
= ((Close[0] - EMA200) /
Point);
}
if
(EMA200 > High[0]) //ขาลง
{
//ระยะจากราคาปัจจบันถึงราคาสูงสุดของแท่งราคา
+ ParabolicSAR
ระยะห่างจากราคาถึงแนวต้าน
= ((EMA200 - Close[0]) /
Point);
}
//กรณีได้ค่าติลบ
if
(ระยะห่างจากราคาถึงแนวต้าน
< 0)
{
ระยะห่างจากราคาถึงแนวต้าน
=
-(ระยะห่างจากราคาถึงแนวต้าน);
}
//แปลงให้เป็นจำนวนนับ
จำนวนตัดขาดทุนที่คำนวณได้
= ((ระยะห่างจากราคาถึงแนวต้าน
< 400) ? 400 :
ระยะห่างจากราคาถึงแนวต้าน);
}
return(จำนวนตัดขาดทุนที่คำนวณได้);
}
/*+------------------------------------------------------------------+
ฟังก์ชัน
หาจำนวนล็อตที่เหมาะสม()
ทำหน้าที่หาจำนวนล็อตที่เหมาะสมต่อกันเปิด
order
+------------------------------------------------------------------+*/
double
หาจำนวนล็อตที่เหมาะสม(double
EMA200)
{
double
ขนาดล็อตที่คำนวณได้;
double
จำนวนเงินทุนที่ใช้ได้;
//หาวงเงินในบัญชีที่เปิดคำสั่งซื้อ/ขายได้
double
จำนวนเงินในบัญชี =
AccountFreeMargin();
//ตรวจหาคำว่า
micro ในสัญลักษร์คู่เงิน
if
(StringFind(Symbol(), "micro", 0) > 0)
{
จำนวนเงินในบัญชี
= AccountFreeMargin() * 100;
}
//หามูลค่้าต่อ
1 pip
double
มูลค่าต่อ1pip
= MarketInfo(Symbol(), MODE_TICKVALUE);
//ถ้าทุนมากกว่า
200 จึงจะคำนวนตามสูตร
if
(จำนวนเงินในบัญชี >
200)
{
//นำจำนวนเงินในบัญชีมาคำนวณหายอดเงินที่ใช้ได้โดยดูจาก
MaximumRisk
จำนวนเงินทุนที่ใช้ได้
= จำนวนเงินในบัญชี
* MaximumRisk;
//หาขขนาดล็อตที่เหมาะสม
ขนาดล็อตที่คำนวณได้
= NormalizeDouble((
(จำนวนเงินทุนที่ใช้ได้
*
//จำนวนเงินที่มี
MaximumRisk)
/ //คูณ เปอร์เซ็นกำไรที่ต้องการ
(((StopLoss==0)
&& !UseAutoStopLoss) ?
400 :
หาจำนวนตัดขาดทุนที่เหมาะสม(EMA200)))/มูลค่าต่อ1pip
//หาร ด้วยจำนวน pip
ที่ตัดขาดทุน
,
2); //แปลงเป็นเลขทศนิยม
2 ตำแหน่ง
}
else {
ขนาดล็อตที่คำนวณได้
= 0.01;
}
//ถ้่า
lots ที่คำนวณได้น้อยกว่า
MinimumLotSize ให้ใช้ค่าใน
MinimumLotSize แทน
if
(ขนาดล็อตที่คำนวณได้
< MinimumLotSize)
ขนาดล็อตที่คำนวณได้ =
MinimumLotSize;
//ส่งค่าขนาล็ออตที่เหมาะสมกลับ
return(ขนาดล็อตที่คำนวณได้);
}
/*+------------------------------------------------------------------+
ฟังก์ชัน
ตรวจสอบเปิดคำสั่งซื้อขาย();
ทำหน้าที่ตรวจสอบเงื่อนไข
เพื่อเปิดคำสั่งซื้อขาย
+------------------------------------------------------------------+*/
void
ตรวจสอบเปิดคำสั่งซื้อขาย(double
EMA200,
double
LowSmoothed14MAก่อนปัจจุบัน,
double
LowSmooted14MA,
double
HighSmoothed14MAก่อนปัจจุบัน,
double
HighSmooted14MA,
double
RSI,
double
MACD)
{
int
ticket;
double
จำนวนpipตัดขาดทุน;
double
จำนวนตัดขาดทุน =
0.0;
int
จำนวนคำสั่งซื้อขายที่เปิดใหม่
= 0;
int
จำนวนคำสั่งที่จะเปิด
= 0;
bool
สถานะการเปิดคำสั่ง =
false;
จำนวนคำสั่งซื้อขายที่เปิดใหม่
=
จำนวนคำสั่งซื้อขายที่เปิดค้างอยู่();
จำนวนคำสั่งที่จะเปิด
= ((OpenAllOrder)? MaxTrade :
1);
//ตรวจสอบเงื่อนไขสำหรับการขายหรือเทรนขาลง
(SELL)จะเปิด
SELL เฉพาะเทรนขาลง
if
((((LowSmooted14MA < EMA200) && (RSI > 20)) &&
((HighSmoothed14MAก่อนปัจจุบัน
> HighSmooted14MA) &&
(High[0]
<= HighSmooted14MA))) &&
(MACD
< 0))
{
สถานะการเปิดคำสั่ง
= true;
//งานแสดงข้อความบนจอ
ข้อความแสดงบนจอ
+= "
*******เข้าเงื่อนไขการขาย
SELL*********";
Comment(ข้อความแสดงบนจอ);
for(;
จำนวนคำสั่งซื้อขายที่เปิดใหม่
< จำนวนคำสั่งที่จะเปิด;
จำนวนคำสั่งซื้อขายที่เปิดใหม่++)
{
//ปรับค่า
StopLoss เป็นค่าที่เหมาะสม
จำนวนpipตัดขาดทุน
=
หาจำนวนตัดขาดทุนที่เหมาะสม(EMA200);
if
(จำนวนpipตัดขาดทุน
> 0)
{
//คำนวณจำนวนตัดขาดทุนสำหรับการขาย
จำนวนตัดขาดทุน
= Ask + จำนวนpipตัดขาดทุน
* Point;
}
//เปิดคำสั่งขาย
ticket
= OrderSend( Symbol(),
OP_SELL,
หาจำนวนล็อตที่เหมาะสม(EMA200),
Bid,
3,
จำนวนตัดขาดทุน,
Bid-TakeProfit*Point,
ชื่อEA,
เลขประจำEA,
0,
Red
);
}
}
else {
สถานะการเปิดคำสั่ง
= false;
}
//ตรวจสอบเงื่อนไขสำหรับการซื้อ
(BUY)จะเปิด
BUY เฉพาะเทรนขาขึ้นเท่านั้น
if
(((((HighSmooted14MA > EMA200) && (RSI < 80)) &&
(LowSmoothed14MAก่อนปัจจุบัน
< LowSmooted14MA)) &&
(Low[0]
>= LowSmooted14MA)) &&
(MACD
> 0))
{
สถานะการเปิดคำสั่ง
= true;
//งานแสดงข้อความบนจอ
ข้อความแสดงบนจอ
+= "
*******เข้าเงื่อนไขการซื้อ
BUY*********";
Comment(ข้อความแสดงบนจอ);
for(;
จำนวนคำสั่งซื้อขายที่เปิดใหม่
< จำนวนคำสั่งที่จะเปิด;
จำนวนคำสั่งซื้อขายที่เปิดใหม่++)
{
//ปรับค่า
StopLoss เป็นค่าที่เหมาะสม
จำนวนpipตัดขาดทุน
=
หาจำนวนตัดขาดทุนที่เหมาะสม(EMA200);
if
(จำนวนpipตัดขาดทุน
> 0)
{
//คำนวณจำนวนตัดขาดทุนสำหรับการซื้อ
จำนวนตัดขาดทุน
= Bid - จำนวนpipตัดขาดทุน
* Point;
}
//เปิดคำสั่งซื้อ
ticket
= OrderSend( Symbol(),
OP_BUY,
หาจำนวนล็อตที่เหมาะสม(EMA200),
Ask,
3,
จำนวนตัดขาดทุน,
Ask
+ TakeProfit *Point,
ชื่อEA,
เลขประจำEA,
0,
Blue
);
}
}
else {
สถานะการเปิดคำสั่ง
= false;
}
if
(!(สถานะการเปิดคำสั่ง))
{
ข้อความแสดงบนจอ
+= "
*********ยังไม่เข้าเงื่อนไขเปิดคำสั่งซื้อขาย******************";
Comment(ข้อความแสดงบนจอ);
}
}
/*+------------------------------------------------------------------+
ฟังก์ชัน
ปิดคำสั่งซื้อ_BUY()
ทำหน้าที่ปิดคำสั่งซื้อ
(BUY)
+------------------------------------------------------------------+*/
void
ปิดคำสั่งซื้อ_BUY(double
LowSmoothed14MAก่อนปัจจุบัน,
double
LowSmoothed14MA)
{
//ปิดคำสั่ง
BUY
ด้วยเงื่อนไขคาดว่าจะกลับเทรน
if
(((High[1] < LowSmoothed14MA) &&
(LowSmoothed14MAก่อนปัจจุบัน
> LowSmoothed14MA)) &&
(High[0]
< LowSmoothed14MA))
{
if(!OrderClose(OrderTicket(),
OrderLots(), Bid, 0, White))
Print("OrderClose
error ",GetLastError());
}
}
/*+------------------------------------------------------------------+
ฟังก์ชัน
ทำ_TrailingStop_สำหรับคำสั่งซื้อ_BUY()
ทำหน้าที่ทำ Trailling
stop สำหรับคำสั่ง BUY
+------------------------------------------------------------------+*/
void
ทำ_TrailingStop_สำหรับคำสั่งซื้อ_BUY()
{
//ตรวจสอบทำ
TrailingStop สำหรับการซื้อ
BUY
if
(TrailingStop>0)
{
if
(OrderStopLoss() < OrderOpenPrice())
{
//กรณีไม่เคยทำ
Trailing Stop มาก่อน
//รอจนกว่าราคาจะวิ่งถึงจุดที่กำหนด
150 จุด
จากราคาเปิดด
if(Bid
- OrderOpenPrice() >= TrailingStopStart*Point)
{
if(Bid
- OrderStopLoss()> TrailingStop*Point)
{
if
(!OrderModify(OrderTicket(), OrderOpenPrice(),
Bid
- TrailingStop*Point, OrderTakeProfit(), 0, Blue))
{
Print("OrderModify
error ",GetLastError());
}
return;
}
}
}
else {
//กรณีเคยทำ
Trailing Stop มาแล้ว
เช็คระยะที่ 2.5
เท่่าของ Trailing
Stop
if(Bid
- OrderStopLoss()> (TrailingStop * 2.5)*Point)
{
if
(!OrderModify(OrderTicket(), OrderOpenPrice(),
Bid
- TrailingStop*Point, OrderTakeProfit(), 0, Blue))
{
Print("OrderModify
error ",GetLastError());
}
return;
}
}
}
}
/*+------------------------------------------------------------------+
ฟังก์ชัน
ปิดคำสั่งขายSELL()
ทำหน้าที่ปิดคำสั่งซื้อ
(SELL)
+------------------------------------------------------------------+*/
void
ปิดคำสั่งขาย_SELL(double
HighSmoothed14MAก่อนปัจจุบัน,
double
HighSmoothed14MA)
{
//ปิดคำสั่ง
SELL เมื่อคาดว่าจะกลับเทรน
if
(((Low[1] > HighSmoothed14MA) &&
(HighSmoothed14MAก่อนปัจจุบัน
< HighSmoothed14MA)) &&
(Low[0]
> HighSmoothed14MA))
{
if(!OrderClose(OrderTicket(),
OrderLots(), Ask, 0, White))
Print("OrderClose
error ",GetLastError());
}
}
/*+------------------------------------------------------------------+
ฟังก์ชัน
ทำ_TrailingStop_สำหรับคำสั่งขาย_SELL()
ทำหน้าที่ทำ Trailling
stop สำหรับคำสั่ง SELL
+------------------------------------------------------------------+*/
void
ทำ_TrailingStop_สำหรับคำสั่งขาย_SELL()
{
if
(TrailingStop > 0)
{
if
(OrderStopLoss() > OrderOpenPrice())
{
//กรณียังไม่เคยทำ
Stop Loss มาก่อน
//รอจนกว่าราคาจะวิ่งถึงจุดที่กำหนด
150 จุด
จากราคาเปิดด
if(OrderOpenPrice()
- Ask > TrailingStopStart * Point)
{
if(OrderStopLoss()-Ask
> TrailingStop*Point)
{
if(!OrderModify(OrderTicket(),
OrderOpenPrice(),
Ask
+ TrailingStop*Point, OrderTakeProfit(), 0, Red))
{
Print("OrderModify
error ",GetLastError());
}
return;
}
}
}
else {
//กรณีเคยเริ่มทำ
Stop Loss มาแล้ว
เช็คระยะที่ 2.5
เท่าของ ค่า Stop
Loss
if(OrderStopLoss()-Ask
> (TrailingStop*2.5)*Point)
{
if(!OrderModify(OrderTicket(),
OrderOpenPrice(),
Ask
+ TrailingStop*Point, OrderTakeProfit(), 0, Red))
{
Print("OrderModify
error ",GetLastError());
}
return;
}
}
}
}
/*+------------------------------------------------------------------+
ฟังก์ชัน
ปิดคำสั่งซื้อขายที่เป็นบวกหลายรายการ()
ทำหน้าที่ปิดคำสั่งซื้อขายที่เป็นบวกพร้อมกันหลายรายการ
+------------------------------------------------------------------+*/
void
ปิดคำสั่งซื้อขายที่เป็นบวกหลายรายการ(int
จำนวนคำสั่งซื้อขายที่มีกำไร)
{
double
ผลกำไรขาดทุนของคำสั่งซื้อขาย;
if
(AllProfitPositiveCloseAll)
{
//ถ้าจำนวนคำสั่งซื้อขายที่ได้กำไรเกิน
2 ใน 3
ปิดคำสั่งซื้อที่ได้กำไรทั้งหมด
if
(จำนวนคำสั่งซื้อขายที่เปิดค้างอยู่()
== จำนวนคำสั่งซื้อขายที่มีกำไร)
{
for(int
i=0;i<OrdersTotal();i++)
{
//กรณีไม่มีคำสั่งซื้อขาย
if
(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
//หาค่ากำไร/ขาดทุนของ
Order
ผลกำไรขาดทุนของคำสั่งซื้อขาย
= OrderProfit() + OrderSwap()
+ OrderCommission();
if
(ผลกำไรขาดทุนของคำสั่งซื้อขาย
> 0.5)
{
//ตรวจสอบกรณีคำสั่งซื้อ
(BUY)
if
(OrderType()==OP_BUY)
{
//ปิดคำสั่ง
BUY
if(!OrderClose(OrderTicket(),
OrderLots(), Bid, 0, White))
Print("OrderClose error
",GetLastError());
}
//ตรวจสอบกรณีคำสั่งขาย
(SELL)
if
(OrderType()==OP_SELL)
{
//ปิดคำสั่ง
SELL
if(!OrderClose(OrderTicket(),
OrderLots(), Ask, 0, White))
Print("OrderClose error
",GetLastError());
}
}
}
}
}
}
}
/*+------------------------------------------------------------------+
ฟังก์ชัน
ตรวจสอบเปิดคำสั่งซื้อขาย();
ทำหน้าที่ตรวจสอบเงื่อนไข
เพื่อเปิดคำสั่งซื้อขาย
+------------------------------------------------------------------+*/
void
ตรวจสอบปิดคำสั่งซื้อขาย(double
LowSmoothed14MAก่อนปัจจุบัน,
double
LowSmoothed14MA,
double
HighSmoothed14MAก่อนปัจจุบัน,
double
HighSmoothed14MA)
{
double
ผลกำไรขาดทุนของคำสั่งซื้อขาย;
//สำหรับเก็บค่ากำไรขาดทุนของ
Order
int
คำสั่งซื้อขายที่ได้กำไร
= 0;
//สำหรับนับจำนวนคำสั่งซื้อขายที่ได้กำไร
for(int
i=0;i<OrdersTotal();i++)
{
//กรณีไม่มีคำสั่งซื้อขาย
if
(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
//เลือกลบเฉพาะที่เปิดด้วย
EA ชุดนี้เท่านั้น
if
((OrderMagicNumber() == เลขประจำEA)
&&
(OrderComment()
== ชื่อEA) &&
(OrderSymbol()
== Symbol()))
{
//หาค่ากำไร/ขาดทุนของ
Order
ผลกำไรขาดทุนของคำสั่งซื้อขาย
= OrderProfit() + OrderSwap()
+ OrderCommission();
if
(ผลกำไรขาดทุนของคำสั่งซื้อขาย
> 0)
{
คำสั่งซื้อขายที่ได้กำไร
+= 1;
}
//ตรวจสอบกรณีคำสั่งซื้อ
(BUY)
if
(OrderType()==OP_BUY)
{
//ปิดคำสั่ง
BUY ที่มีกำไรในวันศุกร์
if
(((FridayCloseAllPositiveOrder && (DayOfWeek()==FRIDAY))
&&
(TimeHour(TimeCurrent()) >
StringToTime("21:55:00"))) &&
(ผลกำไรขาดทุนของคำสั่งซื้อขาย
> 0))
{
ข้อความแสดงบนจอ
+=
"\n\n***ทุกวันศุกร์ปิดคำสั่งซื้อที่ผลกำไรเป็น
บวก ตั้งแต่เวลา ๒๑,๕๕
น. เป็นต้นไป
***";
Comment(ข้อความแสดงบนจอ);
//ปิดคำสั่ง
BUY
if(!OrderClose(OrderTicket(),
OrderLots(), Bid, 0, White))
Print("OrderClose error
",GetLastError());
}
//กรณีปรกติ
//ทำ
TrailingStop ถ้าทำได้
ทำ_TrailingStop_สำหรับคำสั่งซื้อ_BUY();
//ตรวจสอบปิดคำสั่งซื้อขายตามเงื่อนไขที่ต้องการ
ปิดคำสั่งซื้อ_BUY(LowSmoothed14MAก่อนปัจจุบัน,
LowSmoothed14MA);
}
//ตรวจสอบกรณีคำสั่งขาย
(SELL)
if
(OrderType()==OP_SELL)
{
//ปิดคำสั่ง
BUY ที่มีกำไรในวันศุกร์
if
(((FridayCloseAllPositiveOrder && (DayOfWeek()==FRIDAY))
&&
(TimeHour(TimeCurrent()) >
StringToTime("21:55:00"))) &&
(ผลกำไรขาดทุนของคำสั่งซื้อขาย
> 0))
{
ข้อความแสดงบนจอ
+=
"\n\n***ทุกวันศุกร์ปิดคำสั่งซื้อที่ผลกำไรเป็น
บวก ตั้งแต่เวลา ๒๑,๕๕
น. เป็นต้นไป
***";
Comment(ข้อความแสดงบนจอ);
//ปิดคำสั่ง
SELL
if(!OrderClose(OrderTicket(),
OrderLots(), Ask, 0, White))
Print("OrderClose error
",GetLastError());
}
//ทำ
Trailing Stop ถ้าทำได้
ทำ_TrailingStop_สำหรับคำสั่งขาย_SELL();
//ตรวจสอบปิดคำสั่งซื้อขายตามเงื่อนไขที่ต้องการ
ปิดคำสั่งขาย_SELL(HighSmoothed14MAก่อนปัจจุบัน,
HighSmoothed14MA);
}
}
}
}
//ปิดคำสั่งที่มีกำไรหากจำนวนเงิน
2 ใน 3
ของคำสั่งซื้อขายทั้งหมด
ปิดคำสั่งซื้อขายที่เป็นบวกหลายรายการ(คำสั่งซื้อขายที่ได้กำไร);
}
/*+------------------------------------------------------------------+
ฟังก์ชัน
จำนวนคำสั่งซื้อขายที่เปิดค้าอยู่()
ทำหน้าที่นับจำนวนคำสั่งซื้อขายที่เปิดโดย
EA ชุดนี้ที่ยังเปิดค้างอยู่
+------------------------------------------------------------------+*/
int
จำนวนคำสั่งซื้อขายที่เปิดค้างอยู่()
{
int
ตัวนับจำนวนรอบการทำงานของการวนซ้ำ
= 0;
int
จำนวนคำสั่งซื้อขายทั้งหมด
= OrdersTotal();
int
จำนวนคำสั่งซื้อขายที่เปิดโดยEAชุดนี้
= 0;
for
(ตัวนับจำนวนรอบการทำงานของการวนซ้ำ
= 0;
ตัวนับจำนวนรอบการทำงานของการวนซ้ำ
<
จำนวนคำสั่งซื้อขายทั้งหมด;
ตัวนับจำนวนรอบการทำงานของการวนซ้ำ++)
{
//เลือกนับเฉพาะ
Order ที่เปิดด้วย
MyFastSlowMAThaiEA
if(!OrderSelect(ตัวนับจำนวนรอบการทำงานของการวนซ้ำ,
SELECT_BY_POS, MODE_TRADES))
continue;
if
((OrderComment() == ชื่อEA)&&
(OrderMagicNumber() == เลขประจำEA))
{
จำนวนคำสั่งซื้อขายที่เปิดโดยEAชุดนี้++;
}
}
return(จำนวนคำสั่งซื้อขายที่เปิดโดยEAชุดนี้);
}
//+------------------------------------------------------------------+
//|
Expert function |
//+------------------------------------------------------------------+
void
OnInit()
{
}
//+------------------------------------------------------------------+
//|
Expert tick function |
//+------------------------------------------------------------------+
void
OnTick()
{
//ตัวแปรสำหรับเก็บค่าที่อ่านจากอินดิเคเตอร์
double
EMA200;
double
HighSmoothed14MAก่อนปัจจุบัน;
double
HighSmoothed14MA;
double
LowSmoothed14MAก่อนปัจจุบัน;
double
LowSmoothed14MA;
double
RSI;
double
MACD;
//ตัวแปรเก็บค่าทั่วไป
double
ผลกำไรขาดทุนคำสั่งซื้อขายล่าสุด
= 0;
double
วงเงินบัญชี =
0.0;
int
จำนวนคำสั่งซื้อขายที่เปิดไปแล้ว
= 0;
bool
สถานะอนุญาตให้เปิดคำสั่ง
= True;
string
เทรนปัจจุบัน =
"";
string
ข้อความแสดงเทรน;
//อ่านค่าจากอินดีเคเตอร์
//อ่านค่า
EMA 200
EMA200
= iMA(NULL, 0, 200, 0, MODE_EMA, PRICE_CLOSE, 0);
//อ่านค่าเส้นค่าเฉลี่ยจุดสูงสุดของ
MA(14)คำนวณแบบ
Smoothed ก่อนหน้า
HighSmoothed14MAก่อนปัจจุบัน
= iMA(NULL, 0, 14, 0,
MODE_SMMA, PRICE_HIGH, 1);
//อ่านค่าเส้นค่าเฉลี่ยจุดสูงสุดของ
MA(14)คำนวณแบบ
Smoothed
HighSmoothed14MA
= iMA(NULL, 0, 14, 0, MODE_SMMA, PRICE_HIGH, 0);
//อ่านค่าเส้นค่าเฉลี่ยจุดต่ำสุดของ
MA(14)คำนวณแบบ
Smoothed ก่อนหน้า
LowSmoothed14MAก่อนปัจจุบัน
= iMA(NULL, 0, 14, 0,
MODE_SMMA, PRICE_LOW, 1);
//อ่านค่าเส้นค่าเฉลี่ยจุดต่ำสุดของ
MA(14)คำนวณแบบ
Smoothed
LowSmoothed14MA
= iMA(NULL, 0, 14, 0, MODE_SMMA, PRICE_LOW, 0);
//อ่านค่า
RSI
RSI
= iRSI(NULL, 0, 14, PRICE_WEIGHTED, 0);
//อ่านค่า
MACD
MACD
= iMACD(NULL, 0, 12, 26, 9, PRICE_WEIGHTED, MODE_MAIN, 0);
วงเงินบัญชี
= ((StringFind(Symbol(),
"micro", 0) != -1) ?
AccountFreeMargin() * 100 :
AccountFreeMargin());
//ตรวจสอบเทรนและจัดประเภทคำสั่งซื้อขาย
//กรณีคำสั่งขาย
(SELL)
if
(HighSmoothed14MA < EMA200)
{
ข้อความแสดงเทรน
+=
"\n\n*****เส้นค่าเฉลี่ยราคาสูงสุด
14MA = " +
HighSmoothed14MA + " <" +
"
เส้นบอกเทรน EMA
200 = " + EMA200 + "****";
ข้อความแสดงเทรน
+=
"\n*****HighSmoothed14MAก่อนปัจจุบัน
" +
((HighSmoothed14MAก่อนปัจจุบัน
< HighSmoothed14MA) ? "<
" : "> ") +
"HighSmoothed14MA*******";
เทรนปัจจุบัน
= "ขาลง";
}
//กรณีคำสั่งซื้อ
(BUY)
if
(LowSmoothed14MA > EMA200)
{
ข้อความแสดงเทรน
+=
"\n\n*****เส้นค่าเฉลี่ยราคาต่ำสุด
14MA = " +
LowSmoothed14MA + " >" +
"
เส้นบอกเทรน EMA200
= " + EMA200 + "****";
ข้อความแสดงเทรน
+=
"\n*****LowSmoothed14MAก่อนปัจจุบัน
" +
((LowSmoothed14MAก่อนปัจจุบัน
< LowSmoothed14MA) ? "<
" : "> ") +
"LowSmoothed14MA*******";
เทรนปัจจุบัน
= "ขาขึ้น";
}
//งานแสดงข้อความบนจอ
ข้อความแสดงบนจอ
=
"****ปรับปรุงครั้งสุดดท้ายเมื่อ
: " + ปรับปรุงครั้งล่าสุด
+ "แนะนำให้ใช้กับ
Time Frame : H1 ขึ้นไป
****";
ข้อความแสดงบนจอ
+= "\n\n***เงื่อนไนการคำนวณ
Stop Loss อัตโนมัติ
: "
+
(UseAutoStopLoss ? "True" : "False") + "***";
ข้อความแสดงบนจอ
+= "\n***********Stop
Loss : "
+
((StopLoss==0) ? ((!UseAutoStopLoss) ?
"ไม่ได้กำหนด
Stop Losss"
:
หาจำนวนตัดขาดทุนที่เหมาะสม(EMA200))
:
StopLoss) + "***********";
ข้อความแสดงบนจอ
+= ข้อความแสดงเทรน;
ข้อความแสดงบนจอ
+= "\n*****เทรน
" + เทรนปัจจุบัน
+ "************";
ข้อความแสดงบนจอ
+= "\n*****RSI : " +
RSI + "************";
ข้อความแสดงบนจอ
+= "\n*****MACD : "
+ MACD + " ************";
ข้อความแสดงบนจอ
+= "\n\n*****High[0]: "
+ High[0] + "*****";
ข้อความแสดงบนจอ
+= "Low[0]: " +
Low[0] + "*****";
ข้อความแสดงบนจอ
+= " *****Open[0]: "
+ Open[0] + "*****";
ข้อความแสดงบนจอ
+= "Close[0]: " +
Close[0] + "*****";
ข้อความแสดงบนจอ
+= "\n
====จำนวนเงินที่ใช้ได้
==> " + วงเงินบัญชี
+ "====";
ข้อความแสดงบนจอ
+= "\n***มูลค่าต่อ
1 pip==> " +
MarketInfo(Symbol(), MODE_TICKVALUE) + "**";
ข้อความแสดงบนจอ
+= "**จำนวนล็อต
ในการสั่งซื้อรอบถัดไป
==> " +
หาจำนวนล็อตที่เหมาะสม(EMA200)
+ "***";
//ตรวจสอบจำนวนคำสั่งซื้อ/ขายที่เปิดค้างอยู่
จำนวนคำสั่งซื้อขายที่เปิดไปแล้ว
=
จำนวนคำสั่งซื้อขายที่เปิดค้างอยู่();
ข้อความแสดงบนจอ
+=
"\n\n***จำนวนคำสั่งซื้อ/ขายที่เปิดไปแล้ว
: " +
จำนวนคำสั่งซื้อขายที่เปิดไปแล้ว
+ " คำสั่ง
*****";
Comment(ข้อความแสดงบนจอ);
if(IsTradeAllowed())
{
//ตรวจสอบคำสั่งซื้อขายล่าสุดเป็นบวกหรือไม่
ถ้าเป็นบวกจึงเปิดคำสั่งซื้อขายใหม่
if
(จำนวนคำสั่งซื้อขายที่เปิดไปแล้ว
> 0)
{
ตรวจสอบปิดคำสั่งซื้อขาย(LowSmoothed14MAก่อนปัจจุบัน,
LowSmoothed14MA,
HighSmoothed14MAก่อนปัจจุบัน,
HighSmoothed14MA);
}
//ตรวจสอบสถานะให้เปิดคำสั่งซื้อขายในววันศูกร์
if
((FridayNotOpenOrder) && (DayOfWeek()==FRIDAY))
{
สถานะอนุญาตให้เปิดคำสั่ง
= False;
ข้อความแสดงบนจอ
+= "
**********วันศุกร์
=>กำหนดไม่ให้เปิดคำสั่งซื้อขาย***************";
Comment(ข้อความแสดงบนจอ);
}
//ตรวจสอบจำนวนคำสั่งซื้อ/ขายว่าครบหรือยัง
if
(จำนวนคำสั่งซื้อขายที่เปิดไปแล้ว
< MaxTrade)
{
//เมื่ออนุญาตให้เปิดคำสั่ง
if
(สถานะอนุญาตให้เปิดคำสั่ง)
{
ตรวจสอบเปิดคำสั่งซื้อขาย(EMA200,
LowSmoothed14MAก่อนปัจจุบัน,
LowSmoothed14MA,
HighSmoothed14MAก่อนปัจจุบัน,
HighSmoothed14MA,
RSI,
MACD);
}
}
else {
ข้อความแสดงบนจอ
+= "
*********คำสั่งซื้อขายครบจำนวนแล้ว******************";
Comment(ข้อความแสดงบนจอ);
}
}
else {
ข้อความแสดงบนจอ
+= "
**********ไม่ให้เปิดคำสั่งซื้อขาย***************";
Comment(ข้อความแสดงบนจอ);
}
ข้อความแสดงบนจอ
= "";
}
//+------------------------------------------------------------------+ |