PythonでMT5から取得した始値、終値、高値、低値から陽線、陰線、上ヒゲ、下ヒゲのサイズを求める方法

PythonMT5連携

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)を求めることができました。

タイトルとURLをコピーしました