ボタンを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を上げておきます。
基本的な動作確認はしておりますが、不具合を原因とする場合を含め、利用者の損失を補填することは致しかねますのでご了承ください。
ご自身の責任の範囲で(ご自身でも動作確認するなど)ご利用ください。
おすすめ情報
インジケータ、ツールをご利用頂きありがとうございます。
ご利用頂いている方、そうでない方にも、おすすめの情報を紹介いたします。
ご興味のある方は、ぜひご確認頂けたらと思います。
海外FX口座の開設
- その他、口座(キャッシュバックあり)の開設
詳しくはこちらの記事「なぜFX海外口座が人気なのか?MT4/MT5のEAも使用可能、入金/取引キャッシュバックあり、トレーダのための究極ガイド」をご参照下さい。
「Money Charger」は、海外FX取引におけるキャッシュバックサービスを提供するプラットフォームです。
取引ごとにキャッシュバックを受け取ることができ、業界最高水準のサービスを提供しています。
詳しくは「海外FX取引のキャッシュバック」記事をご覧ください。
国内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を確認できます。
コメント