1. fabs関数の概要と実務での活用法
MQL5のfabs関数は、与えられた数値(浮動小数点数)の絶対値を求めるための関数です。名前の由来は「Floating-point Absolute」の略で、マイナスの値をプラスに変換し、プラスの値はそのまま返します。
実務レベルの開発において、この関数は「2つの価格の乖離(距離)」を測る際に非常に重宝します。例えば、現在の価格と移動平均線の距離を計算する場合、現在の価格 - 移動平均線という計算を行うと、価格が下回っている時に結果がマイナスになってしまいます。
初心者が陥りやすい罠は、このマイナス値を考慮せずに条件分岐(if文)を書いてしまうことです。「100ポイント以上離れたらエントリー」というロジックを書く際、計算結果が-150だった場合、if (-150 >= 100)は偽(不成立)となり、意図した動作をしません。fabsを使って絶対値(150)に変換することで、価格の上下方向を問わず「純粋な距離」でロジックを判定できるようになります。
2. 構文と戻り値
fabs関数の構造は非常にシンプルです。
double fabs(
double value // 数値(浮動小数点数)
);
- パラメーター:
valueには、絶対値を求めたいdouble型の数値を入力します。 - 戻り値: 入力された数値が正負に関わらず、常に正の数(
double型)を返します。
※MQL5では、整数(int型)の絶対値を求める場合はabs()関数、浮動小数点数(double/float型)の場合はfabs()関数と使い分けるのが基本ですが、math.mqhを介してオーバーロードされているため、実質的にMathAbs()を使用するケースも多いです。fabsはその中でも「浮動小数点数専用」であることを明示した高速な処理に適した関数です。
3. 具体的な使い方・実践サンプルコード
以下のサンプルコードは、現在の価格と20期間移動平均線(SMA)の距離を計算し、その乖離が一定以上になった場合にログ出力する実用的なスクリプト例です。
//+------------------------------------------------------------------+
//| Sample_fabs_EA.mq5 |
//| Copyright 2024, Quant Engineer |
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input double ThresholdPoints = 100.0; // 乖離の閾値(ポイント)
void OnTick()
{
// 1. 移動平均線の値を取得(例としてiMAを使用)
int ma_handle = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE);
double ma_buffer[];
ArraySetAsSeries(ma_buffer, true);
if(CopyBuffer(ma_handle, 0, 0, 1, ma_buffer) < 0) return;
double current_ma = ma_buffer[0];
double current_price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// 2. 価格とMAの差分を計算
// ここで差分はプラスにもマイナスにもなる
double raw_diff = current_price - current_ma;
// 3. fabs関数を使って「絶対的な距離」を算出
double abs_diff = fabs(raw_diff);
// ポイント単位に変換(1.00005などの値を100などの整数ベースにする)
double diff_in_points = abs_diff / _Point;
// 4. 判定
if(diff_in_points >= ThresholdPoints)
{
PrintFormat("乖離を検知:距離 = %.1f points (現在値: %.5f, MA: %.5f)",
diff_in_points, current_price, current_ma);
}
}
4. 使用上の注意点とよくあるエラー
fabs関数を使用する際に注意すべき点は、「向き(正負)」の情報が完全に失われるという点です。
例えば、トレーリングストップの実装において、「買いポジションの含み益が乗ったときだけストップを動かす」というロジックの場合、単にfabsで差分を取るだけでは、価格が利益方向に動いたのか、損失方向に動いたのかが判別できなくなります。方向性が必要な処理では、fabsを適用する前の値を保持しておくか、比較演算子(> や <)を適切に組み合わせる必要があります。
また、浮動小数点数特有の「丸め誤差」にも注意が必要です。非常に厳密な比較(例:if(fabs(a - b) == 0.0))を行う場合、コンピュータの計算誤差で完全なゼロにならないことがあります。実務では if(fabs(a - b) < _Point / 2) のように、最小値(エプソン値)よりも小さいかどうかで判定するのが安全なクオンツの手法です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムの論理構成が完璧であっても、それを実行するインフラが貧弱であれば、シストレで勝ち続けることは不可能です。特に、自宅のPCや一般的な光回線を利用した自動売買は、技術的に極めて不利な立場にあります。FXの価格更新はミリ秒単位で行われており、自宅からの注文は物理的な距離とネットワーク経路の多さにより、数十から数百ミリ秒の「遅延(レイテンシ)」が発生します。この遅延の間に価格が滑る(スリッページ)ことで、バックテストでは利益が出ていたロジックも、実運用では手数料以上の損失を垂れ流す結果となります。
約定スピードを極限まで高め、理想的なバックテスト結果を再現するには、取引サーバーと同じデータセンター内、あるいは極めて近い場所に位置する「専用VPS(仮想専用サーバー)」の導入が必須です。専用VPSを利用することで、ネットワーク遅延を1ミリ秒以下に抑え、機関投資家に近い実行環境を構築できます。安定した電源供給と24時間の稼働保証も含め、VPSはもはや便利ツールではなく、FXエンジニアにとっての「必須装備」であると断言できます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント