MT4用フリーツール:ChatGPT(GPTs)で作成:1クリックでポジションをすべて決済する

ChatGPTでEA作成
スポンサーリンク

ボタンを1クリックでポジションをすべて決済するツール(EA)の作成

ChatGPT(GPTs)にお願いして、ちょっと便利なツール(EA)を作ってもらいました。
チャート上にボタンを配置して、ボタンを1クリックで、保有中のすべてのポジションをすべて決済します。

使用GPTs:EA Creator

ツールイメージ

依頼内容と実行結果

少し手直ししましたが、ほぼほぼそのまま使えるものを作ってもらえました。

依頼内容(1回目)

以下の仕様でEAの作成をお願いします。
・全決済を意味するボタンを配置する
・ボタンを押されたら、現在保有中のポジションをすべて決済する

ChatGPT出力結果

以下の仕様に基づいて、全決済ボタンを配置し、ボタンが押された際にすべてのポジションを決済するEAのMQL4コードを提供します。

//+------------------------------------------------------------------+
//|                                                       CloseAllEA |
//|                        Copyright 2023, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property strict

input int ButtonX = 10;  // ボタンのX座標
input int ButtonY = 10;  // ボタンのY座標
input int ButtonWidth = 100;  // ボタンの幅
input int ButtonHeight = 30;  // ボタンの高さ

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   // ボタンを作成
   CreateCloseAllButton();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   // ボタンを削除
   ObjectDelete(0, "CloseAllButton");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   // ボタンが押されたかをチェック
   if(ObjectGetInteger(0, "CloseAllButton", OBJPROP_STATE))
     {
      // ボタンが押された場合、すべてのポジションを決済
      CloseAllPositions();
      // ボタンの状態をリセット
      ObjectSetInteger(0, "CloseAllButton", OBJPROP_STATE, false);
     }
  }
//+------------------------------------------------------------------+
//| ボタン作成関数                                                    |
//+------------------------------------------------------------------+
void CreateCloseAllButton()
  {
   // ボタンを作成
   if(!ObjectCreate(0, "CloseAllButton", OBJ_BUTTON, 0, 0, 0))
      Print("Failed to create the button!");

   // ボタンのプロパティを設定
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_CORNER, 0);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_XDISTANCE, ButtonX);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_YDISTANCE, ButtonY);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_WIDTH, ButtonWidth);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_HEIGHT, ButtonHeight);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_HIDDEN, false);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_STATE, false);
   ObjectSetString(0, "CloseAllButton", OBJPROP_TEXT, "Close All");
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_FONTSIZE, 12);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_BORDER_TYPE, BORDER_RAISED);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_CORNER, CORNER_LEFT_UPPER);
  }
//+------------------------------------------------------------------+
//| すべてのポジションを決済する関数                                  |
//+------------------------------------------------------------------+
void CloseAllPositions()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS))
        {
         if(OrderType() == OP_BUY || OrderType() == OP_SELL)
           {
            // 決済
            if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, clrRed))
               Print("Failed to close order: ", OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+

このEAでは、チャート上に「Close All」というボタンが配置されます。ボタンが押されると、CloseAllPositions関数が呼び出され、すべてのポジションが決済されます。ボタンの座標やサイズはパラメータとして設定できます。

このコードをMetaTrader 4のエディタにコピーし、コンパイルして実行することで、希望の機能を持つEAを使用できます。

依頼内容(2回目)

ボタンが押されたかを状態監視ではなく、イベントで処理することはできますか

ChatGPT出力結果

ボタンの押下をイベントで処理する方法も可能です。MetaTrader 4のチャートオブジェクトのイベントを処理するために、OnChartEvent関数を使用できます。以下のコードでは、ボタンが押されたときにイベントをキャッチしてすべてのポジションを決済します。

//+------------------------------------------------------------------+
//|                                                       CloseAllEA |
//|                        Copyright 2023, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property strict

input int ButtonX = 10;  // ボタンのX座標
input int ButtonY = 10;  // ボタンのY座標
input int ButtonWidth = 100;  // ボタンの幅
input int ButtonHeight = 30;  // ボタンの高さ
input int Slippage = 3;  // スリッページ

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   // ボタンを作成
   CreateCloseAllButton();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   // ボタンを削除
   ObjectDelete(0, "CloseAllButton");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   // 通常の処理があればここに記載
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
   if(id == CHARTEVENT_OBJECT_CLICK && sparam == "CloseAllButton")
     {
      // ボタンが押された場合、すべてのポジションを決済
      CloseAllPositions();
     }
  }
//+------------------------------------------------------------------+
//| ボタン作成関数                                                    |
//+------------------------------------------------------------------+
void CreateCloseAllButton()
  {
   // ボタンを作成
   if(!ObjectCreate(0, "CloseAllButton", OBJ_BUTTON, 0, 0, 0))
      Print("Failed to create the button!");

   // ボタンのプロパティを設定
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_CORNER, 0);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_XDISTANCE, ButtonX);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_YDISTANCE, ButtonY);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_WIDTH, ButtonWidth);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_HEIGHT, ButtonHeight);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_HIDDEN, false);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_STATE, false);
   ObjectSetString(0, "CloseAllButton", OBJPROP_TEXT, "Close All");
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_FONTSIZE, 12);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_BORDER_TYPE, BORDER_RAISED);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_CORNER, CORNER_LEFT_UPPER);
  }
