PythonでMT5から取得する為替データは「始値」、「終値」、「高値」、「低値」です。このデータから「ローソク足」を構成する「陽線」、「陰線」、「上ヒゲ」、「下ヒゲ」の大きさを計算します。
陽線、陰線、上ヒゲ、下ヒゲを求める式
陽線・陰線の求め方
陽線(陰線)= 「終値」ー「始値」
※「終値」-「始値」の値が0より大きければ「陽線」とし、小さければ「陰線」とします。かつ0の場合は「同時線」とします。
上ヒゲの求め方
上ヒゲ = 高値 – (終値または始値のいずれかの大きい方)※終値と始値が同じの場合はどちらでもOKとします。
下ヒゲの求め方
下ヒゲ= (終値または始値のいずれかの小さい方) - 低値 ※終値と始値が同じの場合はどちらでもOKとします。
陽線・陰線、上ヒゲ、下ヒゲのイメージ図

陽線・陰線、上ヒゲ、下ヒゲをPythonのデータフレーム形式で求めるコーディング例
- 陽線(または陰線)を求めるシリーズを df[‘body’]とします。
- 上ヒゲを求めるシリーズをdf[‘hshadow’]とします。
- 下ヒゲを求めるシリーズをdf[‘lshadow’]とします。
以下のようなコーディングになります。
df['body']=df['close'] -df['open']
df['hshadow'] = df['high'] - np.where(df['body'] > 0,df['close'],df['open'])
df['sshadow'] = np.where(df['body'] < 0,df['close'],df['open']) - df['low']
ちなみに上ヒゲを求める為の条件をnumpyのwhereを使って判定させています。db[‘body’]が陽線の場合、df[‘high’]-df[‘close’]となり、陽線以外の場合は df[‘high’]-df[‘open’]となります。
同様に下ヒゲを求める為の条件をnumpyのwhereを使って判定させています。df[‘body’]が陰線の場合、df[‘close’]-df[‘low’]となり、陰線以外の場合はdf[‘open’]-df[‘low’]となります。
サンプルコード
PythonでMT5にアクセスして 2024/1/8の12時00分から12時10分までのUSDJPYのデータを1分間隔で取得します。取得したデータに対して、陽線(陰線)、上ヒゲ、下ヒゲを計算しデータフレームに追加するサンプルコードです。
import MetaTrader5 as mt5
import pandas as pd
from datetime import datetime
import pytz
import numpy as np
#loginidにはMT5にログインするためのloginid,ServerNameにはMT5のサーバー名,passwordにはそのパスワードを入力してください。
if mt5.initialize(login=loginid, server="ServerName",password="password") == False:
print (mt5.last_error())
exit()
timezone = pytz.timezone("Etc/UTC")
date_from = datetime(2024, 1, 8, 12,0, tzinfo=timezone) #2024/1/8 12:00
date_to = datetime(2024, 1, 8, 12, 10, tzinfo=timezone) #2024/1/8 12:10
ticks = mt5.copy_rates_range("USDJPY",mt5.TIMEFRAME_M1,date_from,date_to)
mt5.shutdown()
df = pd.DataFrame(ticks)
df['time']=pd.to_datetime(df['time'], unit='s')
df['body']=df['close'] -df['open']
df['hshadow'] = df['high'] - np.where(df['body'] > 0,df['close'],df['open'])
df['lshadow'] = np.where(df['body'] < 0,df['close'],df['open']) - df['low']
print(df)
実行結果
PS C:\Users\user> & C:/Users/user/AppData/Local/Microsoft/WindowsApps/python3.10.exe c:/Users/user/OneDrive/ドキュメント/python/sample1.py
time open high low close tick_volume spread real_volume body hshadow lshadow
0 2024-01-08 12:00:00 144.231 144.235 144.200 144.230 104 3 0 -0.001 0.004 0.030
1 2024-01-08 12:01:00 144.230 144.260 144.212 144.245 143 3 0 0.015 0.015 0.018
2 2024-01-08 12:02:00 144.248 144.289 144.248 144.287 159 3 0 0.039 0.002 0.000
3 2024-01-08 12:03:00 144.287 144.299 144.271 144.279 110 3 0 -0.008 0.012 0.008
4 2024-01-08 12:04:00 144.279 144.311 144.276 144.300 145 3 0 0.021 0.011 0.003
5 2024-01-08 12:05:00 144.300 144.300 144.288 144.291 106 3 0 -0.009 0.000 0.003
6 2024-01-08 12:06:00 144.291 144.320 144.291 144.308 113 3 0 0.017 0.012 0.000
7 2024-01-08 12:07:00 144.309 144.314 144.287 144.290 128 3 0 -0.019 0.005 0.003
8 2024-01-08 12:08:00 144.290 144.313 144.285 144.311 166 3 0 0.021 0.002 0.005
9 2024-01-08 12:09:00 144.312 144.314 144.285 144.296 144 3 0 -0.016 0.002 0.011
10 2024-01-08 12:10:00 144.294 144.308 144.280 144.282 155 3 0 -0.012 0.014 0.002
無事に陽線・陰線(body)、上ヒゲ(hshadow)、下ヒゲ(lshadow)を求めることができました。