2022年11月12日土曜日

過去データーの前処理 MT4からDLしたデーターが100万行を超える時

 MT4の過去データーをCSVにダウンロードしてEXCELで分析します。

EXCELは100万行(正確には104万8576行)までしか取り扱うことができません。

MT4からDLしたCSVは古いデータから新しいデータの順で並んでいるため、最近のデーターが削除されます。

ex.)2005.1~のM5のデーターをエクセルで開けると2019.5までしか入りません。

そこで、EXCELをつかって新しい方から順にデーターが残るようにします。

①エクセルを立ち上げる → 「データ」 →「テキストまたはCSVから」

②ファイルを選んで「インポート」

以下のようなサブ画面が立ち上がります。


③「データーの変換」

Power Queryエディターが立ち上がります。


④Coloum1の▼をクリック → 「降順で並び替え」

⑤左上「閉じて読み込む」をクリック

しばらく待ちます。(30秒-1分程度)

このクエリによって返されたデータはワークシートに入り切りません。が表示されたら「OK」をクリック

タブが増えてデーターが入ります。

テーブルに、なっているため色がついています。

日時もしっかり、EXCEL形式に変換されます。嬉しいおまけです。





2022年10月28日金曜日

MT5をPYTHONで操作しよう②

 前回はPythonでMT5にログインをしました

MT5TOKIO MT5をPYTHONで操作しよう①

今日はMT5からデーターを取得しグラフにします。

①初期設定

#pip install MetaTrader5

import MetaTrader5 as mt5

from datetime import datetime

import matplotlib.pyplot as plt

mt5.initialize()

詳しくは前回の記事を御覧ください。

②過去データーの取得

copy_rate_range()に通貨ペア 時間足 取得開始日時 取得終了日時を与えます。

usdjpy = mt5.copy_rates_range("USDJPY.ps01",mt5.TIMEFRAME_M1,datetime(2022,10,15,20), datetime(2022,10,24,12))

※通貨ペアはUSDJPYだけでなくサフィックス(今回はフィリップ証券を使用していますので.ps01)が必要です。
時間足の記述はmt5.TIMEFRAME_xxです。
取得開始日時、取得終了日時はdatatime を使用します。

作画についてはmatplotlibを調べてください。

MT5はスプレッドが記録されるのが特徴ですので、介入時のスプレッドを見てみます。

赤線:USDJPYレート
青線:スプレッド

介入時にスプレッドがおもしろい上がり方をしています。
Pythonはデーターの扱いが簡単ですので、MT5では苦労することも簡単にできますね

全コード

#pip install MetaTrader5
import MetaTrader5 as mt5
from datetime import datetime
import matplotlib.pyplot as plt
mt5.initialize()
usdjpy = mt5.copy_rates_range("USDJPY.ps01",mt5.TIMEFRAME_M1,datetime(2022,10,15,20), datetime(2022,10,24,12))
close=[]
spread=[]
for i in list(usdjpy):
    close.append(i[1])
    spread.append(i[5])
fig = plt.figure()
ax1 = fig.subplots()
ax2 = ax1.twinx()
ax1.plot(close,color="red")
ax2.plot(spread,color="blue",lw=1)
plt.show()
mt5.shutdown










2022年10月26日水曜日

MT5をPYTHONで操作しよう①

MT5はEA開発者にとって最適化が複数のコアででき時間短縮のメリットがありますが、コードがややこしいことは大きなハードルになっていると思います。

そのためかMT5にはcTrader ライブラリーが標準で組み込まれていたり、Pythonで操作できるパッケージが用意されています。

今回はPythonをつかってMT5にログインをします。


環境

MT5(フィリプ証券)build 3446
Windows 11 Pro 21H2 22000.1098
Jupyter Lab 3.2.9
Python 3.8.10


準備①

MT5の設定

「ツール(T)」→「オプション(O)」



アルゴリズム取引を許可にチェックを入れる
外部Python APIを介したアルゴリズム取引を無効にするのチェックを外す




