Technology

Demand Supply Zone หนังสือ — แนะนำหนังสือและเทคนิคการเทรด

demand supply zone หนงสอ
demand supply zone หนังสือ | SiamCafe Blog
2025-09-21· อ. บอม — SiamCafe.net· 1,425 คำ

Demand Supply Zone คืออะไรและทำงานอย่างไร

Demand Zone คือบริเวณราคาที่มีแรงซื้อมากกว่าแรงขาย ทำให้ราคามีโอกาสดีดตัวขึ้น ส่วน Supply Zone คือบริเวณที่มีแรงขายมากกว่าแรงซื้อ ทำให้ราคามีโอกาสกลับตัวลง แนวคิดนี้พัฒนาต่อยอดจาก Support และ Resistance แบบดั้งเดิม แต่มองเป็นพื้นที่ (zone) แทนที่จะเป็นเส้น (line) เดียว

หลักการพื้นฐานมาจากทฤษฎีอุปสงค์อุปทานทางเศรษฐศาสตร์ เมื่อราคาเคลื่อนที่ออกจากบริเวณหนึ่งอย่างรวดเร็วและรุนแรง แสดงว่าบริเวณนั้นมี institutional orders ที่ยังไม่ถูก fill ทั้งหมด เมื่อราคากลับมาถึงบริเวณเดิมอีกครั้ง orders ที่เหลือจะถูก fill ทำให้ราคาเด้งกลับไปในทิศทางเดิม

Demand Supply Zone ต่างจาก Support Resistance ตรงที่ zone มีความกว้างมากกว่า ไม่ใช่แค่จุดเดียว ทำให้มี margin of error มากกว่า นอกจากนี้ zone ยังมีอายุการใช้งาน (freshness) zone ที่ยังไม่เคยถูกทดสอบมีความแข็งแกร่งกว่า zone ที่ถูกทดสอบหลายครั้งแล้ว

ประเภทของ zone แบ่งตามรูปแบบการเคลื่อนที่ของราคาได้แก่ Rally-Base-Rally (RBR) สำหรับ demand zone ในขาขึ้น, Drop-Base-Rally (DBR) สำหรับ demand zone ที่เกิดจากการกลับตัว, Rally-Base-Drop (RBD) สำหรับ supply zone ในขาลง และ Drop-Base-Drop (DBD) สำหรับ supply zone ที่เกิดจากการกลับตัว

หนังสือ Demand Supply Zone ที่ดีที่สุด

รายชื่อหนังสือที่แนะนำสำหรับเรียนรู้ Demand Supply Zone Trading

# หนังสือ Demand Supply Zone แนะนำ
#
# 1. "Supply and Demand Trading" — Frank Miller
#    - อธิบายแนวคิด supply demand zone อย่างละเอียด
#    - มีตัวอย่าง chart จริงพร้อมคำอธิบาย
#    - เหมาะสำหรับผู้เริ่มต้นและผู้มีประสบการณ์
#
# 2. "The Art and Science of Technical Analysis" — Adam Grimes
#    - ใช้แนวทาง evidence-based สำหรับ TA
#    - อธิบาย market structure และ price action
#    - มีส่วน supply demand ที่ลงลึกมาก
#    - ISBN: 978-1118115121
#
# 3. "Trading Price Action Trading Ranges" — Al Brooks
#    - เน้น price action trading อย่างลึกซึ้ง
#    - อธิบายการอ่าน chart แท่งเทียนทุก bar
#    - ISBN: 978-1118066676
#
# 4. "Secrets of Supply and Demand Trading" — Oleg Volkov
#    - เน้นเรื่อง institutional order flow
#    - อธิบายวิธีระบุ zone ที่แม่นยำ
#    - มี trade setups พร้อมตัวอย่างจริง
#
# 5. "Trading in the Zone" — Mark Douglas
#    - เน้น trading psychology
#    - ช่วยให้ execute trade ตาม plan ได้
#    - จำเป็นสำหรับ discipline ในการเทรด
#    - ISBN: 978-0735201446
#
# 6. "Naked Forex" — Alex Nekritin & Walter Peters
#    - เทรด forex โดยไม่ใช้ indicators
#    - ใช้ price action และ supply demand zones
#    - ISBN: 978-1118114018
#
# 7. "Reading Price Charts Bar by Bar" — Al Brooks
#    - วิเคราะห์ price action ทุก bar
#    - เข้าใจ market context ก่อนเข้า trade
#    - ISBN: 978-0470443958
#
# แหล่งเรียนรู้ออนไลน์เพิ่มเติม:
# - Sam Seiden (Online Trading Academy) — ผู้บุกเบิก supply demand trading
# - Alfonso Moreno — YouTube channel สอน supply demand
# - Chris Capre — Price action และ supply demand courses

