皆さん、こんにちは~潤奈です。
今日は以前から作っていた「取引履歴をGoogleスプレッドシートに自動記帳するEA」のメンテナンスをしていました。
このツールについてブログで書くのは初めてかもしれませんね。 まずは、「そもそもどういう仕組みだったのか?」を簡単に説明しておきます( ゚Д゚)
元々の仕様(Before)
改修を行う前の初期バージョンは、「自分だけが使うからいいや」と思って非常にシンプルな作りにしていました。
- 定時一括送信 毎日指定した時間(デフォルトは23:55)になると、EAが自動的に起きて仕事を開始します。
- 差分データの抽出 「前回記録に成功した日時」を記憶しておいて、それ以降に決済された取引データだけを抽出します。
- シンプルな送信機能 抽出したデータをGoogle Apps Script(GAS)に投げて、同時にMT4内のCSVファイルにもバックアップとして保存して終了!
【何が問題だったか?】 現在はMT4を2台で動作させているのですが、ログを見ていたら「タイムアウト」のエラーがポツンと1件出ていたんです。
たった1件ですが……これ、嫌な予感がしますよね~( ゚Д゚) 今はまだ稼働数が少ないからいいものの、これから「複数台のMT4で、全く同じ時刻(23:55)に一斉送信する」という運用になった途端、Google先生へのアクセスが集中して大渋滞(パンク)するのは目に見えています。
「便利にするはずが、エラー通知の嵐で逆に手間が増える」なんてことになる前に! 今日は本腰を入れて、転ばぬ先の杖としてコードを改修しました。
かなり堅牢なシステムになったので、備忘録として技術的なポイントを共有しますね。
1. 「同時アクセス」の壁を今のうちに回避する
5台のMT4が同時にアクセスしてGAS側でロック待ちが発生するのを防ぐため、以下のロジックに書き換えました。
- 定時実行を廃止: 60分ごとのインターバル実行に変更。これで時間が分散されます。
- ランダム待機の実装: 送信前に0〜30秒のランダムなウェイト(Sleep)を入れることで、アクセスの衝突を物理的に回避!
- GAS側のロック短縮: 30秒待ってダメなら潔くエラーを返し、MT4側で次回再送させる「フェイルファスト」な設計に。
これで、将来起こりうる「360秒タイムアウト」の悪夢を未然に防げそうですw
2. データの整合性と重複排除(ここ大事!)
稼働口座を増やすと、複数の口座を同じシートにまとめることになります。そこにも落とし穴がありました。
Ticket番号の重複問題
別々のブローカーだと、偶然「同じチケット番号」が割り振られる可能性があるという事で。
Ticket番号だけで重複チェックをしていると、後から来たデータが消されてしまうことに気づきました。
→ 「口座番号 + Ticket番号」を複合キーにすることで解決です!
取得期間の厳密化
OrderCloseTime() >= lastExportTime だと、秒単位で被った取引が二重計上されるリスクがありました。
→ > 前回時間 && <= 今回時間 と不等号を厳密にし、二重計上も取り漏らしも防ぐロジックへ修正。
CSVのカンマ問題
MT4のコメント欄に「カンマ(,)」が含まれていると、CSVの列ズレが発生してデータが壊れちゃいます。
→ 送信前にコメント内のカンマをスペースに置換する処理を追加しました。
3. 価格精度の対応も忘れずに
クロス円(3桁)とドルストレート(5桁)が混在しても大丈夫なように、Digitsではなく MarketInfo(Symbol(), MODE_DIGITS) で通貨ペアごとの桁数を取得するように修正しました。
細かいところですが、こういう積み重ねが大事ですよね~。
まとめ
というわけで、たった1件のエラーからヒントを得て、「実運用に耐えうる」コードへと進化させました!
特にGAS連携は便利ですが、リクエスト制限や排他制御をしっかり考えないと、データ量が増えた時に痛い目を見ますからね( ゚Д゚)
これでまた動作確認の経過を見て行きます!
皆さんはトレード記録、どうやって管理していますか?
「もっといい方法あるよ!」という方は、ぜひコメントで教えてください( ・Д・)
では( ゚Д゚)


コメント