Từng bước Tạo và Code lệnh một EA trên Mt4

Từng bước Tạo và Code lệnh một EA trên Mt4

Từng bước Tạo và Code lệnh một EA trên Mt4
Bác nào có thể chỉ em nên dùng hàm nào được ko ạ bolligerbands 20 2.5 rsi 5
Sell giá đóng cửa vượt band trên chờ rsi 5 đi xuống trong khoảng 70 60 nến đóng lại thì sell

Buy khi giá vượt band dưới chờ rsi 5 đi lên trong khoảng 30 40 nến đóng lại thì buy

Em đang tìm hiểu mà mông lung quá
 
RefreshRates();
double RsiH4 = iRSI(Symbol(),240,5,0,1);
double RsiH1 = iRSI(Symbol(),60,5,0,1);
double RsiM15 = iRSI(Symbol(),15,5,0,1);


int i=0;
DisplayInfo(StringConcatenate("RSI H4=",DoubleToStr(RsiH4,0)),"Arial",12,Red,1,i); i++;
DisplayInfo(StringConcatenate("RSI H1=",DoubleToStr(RsiH1,0)),"Arial",12,Red,1,i);
i++;
DisplayInfo(StringConcatenate("RSI M15=",DoubleToStr(RsiH1,0)),"Arial",12,Red,1,i);
i++;
Em có đoạn code này để show RSI nhiều khung mà nó không update RSI liên tục bác nào biết thay đổi thế nào không chỉ giúp em với.
 
Các bác xem giúp cái EA này, ý tưởng là mở lệnh khi cắt đường MA, chốt lời khi đạt 100pip chẳng hạn mà chạy hoài nó báo lỗi không chạy được.

