たくさんのポジションのプロフィットとストップロスを一括で設定したい!
こんにちは。ちょびっとfxです。
さて、タイトル通りですが、EAつくーるで出力されたソースコードを基に複数のポジションのプロフィットとストップロスを設定できるものを作ってみました。
ポジポジ病のお薬って感じですかね。(?)
さて早速、関数です。
//+--------------------------------------------------------------------------------------------------------+
//| ポジションおよび待機中注文のストップロスおよびテイクプロフィットを一括で変更する関数 |
//| 処理: 指定したシンボルのすべてのポジションおよびリミットオーダーのストップロスおよびテイクプロフィット |
//| を一括で変更 |
//| 引数: symbol - 通貨ペア |
//| newStopLoss - 新しいストップロス値(指定通貨ペアの価格で指定) |
//| newTakeProfit - 新しいテイクプロフィット値(指定通貨ペアの価格で指定) |
//| orderType - 注文タイプ(OP_BUY、OP_SELLを指定。-1の場合は全てを対象とする) |
//| 戻り値: なし |
//+--------------------------------------------------------------------------------------------------------+
void updateAllStopLossAndTakeProfit(string symbol, double newTakeProfit, double newStopLoss, int orderType = -1)
{
// オープンポジションおよび待機中注文のストップロスとテイクプロフィットを変更
for (int i = 0; i < OrdersTotal(); i++)
{
// 注文を選択
if (OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == symbol)
{
int currentOrderType = OrderType();
// 指定された注文タイプのみ処理(orderTypeが-1の場合はすべて)
if (orderType == -1 || currentOrderType == orderType)
{
// 新しいストップロスまたはテイクプロフィットが現在の値と異なる場合に処理
if ((newStopLoss == 0 || OrderStopLoss() != newStopLoss) ||
(newTakeProfit == 0 || OrderTakeProfit() != newTakeProfit))
{
// オープンポジションの場合
if ((currentOrderType == OP_BUY &&
(newStopLoss == 0 || newStopLoss < Bid) &&
(newTakeProfit == 0 || newTakeProfit > Bid)) ||
(currentOrderType == OP_SELL &&
(newStopLoss == 0 || newStopLoss > Ask) &&
(newTakeProfit == 0 || newTakeProfit < Ask)))
{
bool result = OrderModify(OrderTicket(), OrderOpenPrice(), newStopLoss, newTakeProfit, 0);
if (result)
{
Print("Successfully updated Stop Loss and Take Profit for order #", OrderTicket());
}
else
{
Print("Failed to update Stop Loss and Take Profit for order #", OrderTicket(), ". Error: ", GetLastError());
}
}
// 待機中のリミットオーダーの場合
else if ((currentOrderType == OP_BUYLIMIT &&
(newStopLoss == 0 || newStopLoss < Bid) &&
(newTakeProfit == 0 || newTakeProfit > Bid)) ||
(currentOrderType == OP_SELLLIMIT &&
(newStopLoss == 0 || newStopLoss > Ask) &&
(newTakeProfit == 0 || newTakeProfit < Ask)))
{
bool result = OrderModify(OrderTicket(), OrderOpenPrice(), newStopLoss, newTakeProfit, 0);
if (result)
{
Print("Successfully updated Stop Loss and Take Profit for pending order #", OrderTicket());
}
else
{
Print("Failed to update Stop Loss and Take Profit for pending order #", OrderTicket(), ". Error: ", GetLastError());
}
}
else
{
Print("Invalid Stop Loss or Take Profit level for order #", OrderTicket());
}
}
}
}
}
}利用方法はこんな感じ。
買いポジションの場合
updateAllStopLossAndTakeProfit("USDJPY", 160, 159, OP_BUY);
売りポジションの場合
updateAllStopLossAndTakeProfit("USDJPY", 159, 160, OP_SELL);
簡単ですね。
*予約しているポジションも一括で変更されます。
EAつくーるのルールの沿ってるので、下記でもOKかも。
inputとしてパラメーター入力から設定値を入力するのもいいかもしれませんね。
input double newBuyProfitPrice = 0; // 買いポジションの新しい利益確定価格(テイクプロフィット) input double newBuyStopLossPrice = 0; // 買いポジションの新しい損切り価格(ストップロス) input double newSellProfitPrice = 0; // 売りポジションの新しい利益確定価格(テイクプロフィット) input double newSellStopLossPrice = 0; // 売りポジションの新しい損切り価格(ストップロス)
// 買いポジションのテイクプロフィットおよびストップロスを更新 updateAllStopLossAndTakeProfit(Symbol(), newBuyProfitPrice, newBuyStopLossPrice, OP_BUY); // 売りポジションのテイクプロフィットおよびストップロスを更新 updateAllStopLossAndTakeProfit(Symbol(), newSellProfitPrice, newSellStopLossPrice, OP_SELL);
ではまた。
ファイルDLは下記より。
× ![]()