取引履歴をCSV出力するスクリプト(期間指定のみ)

CSV分析

どうも!和菓子職人トレーダー潤奈です( ゚Д゚)
今回はMT4に記録されている指定した期間の取引履歴をCSV出力するスクリプトを作成したいと思います。

スポンサーリンク

MetaEditorで作成

今回のコードはスクリプトになりますので、MetaEditorで作成する際には「スクリプト」を選択して作成して下さい。

各コード説明

プロパティを追加

上から4行は作成された時点で記載されていますので、追加するのは5行目の#property show_inputsです。

このshow_inputsを設定しておくと、スクリプト実行前にパラメータ等の設定ウインドウが開きます。

EAやインジケーターでは必ず表示される画面ですが、スクリプトではこの設定をしておかないとパラメータ等の設定ウインドウが開かずに処理を開始してしまいます。

パラメーターを設定

今回はシンプルに出力する取引期間(決済時間基準)の開始と終了の年月日を選択できるようにします。

それぞれの単語の説明は以下になります。

要素単語説明
変数inputパラメーターとして変更可能にする為に必要
変数ReportFromDate期間開始日を記録する変数
変数ReportToDate期間終了日を記録する変数
D’2022.01.01′D’年月日’で記述

オリジナル関数の事前準備

今回のコードで使用するオリジナル関数は通貨ペアの価格の精度(小数点以下の桁数)を取得する関数です。
損益pointをPipsに変換する際に必要になります。

AdjustPoint()関数に通貨ペアの情報を渡し、MarketInfo()関数で小数点以下の桁数を取得します。
switch処理で該当の値を取得します。

要素単語説明
オリジナル関数AdjustPoint()pointとPipsの相互に変換する為の値を取得する関数
変数Currency渡された通貨ペアを保存
変数SymbolDigits通貨ペアの小数点以下の桁数を保存
関数MarketInfo()「気配値表示」ウインドウに表示されている様々な情報を取得
プロパティMODE_DIGITS通貨ペアの小数点以下の桁数
処理return()内の値をAdjuctPoint()関数の戻り値として返す
処理breakswitch,while,do while,forのループ処理から抜ける

OnStart()内のコード作成

メインとなるコードはOnStart()内に記述します。

取引履歴の数を確認

OrdersHistoryTotal()関数で決済済み注文の数を取得できます。
その数が0以下の時にPrint()関数で通知して、returnで処理を終了させます。

要素単語説明
変数historyTotal決済済み注文数を記録する変数
関数OrdersHistoryTotal()決済済み注文数を取得
関数Print()エキスパートログに表示
処理return関数の実行を終了

CSV出力ファイルの名前を作成

CSV出力ファイルの名前をfileName変数に+=で連結させて作成します。
最後に”.csv”を連結させるのを忘れないように!

要素単語説明
変数fileNameCSVファイル名を記録する変数
関数Year()最後に受信したサーバー時間の年を取得
関数Day()最後に受信したサーバー時間の日を取得
関数Hour()最後に受信したサーバー時間の時を取得
関数Minute()最後に受信したサーバー時間の分を取得
関数IntegerToString()int型のデータを文字列に変換

CSVファイルを作成

今回では同じ名前で作成される事はそうないですが、テンプレとして削除して新規作成します。
FileOpen()関数で作成に失敗したらINVALID_HANDLE定数が返ってくるので、失敗した場合にPrint()関数で通知して、returnで処理を終了させます。

要素単語説明
変数fDeleteFileDelete関数の戻り値を保存
関数FileDelete()指定したファイルを削除
変数fFileFileOpen関数の戻り値を保存
関数FileOpen()指定したフラグでファイルを作成・開く
定数INVALID_HANDLE無効なハンドル

ヘッダーを作成

横に長くてすみません。
header変数に,(カンマ)で文字を区切って保存します。
※最後に“\n”を追加する事で改行が行われます。
それをFileWriteString()関数を使ってCSVファイルに書き込みます。

要素単語説明
変数headerヘッダー名を保存
関数FileWriteString()文字列データを書き込む

決済済み注文を検索して書き込む

for文を使って決済済み注文数を検索します。
まず初めにOrderSelect()で決済済み注文を確認しますが、失敗した時にはfalseが返されるのでそれを!OrderSelect()と「!」を付ける事で結果が反転します。
つまり失敗した時はfalse→tureに代わるので、if文の条件を満たしcontinue処理されて、for文のループ処理の始めに戻ります。

要素単語説明
関数OrderSelect()注文データを選択
処理continuewhile,do while,forのループ処理の始めに戻る
変数historyCSVに書き込むデータ保存用
定数NULL空の定数
変数closeTime注文の決済時間を保存
関数OrderCloseTime()注文の決済時間を取得

次に取得した決済時間が指定期間の決済済み注文か確認して期間内であれば中の処理へ移ります。
history変数にデータを+=と+で連結させながら入れていきますが間に,(カンマ)入れる事を忘れないようにして下さい。
各関数を使用して取得したデータを連結していくだけですが、加工が必要な所を説明します。

<注文タイプ>条件演算子(?と:)を使います。
始めの条件式に合致すれば「?」の後の値を代入し、合致しなければ「:」の後の値を代入します。
つまり、注文タイプがOP_BUYだった場合は“BUY”を代入し、違う場合は“SELL”を代入します。

<損益Pips>注文タイプによって計算式が異なりますので、switch処理を使います。
switch処理でBUYかSELLか判定して、エントリー価格と決済価格の差を求め、AdjustPoint()の値を割って求めて、それをtakePrice変数に代入します。
break処理でswitch処理から抜けるのを忘れないようにして下さい。

最後に連結したデータをCSVへ書き込みます。

要素単語説明
関数OrderTicket()注文のチケット番号を取得
関数OrderType()注文の注文タイプを取得
プロパティOP_BUY買いの成行注文
プロパティOP_SELL売りの成行注文
関数OrderSymbol()注文の通貨ペア名を取得
関数OrderLots()注文のロット数を取得
関数OrderOpenTime()注文の注文時間を取得
関数OrderOpenPrice()注文の注文価格を取得
関数OrderCloseTime()注文の決済時間を取得
関数OrderClosePrice()注文の決済価格を取得
変数takePrcie損益Pipsの保存用
処理breakswitch,while,do while,forのループ処理から抜ける
関数NormalizeDouble()小数点以下を指定した桁数で丸めます
関数OrderCommission()注文の手数料を取得
関数OrderSwap()注文のスワップを取得
関数OrderProfit()注文の損益を取得
関数OrderMagicNumber()注文のマジックナンバーを取得
関数OrderComment()注文のコメントを取得

CSVファイルを閉じる

for文の処理が終わり抜けた後、最後はCSVファイルを閉じます。
※これは必ず忘れない事!閉じ忘れると開いたMT4以外で対象ファイルが操作出来なくなります。

MassegeBox()で通知を行います。Print関数よりこっちの方が処理が完了した事を視覚で確認が出来る為です。

ファイルの保存場所

CSVファイルは、MT4メニューの「データフォルダを開く」→「MQL4」→「Files」フォルダへ保存されます。

全ソースコード

以下の記事をご購入頂きましたら今回の全ソースコードをまとめて閲覧する事が出来ます。
尚、この記事のコードを模写して行けば同じ物が出来ますので、時短を考える方、この記事を評価して頂ける方だけご購入をご検討下さい( ゚Д゚)

コメント

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