วิธีระบุ Demand Zone และ Supply Zone บน Chart

ขั้นตอนการระบุ zone ที่มีคุณภาพบน chart

# ขั้นตอนระบุ Demand/Supply Zone
#
# 1. หา "Base" — บริเวณที่ราคา consolidate ก่อน move ออก
#    - มองหาแท่งเทียนตัวเล็กๆ (small body candles)
#    - ยิ่ง base แคบ ยิ่งดี (tight consolidation)
#
# 2. หา "Departure" — การเคลื่อนที่ออกจาก base อย่างรุนแรง
#    - แท่งเทียนตัวใหญ่ (strong momentum candles)
#    - ยิ่งเคลื่อนที่เร็วและไกล zone ยิ่งแข็งแกร่ง
#
# 3. วาด Zone
#    - Demand Zone: วาดจาก low ของ base ถึง high ของ base
#    - Supply Zone: วาดจาก high ของ base ถึง low ของ base
#
# เกณฑ์ประเมินคุณภาพ Zone (1-10):
#
# Freshness (ความใหม่):
#   - Fresh (ยังไม่เคยถูกทดสอบ): 10/10
#   - Tested 1 ครั้ง: 7/10
#   - Tested 2+ ครั้ง: 3/10 (อ่อนแอ)
#
# Strength of Departure:
#   - 3+ แท่งเทียนตัวใหญ่ติดกัน: 10/10
#   - 1-2 แท่งเทียนตัวใหญ่: 7/10
#   - แท่งเทียนปกติ: 4/10
#
# Time Spent in Base:
#   - 1-3 แท่งเทียน: 10/10 (ดีที่สุด)
#   - 4-6 แท่งเทียน: 7/10
#   - 7+ แท่งเทียน: 4/10 (อ่อนแอ)
#
# Risk:Reward จาก Zone:
#   - 1:3 ขึ้นไป: ดี
#   - 1:2: พอรับได้
#   - ต่ำกว่า 1:2: ไม่คุ้มเสี่ยง

# ตัวอย่าง TradingView Pine Script สำหรับวาด Zone
# //@version=5
# indicator("Supply Demand Zones", overlay=true)
# lookback = input.int(20, "Lookback Period")
# threshold = input.float(1.5, "ATR Multiplier")
# atr_val = ta.atr(14)
#
# // หา swing highs/lows
# swing_high = ta.pivothigh(high, lookback, lookback)
# swing_low = ta.pivotlow(low, lookback, lookback)
#
# // วาด supply zone ที่ swing high
# if not na(swing_high)
#     box.new(bar_index - lookback, swing_high,
#             bar_index, swing_high - atr_val * 0.5,
#             bgcolor=color.new(color.red, 85),
#             border_color=color.red)
#
# // วาด demand zone ที่ swing low
# if not na(swing_low)
#     box.new(bar_index - lookback, swing_low + atr_val * 0.5,
#             bar_index, swing_low,
#             bgcolor=color.new(color.green, 85),
#             border_color=color.green)

สร้างเครื่องมือหา Zone อัตโนมัติด้วย Python

ใช้ Python ระบุ Demand Supply Zone จากข้อมูลราคาจริง