//+------------------------------------------------------------------+
//| すべてのポジションを決済する関数                                  |
//+------------------------------------------------------------------+
void CloseAllPositions()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS))
        {
         if(OrderType() == OP_BUY || OrderType() == OP_SELL)
           {
            // 決済
            if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, clrRed))
               Print("Failed to close order: ", OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+

このコードでは、OnChartEvent関数がボタンのクリックイベントを監視し、ボタンがクリックされたときにすべてのポジションを決済します。OnTick関数は、通常のティックごとの処理を行うためのものですが、この例では特に何も行っていません。

手直し後のコード

ボタンが押されたままになる、ボタンサイズを変更できない、という問題があったので、少し手直ししています。


input int ButtonX = 200;  // ボタンのX座標
input int ButtonY = 10;  // ボタンのY座標
input int ButtonWidth = 80;  // ボタンの幅
input int ButtonHeight = 20;  // ボタンの高さ
input int Slippage = 3;  // スリッページ

・・・

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   // 通常の処理があればここに記載
      // ボタンの状態をリセット
      ObjectSetInteger(0, "CloseAllButton", OBJPROP_STATE, false);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
   if(id == CHARTEVENT_OBJECT_CLICK && sparam == "CloseAllButton")
     {
      Print("Pressed.");
      
      // ボタンが押された場合、すべてのポジションを決済
      CloseAllPositions();
      
      // ボタンの状態をリセット
//      ObjectSetInteger(0, "CloseAllButton", OBJPROP_STATE, false);
     }
  }
//+------------------------------------------------------------------+
//| ボタン作成関数                                                    |
//+------------------------------------------------------------------+
void CreateCloseAllButton()
  {
   // ボタンを作成
   if(!ObjectCreate(0, "CloseAllButton", OBJ_BUTTON, 0, 0, 0))
      Print("Failed to create the button!");

   // ボタンのプロパティを設定
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_XDISTANCE, ButtonX);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_YDISTANCE, ButtonY);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_XSIZE, ButtonWidth);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_YSIZE, ButtonHeight);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_HIDDEN, false);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_STATE, false);
   ObjectSetString(0, "CloseAllButton", OBJPROP_TEXT, "Close All");
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_FONTSIZE, 12);
   ObjectSetInteger(0, "CloseAllButton", OBJPROP_BORDER_TYPE, BORDER_RAISED);
  }

・・・

ツール(EA)

作成したEAを上げておきます。
基本的な動作確認はしておりますが、不具合を原因とする場合を含め、利用者の損失を補填することは致しかねますのでご了承ください。
ご自身の責任の範囲で(ご自身でも動作確認するなど)ご利用ください。

1クリックでポジションをすべて決済するツール(EA) (185 ダウンロード )

🚀 ご利用ありがとうございます!ご協力のお願いです 🚀

このたびは、インジケーター・ツールをご利用いただき、誠にありがとうございます!
FXトレードの成功を後押しする、厳選したサービスをご紹介します。
ご利用頂けたら幸いです。
私のこの活動の励みになり、さらに良いツールをご提供していけるのではないかと思います!!

💼 海外FX口座の開設で収益UP!
🌍 Exness口座 – 私が最も信頼するブローカー!
  • スプレッドが業界最安水準で、コスト削減が可能
  • MT4/MT5完全対応、自動売買(EA)との相性も抜群
  • 即時出金対応で、資金管理もスムーズ

👉 Exness口座を今すぐ開設する(特別オファー)

こちらの記事もご参考に。⇒ 私のおすすめのExness口座の開設



💸 キャッシュバックありの海外口座で取引コストを削減!
 🚀 TariTali – 高還元率で差がつくキャッシュバック!
  • 高還元率キャッシュバックで取引コストを最小化
  • MT4/MT5対応ブローカーが豊富 → 自動売買との相性抜群!
  • リアルタイムでキャッシュバック履歴を確認可能
  • 国内銀行への迅速な出金サポートも充実

👉 TariTaliで賢く取引コストを削減する!
詳しくは:「なぜFX海外口座が人気なのか?MT4/MT5のEAも使用可能、入金/取引キャッシュバックあり、トレーダのための究極ガイド」

海外FXキャッシュバック口座開設ならTariTali(タリタリ)

🔥 Money Charger – 海外FXキャッシュバックの新定番!
  • 取引ごとに自動でキャッシュバック → 取引量が多いほどお得!
  • 業界最高水準のキャッシュバック率で、利益効率が大幅アップ
  • シンプルな登録&即日キャッシュバック対応
  • 対応ブローカー多数で、好きな口座を選べる柔軟性

  👉 Money Chargerでキャッシュバックを今すぐスタート!

詳しくは:海外FX取引のキャッシュバック

🇯🇵 国内FX口座も強力サポート!
📈 DMM FX – 国内No.1取引量!



詳しくはこちらの記事「あなたのFX取引を加速させるDMM.com証券のキャッシュバックキャンペーン」をご参照ください。

🔥 その他FX口座の開設

MT4対応口座等もピックアップしています。こちらの記事「FX取引: 国内口座の選択とおすすめ業者の比較、MT4 EA対応口座は」からお願いします。

手軽にお小遣い稼ぎ
 🚀 モッピーでポイ活

少しでもお金を増やしたいと思っているすべての方へ。
スマホやPCを使って手軽にポイントを稼げるサービス「モッピー」を紹介します!

アプリインストール・ゲームアプリで無料で簡単にポイントが貯まる!楽しくポイ活するならモッピー

🤖 トレードシステム(EA)で自動化して利益を加速!
🔥 私が開発した高精度EAをご紹介

👉 EAの詳細はこちら「FXトレーダー必見!MT4向け利益追求型自動売買EAの紹介

📊 人気の売れ筋EAもチェック!
  • 多くのトレーダーが愛用しているEAを厳選
  • 稼働実績や収益データも公開中

👉 人気EAランキングを今すぐ見る

関連記事

スポンサーリンク
海外FXキャッシュバック口座開設ならTariTali(タリタリ)

コメント

タイトルとURLをコピーしました