> ## Documentation Index
> Fetch the complete documentation index at: https://developers.fhsc.com.vn/llms.txt
> Use this file to discover all available pages before exploring further.

# Chỉ báo kỹ thuật

> Giá trị 16 chỉ báo kỹ thuật của 1 mã, tính trực tiếp từ lịch sử giá **khung ngày** (`1D` — không có khung intraday).

Chọn chỉ báo và tham số bằng ký pháp trader quen viết: `indicators=RSI(14),SMA(20),MACD(12,26,9)`. Viết tên trần (`RSI`) thì dùng bộ tham số mặc định của chỉ báo đó.

Một endpoint phục vụ cả hai chế độ: bỏ trống `from`/`to` → phiên gần nhất đã chốt; truyền cả cặp → chuỗi theo phiên. Một phiên trong quá khứ là `from` và `to` cùng đặt vào ngày đó — không có param `date` riêng. Hình dạng response không đổi giữa hai chế độ: snapshot là chuỗi có đúng một phần tử.

Chỉ trả **giá trị**, không quy ra khuyến nghị mua/bán.




## OpenAPI

````yaml /openapi.yaml get /market/stocks/{symbol}/technicals
openapi: 3.1.0
info:
  title: Finhay Securities Open API
  version: 0.2.0-preview.3
  description: |
    Đặc tả chính thức của Finhay Securities Open API, dùng chung cho SDK
    codegen, Redoc docs, và (sau này) mock server / contract test.

    ## Authentication — 2 tier

    - **Tier 1 — chỉ cần API key**: các endpoint đọc dữ liệu thị trường
      (`GET /market/**`, `GET /trading/market/**`). Gửi kèm header
      `X-FH-APIKEY` là đủ.
    - **Tier 2 — HMAC signing**: các endpoint liên quan đến account /
      trading / user. Gửi kèm 4 header `X-FH-APIKEY` + `X-FH-TIMESTAMP` +
      `X-FH-NONCE` + `X-FH-SIGNATURE`; thêm `X-FH-BODYHASH` khi request có
      body. Chi tiết thuật toán xem extension `x-finhay-signing` ở root
      spec hoặc phần README.

    ## Bootstrap flow

    Gọi 2 endpoint tag **Khởi tạo** (`GET /users/v1/users/me` và
    `GET /users/v1/users/{userId}/sub-accounts`) **1 lần khi khởi tạo
    client** để lấy thông tin `user_id` và `subAccountId`. Mọi endpoint thuộc
    tag **Tổng tài sản / Tiểu khoản / Danh mục đầu tư / Sổ lệnh / Lãi-lỗ /
    Quyền cổ đông** đều cần 2 giá trị này để truyền vào path parameter.
  contact: {}
servers:
  - url: https://open-api.fhsc.com.vn
    description: Production
security:
  - FinhayApiKey: []