extern int MagicNumber=10001;
extern double Lots =0.1;
extern double StopLoss=50;
extern double TakeProfit=500;
extern int TrailingStop=150;
extern int Slippage=3;
//+------------------------------------------------------------------+
// expert start function
//+------------------------------------------------------------------+
int start()
{
double MyPoint=Point;
if(Digits==3 || Digits==5) MyPoint=Point*10;
double TheStopLoss=0;
double TheTakeProfit=0;
if( TotalOrdersCount()==0 )
{
int result=0;
double IMA = iMA(NULL,0,100,0,MODE_SMA,PRICE_CLOSE,0);
if((Close[-1]> IMA)&&(Close[-2]< IMA)) // <-------Báo lỗi tại đây Array out of range
{
result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Blue);
if(result>0)
{
TheStopLoss=0;
TheTakeProfit=0;
if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
OrderSelect(result,SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
}
return(0);
}
if((Close[-1]<IMA)&&(Close[-2]>IMA))
{
result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Red);
if(result>0)
{
TheStopLoss=0;
TheTakeProfit=0;
if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint;
if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint;
OrderSelect(result,SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
}
return(0);
}
}
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber
)
{
if(OrderType()==OP_BUY)
{
if((Close[-1]<iMA(NULL,0,100,0,MODE_SMA,PRICE_CLOSE,0)))
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
}
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
{
if(OrderStopLoss()<Bid-MyPoint*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else
{
if((Close[-1]>iMA(NULL,0,100,0,MODE_SMA,PRICE_CLOSE,0)))
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
}
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
{
if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
int TotalOrdersCount()
{
int result=0;
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS ,MODE_TRADES);
if (OrderMagicNumber()==MagicNumber) result++;
}
return (result);
}
 
Các bác xem giúp cái EA này, ý tưởng là mở lệnh khi cắt đường MA, chốt lời khi đạt 100pip chẳng hạn mà chạy hoài nó báo lỗi không chạy được.

extern int MagicNumber=10001;
extern double Lots =0.1;
extern double StopLoss=50;
extern double TakeProfit=500;
extern int TrailingStop=150;
extern int Slippage=3;
//+------------------------------------------------------------------+
// expert start function
//+------------------------------------------------------------------+
int start()
{
double MyPoint=Point;
if(Digits==3 || Digits==5) MyPoint=Point*10;
double TheStopLoss=0;
double TheTakeProfit=0;
if( TotalOrdersCount()==0 )
{
int result=0;
double IMA = iMA(NULL,0,100,0,MODE_SMA,PRICE_CLOSE,0);
if((Close[-1]> IMA)&&(Close[-2]< IMA)) // <-------Báo lỗi tại đây Array out of range
{
result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Blue);
if(result>0)
{
TheStopLoss=0;
TheTakeProfit=0;
if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
OrderSelect(result,SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
}
return(0);
}
if((Close[-1]<IMA)&&(Close[-2]>IMA))
{
result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Red);
if(result>0)
{
TheStopLoss=0;
TheTakeProfit=0;
if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint;
if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint;
OrderSelect(result,SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
}
return(0);
}
}
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber
)
{
if(OrderType()==OP_BUY)
{
if((Close[-1]<iMA(NULL,0,100,0,MODE_SMA,PRICE_CLOSE,0)))
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
}
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
{
if(OrderStopLoss()<Bid-MyPoint*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else
{
if((Close[-1]>iMA(NULL,0,100,0,MODE_SMA,PRICE_CLOSE,0)))
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
}
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
{
if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
int TotalOrdersCount()
{
int result=0;
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS ,MODE_TRADES);
if (OrderMagicNumber()==MagicNumber) result++;
}
return (result);
}

Cái j mà có Close[-1] nữa vậy ?? Close giá trị thấp nhất là 0 nhé. Còn chạy ngược về quá khứ là tăng dần ví dụ cây đứng sau cây hiện tại là 1, tiếp là 2 3 4 5....-1 nó báo lỗi là phải
 
if (condition xx)

{
dosell(Symbol(),Lots,SL,TP,0,""); lệnh buy 1
double checks=OrderOpenPrice();
if (checks>0)
{
double slsell2 = checks+SL2*pip;
double tpsell2 = checks-TP2*pip;
if (Bid>= checks+200)
{
dosell(Symbol(),Lot2,slsell2,tpsell2,0,""); lệnh buy 2 sau 200point
}
}
}

Bác nào đi qua sửa hộ em phát sao cái checks ko lấy được giá mở của lệnh buy 1 nhỉ?
 
Mql4 là ngôn ngữ lập trình bạn ah. Mình sử dụng nó để cụ thể hóa phương pháp giao dịch, chí ít thì là backtest trên lịch sử trước khi áp dụng.
Tùy từng trường hợp, bạn gặp vấn đề gì? cần hỗ trợ code thì nêu ra, mình sẽ


Mql4 là ngôn ngữ lập trình bạn ah. Mình sử dụng nó để cụ thể hóa phương pháp giao dịch, backtest trên lịch sử trước khi áp dụng.
Tùy từng trường hợp, bạn gặp vấn đề gì? cần hỗ trợ code thì nêu ra, mình sẽ giúp trong khả năng.
minh muon code theo dk nhu tren nhung kem theo phan martingale
vd : lenh 1 : sell 0.01 (MA nho cat MA lon tu tren xuong) khong can TP ,SL
khi MA nho cat MA lon nguoc lai tu duoi len (kiem tra neu lenh 1 profit + thi dong lenh 1 mo lenh Buy 0.01 , neu lenh 1 profit - thi mo lenh 2 buy 0.02 dong thoi ko dong lenh 1)
khi 1 va 2 chay song song neu co profit >= so tien minh set thi dong ca 2 lenh va cho dk tiep theo de vao lenh moi bat dau chu ki moi

Khi MA nho cat MA lon tu tren xuong (kiem tra lenh 1 va 2 neu profit + dong ca 2 lenh va mo lenh Sell 0.01 , nguoc lai lenh 1 va 2 profit - thi mo lenh Sell 0.04 dong thoi khong dong lenh 1,2)
Tuong tu nhu vay cho cac lenh tiep theo
 
Chào bạn!
Cho mình hỏi và trao đổi chút về MQL4.
Lối trade của mình đơn giản là khi giá ở vùng đỉnh hoặc đáy (theo cách các định của mình) sẽ vào lệnh. Nếu giá ở lân cận đỉnh sẽ sell và giá ở lân cận đáy sẽ buy. Mình chưa quan tâm đến các Indicater.
Mình sử dụng hàm OnTick() để phát hiện giá có ở vùng vào lệnh hay chưa và OrderSend() để vào lệnh buy/sell nhưng OnTick() được gọi liên tục theo mỗi biến động giá nên lệnh cũng sẽ vào liên tục mình chưa khống chế được.
Bạn gợi ý cho mình cách hạn chế số lượng lệnh nhập với. Hoặc các hàm, các biến của MQL4 có liên quan đến số lượng giao dịch của một cặp tiền nhất định kiểu OrdersTotal() hoạt động của cả EA chẳng hạn.
Cám ơn bạn!
 
Các anh có cái ex4 nào thông báo khi nến trước giá giảm, giá mở cây nến sau thấp hơn giá đóng và ngược lại giá nến trước tăng, giá sau mở cửa cao hơn thì thông báo giúp em với
 
Mình giao dịch theo hành động giá nên mình cần xác định các vùng cản đỉnh - đáy và đường xu hướng trên một khung thời gian nhất định. Trong mql4 có lệnh nào hỗ trợ không, hoặc code thế nào? Bạn nào biết la.f ơn chỉ mình với
 
Chào các bạn, bài viết này mình sẽ hướng dẫn các bạn cách tạo và code lệnh cho một EA mà trong một bài viết của bác Dương Huy đã hướng dẫn các bạn tạo EA tự động.

1. Bước thứ nhất:
Các bạn mở trình soạn thảo MetaEditor của Mt4.
Trên cửa sổ trình soạn thảo MetaEditor. Bạn Click vào mục “New” phái trên góc bên trái.
View attachment 27602

Tại đây có các lựa chọn tương ứng các mục đích lập trình của bạn. Bạn chọn vào “Expert Advisor”. Chọn "Next" để tiếp tục.
View attachment 27603

Tiếp theo bạn đặt tên cho EA mà mình xây dựng. Tôi đặt tên cho EA là Example. Lưu ý các tham số phần Parameters sẽ thêm vào khi lập trình, bạn không cần quan tâm ở đây. Chọn "Next" để tiếp tục.
View attachment 27604

Chọn "Next" để tiếp tục.
View attachment 27605

Chọn "Next" để tiếp tục.
View attachment 27607

Chọn "Finish" lúc này chúng ta sẽ được một mẫu code chung.
View attachment 27608

2. Bước thứ hai:
Bây giờ công việc của chúng ta là tiến hành code các dòng lệnh với các thuật toán cho EA của mình vào trong mẫu code chung thu được ở trên.
Phương pháp giao dịch:
- Lệnh thực hiện dựa vào sự cắt nhau của Ema_8 và Ema_20.
- Kết hợp điều kiện yêu cầu của nến mà ở đó xảy ra sự giao cắt.
- Lệnh mua:
+ Ema_8 cắt từ dưới lên Ema_20.
+ Giá đóng cửa của nến xảy ra sự cắt nhau cao hơn giá mở cửa, và nằm phía trên 2/3 kích thước của nến.
+ Thân nến có kích thước tương đối.
- Lệnh bán:
+ Ema_8 cắt từ trên xuống Ema_20.
+ Giá đóng cửa của nến xảy ra sự cắt nhau thấp hơn giá mở cửa, và nằm phía dưới 1/3 kích thước của nến.
+ Thân nến có kích thước tương đối.

3. Bước thứ ba:
Trong code mẫu tự động tạo ra bởi trình soạn thảo chúng ta có các thành phần:
- Hàm khởi tạo Expert OnInt().
- Hàm kết thúc Expert Ondeint().
- Hàm void OnTick().
Ta thay hàm void OnTick() bằng hàm int start().

//--- đầu tiên ta tiến hành khai báo các biến---
int ticket, ticket_1; // giá trị phục vụ kiểm tra khi tiến hành đặt lệnh
double ma8_1, ma8_2; // giá trị đường tủng bình ma
double ma20_1, ma20_2;
double BarHigh3, BarLow3, BarSize3, BarClose3, BarOpen3; // giá trị nến mới đóng cửa
double atr; // giá trị sử dụng tính toán SL va TP
bool buy_condition = false, sell_condition = false; // điều kiện đặt lệnh
bool n01 = false, n11 = false, n21 = false; // điều kiện đặt 01 lệnh trên 01 nến
bool n02 = false, n12 = false, n22 = false; //
double Lots = 0.01; // khối lượng của lệnh

//---khởi tạo giá trị cho các biến
ma8_1 = iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_MEDIAN, 1);
ma8_2 = iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_MEDIAN, 2);
ma20_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_MEDIAN, 1);
ma20_2 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_MEDIAN, 2);

