解決済み

通貨毎に固有のパラメータ設定する

EAつくーる
希望の星チャート
2025/08/17 13:35
53

EA出品を考えています。通貨別にパラメータを設定したいところがあるので、試しに

https://labo.gogojungle.co.jp/articles/105
こちらのページのサンプルコードをそのままはりつけたのですが
‘TakeProfit’ - constant cannot be modified
‘StopLoss’ - constant cannot be modified

というエラーがでてしまいます。
自分が設定したいのは、時間指定決済で、
input bool isExitByTime = true;
input string TimeCloseValue = “23:48”;
または
input bool isExitByTime = false;
input string TimeCloseValue = “23:48”;
このどちらかの設定を
USDJPY EURJPY EURUSD GBPJPY GBPUSD
の5通貨でお客様が設定をする手間を不要とするために、
初期設定で5通貨別に時間指定決済あり/なしを設定したいのですが、
よろしくお願いいたします。

コメント

希望の星チャート
2025/08/19 11:47

https://labo.gogojungle.co.jp/articles/2273
こちらの質問に関して、
下記の設定で分岐可能というご指導を頂いたように思います
基本設定
input int Magic1= 1;
input bool isExitByTime = true;
input string TimeCloseValue = “23:00”;

input int Magic2 = 2;
input bool isExitByTime2 = true;
input string TimeCloseValue2 = “23:00”;

☆(OnTick() 内
if(isExitByTime == true) ExitByTime(TimeCloseValue, Magic1, exit_time_date_array);
if(isExitByTime2 == true) ExitByTime(TimeCloseValue2, Magic2, exit_time_date_array);

そして今回の質問なのですが、
さらに通貨別初期設定。ということは可能でしょうか?
https://labo.gogojungle.co.jp/articles/105
こちらのページのサンプルコードをそのままはりつけたのですが
‘TakeProfit’ - constant cannot be modified
‘StopLoss’ - constant cannot be modified
うまくいきませんでした。
下記設定が可能であれば初期状態から購入者がスワップ+のみでEAを使用できると考えています。
こちらを導入するためにはどのように修正記載すればよいでしょうか?

USDJPY
input bool isExitByTime = true; ポジション1(Magic1)持ち越しあり(買い)
input bool isExitByTime2 = false; ポジション2(Magic2)売り持ち越しなし(売り)
EURJPY
input bool isExitByTime = true; ポジション1(Magic1)持ち越しあり(買い)
input bool isExitByTime2 = false; ポジション2(Magic2)売り持ち越しなし(売り)
GBPJPY
input bool isExitByTime = true; ポジション1(Magic1)持ち越しあり(買い)
input bool isExitByTime2 = false; ポジション2(Magic2)売り持ち越しなし(売り)
EURUSD
input bool isExitByTime = false; ポジション1(Magic1)買い持ち越しなし(買い)
input bool isExitByTime2 = true; ポジション2(Magic2)売り持ち越しあり(売り)
GBPUSD
input bool isExitByTime = false; ポジション1(Magic1)買い持ち越しなし(買い)
input bool isExitByTime2 = true; ポジション2(Magic2)売り持ち越しあり(売り)

GogoJungle
2025/08/20 10:59

いつもお世話になっております。

通貨別の初期値(“買いは持ち越し/売りは決済”など)を、購入者が触らなくても反映したいというご要望に沿って結論をお伝えします。

  • EAつくーる単体で“1本のEAの内部で通貨ごとに初期値を自動切替”することはできません。
    EAつくーるのインプットは固定値で、チャートの通貨ペアに応じて入力値を自動変更する仕組みがないためです。
  • ただし運用上の回避策として、通貨ごとにEA(もしくはセットファイル)を分けて配布すれば、購入者側の手間をゼロにできます。
    さらに「売りだけ時刻決済・買いは持ち越し」のような片側だけの時刻決済は、「オプション→指定時刻決済」では“全ポジション対象”になるため、取引条件で時刻に合わせた「買い/売りポジション決済」ルールを作るのが確実です(ポジション単位で制御できます)。

以下、実装パターンをご提案します。


パターンA(ノーコード・確実):通貨ごとにEA(またはset)を用意

構成

  • 通貨別に5本のEAを出力するか、1本のEA+通貨別setファイル5つを同梱します。
  • 各EA(またはset)で「Magic1/2」と時刻決済の有無を、狙いどおりの初期値にしておきます。
    例)USDJPY/EURJPY/GBPJPYは「買い(Magic1)持ち越し、売り(Magic2)23:48で決済」
       EURUSD/GBPUSDはその逆 …という形。

