MathMod関数の働き・役割
MathMod関数は、2つの数値を割り算したときの「割り切れずに残る余り」を求めるために使います。この関数は、整数だけでなく小数を含む計算にも対応しており、余りの値も小数で返します。
例えば、10(被除数、割られる数)を3(除数、割る数)で割ったときの余りを考えます。普通の割り算では、10 ÷ 3 = 3.333… となりますが、MathMod関数は「割り切れずに残る小数部分」を余りとして返し、結果は0.333… になります。このように、被除数と除数が小数でも計算が可能です。
この計算は、「val = i * y + f」という数式で表されます。ここで、
- val は被除数(割られる数)、
- i は割り算の結果の整数部分、
- y は除数(割る数)、
- f は余りの小数部分です。
たとえば、10を3で割る場合、「10 = 3 × 3 + 1」となり、MathMod関数で計算される余り f は1です。また、12.5を2.5で割る場合、「12.5 = 2.5 × 5 + 0」となり、この場合の余り f は0になります。
このように、MathMod関数は「val = i * y + f」の形で、割り切れずに残る小数部分 f を計算して返します。
MathMod関数の引数について
double MathMod(
double value, // 被除数
double value2 // 除数
);
MathMod関数は、2つの引数を受け取ります。これらの引数は割り算の対象となる数値であり、被除数(割られる数)と除数(割る数)を指定します。
- value
被除数として割られる数値を指定します。例えば、10を指定した場合、10 ÷ value2 の割り算が実行されます。この値は小数でも指定可能です。 - value2
除数として割る数値を指定します。value2 は割り算の「割る数」にあたります。こちらも小数を指定でき、0以外の値である必要があります。
MathMod関数の戻り値について
MathMod関数は、指定された数値の割り算における「割り切れずに残る余り」を返します。この余りは、小数を含む値で、被除数(割られる数)と同じ符号になります。また、この余りの絶対値(正負に関係なく、その数の大きさだけを見る)は、除数(割る数)の絶対値よりも小さくなります。
例えば、MathMod関数を使って 10 を 3 で割った場合、戻り値は 1 です。これは「10 = 3 × 3 + 1」の「1」の部分にあたります。また、12.5 を 2.5 で割ると割り切れるため、戻り値は 0 になります(「12.5 = 2.5 × 5 + 0」)。
MathMod関数を使ったサンプルコード
#property script_show_inputs // 入力パラメータをスクリプトのプロパティとして表示
//--- 入力パラメータの設定
input double InpDividentValue = 10; // 被除数値(割られる数)を入力
input double InpDivisorValue = 3; // 除数値(割る数)を入力
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 入力された数値を使って、割り算の余りを計算
// MathMod関数で、InpDividentValue を InpDivisorValue で割ったときの余りを取得
double res = MathMod(InpDividentValue, InpDivisorValue);
//--- 計算結果をエキスパートログに出力
// PrintFormat関数を使用して、割り算の結果を見やすい形式で表示
// %.2f は小数点以下2桁まで表示する指定
PrintFormat("%.2f を %.2f で割った余り = %.2f", InpDividentValue, InpDivisorValue, res);
}
サンプルコード解説
MathMod関数を使ったサンプルコードの詳細を解説します。
入力パラメータ設定
コード冒頭で設定されている #property script_show_inputs は、スクリプトが実行される際に、入力パラメータを画面に表示するための指定です。これにより、ユーザーがコード実行前に数値の入力パラメータを確認し、必要に応じて変更できるようになります。
続いて、input double InpDividentValue = 10 と input double InpDivisorValue = 3 が設定されています。
- InpDividentValue は割られる数(被除数)を指定します。このサンプルでは 10 が初期値として設定されています。
- InpDivisorValue は割る数(除数)を指定します。サンプルでは 3 が初期値です。
このように input として宣言されたパラメータは、スクリプト実行前にユーザーが自由に設定できる値です。
メイン関数 OnStart の設定
次に、OnStart関数の中身を解説します。この関数はスクリプトのメイン関数で、スクリプト実行時に自動的に呼び出されます。
MathMod関数で余りを計算
double res = MathMod(InpDividentValue, InpDivisorValue); の部分では、MathMod関数を使用して割り算の余りを計算し、その結果を res 変数に格納しています。
ここでMathMod関数は、InpDividentValue を InpDivisorValue で割った際に発生する余りを計算します。たとえば、被除数が 10、除数が 3 の場合、余りは 1 です。この計算結果が res に代入されます。
PrintFormat関数で結果を表示
最後に、PrintFormat関数を使って計算結果をエキスパートログに出力しています。PrintFormat関数は、指定した形式でメッセージを表示するために使われます。
ここでの記述は PrintFormat(“%.2f を %.2f で割った余り = %.2f”, InpDividentValue, InpDivisorValue, res); です。
PrintFormat関数のフォーマット指定子について
- %.2f は、浮動小数点(小数を含む数値)を小数点以下2桁まで表示するフォーマット指定子です。
- 各 %.2f は、それぞれ以下のように順番に対応しています。
- 最初の %.2f は InpDividentValue に対応し、ここでは 10 を小数点以下2桁で表示します。
- 2つ目の %.2f は InpDivisorValue に対応し、ここでは 3 を小数点以下2桁で表示します。
- 3つ目の %.2f は計算結果 res に対応し、余りの値を小数点以下2桁で表示します。
したがって、PrintFormat関数 の出力結果としては「10.00 を 3.00 で割った余り = 1.00」という形で表示されます。
このコードは、MathMod関数を使って割り算の余りを簡単に求め、その結果を見やすい形式で表示する方法を示しています。
この関数を使ってEAを作る際のアイディア
時間やバー数を用いたトレードタイミング設定
MathMod関数を使って、特定の時間やバー数でトレードを実行するEAを作成できます。例えば、バーの番号を特定の数値で割り、その余りが0のときだけ売買シグナルを発生させることで、一定間隔でトレードを行うタイミングを制御することができます。
バーの番号をMathMod関数で計算し、特定の余りの値(例えば 0)になったときにエントリーのシグナルを発生させます。
これにより、任意の周期に合わせてトレードを開始するEAを実装することが可能です。
移動平均のクロス時に取引の間隔を調整
MathMod関数を活用することで、移動平均のクロスによるエントリータイミングに一定の間隔を設定することもできます。例えば、クロスが発生するたびにすぐにエントリーするのではなく、クロスが特定の回数(例えば、5回)起きるたびにエントリーを行うといった設定が可能です。
クロスの回数を MathMod関数で管理し、指定回数に達したタイミングで取引を行います。
これにより、移動平均のシグナルに基づきながらも、余計なトレードを抑え、より効率的なエントリーを実現できます。
ポジションサイズの動的な調整
取引する際のポジションサイズを動的に変えることもMathMod関数で実現可能です。例えば、余りの値に基づいてポジションサイズを増減させ、リスク管理を行う方法が考えられます。
特定の周期でポジションサイズを小さくしたり、または増やしたりすることで、相場の動きに合わせた取引の柔軟性が高まります。
これにより、過剰なリスクを抑えつつ、利益を伸ばす取引が期待できます。
価格水準に応じた注文の自動調整
特定の価格水準で余りが発生するタイミングを利用して、待機注文の価格を自動で変更するEAを作成できます。例えば、価格を一定の値で割った余りが特定の値になると、買い注文や売り注文の価格を少しずらして再設定するようなロジックを組むことで、注文の柔軟性を高められます。
価格を動的に管理し、MathMod関数によって計算されたタイミングで待機注文を最適化します。
こうすることで、相場のボラティリティに応じた自動取引戦略が可能です。