tags:
  - name: Khởi tạo
    description: >-
      Khởi tạo client — lấy `user_id` và `subAccountId`. Gọi 1 lần khi khởi tạo
      SDK rồi cache lại.
  - name: Bảng giá thị trường
    description: >-
      Giá realtime, lịch sử và sổ lệnh thống nhất cho stocks / indices / forex /
      crypto / hàng hoá / quỹ mở / trái phiếu / ETF.
  - name: Phân tích cơ bản
    description: >-
      Chỉ số tài chính cơ bản của doanh nghiệp — chỉ số tổng quan, phân tích
      theo kỳ và báo cáo tài chính chuẩn (income statement / balance sheet /
      cash flow).
  - name: Tin tức-sự kiện
    description: >-
      Sự kiện doanh nghiệp (cổ tức, quyền mua, ĐHCĐ, …), tin tức stock, tin tức
      tài chính toàn cầu (forex / commodities / economic-indicators /
      stock-market / cryptocurrency) và báo cáo khuyến nghị từ analyst.
  - name: Kinh tế vĩ mô
    description: >-
      Chỉ số kinh tế vĩ mô (CPI, PMI, PCE, GDP, …), lãi suất tiền gửi ngân hàng
      và lịch sự kiện kinh tế.
  - name: Tổng tài sản
    description: >-
      Tổng quan tài sản cấp user — cross-product (stock, fund, bond, hay0) kèm
      cash, debt, PnL.
  - name: Tiểu khoản
    description: Thông tin tiểu khoản — số dư, margin, dư nợ và ngân hàng liên kết.
  - name: Danh mục đầu tư
    description: Danh mục stock đang nắm giữ kèm giá realtime và PnL theo vị thế.
  - name: Sổ lệnh
    description: >-
      Quản lý lệnh — sổ lệnh trong ngày, danh sách đầy đủ hoặc chi tiết theo
      `orderId`.
  - name: Lãi-lỗ
    description: PnL và analytics cá nhân — lãi / lỗ trong ngày tổng hợp theo user.
  - name: Quyền cổ đông
    description: Quyền cổ đông (cổ tức, quyền mua, bỏ phiếu, …) của tiểu khoản.
  - name: Phiên giao dịch
    description: >-
      Hạ tầng trading — trạng thái phiên giao dịch và order type khả dụng của
      mỗi exchange.
  - name: Thực thi lệnh
    description: |
      ⚠️ Nhóm endpoint này đang ở giai đoạn **preview**.

      Đặt / sửa / huỷ lệnh trên sàn — write operation nhạy cảm, yêu cầu
      Tier 2 HMAC đầy đủ + `X-FH-BODYHASH` + `X-FH-2FA-TOKEN` (daily 2FA
      session).
paths:
  /market/stocks/{symbol}/technicals:
    get:
      tags:
        - Bảng giá thị trường
      summary: Chỉ báo kỹ thuật
      description: >
        Giá trị 16 chỉ báo kỹ thuật của 1 mã, tính trực tiếp từ lịch sử giá
        **khung ngày** (`1D` — không có khung intraday).


        Chọn chỉ báo và tham số bằng ký pháp trader quen viết:
        `indicators=RSI(14),SMA(20),MACD(12,26,9)`. Viết tên trần (`RSI`) thì
        dùng bộ tham số mặc định của chỉ báo đó.


        Một endpoint phục vụ cả hai chế độ: bỏ trống `from`/`to` → phiên gần
        nhất đã chốt; truyền cả cặp → chuỗi theo phiên. Một phiên trong quá khứ
        là `from` và `to` cùng đặt vào ngày đó — không có param `date` riêng.
        Hình dạng response không đổi giữa hai chế độ: snapshot là chuỗi có đúng
        một phần tử.


        Chỉ trả **giá trị**, không quy ra khuyến nghị mua/bán.
      operationId: stocksGetTechnicals
      parameters:
        - name: symbol
          in: path
          required: true
          description: >-
            Mã cổ phiếu niêm yết (3–10 ký tự chữ/số, không phân biệt hoa
            thường). VD: VNM, FPT.
          schema:
            type: string
            example: HPG
        - name: indicators
          in: query
          required: false
          description: >-
            Danh sách chỉ báo, ngăn bởi dấu phẩy, mỗi cái theo ký pháp `TÊN(tham
            số)` — tối đa 20 chỉ báo.


            Xu hướng: `SMA(period)`, `EMA(period)`, `ADX(period)`,
            `SUPERTREND(period,multiplier)`, `PSAR(step,max_step)`,
            `ICHIMOKU(tenkan,kijun,senkou_b,displacement)`.

            Động lượng: `RSI(period)`, `MACD(fast,slow,signal)`,
            `STOCH(period,k_smooth,d_smooth)`, `CCI(period)`,
            `WILLIAMS_R(period)`.

            Biến động: `BBANDS(period,std_dev)`, `ATR(period)`.

            Khối lượng: `OBV()`, `MFI(period)`, `VOLUME_SMA(period)`.


            Bỏ trống → bộ mặc định phủ cả 4 nhóm:
            `SMA(20),SMA(50),EMA(20),RSI(14),MACD(12,26,9),BBANDS(20,2),VOLUME_SMA(20)`.
          schema:
            type: string
            example: RSI(14),SMA(20),MACD(12,26,9)
        - name: from
          in: query
          required: false
          description: Ngày bắt đầu (bao gồm), dạng `YYYY-MM-DD`. Phải đi kèm `to`.
          schema:
            type: string
            format: date
            example: '2026-05-01'
        - name: to
          in: query
          required: false
          description: >-
            Ngày kết thúc (bao gồm), dạng `YYYY-MM-DD`. Phải đi kèm `from`,
            không sớm hơn `from`, không ở tương lai, khoảng cách tối đa 5 năm.
          schema:
            type: string
            format: date
            example: '2026-07-31'
      responses:
        '200':
          description: >-
            `data` gồm `prices` (giá đóng cửa của cửa sổ) và `indicators` (mỗi
            chỉ báo một chuỗi).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StockTechnicalsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
      x-codeSamples:
        - lang: bash
          label: cURL
          source: |
            curl -H "X-FH-APIKEY: $FINHAY_API_KEY" \
              "https://open-api.fhsc.com.vn/market/stocks/HPG/technicals?indicators=RSI(14),MACD(12,26,9)"
