ChatGPTによる成行売り指値/逆指値付き注文関数の作成
ChatGPT(GPTs)を活用して、水平線を設定した位置に指値/逆指値を設定し、成行売り注文を行う便利な関数を作成しました。
使用GPTs:EA Creator
目的
目的は端的に言うと、“現在値の上下に設定した水平線に基づいて、指値と逆指値を自動で設定して成行売り注文を実行する“関数を作成することでした。
最初の依頼内容と実行結果
こちらの記事「ChatGPT(GPTs)でMQL4用の関数作成:成行買い指値/逆指値付き注文を行う」で、基本的に同じ仕様で買い注文を行う関数を作ったため、この依頼に続けて売り注文用の関数を作ってもらっています。
そこで試しに、かなり簡素な文面で依頼をしてみました。下記のような依頼です。
何と、すごい!こんな依頼でも作成してもらえました!賢いですね。
依頼内容
同じように、成り行き売り注文の関数を作成お願いします。
指値、逆指値が買いとは上下逆になることに注意お願いします。
ChatGPT出力結果
指定された仕様に基づいて、成行売り注文を行うMQL4関数を作成します。この関数では、売り注文の際に指値と逆指値が買い注文の場合と上下逆になる点に注意して設定します。
// 外部パラメータ extern double lotSize = 0.1; // ロットサイズの初期値 extern string linePrefix = "Horizontal Line"; // 水平線の名前の接頭辞 extern double takeProfitOffset = 50.0; // 指値オフセット値(pips) extern double stopLossOffset = 50.0; // 逆指値オフセット値(pips) extern int slippage = 3; // スリッページ extern int MagicNumber = 123456; // マジックナンバー // 成り行き売り注文関数 void PlaceSellOrder() { double askPrice = MarketInfo(Symbol(), MODE_ASK); double bidPrice = MarketInfo(Symbol(), MODE_BID); double lowerTakeProfitPrice = 0.0; // 指値 double upperStopLossPrice = 0.0; // 逆指値 string lowerLineName = ""; string upperLineName = ""; // チャート上の水平線をチェック for(int i = 0; i < ObjectsTotal(); i++) { string name = ObjectName(i); if(ObjectType(name) == OBJ_HLINE && StringFind(name, linePrefix) == 0) { double linePrice = ObjectGet(name, OBJPROP_PRICE1); // 現在値より下にある有効な水平線を探す(指値用) if(linePrice < bidPrice && (lowerTakeProfitPrice == 0.0 || linePrice > lowerTakeProfitPrice)) { lowerTakeProfitPrice = linePrice; lowerLineName = name; } // 現在値より上にある有効な水平線を探す(逆指値用) else if(linePrice > askPrice && (upperStopLossPrice == 0.0 || linePrice < upperStopLossPrice)) { upperStopLossPrice = linePrice; upperLineName = name; } } } // 指値および逆指値の設定 if(lowerTakeProfitPrice == 0.0) lowerTakeProfitPrice = bidPrice - (takeProfitOffset * Point * 10); if(upperStopLossPrice == 0.0) upperStopLossPrice = bidPrice + (stopLossOffset * Point * 10); // 成行売り注文を出す int ticket = OrderSend(Symbol(), OP_SELL, lotSize, bidPrice, slippage, upperStopLossPrice, lowerTakeProfitPrice, "Sell Order", MagicNumber, 0, clrRed); if(ticket <= 0) { Print("OrderSend failed with error #", GetLastError()); } else { Print("Sell order placed successfully with ticket #", ticket); // 使用した水平線を削除 if(lowerLineName != "") ObjectDelete(lowerLineName); if(upperLineName != "") ObjectDelete(upperLineName); } }
この関数では、成行売り注文を行い、指定された名前の接頭辞で始まる水平線を検索します。指定された条件に基づいて指値と逆指値を設定し、使用した水平線は削除します。ロットサイズ、スリッページ、マジックナンバーは外部パラメータから取得します。注文が成功したかどうかは、
OrderSend
関数の戻り値とGetLastError
関数を使用して確認します。
コメント