#!/usr/bin/env python3
# supply_demand_detector.py — หา Supply Demand Zone อัตโนมัติ
import pandas as pd
import numpy as np
import yfinance as yf

class SupplyDemandDetector:
    def __init__(self, data, atr_period=14, lookback=10, min_move_atr=1.5):
        self.data = data.copy()
        self.atr_period = atr_period
        self.lookback = lookback
        self.min_move_atr = min_move_atr
        self._calculate_atr()

    def _calculate_atr(self):
        high = self.data["High"]
        low = self.data["Low"]
        close = self.data["Close"]
        tr1 = high - low
        tr2 = abs(high - close.shift())
        tr3 = abs(low - close.shift())
        tr = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1)
        self.data["ATR"] = tr.rolling(self.atr_period).mean()

    def find_swing_points(self):
        high = self.data["High"].values
        low = self.data["Low"].values
        n = self.lookback
        swing_highs = []
        swing_lows = []

        for i in range(n, len(high) - n):
            if high[i] == max(high[i-n:i+n+1]):
                swing_highs.append(i)
            if low[i] == min(low[i-n:i+n+1]):
                swing_lows.append(i)

        return swing_highs, swing_lows

    def detect_zones(self):
        swing_highs, swing_lows = self.find_swing_points()
        zones = []

        # Demand Zones (จาก swing lows ที่มี strong departure)
        for idx in swing_lows:
            if idx + 3 >= len(self.data):
                continue
            base_low = self.data["Low"].iloc[idx]
            base_high = self.data["High"].iloc[idx]
            departure_move = self.data["High"].iloc[idx+1:idx+4].max() - base_low
            atr = self.data["ATR"].iloc[idx]

            if atr > 0 and departure_move > atr * self.min_move_atr:
                # ตรวจสอบว่า zone ยังไม่ถูกทดสอบ
                tested = False
                for j in range(idx + 4, len(self.data)):
                    if self.data["Low"].iloc[j] <= base_high:
                        tested = True
                        break

                zones.append({
                    "type": "demand",
                    "date": self.data.index[idx],
                    "zone_low": round(base_low, 2),
                    "zone_high": round(base_high, 2),
                    "strength": round(departure_move / atr, 1),
                    "fresh": not tested,
                })

        # Supply Zones (จาก swing highs ที่มี strong departure)
        for idx in swing_highs:
            if idx + 3 >= len(self.data):
                continue
            base_high = self.data["High"].iloc[idx]
            base_low = self.data["Low"].iloc[idx]
            departure_move = base_high - self.data["Low"].iloc[idx+1:idx+4].min()
            atr = self.data["ATR"].iloc[idx]

            if atr > 0 and departure_move > atr * self.min_move_atr:
                tested = False
                for j in range(idx + 4, len(self.data)):
                    if self.data["High"].iloc[j] >= base_low:
                        tested = True
                        break

                zones.append({
                    "type": "supply",
                    "date": self.data.index[idx],
                    "zone_low": round(base_low, 2),
                    "zone_high": round(base_high, 2),
                    "strength": round(departure_move / atr, 1),
                    "fresh": not tested,
                })

        return sorted(zones, key=lambda x: x["date"], reverse=True)

if __name__ == "__main__":
    data = yf.download("AAPL", period="6mo")
    detector = SupplyDemandDetector(data)
    zones = detector.detect_zones()

    print(f"\n=== Supply Demand Zones: AAPL ===")
    print(f"Current Price: {data['Close'].iloc[-1]:.2f}\n")

    for z in zones[:15]:
        fresh = "FRESH" if z["fresh"] else "TESTED"
        print(f"[{z['type'].upper():6s}] {z['date'].strftime('%Y-%m-%d')} | "
              f"Zone: {z['zone_low']:.2f} - {z['zone_high']:.2f} | "
              f"Strength: {z['strength']:.1f}x ATR | {fresh}")

กลยุทธ์การเทรดด้วย Demand Supply Zone

ขั้นตอนการเทรดด้วย Demand Supply Zone อย่างเป็นระบบ

