ローソク足 パターンを SVG ファイルで出力する

基本

日の丸坊主大陽線小陽線陽のカラカサトンカチ(陽)陰の丸坊主大陰線小陰線陰のカラカサトンカチ(陰)トンボ十字線塔婆一本線
import svgwrite

# SVG設定(幅拡張!)
width = 1400
height = 300
dwg = svgwrite.Drawing("candlestick_patterns.svg", size=(width, height))

# パターン定義(名前, open, high, low, close, 色)
patterns = [
    # 強気パターン(赤)
    ("日の丸坊主", 100, 120, 100, 120, '#f44336'),
    ("大陽線", 105, 120, 100, 115, '#f44336'),
    ("小陽線", 108, 112, 106, 110, '#f44336'),
    ("陽のカラカサ", 110, 112, 100, 111, '#f44336'),
    ("トンカチ(陽)", 111, 120, 111, 112, '#f44336'),

    # 弱気パターン(青)
    ("陰の丸坊主", 120, 120, 100, 100, '#2196f3'),
    ("大陰線", 115, 120, 100, 105, '#2196f3'),
    ("小陰線", 110, 112, 106, 108, '#2196f3'),
    ("陰のカラカサ", 111, 112, 100, 110, '#2196f3'),
    ("トンカチ(陰)", 112, 125, 112, 113, '#2196f3'),

    # 陰陽なし(黒)
    ("トンボ", 110, 110, 100, 110, 'black'),
    ("十字線", 110, 115, 105, 110, 'black'),
    ("塔婆", 110, 125, 110, 111, 'black'),
    ("一本線", 110, 110, 110, 110, 'black'),
]

# スケール設定
price_min = 95
price_max = 130
price_span = price_max - price_min
y_top = 20
y_bottom = 220

def price_to_y(p):
    return y_bottom - ((p - price_min) / price_span) * (y_bottom - y_top)

# 描画ループ
x = 40
for name, open_, high, low, close, color in patterns:
    x_center = x + 5
    y_open = price_to_y(open_)
    y_close = price_to_y(close)
    y_high = price_to_y(high)
    y_low = price_to_y(low)

    body_top = min(y_open, y_close)
    body_bottom = max(y_open, y_close)
    body_height = body_bottom - body_top

    # 一本線(特別処理)
    if "一本線" in name:
        y = y_open
        dwg.add(dwg.line(start=(x_center - 10, y), end=(x_center + 10, y), stroke='black', stroke_width=2))

    else:
        # 胴体調整(Dojiなど)
        if open_ == close:
            body_height = 1
            body_top = y_open - 0.5
            body_bottom = y_open + 0.5
        elif body_height == 0:
            body_height = 1
            body_top -= 0.5

        # ヒゲ調整
        if "カラカサ" in name:
            y_high = y_open  # 上ヒゲなし
        if "トンカチ" in name:
            y_low = y_close  # 下ヒゲなし
        if "塔婆" in name:
            y_low = y_close  # 下ヒゲなし
        if "トンボ" in name:
            y_high = y_open  # 上ヒゲなし

        # ヒゲ(中央から上下に)
        dwg.add(dwg.line(start=(x_center, y_high), end=(x_center, body_top), stroke='black', stroke_width=1))
        dwg.add(dwg.line(start=(x_center, body_bottom), end=(x_center, y_low), stroke='black', stroke_width=1))

        # 胴体
        dwg.add(dwg.rect(insert=(x, body_top), size=(10, body_height), fill=color, stroke='black'))

    # 名前ラベル
    dwg.add(dwg.text(name, insert=(x_center, y_bottom + 15), font_size='10px', text_anchor='middle'))

    x += 70

# 保存
dwg.save()
print("SVGファイル 'candlestick_patterns.svg' を生成しました!")

応用

三山三川三兵三空三法包み足はらみ線
import svgwrite

dwg = svgwrite.Drawing("sakata_gohou_extended.svg", size=(1000, 300))

# スケール設定
price_min = 90
price_max = 130
y_top = 20
y_bottom = 220
price_span = price_max - price_min

def price_to_y(p):
    return y_bottom - ((p - price_min) / price_span) * (y_bottom - y_top)

# パターン定義(ラベル, [ローソク足(open, high, low, close, 色)])
patterns = [
    ("三山", [
        (110, 115, 108, 114, '#f44336'),
        (114, 110, 106, 108, '#2196f3'),
        (108, 113, 107, 112, '#f44336'),
    ]),
    ("三川", [
        (100, 104, 98, 102, '#2196f3'),
        (102, 106, 100, 105, '#f44336'),
        (105, 103, 99, 101, '#2196f3'),
    ]),
    ("三兵", [
        (100, 105, 98, 104, '#f44336'),
        (104, 110, 102, 109, '#f44336'),
        (109, 115, 107, 114, '#f44336'),
    ]),
    ("三空", [
        (100, 105, 98, 104, '#f44336'),
        (110, 115, 108, 114, '#f44336'),
        (120, 125, 118, 124, '#f44336'),
    ]),
    ("三法", [
        (100, 105, 98, 104, '#f44336'),
        (104, 106, 103, 105, '#999999'),
        (105, 110, 104, 109, '#f44336'),
    ]),
    ("包み足", [
        (110, 115, 105, 108, '#2196f3'),
        (107, 118, 102, 117, '#f44336'),
    ]),
    ("はらみ線", [
        (107, 118, 102, 117, '#f44336'),
        (110, 115, 105, 108, '#2196f3'),
    ]),
]

x_start = 40
for label, candles in patterns:
    x = x_start
    for open_, high, low, close, color in candles:
        x_center = x + 5
        y_open = price_to_y(open_)
        y_close = price_to_y(close)
        y_high = price_to_y(high)
        y_low = price_to_y(low)

        body_top = min(y_open, y_close)
        body_bottom = max(y_open, y_close)
        body_height = body_bottom - body_top
        if open_ == close:
            body_height = 1
            body_top = y_open - 0.5
            body_bottom = y_open + 0.5

        # ヒゲ
        dwg.add(dwg.line(start=(x_center, y_high), end=(x_center, body_top), stroke='black', stroke_width=1))
        dwg.add(dwg.line(start=(x_center, body_bottom), end=(x_center, y_low), stroke='black', stroke_width=1))

        # 胴体
        dwg.add(dwg.rect(insert=(x, body_top), size=(10, body_height), fill=color, stroke='black'))
        x += 20

    # ラベル
    dwg.add(dwg.text(label, insert=(x_start + 10, y_bottom + 15), font_size='12px', text_anchor='start'))
    x_start += 140

# 保存
dwg.save()
print("SVGファイル 'sakata_gohou_extended.svg' を生成しました!")

Python,

Posted by eightban