MathMax関数の働き・役割
MathMax関数は、指定された2つの数値のうち、より大きい値を返すために使用されます。
この関数は、価格やインジケータの値の比較を行う際に便利です。例えば、現在の価格と移動平均値を比較して、どちらが高いかを調べたい場合に活用できます。
MathMax関数を使用することで、コード内での条件分岐を最小限にし、簡潔に最大値の取得が可能になります。
MathMax関数の引数について
double MathMax(
double value1, // 1番目の値
double value2 // 2番目の値
);
第1引数 value1
最初の数値です。これは、MathMax関数が比較する2つの数値のうちの一つ目の値を表します。この引数に指定した値と第2引数の値が比較され、より大きい方が戻り値として返されます。
第2引数 value2
2つ目の数値です。この引数に指定した値は第1引数の値と比較され、より大きい値がMathMax関数の戻り値となります。
MathMax関数は、この2つの数値を比較して最大値を返す役割を持っています。引数に整数型や浮動小数点型など、異なる型の値を指定した場合は、自動的に大きいビットサイズの型にキャストされます。同じデータ型が引数として渡された場合はキャストは行われません。
MathMax関数の戻り値について
MathMax関数の戻り値は、指定された2つの引数のうち大きい方の値です。戻り値の型は引数として渡された2つの値のうち、ビットサイズの大きいデータ型と同じになります。
例えば、value1が整数型(int)、value2が浮動小数点型(double)の場合、戻り値は浮動小数点型の値として返されます。異なるデータ型が引数として渡される場合、ビットサイズの小さいデータ型が自動的にビットサイズの大きいデータ型にキャストされるため、戻り値の型もキャスト後のデータ型と一致します。
MathMax関数を使ったサンプルコード
//--- 入力パラメータを定義
input int InpPeriod = 10; // 移動平均の計算期間(デフォルト値は10)
input ENUM_MA_METHOD InpMethod = MODE_SMA; // 移動平均の計算方法(ここでは単純移動平均)
input ENUM_APPLIED_PRICE InpPrice = PRICE_CLOSE; // 移動平均の計算に使用する価格(ここでは終値)
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 移動平均期間が1未満で設定されている場合は、デフォルト値10を使用する
int period = (InpPeriod < 1 ? 10 : InpPeriod);
//--- 移動平均指標のハンドルを作成する(正常に作成されるとハンドルが返される)
int handle = iMA(Symbol(), Period(), period, 0, InpMethod, InpPrice);
if (handle == INVALID_HANDLE) // ハンドルが無効な場合
{
Print("移動平均指標ハンドルの作成に失敗しました。エラーコード:", GetLastError());
return;
}
//--- 現在のBid(買い)価格を取得する
double bid = 0; // Bid価格を格納する変数を初期化
ResetLastError(); // エラー状態をリセット
if (!SymbolInfoDouble(Symbol(), SYMBOL_BID, bid)) // Bid価格の取得に失敗した場合
{
Print("Bid価格の取得に失敗しました。エラーコード:", GetLastError());
return;
}
//--- 現在の足の移動平均値を取得する
double array[1]; // 移動平均データを格納する配列を用意
int copied = CopyBuffer(handle, 0, 0, 1, array); // 移動平均の値を取得
if (copied != 1) // データが正常に取得されなかった場合
{
Print("移動平均データの取得に失敗しました。エラーコード:", GetLastError());
return;
}
//--- 2つの価格(Bid価格と移動平均値)のうち最も高い価格を取得し、結果を操作ログに表示する
double max_price = MathMax(bid, array[0]); // MathMax関数でBidと移動平均の最大値を求める
PrintFormat("Bid価格: %.*f, 移動平均: %.*f, 2つのうち最も高い価格: %.*f", _Digits, bid, _Digits, array[0], _Digits, max_price);
//--- Bid価格と移動平均の比較結果を表示
PrintFormat("Bid価格は移動平均値より%s", (bid > array[0] ? "高いです" : bid < array[0] ? "低いです" : "同じです"));
}
このコードは、現在のBid価格と移動平均値を比較し、その関係をエキスパートログに表示します。Bid価格が移動平均より高い場合には「Bid価格は移動平均値より高いです」と出力され、逆に低い場合には「Bid価格は移動平均値より低いです」と出力されます。もしBid価格と移動平均が同じであれば、「同じです」と表示されます。
サンプルコード解説
このコードでは、MathMax関数を使用して現在のBid価格と移動平均値のうち最大値を取得し、さらにこれらの比較結果をエキスパートログに出力しています。コードの各部分について詳しく解説します。
入力パラメータの定義
コード冒頭では、スクリプトの実行時に変更可能な入力パラメータを定義しています。
- InpPeriod:移動平均の計算期間を指定する整数型のパラメータです。初期値は10に設定されています。1未満の値が指定された場合には、後続のコードでデフォルト値10に設定されます。
- InpMethod:移動平均の計算方法を指定する列挙型のパラメータで、初期値は単純移動平均(MODE_SMA)に設定されています。
- InpPrice:移動平均の計算に使用する価格を指定する列挙型のパラメータです。初期値は終値(PRICE_CLOSE)です。
OnStart関数
スクリプトが実行される際に呼び出されるOnStart関数内で、各処理が順に行われます。
移動平均期間の設定
まず、InpPeriodが1未満である場合、計算期間を10に設定する三項演算子を使用しています。
三項演算子とは、条件式を使って「条件が真の場合の値」と「条件が偽の場合の値」を簡潔に分岐できる演算子です。形式としては「条件式 ? 真の場合の値 : 偽の場合の値」のように書きます。
この場合、InpPeriodが1より小さいかどうかを条件式とし、条件が真ならば10を、それ以外ならInpPeriodの値を計算期間に設定しています。
この処理によって、入力パラメータが不正な値である場合にデフォルト値が使用されるようになります。
移動平均指標のハンドル作成
iMA関数を使って移動平均指標のハンドルを作成します。iMA関数は、シンボル(現在のチャート)、タイムフレーム、移動平均の計算期間、シフト値、計算方法、価格種別の引数を受け取ります。正常に作成されるとハンドル(識別子)が返され、無効な場合(ハンドルがINVALID_HANDLEの場合、)はPrint関数とGetLastError関数を使い、エラーメッセージがエキスパートログに表示されます。
Bid価格の取得
現在のBid価格を取得するために、SymbolInfoDouble関数を使用します。この関数はシンボルのプロパティを取得するために使われ、ここではSYMBOL_BIDプロパティで現在のBid価格を取得しています。Bid価格の取得に失敗した場合、エラーメッセージがエキスパートログに出力され、処理が終了します。
移動平均値の取得
CopyBuffer関数を用いて、取得した移動平均指標の現在の足の値を取得します。この値は配列arrayに格納され、取得が成功したかを確認しています。データが取得できない場合も、エラーメッセージがエキスパートログに表示されます。
MathMax関数で最大値を取得し、ログに出力
MathMax関数を使って、Bid価格と移動平均値のうち大きい方の価格を求め、max_priceに格納します。続いて、PrintFormat関数を使い、Bid価格、移動平均値、およびそのうちの最大値をエキスパートログに表示します。
ここで使われているPrintFormat関数では、フォーマット指定子が使用されています。フォーマット指定子とは、出力する値の型や表示形式を指定するためのもので、「%.*f」という形式が見られます。以下にこの指定子の詳細を説明します。
- %:フォーマット指定子の始まりを示します。
- .*f:小数点以下の桁数を指定し、浮動小数点数を表示するための指定子です。
ここで、.*の部分は表示したい小数点以下の桁数を指定し、fが浮動小数点数の値を表しています。例えば「%.f」の形式で「_Digits, bid」が指定されている場合、_Digitsの値が小数点以下の桁数として使われ、bidの値がその桁数に従って出力されます。
この形式により、Bid価格や移動平均値、最大値が見やすい形でエキスパートログに表示されます。
Bid価格と移動平均値の比較結果を表示
最後に三項演算子を使用し、Bid価格が移動平均値より高いか、低いか、あるいは同じであるかをエキスパートログに出力します。
※ここでは三項演算子が入れ子状(ネスト)になっています。三項演算子が入れ子状になると、一つの条件だけでなく、複数の条件をチェックして、異なる結果を返すことができます。ちょっと複雑なので、具体的に、このコードの文法構造を簡単に説明します。
使われているコードの分解
PrintFormat("Bid価格は移動平均値より%s",
(bid > array[0] ? "高いです" : bid < array[0] ? "低いです" : "同じです"));
このコードの中で三項演算子が使用されている部分は次の部分です。
(bid > array[0] ? "高いです" : bid < array[0] ? "低いです" : "同じです")
三項演算子の一般的な構造は、「条件式 ? 真の場合の値 : 偽の場合の値」という形をとります。このコードでは次のような入れ子状の三項演算子を使っています。
入れ子構造の解説
最初の条件(bid > array[0])
- まず、Bid価格が移動平均よりも大きいかをチェックしています。
- もしこれが「真」であれば、「高いです」を返します。
最初の条件が「偽」の場合
- 最初の条件が「偽」だった場合、次に
bid < array[0]
をチェックします。 - もしこの条件が「真」であれば、「低いです」を返します。
- どちらの条件も「偽」の場合
- Bid価格が移動平均と同じ場合は、最初の2つの条件がどちらも「偽」になるので、最後に「同じです」を返します。
この条件式を順番に整理すると、次のような流れです。
このように三項演算子を入れ子にすると、複数の条件を一度に判定できるため、条件に応じた結果を効率的に返すことができます。
MathMax関数を使ってEAを作る際のアイディア
トレンドフォローEAの作成
MathMax関数を使用して、現在の価格と移動平均などのインジケータを比較し、価格が移動平均よりも高い場合に買いエントリー、低い場合に売りエントリーを行うEAを作成することができます。トレンドの方向を価格と移動平均の大小関係で判断することで、シンプルなトレンドフォロー戦略を構築できます。
サポート・レジスタンスレベルの判定
MathMax関数を使って、直近の高値や安値と現在の価格を比較し、サポートやレジスタンスのレベルを自動的に判断するEAを作成することが可能です。価格がサポートラインを下回った場合やレジスタンスラインを上回った場合にエントリーやエグジットの条件を設定し、逆張りや順張りの戦略を実行することができます。
ストップロスやテイクプロフィットの自動設定
MathMax関数を用いて、現在の価格や過去の高値・安値を基に最適なストップロスやテイクプロフィットの位置を設定するEAを作成することも有効です。過去の一定期間の高値や安値と比較して、大きい値を自動でストップロスラインに設定することで、リスク管理を強化したトレードを行うことができます。
ボラティリティの判定による取引頻度の調整
MathMax関数を利用して、一定期間の最大値と最小値を取得し、その差でボラティリティを算出することができます。このボラティリティを基に、値動きが大きいときにはトレード頻度を増やし、動きが小さいときにはトレードを抑えるようなEAの設定が可能です。ボラティリティを加味したエントリー条件を取り入れることで、変動に合わせたトレード戦略を実装できます。
複数インジケータとの組み合わせによる柔軟な条件判定
MathMax関数を活用し、他のインジケータと比較することで複数条件を組み合わせたEAを構築できます。たとえば、RSIやMACDと価格の大小関係を組み合わせて、特定の条件下でエントリーやエグジットを実行するルールを設定することで、柔軟な条件判定が可能になります。