#!/usr/bin/env python3
# ds_zone_strategy.py — Demand Supply Zone Trading Strategy
import pandas as pd
import numpy as np

class DSZoneStrategy:
    def __init__(self, capital=100000, risk_per_trade=0.01):
        self.capital = capital
        self.risk_per_trade = risk_per_trade
        self.trades = []

    def calculate_position_size(self, entry, stop_loss):
        risk_amount = self.capital * self.risk_per_trade
        risk_per_share = abs(entry - stop_loss)
        if risk_per_share == 0:
            return 0
        return int(risk_amount / risk_per_share)

    def generate_signals(self, data, zones):
        signals = []
        close = data["Close"].values
        low = data["Low"].values
        high = data["High"].values

        for i in range(1, len(data)):
            current_price = close[i]

            for zone in zones:
                if not zone["fresh"]:
                    continue

                # Buy Signal: ราคาเข้า Demand Zone
                if zone["type"] == "demand":
                    if low[i] <= zone["zone_high"] and close[i] > zone["zone_low"]:
                        entry = zone["zone_high"]
                        stop_loss = zone["zone_low"] - (zone["zone_high"] - zone["zone_low"]) * 0.2
                        take_profit = entry + (entry - stop_loss) * 3  # RR 1:3

                        size = self.calculate_position_size(entry, stop_loss)
                        if size > 0:
                            signals.append({
                                "date": data.index[i],
                                "action": "BUY",
                                "entry": round(entry, 2),
                                "stop_loss": round(stop_loss, 2),
                                "take_profit": round(take_profit, 2),
                                "size": size,
                                "zone_strength": zone["strength"],
                            })

                # Sell Signal: ราคาเข้า Supply Zone
                elif zone["type"] == "supply":
                    if high[i] >= zone["zone_low"] and close[i] < zone["zone_high"]:
                        entry = zone["zone_low"]
                        stop_loss = zone["zone_high"] + (zone["zone_high"] - zone["zone_low"]) * 0.2
                        take_profit = entry - (stop_loss - entry) * 3

                        size = self.calculate_position_size(entry, stop_loss)
                        if size > 0:
                            signals.append({
                                "date": data.index[i],
                                "action": "SELL",
                                "entry": round(entry, 2),
                                "stop_loss": round(stop_loss, 2),
                                "take_profit": round(take_profit, 2),
                                "size": size,
                                "zone_strength": zone["strength"],
                            })

        return signals

    def print_signals(self, signals):
        print(f"\n=== Trading Signals ===")
        print(f"Risk per trade: {self.risk_per_trade*100}% of {self.capital:,.0f}")
        for s in signals[-10:]:
            rr = abs(s["take_profit"] - s["entry"]) / abs(s["entry"] - s["stop_loss"])
            print(f"  {s['date'].strftime('%Y-%m-%d')} {s['action']} "
                  f"Entry: {s['entry']} SL: {s['stop_loss']} "
                  f"TP: {s['take_profit']} Size: {s['size']} "
                  f"R:R 1:{rr:.1f}")

Backtesting กลยุทธ์ Demand Supply Zone

ทดสอบกลยุทธ์ด้วยข้อมูลในอดีตเพื่อวัดประสิทธิภาพ

# backtesting สำหรับ demand supply zone strategy
import yfinance as yf

