English

MQL5の書き方(for MQL4デザイナー)

 

2024.09

林貴晴/AMSER Inc.

コードの難読化

読みやすく、シンプルなソースコードは、可読性が高くなり、バグが少なく、効率的に動作します。しかし、ソースコードを他者に提供する必要がある場合でも、ロジックは知られたくないことがあります。そこで、本記事ではソースコードの難読化手法について説明します。

 

二次方程式を使った難読化

以下のようなシンプルなコードがあります。
このような条件式を、二次方程式を使って難読化する方法を紹介します。

if(Hour() == 9 || Hour() == 10) // 発注処理                        
                    
 

Hour()をxと置き換えて考えます。

if(x == 9 || x == 10)//発注処理
                    
 

これは以下のように変形できます。

if((x - 9) == 0 || (x - 10) == 0)//発注処理
                    
 

次に、この条件を数学的な二次方程式の形式に変換します。

(x - 9)(x - 10) = 0
                    
 

この方程式を展開します。

x² - 19x + 90 = 0
                    
 

90を移項して右辺に移し、xでくくります。

x * (x - 19) = -90
                    
 

これをMQL5のコードに適用すると、次のように書き換えることができます。

if(Hour() * (Hour() - 19) == -90) // 発注処理
                    
 

理屈は単純ですが、このような変形を理解していない人にとっては、非常に読みにくいコードとなります。

 

列挙型を使った計算の難読化

MQL5の列挙型には、それぞれ数値が割り振られています。たとえば、ポジションの売り買いを示すPOSITION_TYPE_BUYは0、POSITION_TYPE_SELLは1です。この性質を利用して、以下のようなコードを難読化します。

long TYPE = PositionGetInteger(POSITION_TYPE);
if(TYPE == POSITION_TYPE_BUY && RSI > 70) // 決済処理
if(TYPE == POSITION_TYPE_SELL && RSI < 30) // 決済処理
                    
 

上記のコードを次のように変換できます。

double TYPE = (PositionGetInteger(POSITION_TYPE) - 0.5) * 2;
if(TYPE * RSI < (50 - 20 * TYPE) * TYPE) // 決済処理
                    
 

この難読化のロジックは、BUYとSELLの条件判断を1つのコードにまとめています。

 

BUYポジションの場合

PositionGetInteger(POSITION_TYPE)は0を返します。
これにより、次の式になります。

TYPE = (0 - 0.5) * 2; // TYPEには-1が入ります。
                    
 

この値を代入すると2行目は次のように計算されます。

-1 * RSI < (50 - 20 * -1) * -1                        
                    
 

これを、簡単にまとめます。

-RSI < -70
                    
 

両辺に-1を掛けるとRSI > 70となり、元のソースコードと同じ条件になります。

 

SELLポジションの場合

PositionGetInteger(POSITION_TYPE)は1を返します。

TYPE=(1-0.5)*2;// TYPE には +1が入ります。                        
                    
 

この値を2行目に代入すると、次の式になります。

1 * RSI < (50 - 20 * 1) * 1                        
                    
 

これを簡単にすると、RSI < 30となり、こちらも元のソースコードと同じ条件となります。

コードの難読化は、MQL5プログラマーがロジックを保護するための有効な手段です。二次方程式や列挙型を利用した方法は、ソースコードの解読を困難にし、トレーディングロジックを守るのに役立ちます。特に、EAを外部に提供する場合や、逆コンパイルのリスクがある場合に効果を発揮します。
しかし、難読化には注意すべき点もあります。難読化されたコードは作成者自身にとっても理解が難しくなり、将来の修正や機能追加が困難になる可能性があります。さらに、エラーが発生した際のデバッグも複雑になります。
難読化は有効なツールですが、それ単独ではなく、総合的なアプローチの一部として活用することが賢明です。

 

執筆者紹介
林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。