この度、ナンピン幅および利確幅をATRに連動させて、破綻リスクを確率的に制御するナンピンマーチン型のFX自動売買ツール(EAまたはBOT)の開発を行いました。
この記事は、前回の記事の続きです。
MQL5で開発しMT5で稼働させるEA、MQL4で開発しMT4で稼働させるEA、Pythonで開発しMT5のPython APIを利用して稼働させるBOT、とそれぞれ用意しているのですが、この記事ではそのEAまたはBOTの開発における思考過程を少しずつ具体的に記事にしていきたいと思います。
なお、作成したMT5用EAとMT4用EAについては、以下からダウンロード可能です。
前回まで
勝率試算用関数の定義
以下のような関数を定義しました。
@numba.njit
def calc_result(op=None, lo=None, hi=None, lc_range=None, tp_range=None):
y = op.copy()
y[:] = np.nan
for i in range(op.size):
lc_price = op[i] - lc_range
tp_price = op[i] + tp_range
for j in range(i + 1, op.size):
if lo[j] < lc_price:
y[i] = -1
break
if hi[j] > tp_price:
y[i] = 1
break
return y
- 毎分op(始値)でエントリーしたとする。
- 利確価格(tp_price)をエントリープライス(op)からtp_rangeだけ離れた位置に設定
- ロスカット価格(lc_price)をエントリープライス(op)からlc_rangeだけ離れた位置に設定
- 次以降の分足を順番に見ていって、利確とロスカットどちらの価格に先に到達するか判定
というような処理を行う関数になっています。
勝率の試算結果
まずは、lc_range=0.85, tp_range=1.15,
と、スプレッド分だけエントリー価格をずらしたような設定で試算してみると結果は以下の通りになりました。
勝率を高める工夫を加えてみる
さて、これまではかなり単純な、相場が完全なランダムであるという前提でしか考えていませんでしたが、実際はそんなことはないと思います。そこで、エントリー条件をもう少し工夫してみて、勝率がどの程度変わるのかについて分析してみたいと思います。
Ta-Libでテクニカル指標を計算
さて、PythonではTa-Libという外部ライブラリが存在し、主要なテクニカル指標を簡単に計算することが可能です。
そこでここでは、Google ColabでTa-Libを使用する方法をご紹介します。
ta-libをGoogle Colabにインストール
以下をコードセルにコピペし、実行します。
!curl -L http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz -O && tar xzvf ta-lib-0.4.0-src.tar.gz
!cd ta-lib && ./configure --prefix=/usr && make && make install && cd - && pip install ta-lib
結構長めのインストール処理が動きます。しばらく待ちましょう。(私の環境でも、1分とかでは終わらないくらい結構長めです。)
あとは、以下のコマンドを実行してみて、エラーなくインポート出来れば、問題なくインストール出来ているはずです。
import talib
talibでATRを計算
それでは、talibを用いて、テクニカル指標を計算して見ましょう。
基データは、前回の記事でも使用したGOLD#の1分足です。
以下の関数を定義します。
def calc_indicators(df):
open = df['Open']
high = df['High']
low = df['Low']
close = df['Close']
ATR = talib.ATR(high, low, close, timeperiod=14)
df['ATR'] = ATR
return df
これだけです。中身を簡単に解説します。
まず、四本値が入っているdfをインプットにして、open,high,low,closeを取得します。
そして、「talib.ATR」というtalibに用意されているATR取得用関数を用いて、ATRを取得します。この際、timeperiodというのがATR期間を設定する部分です。ここでは、一般的な14を設定しています。
最後に、dfの’ATR’というカラムにATRを追加します。
returnとして返ってくるのは、以下のようにATRが追加されたdfです。
14分間の値をインプットとするので、最初のうちはATRがNaNとなっていますが、ATRを正しく取得出来ていることが確認できます。
複数のテクニカル指標を計算
さらに、MA,RSI,ADX,+DI,-DIも計算して見ましょう。
def calc_indicators(df):
open = df['Open']
high = df['High']
low = df['Low']
close = df['Close']
median = (high+low)/2
#talib
MA = talib.SMA(median, timeperiod=14)
RSI = talib.RSI(close, timeperiod=14)
ADX = talib.ADX(high, low, close, timeperiod=14)
pDI = talib.PLUS_DI(high, low, close, timeperiod=14)
mDI = talib.MINUS_DI(high, low, close, timeperiod=14)
ATR = talib.ATR(high, low, close, timeperiod=14)
df['MA'],df['RSI'],df['ADX'],df['pDI'],df['mDI'],df['ATR'] = MA,RSI,ADX,pDI,mDI,ATR
return df
以上の通り、talibを使えば結構簡単に、barデータ(四本値データ)にテクニカル指標を追加することが可能です。
以下のように、各種テクニカル指標を計算できました。
この後は、このテクニカル指標を勝率試算用関数を組み合わせて、テクニカル分析が勝率にどのように影響するかを分析してみたいと思います。