BarHigh3 = iHigh (Symbol(), 0, 1);
BarLow3 = iLow (Symbol(), 0, 1);
BarClose3 = iClose ( Symbol(), 0, 1);
BarOpen3 = iOpen( Symbol(),0,1);
BarSize3 = BarHigh3 - BarLow3;

atr = iATR (Symbol(), 0, 40, 1);

//-------xác định điều kiện cho đặt lệnh---------
//-------thuat toan dieu kien cho lenh buy------
if( ma8_2 < ma20_2 && ma8_1 > ma20_1 )
{
if ( BarClose3 > BarLow3 + 0.7*BarSize3 )
{
if ( BarSize3 > 0.6*atr )
{
buy_condition = true;
}
}
}
//------- thuat toan dieu kien lenh sell------
if( ma8_2 > ma20_2 && ma8_1 < ma20_1 )
{
if ( BarClose3 < BarLow3 + 0.3*BarSize3 )
{
if ( BarSize3 > 0.6*atr )
{
sell_condition = true;
}
}
}

//------- điều kiện đặt 01 lệnh trên 01 nến cho mỗi cặp------
int total = OrdersTotal();
for ( int pos = 0; pos <= total; pos++ )
{
if ( OrderSelect( pos, SELECT_BY_POS ) == true )
{
//----------------------lenh thuc hien khac ngay-----------------------------------
if ( OrderSymbol() == "AUDUSD" && (TimeDay(TimeCurrent()) != TimeDay (OrderOpenTime())) )
{
if ( OrderType() == OP_BUY )
n01 = true;
if ( OrderType() == OP_SELL )
n11 = true;
}

if ( OrderSymbol() == "EURUSD" && (TimeDay(TimeCurrent()) != TimeDay (OrderOpenTime())) )
{
if ( OrderType() == OP_BUY )
n02 = true;
if ( OrderType() == OP_SELL )
n12 = true;
}

//--------------------lenh thuc hien cung ngay------------------------------------------
if ( OrderSymbol() == "AUDUSD" && (TimeDay(TimeCurrent()) == TimeDay (OrderOpenTime())) )
{
n21 = true;
}

if ( OrderSymbol() == "EURUSD" && (TimeDay(TimeCurrent()) == TimeDay (OrderOpenTime())) )
{
n22 = true;
}
}
}

