2025年3月10日月曜日

MT4バックテストの決済通貨レートについて

MT4で証拠金通貨をJPYに設定し、EUR/USDのバックテストを行った場合、

取引履歴には円建てで損益が表示されます。

この際、円への換算レートはどのように計算されているのでしょうか?


仮説①:その時点のUSD/JPYレートを使用

この場合、バックテスト時にUSD/JPYの過去データが存在しない場合はどうなるのでしょうか?

仮説②:バックテストを実施した時点のUSD/JPYレートを使用


この仮説を検証するため、実際にバックテストを行い、得られた損益を比較しました。


検証方法

バックテストでは、レート変換に影響でインジケーターの値が異なる可能性があるため、毎日同じ時間にエントリーし、同じ時間にクローズするEAを作成し、テストを行いました。


検証結果

現在のUSD/JPYレート:147.580

バックテストで取得した結果:

プロフィット(証拠金通貨USD) ÷ プロフィット(証拠金通貨JPY) の比率


最大値:148.000

最小値:147.000

平均値:147.608


換算レートの確認

得られた換算レートを並べてみると、ほとんどが現在のレート付近に集中し、時々若干の変動が見られる状態でした。

 



ヒストグラムでの確認

どのレートが最も多く使用されているかをヒストグラムで確認したところ、バックテスト開始時のレートにほぼ集中していることがわかりました。





結論

MT4でEUR/USDを証拠金通貨JPYでバックテストした場合、
バックテストを実施した時点のUSD/JPYレートの少数第一位を切り捨て、または切り上げた範囲のレートが使用される

ほとんどの場合、現在のレート付近が適用される

この結果は、仮説②に近いものでした。

まとめ

つまり、EUR/USDを証拠金通貨USDでバックテストする場合とJPYでバックテストする場合で、換算レートの影響による大きな差は生じないと言えそうです。






2025年2月13日木曜日

難読化のはなし

EA開発において、ロジックの保守は極めて重要です。

しかし、デコンパイルを試みる人がいる以上、コードの難読化は必須といえるでしょう。

代表的なデコンパイル対策には、以下のようなものがあります。


1️⃣ 外部ファイルを使用する

→ ex4ファイル単体ではなく、外部ファイルを参照する方法。ただし、外部ファイルの配布や設置の手間が増えるうえ、それ自体が解析されるリスクもあります。


2️⃣ 暗号化コンパイルを活用する

→ META EDITORではコードを暗号化した状態でコンパイルできます。

しかし、これも突破される可能性があると言われています。


3️⃣ 変数を増やしてコードを難読化する

→ 読解を困難にすることで解析を防ぐ手法。

ただし、開発側も大幅に手間が増え、メンテナンスが煩雑になるデメリットがあります。


どの手法にも一長一短があり、完全な防御策は存在しません。

しかし、複数の対策を組み合わせることで、解析の難易度を大幅に引き上げることは可能です。

EA開発者として、常に対策を講じながら、資産を守る意識が求められますね。


ソースコードを読んでも理解しづらくするテクニック


デコンパイル対策の一環として、コードの可読性を意図的に下げる方法を紹介します。

今回は、シンプルな条件分岐を難読化してみましょう。


通常のコード

if(x == 9 || x == 10)return;

このコードは、x が 9 または 10 のときに処理を終了します。非常に分かりやすいですね。


難読化したコード

if (!(bool)((x - 9) * (x - 10))) return;

この書き方では、(x - 9) * (x - 10) = 0 となる場合に return されます。

具体的には、

x = 9 のとき → 9 - 9 = 0 となる

x = 10 のとき → 10 - 10 = 0 となる

したがって、 x = 9 または x = 10 のとき return される点は元のコードと同じですが、数学の知識がないと一見して理解しにくくなっています。

さらに、わざわざ bool に型キャストし、! を使って判定している点も可読性を下げるポイントです。

このように、シンプルな条件式でも数学的な変形や冗長な型変換を組み合わせることで、解析の難易度を高めることができます。

デコンパイルを防ぐためには、こうしたテクニックを適宜取り入れながら、コードの保護を強化していきましょう。