Biểu đồ RRG (Relative Rotation Graph) Hướng đi và sức khỏe dòng tiền
GIỚI THIỆU
(RRG) là một công cụ trực quan hóa để phân tích Sức mạnh tương đối (Relative Strength - RS). Với cơ chế luân chuyển của dòng tiền theo chu kỳ, RRG giúp nhà đầu tư tìm hiểu được những tài sản mạnh nhất trên thị trường, hoặc là sắp sửa mạnh nhất so với 1 mốc (thường là các chỉ số thị trường) hoặc so với chính nó.
Nhìn chung, dòng tiền sẽ vận động theo 1 chu kỳ gồm 4 giai đoạn, giống với 4 mùa trong năm. Biểu đồ RRG sẽ thể hiện các chu kì của dòng tiền như sau:
* Cải thiện - “Mùa Xuân”
* Dẫn dắt - “Mùa Hạ”
* Suy yếu - “Mùa Thu”
* Tụt hậu - “Mùa Đông”
VIDEO THAM KHẢO
CODE RRG CỔ PHIẾU RIÊNG LẺ
_SECTION_BEGIN( "RRG cophieu" );
_N( base = ParamStr( "Base", "vnindex" ) );
_N( list = ParamStr( "Symbols", "vn30,hnx30,hnxindex,upindex,vnxall" ) );
tbar = Param( "Trailing Bar", 12, 1, 100, 1 );
EnableTextOutput( False );
GfxSetOverlayMode( 2 );
pxl = Status( "pxchartleft" );
pxr = Status( "pxchartright" );
pxt = Status( "pxcharttop" );
pxb = Status( "pxchartbottom" );
pxw = ( pxr - pxl ) / 2;
pxh = ( pxb - pxt ) / 2;
xm = pxl + pxw;
ym = pxt + pxh;
GfxSelectPen(colorGreen);
//GfxMoveTo( pxl, ym );
//GfxLineTo( pxr, ym );
//GfxMoveTo( xm, pxt );
//GfxLineTo( xm, pxb );
// ve mau cho chart
GfxSelectPen(colorGreen);
GfxSelectSolidBrush(colorBrightGreen);
GfxRectangle( pxw, pxt, pxr, pxh );
GfxSelectSolidBrush(ColorRGB(255,250,179));
GfxRectangle( pxw, pxh, pxr, pxb );
GfxSelectSolidBrush(ColorRGB(235,113,83));
GfxRectangle( pxl,pxh, pxw, pxb );
GfxSelectSolidBrush(ColorRGB(103,191,127));
GfxRectangle( pxl,pxt, pxw, pxh );
// Viet chu cac goc phan tu
CoChu=Status("pxheight")/20;
XuongHang=Status("pxheight")/12-Status("pxheight")/9;
QuaCot=Status("pxwidth")/4-Status("pxwidth")/6;
GfxSetBkMode( 1 );
GfxSelectFont("Tahoma", CoChu );
GfxSetTextColor( colorViolet);
GfxTextOut( "DAN DAT +/+", pxr-3*quaCot, pxt-1.2*XuongHang );
GfxTextOut( "SUY YEU +/-", pxr-3*quaCot, pxb+2.6*XuongHang );
GfxTextOut( "TUT HAU -/-", pxl+0.2*quaCot, pxb+2.6*XuongHang );
GfxTextOut( "CAI THIEN -/+", pxl+0.2*quaCot, pxt-1.2*XuongHang );
GfxSetTextColor( colorBlack );
GfxSelectFont("Tahoma", CoChu/2 );
//ham tinh chi so
function getrs ( sc, t )
{
bc = Foreign( base, "C" );
sbr = sc / bc;
rs1 = MA( sbr, 12 );
rs2 = MA( sbr, 26 );
rs = 100 * ( ( rs1 - rs2 ) / rs2 + 1 );
rm1 = MA( rs, 1 );
rm2 = MA( rs, 9 );
rm = 100 * ( ( rm1 - rm2 ) / rm2 + 1 );
return IIf( t, rs , rm ) - 100;
}
function drawpos ( x, y, sym, text )
{
rsl = VarGet( "rsl" );
rsh = VarGet( "rsh" );
rml = VarGet( "rml" );
rmh = VarGet( "rmh" );
xx = pxl + pxw + x * ( pxw / ( Max( rsh, -rsl ) * 1.10 ) );
yy = pxb - pxh - y * ( pxh / ( Max( rmh, -rml ) * 1.10 ) );
xp = Nz( VarGet( "xp" + sym ), xx );
yp = Nz( VarGet( "yp" + sym ), yy );
VarSet( "xp" + sym, xx );
VarSet( "yp" + sym, yy );
GfxMoveTo( xp, yp );
GfxLineTo( xx, yy );
GfxCircle( xx, yy, IIf( text == "", 2, 4 ) );
if ( text != "" ) GfxTextOut( sym, xx + 6 , yy - 3 );
}
for ( i = 0; ( sym = StrExtract( list, i ) ) != ""; i++ )
{
SetForeign( sym );
rs = getrs( C, 1 );
rm = getrs( C, 0 );
for ( ii = BarCount - tbar; ii < BarCount; ii++ )
{
rs_ = rs[ ii ];
rm_ = rm[ ii ];
rsh = Nz( VarGet( "rsh" ), rs_ );
if ( rs_ >= rsh )
VarSet( "rsh", rs_ );
rsl = Nz( VarGet( "rsl" ), rs_ );
if ( rs_ <= rsl )
VarSet( "rsl", rs_ );
rmh = Nz( VarGet( "rmh" ), rm_ );
if ( rm_ >= rmh )
VarSet( "rmh", rm_ );
rml = Nz( VarGet( "rml" ), rm_ );
if ( rm_ <= rml )
VarSet( "rml", rm_ );
}
RestorePriceArrays( True );
}
for ( i = 0; ( sym = StrExtract( list, i ) ) != ""; i++ )
{
SetForeign( sym );
GfxSelectPen(ColorRGB(255,155-10*i,200-10*i));
rs = getrs( C, 1 );
rm = getrs( C, 0 );
for ( ii = BarCount - tbar; ii < BarCount; ii++ )
{
drawpos( rs[ ii ], rm[ ii ], sym, WriteIf( ii == BarCount - 1, sym, "" ) );
}
RestorePriceArrays( True );
}
_SECTION_END();
CODE RRG NHÓM NGÀNH
_SECTION_BEGIN( "RRG Chart" );
//==========================
_N( base = ParamStr( "Base", "vnindex" ) );
tbar = Param( "Trailing Bar", 12, 1, 100, 1 );
EnableTextOutput( False );
GfxSetOverlayMode( 2 );
pxl = Status( "pxchartleft" );
pxr = Status( "pxchartright" );
pxt = Status( "pxcharttop" );
pxb = Status( "pxchartbottom" );
pxw = ( pxr - pxl ) / 2;
pxh = ( pxb - pxt ) / 2;
xm = pxl + pxw;
ym = pxt + pxh;
GfxSelectPen(colorGreen);
// ve mau cho chart
GfxSelectPen(colorGreen);
GfxSelectSolidBrush(colorBrightGreen);
GfxRectangle( pxw, pxt, pxr, pxh );
GfxSelectSolidBrush(ColorRGB(255,250,179));
GfxRectangle( pxw, pxh, pxr, pxb );
GfxSelectSolidBrush(ColorRGB(235,113,83));
GfxRectangle( pxl,pxh, pxw, pxb );
GfxSelectSolidBrush(ColorRGB(103,191,127));
GfxRectangle( pxl,pxt, pxw, pxh );
// Viet chu cac goc phan tu
CoChu=Status("pxheight")/20;
XuongHang=Status("pxheight")/12-Status("pxheight")/9;
QuaCot=Status("pxwidth")/4-Status("pxwidth")/6;
GfxSetBkMode( 1 );
GfxSelectFont("Tahoma", CoChu );
GfxSetTextColor( colorViolet);
GfxTextOut( "DAN DAT +/+", pxr-3*quaCot, pxt-1.2*XuongHang );
GfxTextOut( "SUY YEU +/-", pxr-3*quaCot, pxb+2.6*XuongHang );
GfxTextOut( "TUT HAU -/-", pxl+0.2*quaCot, pxb+2.6*XuongHang );
GfxTextOut( "CAI THIEN -/+", pxl+0.2*quaCot, pxt-1.2*XuongHang );
GfxSetTextColor( colorBlack );
GfxSelectFont("Tahoma", CoChu/2 );
//tinh gia watchlist
Sowl=6;
function TinhCList(Sowl )
{
listNganh = CategoryGetSymbols( categoryWatchlist, Sowl );
for( a = 0; ( MAcp = StrExtract( Listnganh, a ) ) != ""; a++ )
{
Vol= MA(Foreign( MAcp, "V" ),50);
giatri = Foreign( MAcp, "C" )*Vol;
if( a == 0 ) {TongVol = 1;
TongGtri=0;}
else {TongGtri = tongGtri + GiaTri;
TongVol=TongVol+Vol;}
}
return (TongGtri / TongVol);
}
//ham tinh chi so RS, giai quyet cho wl
function getrs ( sowl, t )
{
bc = Foreign( base, "C" );
sbr = tinhCList(sowl) / bc;
rs1 = MA( sbr, 12 );
rs2 = MA( sbr, 26 );
rs = 100 * ( ( rs1 - rs2 ) / rs2 + 1 );
rm1 = MA( rs, 1 );
rm2 = MA( rs, 9 );
rm = 100 * ( ( rm1 - rm2 ) / rm2 + 1 );
return IIf( t, rs , rm ) - 100;
}
// ham ve do thi
function drawpos (sowl, x, y, text )
{
rsl = VarGet( "rsl" );
rsh = VarGet( "rsh" );
rml = VarGet( "rml" );
rmh = VarGet( "rmh" );
xx = pxl + pxw + x * ( pxw / ( Max( rsh, -rsl ) * 1.10 ) );
yy = pxb - pxh - y * ( pxh / ( Max( rmh, -rml ) * 1.10 ) );
Ten=CategoryGetName( categoryWatchlist, sowl );
xp = Nz( VarGet( "xp" + ten ), xx );// neu bien xp+sym ko co thi no = xx
yp = Nz( VarGet( "yp" + ten ), yy );
VarSet( "xp" + ten, xx );
VarSet( "yp" + ten, yy );
GfxMoveTo( xp, yp );
GfxLineTo( xx, yy );
GfxSelectSolidBrush(colorRed);
GfxCircle( xx, yy, IIf( text == "", 2, 4 ) );//ve nhung cham nho
if ( text != "" ) GfxTextOut( ten, xx + 6 , yy - 3 );// viet chu cuoi dthi
}
//=====================================
function Ve(sowl)
{
rs = getrs( sowl, 1 );
rm = getrs( sowl, 0 );
for ( ii = BarCount - tbar; ii < BarCount; ii++ )
{
rs_ = rs[ ii ];
rm_ = rm[ ii ];
rsh = Nz( VarGet( "rsh" ), rs_ );
if ( rs_ >= rsh )
VarSet( "rsh", rs_ );
rsl = Nz( VarGet( "rsl" ), rs_ );
if ( rs_ <= rsl )
VarSet( "rsl", rs_ );
rmh = Nz( VarGet( "rmh" ), rm_ );
if ( rm_ >= rmh )
VarSet( "rmh", rm_ );
rml = Nz( VarGet( "rml" ), rm_ );
if ( rm_ <= rml )
VarSet( "rml", rm_ );
drawpos(sowl, rs[ ii ], rm[ ii ], WriteIf( ii == BarCount - 1, "yes", "" ) );
}
}
VeNganHang=ParamList("Ngan Hang","Hien|An");
VeBDS=ParamList("BDS","Hien|An");
VeBdskcn=ParamList("Bds Kcn","Hien|An");
VeChungKhoan=ParamList("Chung Khoan","Hien|An");
VeDauKhi=ParamList("Dau Khi","Hien|An");
VeCongNghe=ParamList("Cong Nghe","Hien|An");
VeCangBien=ParamList("Cang Bien","Hien|An");
VePhanBon=ParamList("Phan Bon","Hien|An");
VeThep=ParamList("Thep","Hien|An");
VeDetMay=ParamList("Det May","Hien|An");
VeThuySan=ParamList("Thuy San","Hien|An");
VeXayDung=ParamList("Xay Dung","Hien|An");
VeDien=ParamList("NL Dien","Hien|An");
VeBanLe=ParamList("Ban Le","Hien|An");
VeHangKo=ParamList("Hang Ko","Hien|An");
VeMiaDuong=ParamList("Mia Duong","Hien|An");
VeBaoHiem=ParamList("Bao Hiem","Hien|An");
VeVLXD=ParamList("Vl Xd","Hien|An");
VeXiMang=ParamList("Xi Mang","Hien|An");
switch(VeNganHang)
{
case "Hien":
GfxSelectPen(colorRed);
Ve(68);
break;
case "An":
break;
}
switch(VeBDS)
{
case "Hien":
GfxSelectPen(colorDarkYellow);
Ve(67);
break;
case "An":
break;
}
switch(VeBDSkcn)
{
case "Hien":
GfxSelectPen(colorAqua);
Ve(66);
break;
case "An":
break;
}
switch(VeChungKhoan)
{
case "Hien":
GfxSelectPen(colorGreen);
Ve(65);
break;
case "An":
break;
}
switch(VeDauKhi)
{
case "Hien":
GfxSelectPen(colorBrown);
Ve(64);
break;
case "An":
break;
}
switch(VeCongNghe)
{
case "Hien":
GfxSelectPen(colorTan);
Ve(63);
break;
case "An":
break;
}
switch(VeCangBien)
{
case "Hien":
GfxSelectPen(colorLightBlue);
Ve(62);
break;
case "An":
break;
}
switch(VeThep)
{
case "Hien":
GfxSelectPen(ColorRGB(17,162,251));
Ve(60);
break;
case "An":
break;
}
switch(VePhanBon)
{
case "Hien":
GfxSelectPen(ColorRGB(231,37,208));
Ve(61);
break;
case "An":
break;
}
switch(VeDetMay)
{
case "Hien":
GfxSelectPen(ColorRGB(246,213,18));
Ve(59);
break;
case "An":
break;
}
switch(VeThuySan)
{
case "Hien":
GfxSelectPen(ColorRGB(185,89,79));
Ve(58);
break;
case "An":
break;
}
switch(VeXayDung)
{
case "Hien":
GfxSelectPen(colorBlack);
Ve(57);
break;
case "An":
break;
}
switch(VeDien)
{
case "Hien":
GfxSelectPen(ColorRGB(137,81,183));
Ve(56);
break;
case "An":
break;
}
switch(VeBanLe)
{
case "Hien":
GfxSelectPen(ColorRGB(100,100,100));
Ve(55);
break;
case "An":
break;
}
switch(VeHangko)
{
case "Hien":
GfxSelectPen(ColorRGB(67,167,4));
Ve(54);
break;
case "An":
break;
}
switch(VeMiaDuong)
{
case "Hien":
GfxSelectPen(ColorRGB(102,255,255));
Ve(53);
break;
case "An":
break;
}
switch(VeBaoHiem)
{
case "Hien":
GfxSelectPen(ColorRGB(0,155,155));
Ve(52);
break;
case "An":
break;
}
switch(VeVLXD)
{
case "Hien":
GfxSelectPen(colorBlue);
Ve(46);
break;
case "An":
break;
}
switch(VeXiMang)
{
case "Hien":
GfxSelectPen(ColorRGB(102,0,255));
Ve(45);
break;
case "An":
break;
}
_SECTION_END();