準備② ライブラリーのインストール

pip install MetaTrader5

※pipが古くつまずきました うまくいかない特はアップグレードしてください。


MT5の接続

import MetaTrader5 as mt5

mt5.initialize()


initialize()でMT5と接続されます。成功したときはTrueが表示されます。

※MT5が起動していないときは最後に起動したMT5が起動します。

PCに複数のMT5をインストールしてあり、起動したいMT5を指定する場合

mt5.initialize('C: ~フルパス~')


MT5 バージョンの確認

mt5.version()

結果は(500, 3446, '24 Sep 2022')が返ってきました。


MT5 ログイン 

mt5.login( xxxxxxx, password="yyyyyyy", server="trading.phillip-mt5.jp:443")

ログイン情報を入れてください。 xxxxxxxx はログイン:に入れる値 yyyyyyはパスワード:に入れる値 serverはサーバー:に入れる値です。


※ログインしなくても価格などは取得できるようです。
ログインすることで取引ができるようになります。












2022年10月25日火曜日

為替介入について

 最近為替介入で相場が楽しくなってきています。

あらためて介入ってなんだろうと思い整理をしてみました。


為替介入とはなんですか 日銀

目的:為替相場の急激な変動を抑え、その安定化を図ること

※目的は価格操作ではなく、ボラティリティを抑えることです。

誰がする:財務大臣の判断で日銀、もしくは海外の通貨当局が実行します。

資金は?:円安の場合 外為特会の保有するドル資金を売却して、円を買い入れる

