設定したリスクリワードで指値または逆指値を自動設定するツール(EA)の作成
ChatGPT(GPTs)にお願いして、ちょっと便利なツール(EA)を作ってもらいました。
逆指値または指値のどちらかを設定すると、パラメータで設定したリスクリワードに従って、指値または逆指値を自動でツールです。
使用GPTs:EA Creator
依頼内容と実行結果
少し手直ししましたが、ほぼほぼそのまま使えるものを作ってもらえました。
依頼内容(1回目)
以下の仕様で、EAの作成をお願いします
#パラメータ
・注文ロット数
・リスクリワード(損益を1として利益の比率を設定する)
その他、必要なものあれば追加#仕様
(1)保持しているポジションの中に、指値のみが設定されているポジションがあった場合、以下の条件で逆指値を設定する
・エントリー価格と指値より見込み利益を計算する
・見込み利益とリスクリワードより算出した損益となる価格に逆指値を設定する
(2)保持しているポジションの中に、逆指値のみが設定されているポジションがあった場合、以下の条件で指値を設定する
・エントリー価格と逆指値より見込み損益を計算する
・見込み損益とリスクリワードより算出した利益となる価格に指値を設定する
#余計なパラメータを入れてしまいました。。
ChatGPT出力結果
以下の仕様に基づいて、指定されたリスクリワード比率を使用して逆指値と指値を設定するEAのMQL4コードを提供します。このEAは、保有中のポジションをチェックし、条件に応じて逆指値や指値を設定します。
//+------------------------------------------------------------------+ //| RiskRewardEA | //| Copyright 2023, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property strict input double LotSize = 0.1; // 注文ロット数 input double RiskRewardRatio = 2.0; // リスクリワード比率 input int Slippage = 3; // スリッページ input int MagicNumber = 0; // マジックナンバー //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // ポジションをチェック for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS)) { // 損益を計算し、逆指値または指値を設定 CheckModifyOrders(); } } } //+------------------------------------------------------------------+ //| ポジションをチェックし、逆指値または指値を設定する関数 | //+------------------------------------------------------------------+ void CheckModifyOrders() { double entryPrice = OrderOpenPrice(); double tp = OrderTakeProfit(); double sl = OrderStopLoss(); double newSl, newTp; // 指値のみが設定されている場合 if(tp > 0 && sl == 0) { double expectedProfit = MathAbs(tp - entryPrice); double risk = expectedProfit / RiskRewardRatio; if(OrderType() == OP_BUY) { newSl = NormalizeDouble(entryPrice - risk, Digits); } else if(OrderType() == OP_SELL) { newSl = NormalizeDouble(entryPrice + risk, Digits); } OrderModify(OrderTicket(), entryPrice, newSl, tp, 0, clrRed); } // 逆指値のみが設定されている場合 if(tp == 0 && sl > 0) { double expectedLoss = MathAbs(entryPrice - sl); double reward = expectedLoss * RiskRewardRatio; if(OrderType() == OP_BUY) { newTp = NormalizeDouble(entryPrice + reward, Digits); } else if(OrderType() == OP_SELL) { newTp = NormalizeDouble(entryPrice - reward, Digits); } OrderModify(OrderTicket(), entryPrice, sl, newTp, 0, clrGreen); } } //+------------------------------------------------------------------+
説明
- パラメータ
LotSize
: 注文ロット数RiskRewardRatio
: リスクリワード比率Slippage
: スリッページMagicNumber
: マジックナンバー
- 初期化 (
OnInit
)
- 特に初期化は必要ありません。
- ティックイベント (
OnTick
)
- 保有中のポジションをチェックし、逆指値または指値を設定します。
- ポジションのチェックおよび設定 (
CheckModifyOrders
)
- 保有中のポジションに対して、以下の条件に基づいて逆指値または指値を設定します。
- 指値のみが設定されている場合
- エントリー価格と指値より見込み利益を計算し、リスクリワード比率を使用して逆指値を設定します。
- 逆指値のみが設定されている場合
- エントリー価格と逆指値より見込み損益を計算し、リスクリワード比率を使用して指値を設定します。
このEAは、保有中のポジションを監視し、指定されたリスクリワード比率に基づいて逆指値および指値を設定します。MetaTrader 4のエディタにこのコードをコピーし、コンパイルして実行することで動作を確認できます。
依頼内容(2回目)
EA_RiskRewardManager の修正と仕様追加をお願いします
・RiskRewardRatio 以外のパラメータは使っていないと思うので削除
・OnTickで、ポジションチェックを行う間隔を秒単位で設定できるようにする(処理負荷の調整)
・newSl, newTpを未初期化使うケースがあるので、0で初期化
依頼内容(3回目)
DigitsをMarketInfoを使って、変更対象のポジションの通貨ペアの桁数をとるようにしてもらえますか
ChatGPT出力結果
もちろんです。以下のコードでは、
Digits
をMarketInfo
関数を使用して、変更対象のポジションの通貨ペアの桁数を取得するように修正しました。//+------------------------------------------------------------------+ //| EA_RiskRewardManager | //| Copyright 2023, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property strict input double RiskRewardRatio = 2.0; // リスクリワード比率 input int CheckIntervalSeconds = 60; // ポジションチェックの間隔(秒) input int Slippage = 3; // スリッページ datetime lastCheckTime = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { datetime currentTime = TimeCurrent(); if (currentTime - lastCheckTime >= CheckIntervalSeconds) { lastCheckTime = currentTime; // ポジションをチェック for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS)) { // 損益を計算し、逆指値または指値を設定 CheckModifyOrders(); } } } } //+------------------------------------------------------------------+ //| ポジションをチェックし、逆指値または指値を設定する関数 | //+------------------------------------------------------------------+ void CheckModifyOrders() { string symbol = OrderSymbol(); int digits = (int)MarketInfo(symbol, MODE_DIGITS); double entryPrice = OrderOpenPrice(); double tp = OrderTakeProfit(); double sl = OrderStopLoss(); double newSl = 0, newTp = 0; // 指値のみが設定されている場合 if(tp > 0 && sl == 0) { double expectedProfit = MathAbs(tp - entryPrice); double risk = expectedProfit / RiskRewardRatio; if(OrderType() == OP_BUY) { newSl = NormalizeDouble(entryPrice - risk, digits); } else if(OrderType() == OP_SELL) { newSl = NormalizeDouble(entryPrice + risk, digits); } OrderModify(OrderTicket(), entryPrice, newSl, tp, 0, clrRed); } // 逆指値のみが設定されている場合 if(tp == 0 && sl > 0) { double expectedLoss = MathAbs(entryPrice - sl); double reward = expectedLoss * RiskRewardRatio; if(OrderType() == OP_BUY) { newTp = NormalizeDouble(entryPrice + reward, digits); } else if(OrderType() == OP_SELL) { newTp = NormalizeDouble(entryPrice - reward, digits); } OrderModify(OrderTicket(), entryPrice, sl, newTp, 0, clrGreen); } } //+------------------------------------------------------------------+
説明
- パラメータ
RiskRewardRatio
: リスクリワード比率CheckIntervalSeconds
: ポジションチェックの間隔(秒)Slippage
: スリッページ
- 初期化 (
OnInit
)
- 特に初期化は必要ありません。
- ティックイベント (
OnTick
)
- ポジションチェックを設定された間隔で行うための条件を追加しました。
- ポジションのチェックおよび設定 (
CheckModifyOrders
)
OrderSymbol
関数を使用してポジションの通貨ペアを取得し、MarketInfo
関数を使用してその通貨ペアの桁数を取得します。newSl
およびnewTp
を0で初期化しました。- 保有中のポジションに対して、以下の条件に基づいて逆指値または指値を設定します。
- 指値のみが設定されている場合
- エントリー価格と指値より見込み利益を計算し、リスクリワード比率を使用して逆指値を設定します。
- 逆指値のみが設定されている場合
- エントリー価格と逆指値より見込み損益を計算し、リスクリワード比率を使用して指値を設定します。
このEAは、保有中のポジションを監視し、指定されたリスクリワード比率に基づいて逆指値および指値を設定します。MetaTrader 4のエディタにこのコードをコピーし、コンパイルして実行することで動作を確認できます。
ツール(EA)
作成したEAを上げておきます。
基本的な動作確認はしておりますが、不具合を原因とする場合を含め、利用者の損失を補填することは致しかねますのでご了承ください。
ご自身の責任の範囲で(ご自身でも動作確認するなど)ご利用ください。
ご協力のお願い
もし、こちらのインジケータ、ツールを気に入ってもらえて、気が向いたら(何か利用する機会あれば)、ドネーション代わりに以下のいずれか何でもよいので、ご対応いただけたら幸いです。活動の励みになります。
海外FX口座の開設
- その他、口座(キャッシュバックあり)の開設
詳しくはこちらの記事「なぜFX海外口座が人気なのか?MT4/MT5のEAも使用可能、入金/取引キャッシュバックあり、トレーダのための究極ガイド」をご参照下さい。
国内FX口座の開設
詳しくはこちらの記事「あなたのFX取引を加速させるDMM.com証券のキャッシュバックキャンペーン」をご参照ください。
- その他FX口座の開設
MT4対応口座等もピックアップしています。こちらの記事「FX取引: 国内口座の選択とおすすめ業者の比較、MT4 EA対応口座は」からお願いします。
トレードシステム(EA)の購入
- 私が作成したEAのご購入
こちらの記事「FXトレーダー必見!MT4向け利益追求型自動売買EAの紹介」で、私が作成したEAの紹介をしています。利用いただけたら嬉しいです。
特に、おすすめは(調子が良いのは)こちら「ポンドュール(HL band M15 for GJ)」「BBHL band H1 for AJ」辺りです。
- 他のEAのご購入
以下より人気EA、売れ筋EAを購入する。
コメント