EAつくーるでの設定例(USDJPY向け)

  1. 基本項目(共通の初期値を設定)
  • ロット数:任意
  • 損切り:0(※「ナンピン/ピラミッディング」を使わないなら任意でも可)
  • 利食い:0(同上)
  • スリッページ:任意
  1. オプション
  • 取引通貨ペア制限:通貨ペア名=USDJPY(このEAはUSDJPY専用に)
  • 取引曜日制限:必要に応じて設定
  • 指定時刻決済は使いません(※“片側だけ決済”にしたいので、取引条件で制御します)
  • 最大スプレッド制限:任意(推奨)
  1. 取引条件
  • 「ポジション1(Magic1=1)」=買い用

    • エントリー条件:ユーザー様のロジック
    • 決済条件:設定しない(=持ち越し)
  • 「ポジション2(Magic2=2)」=売り用

    • エントリー条件:ユーザー様のロジック

    • 決済条件:指定時刻のローソク足で売りだけ決済
      例(23:48相当のタイミングで成り立つ条件を用意)

      ローソク足(通貨ペア:USDJPY, 時間足:チャートの足, 適用価格:終値, 計算位置:0本前, 指定時刻:23:48)
      =
      ローソク足(通貨ペア:USDJPY, 時間足:チャートの足, 適用価格:終値, 計算位置:0本前)
      ↓
      売りポジション決済
      

      ポイント:

      • 「指定時刻」を使うとその時刻に生成された足で条件が真になります。
      • 必要なら「取引曜日制限」を併用して平日だけなどに限定可能です。

> EURJPY/GBPJPYも同様に設定(Magic1=買い持ち越し、Magic2=売り23:48決済)。
> EURUSD/GBPUSDは(Magic1=買い23:48決済、Magic2=売り持ち越し)で、それぞれ「取引通貨ペア制限」を通貨名に合わせて作ってください。
> これにより**“購入者は通貨に合ったEA(またはset)を入れるだけ”**になります。


パターンB(1本にまとめたい場合の最終手段):外部MQLで通貨分岐

> EAつくーるの範囲を超えるため最終手段です。初心者向けではないため要点のみ。

  • 問題のコンパイルエラー
    'TakeProfit' - constant cannot be modified / 'StopLoss' - constant cannot be modified』は、input は定数扱いのため、後から代入しようとして発生します。
    対処input は“初期入力用”に留め、実行時に書き換える変数(例:int takeProfit; int stopLoss; bool isExitByTimeBuy; bool isExitByTimeSell;)を別に用意して、OnInit()Symbol() に応じて代入します。input そのものを上書きしないようにします。

  • 通貨別の初期値切替の考え方(例)

    • OnInit() 内で switch(Symbol())if(Symbol()=="USDJPY") のように分岐

    • Magic1/2(買い/売り)それぞれの時刻決済フラグ時刻文字列を、通貨に応じて内部変数へ代入

    • OnTick() では前回ご提示の

      if(isExitByTimeBuy)  ExitByTime(TimeCloseValueBuy,  Magic1, exit_time_date_array);
      if(isExitByTimeSell) ExitByTime(TimeCloseValueSell, Magic2, exit_time_date_array);
      

      の**isExitByTimeBuy/TimeCloseValueBuy 等は input ではなく “内部変数”** を参照させる

    • こうすると購入者の入力に依らず通貨別の初期値を実行時に適用できます。
      ※ EAつくーるでMT5用EAをコンパイルする場合は、MQL5\Include\Tkool\Tkool.mqh が正しい場所にあるかも併せて確認してください。


ありがちな設定ミスと確認ポイント

  • 「オプション→指定時刻決済」をONにすると買い/売りの区別なく全ポジションが強制決済されます。
    片側のみの決済をしたいときは取引条件で“買い/売りポジション決済”を個別に作るようにしてください。
  • 「取引通貨ペア制限」を指定し忘れると、EAが他通貨でも動作し得ます。通貨別EAにする場合は必ず通貨名を固定してください。
  • 「基本項目」の損切り/利食いを0にしないまま「ピラミッディング/ナンピン」を併用すると挙動が崩れます。今回のロジックでは通常OFFでも構いませんが、ONにする場合は注意してください。

まとめ(実務的なおすすめ)

  1. 購入者の手間ゼロを最優先するなら、通貨ごとにEA(またはset)を分けて配布(パターンA)。

    • 各EAに「取引通貨ペア制限」を設定
    • 片側だけの時刻決済は取引条件で「買い/売りポジション決済」を時刻指定で発火
  2. どうしても1本に集約したい場合のみ、外部MQLでSymbol()分岐+内部変数で初期値を切替(パターンB)。

    • input に代入しない(今回のエラー原因)
    • OnInit() で内部変数へ通貨別初期値を設定

この方針であれば、記載いただいた5通貨の「買いは持ち越し/売りは時刻決済」やその逆の要件を、購入者側の設定なしで実現できます。

希望の星チャート
2025/08/20 12:12

ありがとうございました。どのような方法をとるのが良いのか、考えがまとまってきました。

関連トピックス

検索結果がありません。

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

注目トピックス

検索結果がありません。