def backtest_ds_zone(symbol="AAPL", period="2y"):
    data = yf.download(symbol, period=period)
    
    # ใช้ detector หา zones
    detector = SupplyDemandDetector(data, lookback=10, min_move_atr=1.5)
    zones = detector.detect_zones()
    
    # ใช้ strategy สร้าง signals
    strategy = DSZoneStrategy(capital=100000, risk_per_trade=0.01)
    signals = strategy.generate_signals(data, zones)
    
    # จำลองการเทรด
    results = []
    for sig in signals:
        idx = data.index.get_loc(sig["date"])
        entry = sig["entry"]
        sl = sig["stop_loss"]
        tp = sig["take_profit"]
        
        # ดูว่า hit TP หรือ SL ก่อน
        for j in range(idx + 1, min(idx + 20, len(data))):
            if sig["action"] == "BUY":
                if data["Low"].iloc[j] <= sl:
                    results.append({"pnl": (sl - entry) * sig["size"], "result": "LOSS"})
                    break
                elif data["High"].iloc[j] >= tp:
                    results.append({"pnl": (tp - entry) * sig["size"], "result": "WIN"})
                    break
            else:
                if data["High"].iloc[j] >= sl:
                    results.append({"pnl": (entry - sl) * sig["size"], "result": "LOSS"})
                    break
                elif data["Low"].iloc[j] <= tp:
                    results.append({"pnl": (entry - tp) * sig["size"], "result": "WIN"})
                    break
    
    # สรุปผล
    wins = [r for r in results if r["result"] == "WIN"]
    losses = [r for r in results if r["result"] == "LOSS"]
    total_pnl = sum(r["pnl"] for r in results)
    
    print(f"\n=== Backtest Results: {symbol} ({period}) ===")
    print(f"Total Trades: {len(results)}")
    print(f"Wins: {len(wins)} | Losses: {len(losses)}")
    print(f"Win Rate: {len(wins)/max(len(results),1)*100:.1f}%")
    print(f"Total P&L: ")
    print(f"Avg Win: ")
    print(f"Avg Loss: ")
    
    return results

# backtest_ds_zone("AAPL", "2y")

FAQ คำถามที่พบบ่อย

Q: Demand Supply Zone กับ Support Resistance ต่างกันอย่างไร?

A: Support Resistance เป็นเส้นเดียวที่ลากจากจุดที่ราคาเคยกลับตัว ส่วน Demand Supply Zone เป็นพื้นที่ที่มีความกว้าง ครอบคลุมทั้ง base ของราคา นอกจากนี้ zone ยังมีแนวคิดเรื่อง freshness คือ zone ที่ยังไม่เคยถูกทดสอบจะแข็งแกร่งกว่า ส่วน support resistance ไม่มีแนวคิดนี้

Q: ควรใช้ timeframe ไหนสำหรับ Demand Supply Zone?

A: zone ใน timeframe สูงกว่าเช่น Daily หรือ Weekly มีความแข็งแกร่งกว่า zone ใน timeframe ต่ำ แนะนำ multi-timeframe analysis คือหา zone ใน Daily/4H แล้วเข้า trade ใน 1H/15M เมื่อราคาเข้าใกล้ zone สำหรับ day trading ใช้ 1H เป็นหลักแล้วเข้าที่ 5M/15M

Q: Zone ที่ถูกทดสอบแล้วยังใช้ได้ไหม?

A: Zone ที่ถูกทดสอบ 1 ครั้งแล้วราคาเด้งกลับยังพอใช้ได้แต่ความน่าเชื่อถือลดลง zone ที่ถูกทดสอบ 2 ครั้งขึ้นไปมีโอกาสถูกทะลุสูงมากเพราะ institutional orders ส่วนใหญ่ถูก fill ไปแล้ว แนะนำให้เน้น fresh zones ที่ยังไม่เคยถูกทดสอบเลย

Q: จะหาข้อมูลราคาฟรีสำหรับฝึก Technical Analysis ได้ที่ไหน?

A: Yahoo Finance ผ่าน yfinance library ใน Python ให้ข้อมูลราคาหุ้นทั่วโลกฟรี TradingView ให้ดู chart ฟรีพร้อมเครื่องมือ TA ครบถ้วน Investing.com ให้ข้อมูลราคา forex และ commodities สำหรับ crypto ใช้ ccxt library เชื่อมต่อกับ exchange หลายแห่ง

📖 บทความที่เกี่ยวข้อง

demand supply zone indicatorอ่านบทความ → demand supply zoneอ่านบทความ → หนังสือ demand supply zoneอ่านบทความ → demand and supply diagramอ่านบทความ → การหา demand supply zoneอ่านบทความ →

📚 ดูบทความทั้งหมด →