components:
  schemas:
    StockTechnicalsResponse:
      allOf:
        - $ref: '#/components/schemas/EnvelopeBase'
        - type: object
          required:
            - data
          properties:
            data:
              $ref: '#/components/schemas/StockTechnicals'
    EnvelopeBase:
      type: object
      description: |
        Các field chung của envelope trong mọi response của Finhay API.

        - `error_code` là `"0"` (string) khi thành công, mã khác `"0"` khi lỗi.
        - `message` là thông điệp ngắn từ server.
      properties:
        error_code:
          type: string
          description: '`"0"` khi thành công, khác `"0"` khi lỗi.'
          example: '0'
        message:
          type: string
          description: Thông điệp trạng thái dễ đọc.
          example: success
    StockTechnicals:
      type: object
      description: Chỉ báo kỹ thuật của một mã trên cửa sổ đã tính.
      required:
        - symbol
        - resolution
        - from
        - to
        - prices
        - indicators
      properties:
        symbol:
          type: string
          description: Mã cổ phiếu.
          example: HPG
        resolution:
          type: string
          description: Khung thời gian của bar; luôn là `1D`.
          example: 1D
        from:
          type: string
          format: date
          description: >-
            Phiên đầu tiên thực sự được tính — đã lùi khỏi ngày nghỉ, không phải
            ngày client gửi lên.
          example: '2026-05-04'
        to:
          type: string
          format: date
          description: Phiên cuối cùng được tính. Bằng `from` ở chế độ phiên gần nhất.
          example: '2026-07-31'
        prices:
          type: array
          description: >-
            Giá đóng cửa của cửa sổ, liệt kê một lần ở cấp trên thay vì lặp
            trong từng chỉ báo. Align với chuỗi chỉ báo theo `date`.
          items:
            $ref: '#/components/schemas/StockTechnicalPrice'
        indicators:
          type: array
          description: Mỗi chỉ báo đã yêu cầu một phần tử, theo đúng thứ tự yêu cầu.
          items:
            $ref: '#/components/schemas/StockTechnicalSeries'
    ErrorBody:
      type: object
      description: Body của response khi 4xx / 5xx.
      properties:
        error_code:
          type: string
          description: >-
            Mã lỗi khác `"0"` (ví dụ `AUTH_SIGNATURE_INVALID`,
            `RATE_LIMIT_EXCEEDED`, …).
          example: '400'
        message:
          type: string
          description: Thông điệp lỗi (tiếng Anh, từ server).
          example: Invalid parameter
      required:
        - error_code
        - message
    StockTechnicalPrice:
      type: object
      description: Giá đóng cửa của một phiên trong cửa sổ, để đối chiếu với chỉ báo.
      required:
        - date
        - close
      properties:
        date:
          type: string
          format: date
          description: Ngày của phiên (`YYYY-MM-DD`).
          example: '2026-07-31'
        close:
          type: number
          description: Giá đóng cửa (nghìn đồng).
          example: 21.7
    StockTechnicalSeries:
      type: object
      description: Chuỗi của một chỉ báo đã yêu cầu.
      required:
        - indicator
        - params
        - display_name
        - data
      properties:
        indicator:
          type: string
          description: Tên chỉ báo.
          example: MACD
        params:
          type: string
          description: Tham số đã áp dụng, ngăn bởi dấu phẩy (rỗng với `OBV`).
          example: 12,26,9
        display_name:
          type: string
          description: Ký pháp đầy đủ để hiển thị.
          example: MACD(12,26,9)
        data:
          type: array
          description: >-
            Chuỗi theo phiên; đúng 1 phần tử ở chế độ phiên gần nhất. Rỗng khi
            không tính được — khi đó xem `note`, các chỉ báo khác vẫn trả bình
            thường.
          items:
            $ref: '#/components/schemas/StockTechnicalPoint'
        note:
          type: string
          description: >-
            Lý do `data` rỗng (vd `SUPERTREND`/`PSAR` cần tối thiểu 200 phiên).
            Chỉ xuất hiện khi có.
          example: Cần tối thiểu 200 phiên, mã hiện có 143
    StockTechnicalPoint:
      type: object
      description: >-
        Một phiên trong chuỗi của một chỉ báo: `date` cộng các thành phần mà
        chính chỉ báo đó sinh ra.


        Tên thành phần theo từng chỉ báo — chỉ báo một đường (SMA, EMA, RSI,
        ATR, CCI, WILLIAMS_R, OBV, MFI, VOLUME_SMA) trả `value`; `MACD` trả
        `macd_line`/`signal_line`/`histogram`; `BBANDS` trả
        `upper`/`middle`/`lower`; `STOCH` trả `k`/`d`; `ADX` trả
        `value`/`plus_di`/`minus_di`; `SUPERTREND` và `PSAR` trả `value` kèm
        `direction` (`UP`/`DOWN`); `ICHIMOKU` trả
        `tenkan`/`kijun`/`senkou_a`/`senkou_b`/`chikou`.
      required:
        - date
      properties:
        date:
          type: string
          format: date
          description: Ngày của phiên (`YYYY-MM-DD`).
          example: '2026-07-31'
      additionalProperties:
        type:
          - number
          - string
        description: >-
          Giá trị một thành phần của chỉ báo; `direction` là chuỗi, còn lại là
          số.
      example:
        date: '2026-07-31'
        macd_line: -0.179
        signal_line: 0.014
        histogram: -0.193
  responses:
    BadRequest:
      description: Request không hợp lệ — thiếu hoặc sai tham số.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            error_code: '400'
            message: Invalid parameter
    Unauthorized:
      description: Không xác thực — thiếu, sai hoặc không hợp lệ chữ ký / API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            error_code: '401'
            message: Invalid signature
    NotFound:
      description: >-
        Tài nguyên không tồn tại — `error_code` mô tả cụ thể loại tài nguyên
        không tìm thấy.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            error_code: '404'
            message: Not found
    RateLimited:
      description: >-
        Vượt giới hạn rate limit. Chờ đến thời điểm `X-RateLimit-Reset` rồi thử
        lại.
      headers:
        X-RateLimit-Reset:
          $ref: '#/components/headers/XRateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            error_code: '429'
            message: Too many requests
    InternalError:
      description: Lỗi server nội bộ.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
          example:
            error_code: '500'
            message: Internal server error
  headers:
    XRateLimitReset:
      description: |
        Unix timestamp (giây) — thời điểm window rate limit reset. Client nhận
        `429 Too Many Requests` nên chờ đến thời điểm này rồi retry.
      schema:
        type: integer
        format: int64
        example: 1713441600
  securitySchemes:
    FinhayApiKey:
      type: apiKey
      in: header
      name: X-FH-APIKEY
      description: >
        API key dài hạn của client. Cấu hình 1 lần lúc khởi tạo; có thể wire
        thẳng

        vào static setter của SDK tự-gen. Đi kèm với `FINHAY_API_SECRET` —
        secret

        này chỉ dùng ở phía client để tính `X-FH-SIGNATURE`, **không** bao giờ

        gửi qua mạng.

````