Biểu đồ RRG (Relative Rotation Graph) Hướng đi và sức khỏe dòng tiền

Thứ 2, 17/03/2025

::

PM
Đầu tư chứng khoán khoa học trên nền tảng phân tích dữ liệu và thống kê
Biểu đồ RRG (Relative Rotation Graph) Hướng đi và sức khỏe dòng tiền
03/09/2022 05:00 AM 3477 Lượt xem

    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();

     

    Đọc thêm

    Thu gọn

    Bài viết khác:
    Zalo
    Hotline