//------- đặt lệnh buy và sell-------------------------------------------------
if ( ( buy_condition == true && Symbol() == "AUDUSD" && n11 == false && n21 == false) ||
( buy_condition == true && Symbol() == "EURUSD" && n12 == false && n22 == false) )
{
if ( BarClose3 - BarLow3 < atr*1.5 )
{
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask, 3, BarLow3 - 50*Point, Ask + (Ask - BarLow3 + 50*Point)*2.1,"My EA",1245,0,Green); // buy order place
}
else
{
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask, 3, Ask - atr*1.5, Ask + atr*1.5*2.1,"My EA",1245,0,Green); // buy order pl
}

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("BUY order opened : ",OrderOpenPrice());
return (0);
}
}
else
{
Print("Error opening BUY order : ",GetLastError());
return(0);
}
}

Ta đã vừa code hoàn thành EA theo phương pháp giao dịch đơn giản là dựa vào sự cắt nhau của các đường trung bình giá kết hợp điều kiện giá đóng cửa của nến.
Các bạn chú ý, trong phần đặt lệnh "SendOrder" ta chia ra hai trường hợp dựa vào kích thước của nến so sánh với giá trị ATR. Tỉ lệ Reward/Risk là 2:1. EA giao dịch trên 2 cặp ngoại tệ là AUD/USD, EUR/USD.
Bây giờ công việc của ta sẽ là biên dịch để có được một EA giao dịch tự động.
Các bạn tải file EA và file hướng dẫn cách các bạn Backtest của Fxpro ở dưới để xem thêm nhá./.

View attachment 27606

Bác cho mình xin code buy/sell limit đc không ạ
thank bác nhiều
 
Các bác cho e hỏi , e tạo 1 con ea đơn giản khi 2 đường ma cắt nhau và rsi nằm trên 50 thì buy và ngược lại .
Nhưng khi test thì ea lại vào lệnh khi 2 đường cắt nhau( rsi ko đủ dk) hoặc rsi lên 50 vào lệnh ( nhưng 2 đường ko cắt ) . E dùng && mà vẫn vậy trong khi viết indi thì ok . Có bác nào thông não hoặc giúp e ko? E cảm ơn

cái vấn đề của bác là do
Chào các bác, mình đang cần 1 EA có thể tự cắt lệnh đang mở khi 2 đường EMA cắt nhau, cứ có chuông báo 2 đường EMA trên cắt nhau là EA cắt hết lệnh đang mở.
Ai có con EA này chia sẻ cho mình với. Rất cám ơn ak!
asv1-uphinhnhanh-com_images_2018_08_17_1aec22-png.55019
cái này đơn giản mà bạn...cứ cắt lên là đóng buy và cắt xuống là đóng sell thôi
nhưng cái này mình làm rồi...k ổn bác ạ...nát lắm
 
Cả nhà cho em hỏi với em muốn đặt SL ở giá cao nhất của cây nến trước nến đặt thì viết lệnh thế nào ạ?
 
Cấu trúc lệnh đó quản lý được việc đặt 1 lệnh trên 1 nến nếu có tín hiệu. Trường hợp xảy ra TP hay SL trong cùng 1 nến, muốn quản lý thì bạn phải sử dụng thêm phần History closed ỏders (các lệnh đã đóng).
BẠN ƠI MÌNH MUỐN NÓ KHÔNG SELL HOẶC BUY KHI ĐÓNG LỆNH TRONG CÙNG 1 NẾN BẠN CÓ THỂ GIÚP MÌNH KHÔNG!
 
có bác nào biết viết lệnh khi giá đóng nến dưới đường MA14 thì vào lệnh sell và giá đóng nến vượt lên trên thì buy không? Giúp e với, e viết mà nó cứ toàn vừa mới chạm chưa đóng nến thì nó đã vào lệnh rồi
 

BÌNH LUẬN MỚI NHẤT

  • Mạc An trong Phân tích Forex - Vàng - Hàng hóa 1,124 Xem / 68 Trả lời
  • DuongHuy trong Phân tích Forex - Vàng - Hàng hóa 288 Xem / 20 Trả lời
  • ngoi_sao_co_doc trong Phân tích Forex - Vàng - Hàng hóa 23,988 Xem / 82 Trả lời
  • Quíc Óp trong Phân tích Forex - Vàng - Hàng hóa 185 Xem / 3 Trả lời
  • Berkeley trong Phân tích Forex - Vàng - Hàng hóa 103 Xem / 2 Trả lời
  • LuTienSinh trong Phân tích Forex - Vàng - Hàng hóa 121 Xem / 3 Trả lời
  • DuongHuy trong Phân tích Forex - Vàng - Hàng hóa 233 Xem / 9 Trả lời
  • AdBlock Detected

    We get it, advertisements are annoying!

    Sure, ad-blocking software does a great job at blocking ads, but it also blocks useful features of our website. For the best site experience please disable your AdBlocker.

    Back
    Bên trên