※資金は無限ではないようです。19兆円(日経新聞)程度との予測もあります。
9/22 2.8兆円(Bloomberg) 10/21 5.5兆円(毎日新聞
残り10.7兆 22日も大きな動きがありましたのでもう資金が底をついているかもしれません。


過去の介入状況は?

ドル買いの日別介入日回数です。
報告は1日に複数回介入してもまとめられますので日別でだしています。


輸入業者は支払い日までにドルを手に入れる必要があります。
締め日が多い25日に介入が少ないのは日銀の配慮でしょうか

今回のような円買いの介入は32回しかありませんので、データとして貧弱です。

曜日別

※月金が多いようです。


今回も10/21(金) 10/25(月)でしたね。

 



2022年8月25日木曜日

SAXO BANK APIの接続 for Excel

SAXO BANK証券

SAXO BANK証券(以下SAXO)はデンマークの会社です。SAXOさんが作った会社らしいのですが、SAXO性はアングロサクソンのサクソン、ザクセン人でイギリスに渡らなかった人の末裔と思われます。
話がそれましたが、SAXOは米株オプションやが通貨オプションなど商品が豊富です。さらにFXは月朝3、4時から取引開始とかなりチャレンジャーな会社です。(MT4は普通です)
ツールも豊富ですが、9月頭でMT4は一部利用者以外終了の予定です。代わりになにかできないかと相談したところAPIを教えていただいたので接続までを紹介します。今回はEXCELにポジションを表示する方法です。まぁ、英語のマニュアルがあるのでその通りやるだけですが、引っかかったところなどありますのでお役に立てば幸いです。



①SAXO TRADERGOにログイン


英語のマニュアルはDEMO口座ですがこちらは本番口座で進めます。



②APIの使用を有効にする

「口座管理」 → Open API Data Access「開く」 → 「有効にする」
*無効にするとなっていた場合は、既に有効になっています



③Add-inのダウンロード

以下リンクからダウンロードします。
32ーBitと64ーBitがあります
解凍して保存してください
ファイル名はOpenApi-AddIn-64bits.xll 
拡張子xll はEXCELアドインです




④Add-Inのインストール

EXCEL起動 → 左下「オプション」 →左下「アドイン」 → 管理「設定(G)...」 → 「参照」ダウンロードしたOpenApi-AddIn-64bits.xll が保存されている場所に移動 →「OK」

OpenApi-AddIn-64bits.xllを起動 
ログインします
リボンの「OpenApi」 → 「LogIn」
※デモ口座の時は「SIM」本番口座の時は「LIVE」を選んでください

ログイン後「ファイル」 → 「空白のブック」を作成
「Formula Builder」が押せるようになりますので押下

Service , Endpoint のプルダウンを画像と同じようにセット
Fields に画像と同じように8個追加
最後に右下「Insert Formula」を押下


先ほど作成した空白のブックにポジション情報が表示されます。
※ポジションを持っていない時はなにも表示されません。




「おまけ」途中ハマったところ
・英語のマニュアルはDEMO口座での解説でしたので、本番口座で使う方法がわからずなやみました。SAXOに確認したところSIMをLIVEに変更するとできると教えていただきました。
・最後の画像は本番口座ですが、はじめはデモ口座で進めました。ポジションが表示されずなやみましたが、ポジションを持っていないことに気が付きSaxoTraderGoで発注したところすぐにEXCEL側に表示され解決



手順どおりやれば簡単です。ポジション管理などに便利ではないでしょうか
また、自動売買も可能なようですのでMT4の代わりにチャレンジするのも面白いかもしれません。

























2022年7月11日月曜日

上位足の過去データ取得問題

 M1で動作するEAでM5のデータを参照する時

EAをM1のチャートのセットしてからM5のデータをダウンロードするのに数ティック時間が必要です。

上位足のデータがダウンロード済みの場合は問題ありませんが、ダウンロードまでの数ティックに誤動作が発生しないように気をつける必要があります。

2022年6月2日木曜日

バックテストレポート MODIFYの削除

とあるバックテストの分析を試みたのですが、ファイルサイズが250Mと巨大でした。

原因はmodifyが大変多く、容量、行数ともに膨大に

そこで、modifyの行をPythonで削除することにしました。

以下コード

inputFile = r'StrategyTester.htm'       # 読み込みファイル
outputFile = r'StrategyTesterNew.htm'   # 書き込みファイル
for line in open(inputFile):
    if 'modify' in line:
        continue
    else:
        with open(outputFile, mode='a') as f:
            f.write(line)


コードはこちらを参照させていただきました。
ありがとうございます。

https://akatsuki1024.hatenablog.com/entry/2020/12/13/201612



上:オリジナル

下:MODIFY削除

容量が98%減できました!


2022年4月24日日曜日

HST ヒストリカルデータの変換 hst(MT4)⇒ hst(MT5) 作ってみよう構想の巻

PANDAの作者、仮称P氏と食事・情報交換にいきました。

話題はMT5の最適化

MT4と比べて早いよね的な話ですが、スプレッドが壁です。

MT4の最適化、バックテストはスプレッドを試験前に指定します。
MT5は過去データーにスプレッドが入っているため変更ができません。

MT5は通貨ペアを作成し希望のスプレッドのデーターをインストールする必要があります。

流れはこうなります。

  • MT4のHSTをDL
  • MT4へインストール
  • MT4からCSVでDL
  • エクセルでスプレッドを追記
  • MT5へインストール

なれれば大したことはないのですが、21世紀に人が手でする作業ではありません。

DL後に変換するプログラムがあれば3工程になります。

  • MT4のHSTをDL
  • 変換
  • MT5へインストール
※DLしZIP解凍も自動化できますが、ヒストリカルデータにも著作権がありますのでやめておきます。

プログラムの流れは以下になります。
  1. 画面の作成
    • 画面
    • スプレッド入力
    • 開始ボタン
  2. HSTをドロップされたら受け取る
    • 拡張子がHSTでない時はエラー出力
  3. TickVol作成(volumeのコピー)
  4. Spreadの入力(1で入力された値)
  5. CSVの作成

つづく




2022年4月20日水曜日

過剰最適化発見ツール バクフィックス

 バグに関する情報をいただきました。

「こつめ」さん情報をありがとうございます!

取引履歴にmodifyがあると正しく動きませんでした。m(_ _)m


OverFittingCHK5 (ver4)を作成しましたのでこちらをご利用ください。

OverFittingCHK5 

修正点

①modifyがあっても正しく計算できるように修正

②取引数が少ないデーターにアラートを出力

偶数日、奇数日、偶数月、奇数月の取引がない場合エラーが出ます。

③バックテストデータ以外をコピーしていたときにアラートを出力




①②③ともにエラーが出ていました。エラーが出ても何もわからないので、困惑されたと思います。①は修正、②③はアラートがでてわかりやすくなったと思います。


小噺(いいわけ?)
①MT4のバックテストデータのエントリーとクローズを比較して成績を出しています。
  • 一対一の場合 エントリーした取引の番号が1の場合、クローズ取引の番号も1で出力されます。
  • 分割クローズした場合 エントリーしたのが取引番号1の場合、一部クローズした時に全ロットが取引番号1でクローズし、残りを取引番号2でエントリーしたように出力します。
  • modifyが入った場合 エントリーしたのが取引番号1の場合、モディファイも取引番号1で出力されクローズ取引の番号も1で出力されます。3つになったのでエラーが出ました。完全な私のミスです。
②modifyデバッグ用に短い取引EAを作りました。
エントリー、モディファイ、クローズを1回して終わります。
偶数日の取引がなくエラーが出ました。
対象の取引数がないときにはエラーが出ることに気が付きました。修正も考えたのですが、そもそも取引数の少ないバックテストを分析する理由がないと思い。アラートを出力するようにしました。

③バックテストデーター以外をコピーしていた時
エラーが出ていましたが、ローンチを急いでいて忘れていました。(←完全な言い訳)

ブログでアップデートをしていくとどれが最新かわからなくなるのでDL用ページをそのうち作ろうと思います。



ファイル名は~CHK5ですがバージョンは4です。
CHKは1から数え始め バージョンは0から数えてしまいました。
こちらもそのうち修正します。






2022年4月18日月曜日

過剰最適化発見ツール Over Fitting CHK

Pythonで過剰最適化発見ツールを作成
無料公開します。

BETA版の位置づけです。
バグなどありましたら教えてください。


使い方

①MT4で気になるEAのバックテストをする

②「結果」タブへ移動し右クリック

「全てコピー(y)」










③OverFittingCHK.exeを起動

数秒から1、2分かかります。
開発環境i5-9400F 2.9GHz RAM16.0GB win11Pro
2005-2022.4 3600取引で10秒程度です。

※必ずコピーしてから起動してください


全取引、偶数日だけ、奇数日だけ、偶数月、奇数月だけの成績を出力します。

損益が一つでもマイナスになるようなEA、
また最大DDが極端になる場合(特にナンピン系)は使用を検討しましょう

OFC(OverFittingChecker)ver3DownLoad 古いバージョンですmodifyでエラーが出ます


著作権など
無料で配布していますが、著作権は放棄していません。
再配布、DL直リンクはご遠慮ください。


バックテストは好成績なのに運用すると大きなDD が出る。

この原因は過剰最適化です。その原因の一つは試験取引数の少なさです。

例えばこういったケースです。10年で1,000取引するEA DDは50,000 これにフィルターを付けると取引数は10減少して990 DDは30,000になりました。

DDは減っていますが、このフィルターが影響を及ぼしたのはわずか10取引です。
こういった影響の少ないフィルターは過剰最適化を招きます。

今回配布のOFCは特定の日にちだけで動かした場合の成績を表示します。

100%過剰最適化を発見できるものではありませんが、これで発見できるものもあります。


アウトオブサンプル試験

アウトオブサンプル試験は例えば偶数日で最適化をし奇数日で確認をします。
今回のOFCは全期間で最適化したものを偶数日、奇数日に分けます。

・アウトオブサンプルのメリット

偶数日で最適化をした場合、奇数日の取引は全く考慮されていないので、奇数日でバックテストをした時に過剰最適化になりにくい

・OFCのメリット

全期間で最適化をするため対象取引数が多い

一長一短ですがアウトオブサンプルする方もしない方もOFCで試験をする勝ちはあると思います。

(おまけ)

アウトオブサンプルをするときには以下のコードを使っています。
今回のOFCと似たような使い方も可能です。


input int MODE=0;
void OnTick(){
   // MODE== 0 is ALL
   if(MODE== 1&&Month()%2==0)return;//奇数月
   if(MODE== 2&&Month()%2!=0)return;//偶数月
   if(MODE== 3&& Year()%2==0)return;//奇数年
   if(MODE== 4&& Year()%2!=0)return;//偶数年
   if(MODE== 5&&DayOfWeek()<=3)return;//月火水
   if(MODE== 6&&DayOfWeek()>=4)return;//木金
   if(MODE== 7&&(Year()+Month())%2==0)return;//年+月奇数
   if(MODE== 8&&(Year()+Month())%2!=0)return;//年+月偶数
   if(MODE== 9&&(Year()+DayOfWeek())%2==0)return;//年+曜日奇数
   if(MODE==10&&(Year()+DayOfWeek())%2!=0)return;//年+曜日偶数
   if(MODE==11&&(Month()+DayOfWeek())%2==0)return;//月+曜日奇数
   if(MODE==12&&(Month()+DayOfWeek())%2!=0)return;//月+曜日偶数

課題

・コピペだけでなく、バックテストファイルでもデータを渡せると便利

・それぞれのチャートが出せると視覚的にわかる

・計算時間の高速化

・複数ポジションの場合 分けた結果が破綻しても終了しない

・偶数奇数日、月 だけでなくいろいろな組み合わせを出力

進めていくとQAのようになるかもしれません。
根気の続く限り進めていきたいと思いますので応援してください!

みんなで儲かりますように!


バージョン

最新バージョンから3つ古くなると動かなくなります。
バージョンアップを即すメッセージが出たときには最新版をDLしてください




セキュリティの警告について(2022.4.19追記)

exeファイルをダウンロードして使用する時に警告が出ることがあります。

 以下WINDOWS11の画面です
11以外の場合画面が少し異なりますが、詳細情報を押し、実行を押すことで使用できます。「実行」が出てこない(「実行しない」だけ表示される)場合はググって調べてみてください。「セキュリティ」、「SmartScreen」、「WindowsによってPCが保護されました」で検索するとすぐに見つかると思います。






バグ情報(2022.4.19追記)
modify が入っているとエラーが出ます。
情報をご提供いただきました「こつめ」さん
ありがとうございます!!
できるだけ早く修正します。



2022年4月4日月曜日

過剰最適化回避

 過剰最適化を避けることはEA開発者にとって非常に重要です。
最適化を繰り返し完成したEAの成績が出ない。
これは誰もが経験をすることだと思います。

大きな原因の一つは取引数が少ないことです
1つのロジックで数百程度の取引数は必要です。

この条件をクリアをしている人が多いと思いますが、
逆に取引を減らすときにもある程度の取引数が必要です。

例えば、フィルターを付けて成績が良くなったとします。
そのフィルターで取引数が20減りました。

しかし20しか減ってないのでしたらこれは再現性の乏しい過剰最適化です。

フィルターを付けるときにも100程度の取引に影響があるものを使いましょう。

しかしどうしても取引数が足りない時があります。
そんな時の最適化方法を紹介します。


過去データーの前処理 MT4からDLしたデーターが100万行を超える時

 MT4の過去データーをCSVにダウンロードしてEXCELで分析します。 EXCELは100万行(正確には 104万8576行)までしか取り扱うことができません。 MT4からDLしたCSVは古いデータから新しいデータの順で並んでいるため、最近のデーターが削除されます。 ex.)2...