OsMAの補正値について

2025/10/26 16:06
28


EAつくーるにてOsMAの補正値を設定したところ、小数点第一位以下の数値を入力すると0になってしまいます。他のオシレーター系のインジケーターでは小数点第一位以下の数値を設定できるのですが、OsMAのみできないようです。これには何か意図があるのでしょうか?


同じくOsMAの補正値を設定したところ、コード内の補正値の直前に「+ PipsToPrice」が入っています。

例: if(iOsMA(Symbol(), PERIOD_M15, 50, 190, 5, PRICE_CLOSE, 0) + PipsToPrice(0.5) >= iOsMA(Symbol(), PERIOD_M15, 50, 190, 5, PRICE_CLOSE, 0) + PipsToPrice(0.5)) signal = 1;

他のオシレーター系のインジケーターでは入っていませんし、価格ベースではないオシレーター系に「+ PipsToPrice」が入っていることによって逆に補正値が効いていないようです。

上記①②について修正・変更はできますか?

コメント

GogoJungle
2025/10/30 14:47

ご質問ありがとうございます。OsMA の補正値について、①②それぞれ回答いたします。

① 小数点第一位以下を入れると 0 になる件

現在のEAつくーるでは OsMAの補正値を「pips」として扱い、内部で価格へ変換(PipsToPrice() しています。
このため、通貨ペアの最小刻み(Point)より小さい値は丸め込みで 0 になってしまう場合があります(例:USDJPY で 0.05 pips は 0.0005 円相当で、ブローカー設定によっては有効桁に達せず 0 になります)。

  • 仕様意図:異なる桁数の通貨ペアでも同じ"pips"基準でEAを共通運用できるようにするためです。
  • 回避策:補正値を 1 pip 以上(または Point を上回る値) で設定してください。

純粋な価格単位(0.001など)で補正値を使いたい場合
申し訳ありませんが、現行仕様ではUIでの切替はありません。出力した MQL コードを修正してご対応ください(方法は後述)。


+ PipsToPrice() が入っていて補正が効かない件

ご指摘のとおり、OsMA は価格差ベースのインジケーターですが、EAつくーるでは"どの銘柄でも同じ感覚(pips)"で使えるように、補正値に PipsToPrice() を付与する実装になっています。
そのため、ご希望が「価格単位の生値をそのまま足し引きしたい」であれば、PipsToPrice() を外すコード修正が必要です。

なお、質問文の例:

if(iOsMA(...) + PipsToPrice(0.5) >= iOsMA(...) + PipsToPrice(0.5)) signal = 1;

は、左右が同一式のため常に trueになります。意図はおそらく
iOsMA(...) >= PipsToPrice(0.5)」や
iOsMA(現在) >= iOsMA(過去) + PipsToPrice(0.5)
のような “値と閾値(または過去値)を比較する” 条件かと思われます。比較ロジックも併せてご確認ください。


変更・修正は可能ですか?
  • EAつくーるのUI上での切替: 現状は不可です(仕様)。
  • コード編集での変更: 可能です。以下のいずれかで対応してください。

A. pipsではなく「価格単位の生値」を補正として使う

iOsMA(...) + PipsToPrice(param)iOsMA(...) + param に置換します。
(MT4/MT5 共通の考え方)

例(MT4)

// 変更前
double val = iOsMA(Symbol(), PERIOD_M15, 50, 190, 5, PRICE_CLOSE, 0) + PipsToPrice(補正値);

// 変更後:補正値を価格単位そのままで扱う
double val = iOsMA(Symbol(), PERIOD_M15, 50, 190, 5, PRICE_CLOSE, 0) + 補正値;

例(MT5)

// 変更前
double val = iOsMA(_Symbol, PERIOD_M15, 50, 190, 5, PRICE_CLOSE, 0) + PipsToPrice(補正値);

// 変更後
double val = iOsMA(_Symbol, PERIOD_M15, 50, 190, 5, PRICE_CLOSE, 0) + 補正値;

注意:価格単位で扱うとシンボルごとにスケールが変わるため、同一pips感覚の移植性は失われます。単一通貨専用・研究用途ならこちらが直感的です。

B. pips運用を維持しつつ、丸め込みを避ける

  • 補正値を 最小刻み以上(例:0.1〜1.0 pips 以上) にする
  • または、内部で使用する比較をpipsではなく価格差へ変換後に正しく正規化する(NormalizeDouble/Point丸め)
    ※EAつくーる既定の PipsToPrice() はこの趣旨で実装されています。

修正手順(実務)
  1. EAつくーるで mq4/mq5 を出力
  2. エディタで PipsToPrice( を検索
  3. OsMA の補正に関わる行を + PipsToPrice(x)+ x に置換
  4. 比較式が左右同一になっていないか確認(例のような恒真は修正)
  5. 必要に応じて価格の正規化(MT4: NormalizeDouble(price, Digits) / MT5: Point で丸め)

まとめ
  • ①は「pips→価格変換」の仕様上、Point未満は 0 に丸められうるため発生します。
  • ②は「pips基準で統一する設計意図」で PipsToPrice() を付けています。
  • 純粋な数値(価格単位)で使いたい場合はコード修正で対応可能です。
  • 複数通貨ペアでの共通運用を重視するなら pips 方式を推奨、単一銘柄での細かい調整を重視するなら 価格単位方式(PipsToPriceを外す) が向いています。

必要であれば、該当箇所のスクリーンショットや該当行のコピペをいただければ、置換すべき行をピンポイントで指定してお返しします。

関連トピックス

検索結果がありません。

ノーコードで誰でも簡単EA開発!MQL言語学習にも使える! | GogoJungle

注目トピックス

検索結果がありません。