Nến Heiken Ashi dịch ra tiếng Việt có nghĩa là thanh trung bình, nến trung bình. Nến Heiken Ashi được phát minh bởi Munehisa Honma vào năm 1970 và có hình dạng gần giống với nến Nhật.
Nến Heiken Ashi gồm 2 phần thân nến và râu nến (bóng nến), cung cấp 4 mức giá quan trọng: cao nhất, thấp nhất, giá mở cửa và giá đóng cửa. Tuy nhiên, các mức giá này được tính theo công thức phức tạp hơn so với nến Nhật, vì nó còn liên quan đến mức giá trung bình của các phiên giao dịch trước đó.
Tương tự như đường trung bình động MA thì nến Heiken Ashi giúp làm mượt giá, loại bỏ bớt tín hiệu nhiễu giúp trader dễ dàng nhận biết xu hướng trên biểu đồ giá.
Công thức tính các mức giá của nến Heiken Ashi:
Mức giá mở cửa (Open) của nến Heiken Ashi được tính bằng trung bình của 2 mức giá mở cửa và đóng cửa của cây nến trước (phiên giao dịch trước).
- Giá mở cửa (Open) = (Open of Pre. Bar + Close of Pre. Bar)/2
Mức giá đóng cửa (Close) được tính bằng trung bình cộng của 4 mức giá: mở cửa, đóng cửa, cao nhất, thấp nhất trong phiên giao dịch hiện tại.
- Giá đóng cửa (Close) = (Open + Close + High + Low)/4
Mức giá cao nhất (High) là giá trị lớn nhất của 3 mức giá mở cửa, đóng cửa, mức cao nhất trong phiên giao dịch.
- Giá cao nhất (High) = Max (High, Open, Close)
Mức giá thấp nhất (Low) là giá trị nhỏ nhất trong các mức giá mở cửa, đóng cửa, giá thấp nhất trong phiên giao dịch.
- Giá thấp nhất (Low) = Min (Low, Open, Close)
Mình sẽ tạm viết với logic sau đây:
Nếu nến Heiken hiện tại Open > Close (Nến heiken đỏ): SELL tại giá hiện tại. Đóng tất cả nếu xuất hiện nến Heiken Xanh
Nếu nến Heiken hiện tại Open > Close (Nến heiken xanh): NUY tại giá hiện tại. Đóng tất cả nếu xuất hiện nến Heiken Đỏ
Code đầy đủ sử dụng Heiken-Ashi vào lệnh:
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#include <Trade\Trade.mqh>
CTrade ExtTrade;
double open;
double high;
double low;
double close;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
long volume = iVolume(_Symbol,PERIOD_CURRENT,0);
if(volume > 1)
return;
OpenSell();
OpenBuy();
}
bool GetSignal(int i, double &o, double &h, double &l, double &c)
{
double op[];
double hi[];
double lo[];
double cl[];
int handle = iCustom(_Symbol,PERIOD_CURRENT,"Examples\\Heiken_Ashi");
CopyBuffer(handle,0,i,1,op);
o = NormalizeDouble(op[0],_Digits);
CopyBuffer(handle,1,i,1,hi);
h = NormalizeDouble(hi[0],_Digits);
CopyBuffer(handle,2,i,1,lo);
l = NormalizeDouble(lo[0],_Digits);
CopyBuffer(handle,3,i,1,cl);
c = NormalizeDouble(cl[0],_Digits);
return true;
}
void OpenSell()
{
bool res = GetSignal(0,open,high,low,close);
if(open > close)
{
CloseAllOrdersBySide(_Symbol,POSITION_TYPE_BUY);
double price = SymbolInfoDouble(_Symbol,SYMBOL_BID);
ExtTrade.PositionOpen(_Symbol,ORDER_TYPE_SELL,0.01,price,0,0,"");
if(ExtTrade.ResultOrder() > 0)
{
Print("OrderSend Sucessfull");
}
else
Print("OrderSend failed with error #",GetLastError());
}
return;
}
void OpenBuy()
{
bool res = GetSignal(0,open,high,low,close);
if(open < close)
{
CloseAllOrdersBySide(_Symbol,POSITION_TYPE_SELL);
double price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
ExtTrade.PositionOpen(_Symbol,ORDER_TYPE_BUY,0.01,price,0,0,"");
if(ExtTrade.ResultOrder() > 0)
{
Print("OrderSend Sucessfull");
}
else
Print("OrderSend failed with error #",GetLastError());
}
return;
}
void CloseAllOrdersBySide(string symbol, int side)
{
int i=0;
while(i<PositionsTotal())
{
bool odsl = OrderSelect(PositionGetTicket(i));
if(PositionGetString(POSITION_SYMBOL) == symbol && PositionGetInteger(POSITION_TYPE) == side)
{
ExtTrade.PositionClose(PositionGetTicket(i),3);
i--;
}
i++;
}
}
//+------------------------------------------------------------------+
Nếu có bất kỳ thắc mắc nào vui lòng liên hệ Telegram: @gfvietvd