リスクゼロの損益分岐点でストップ注文するスクリプト|ブレイクイーブン
複数ポジションでの損益分岐点は、計算が少し大変です。
簡単にリスクゼロのストップ注文ができる方法はありますか?
FXの不労所得だけで年収2000万を達成しました。
このお悩みに誠意をもって回答します。
このページでわかること・できること
〇損益分岐点を計算し、ストップ注文できるスクリプトについて
〇スクリプトのダウンロード
〇スクリプトのインストールと使い方
損益分岐点にリスクゼロのストップ注文ができるスクリプト|Break even
スクリプト「Break even」を使うと損益分岐点を計算し、ストップ注文を入れてくれる。
ストップ注文は適用開始の利益幅と最低の獲得利益を指定できる。
ポジションがひとつの場合は簡単な作業であるが、複数ポジションの場合に損益分岐点を割り出すには手間がかかる。
このスクリプトを使えば、複数ポジションでも簡単にリスクゼロの位置でストップ注文ができる。
獲得する利益も自由に設定できる。
また、適用する注文は、すべての注文、買いのみ、売りのみから選択可能。
Break evenのインストール
ダウンロードしたスクリプトはMT4の「scripts」フォルダへ移動し、再起動でインストールが完了する。
MT4から上記の順番でフォルダを開き、スクリプトを移動する。
スクリプトのインストール詳細は以下を参照
Break evenの使い方
MT4へインストールしたスクリプトは、ナビゲーターのスクリプトから呼び出しが可能となる。
スクリプトの起動はダブルクリックやチャートへのドロップで実行できる。
スクリプトを実行するとパラメーター画面が開くので、パラメーターを設定しOKをクリック。
〇現在のチャートシンボルのみ:実行したチャートの通貨ペアのみか、すべての注文に適用させるかを選択。
〇適用する注文:全て、買いのみ、売りのみ、の3点から選択可能。
〇適用開始の利益:全ポジションの合計でどれだけの利益からスクリプトを適用させるかを指定。
〇獲得する利益:確定させる利益の量を指定。
運用開始の利益で設定した値以上に利益がある場合、スクリプトは実行される。
スクリプト「ブレイクイーブン」の便利な点
リスクゼロの損益分岐点でストップ注文できるスクリプトは「ブレイクイーブン」は、トレーダーにとって便利なツールだ。
複数ポジションに対応し、売りのみ、買いのみの適用もできる。
具体的に便利である点は以下より参照いただきたい。
- リスク管理強化: スクリプトは損益分岐点で自動的にストップ注文を行うため、ポジションのリスクを限定できる。
損失が最小限に抑えられるため、トレーダーのリスク管理が簡単に強化される。 - 感情の排除: 感情に左右されずに注文が実行されるため、冷静なトレードが可能となる。
ヒューマンエラーや感情的な判断ミスを未然に回避できる。 - 効率的なエントリー/エグジット: 損益分岐点でのストップ注文は、効率的なエントリーとエグジットを可能にする。
利益を最大化し、損失を最小限に抑えることに役立つ。 - 時間節約: ブレイクイーブンの注文を実行した後は、常にチャートを監視する必要がなくなる。
節約できた時間で他の重要な作業に集中もできる。
これらの要因により、リスクゼロの損益分岐点でストップ注文するスクリプトは、トレードの効率性、リスク管理、感情の排除などをサポートし、トレーダーの取引を強化できる。
スクリプトのプログラム
//+------------------------------------------------------------------+
//| Break even.mq4 |
//| Copyright 2024, FX-Bonus.net |
//| https://fx-bonus.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, FX-Bonus.net"
#property link "https://fx-bonus.net/"
#property version "1.00"
#property strict
#property show_inputs
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
enum ENUM_ORDER_TYPES
{
ALL_ORDERS = 1, // 全ての注文
ONLY_BUY = 2, // 買い注文のみ
ONLY_SELL = 3 // 売り注文のみ
};
input bool OnlyCurrentSymbol = false; // 現在のチャートのシンボルのみ
input ENUM_ORDER_TYPES OrderTypeFilter = ALL_ORDERS; // 適用する注文
input int MinimumProfit = 0; // 適用開始の利益(ポイント)
input int AdditionalProfit = 0; // 獲得する利益(ポイント)
void OnStart()
{
if (!TerminalInfoInteger(TERMINAL_CONNECTED))
{
Print("トレードサーバーに接続されていません。終了します。");
return;
}
if ((!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) || (!MQLInfoInteger(MQL_TRADE_ALLOWED)))
{
Print("オートトレードが無効です。有効にしてください。終了します。");
return;
}
int orders_total = OrdersTotal();
for (int i = orders_total - 1; i >= 0; i--) // 後ろから処理して、ループ中に1つ以上の注文が閉じられた場合に備える
{
if (!OrderSelect(i, SELECT_BY_POS))
{
Print("エラー - 注文が選択できません - ", GetLastError());
continue;
}
if (OrderProfit() <= 0) continue; // 損失の注文は常にスキップ
// 注文がフィルターと一致するかどうかを確認し、一致しない場合は注文をスキップして次に移動する
if ((OrderTypeFilter == ONLY_SELL) && (OrderType() == OP_BUY)) continue;
if ((OrderTypeFilter == ONLY_BUY) && (OrderType() == OP_SELL)) continue;
if ((OnlyCurrentSymbol) && (OrderSymbol() != Symbol())) continue;
double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);
// 差を計算してdoubleを比較。この差がPoint / 2より大きい場合、注文の利益はMinimumProfitパラメーター以下です。
if ((MinimumProfit > 0) && ((double)MinimumProfit - MathAbs(OrderOpenPrice() - OrderClosePrice()) / point > point / 2)) continue;
if (SymbolInfoInteger(OrderSymbol(), SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_DISABLED)
{
Print(OrderSymbol(), " で取引が無効です。スキップします。");
continue;
}
double extra_be_distance = AdditionalProfit * point;
int digits = (int)SymbolInfoInteger(OrderSymbol(), SYMBOL_DIGITS);
double tick_size = MarketInfo(OrderSymbol(), MODE_TICKSIZE);
if (tick_size > 0)
{
// Tickサイズの精度に合わせて調整する
extra_be_distance = NormalizeDouble(MathRound(extra_be_distance / tick_size) * tick_size, digits);
}
else
{
Print(OrderSymbol(), " のTickサイズが0です。スキップします。");
continue;
}
if (OrderType() == OP_BUY)
{
double BE_price = NormalizeDouble(OrderOpenPrice() + extra_be_distance, digits);
if ((SymbolInfoDouble(OrderSymbol(), SYMBOL_BID) >= BE_price) && (BE_price > OrderStopLoss())) // 現在の価格が計算されたBE価格より上にあり、現在のストップロスがそれより低い場合にのみ、BEに移動します。
{
double prev_sl = OrderStopLoss(); // 前回のSLを記憶する
// BE価格をSLフィールドに書き込みます。
if (!OrderModify(OrderTicket(), OrderOpenPrice(), BE_price, OrderTakeProfit(), OrderExpiration()))
Print("OrderModify Buy BE failed ", GetLastError(), " for ", OrderSymbol());
else
Print(OrderSymbol() + " BUY-order #" + IntegerToString(OrderTicket()) + " ロット数 = " + DoubleToString(OrderLots(), 2) + ", 始値 = " + DoubleToString(OrderOpenPrice(), digits) + ", ストップロスが " + DoubleToString(prev_sl, digits) + " から移動しました。");
}
}
else if (OrderType() == OP_SELL)
{
double BE_price = NormalizeDouble(OrderOpenPrice() - extra_be_distance, digits);
if ((SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK) <= BE_price) && ((BE_price < OrderStopLoss()) || (OrderStopLoss() == 0))) // 現在の価格が計算されたBE価格より下にあり、現在のストップロスがそれより高い(または0)場合にのみ、BEに移動します。
{
double prev_sl = OrderStopLoss(); // 前回のSLを記憶する
// BE価格をSLフィールドに書き込みます。
if (!OrderModify(OrderTicket(), OrderOpenPrice(), BE_price, OrderTakeProfit(), OrderExpiration()))
Print("OrderModify Buy BE failed ", GetLastError(), " for ", OrderSymbol());
else
Print(OrderSymbol() + " SELL-order #" + IntegerToString(OrderTicket()) + " ロット数 = " + DoubleToString(OrderLots(), 2) + ", 始値 = " + DoubleToString(OrderOpenPrice(), digits) + ", ストップロスが " + DoubleToString(prev_sl, digits) + " から移動しました。");
}
}
}
return;
}
プログラム解説
1. ENUM_ORDER_TYPES 列挙型
- 注文タイプを定義するための列挙型です。ALL_ORDERS(全ての注文)、ONLY_BUY(買い注文のみ)、ONLY_SELL(売り注文のみ)の3つの定数があります。
2. 入力パラメーター
input
ディレクティブを使用して、スクリプトの動作をカスタマイズするためのパラメーターを定義します。OnlyCurrentSymbol
: 現在のチャートのシンボルのみを対象とするかどうかを指定します。OrderTypeFilter
: 適用する注文のタイプを指定します。MinimumProfit
: ブレークイーブンを適用する最小利益(ポイント)を指定します。AdditionalProfit
: ブレークイーブンに追加する利益(ポイント)を指定します。
3. void OnStart()
- スクリプトのメイン関数です。スクリプトの開始時に実行されます。
- トレードサーバーへの接続とオートトレードの有効化を確認します。
- 注文を処理するためのループを開始します。後ろから処理しているのは、ループ中に注文が閉じられる可能性があるためです。
- 各注文に対して以下の処理を行います:
- 注文が利益を出しているかどうかをチェックし、利益がない場合はスキップします。
- フィルターに一致しない注文はスキップします。
- 指定した最小利益以上の利益がある場合、ブレークイーブンを適用します。
- 注文の取引が無効な場合はスキップします。
- 注文のタイプ(買い/売り)に応じて、ブレークイーブンの条件を計算して注文を修正します(ストップロスを調整)。
4. OrderModify()
関数
- 注文のストップロスをブレークイーブンに移動するために使用されます。
このスクリプトは、指定された条件下で注文にブレークイーブンを適用するためのものです。注文が一定の利益を上げた場合に自動的にストップロスを調整し、利益確定を試みます。ただし、このスクリプトは全体の一部であり、他の関数や設定も含まれている可能性があるため、全体の動作を理解するためには全体のコードを確認する必要があります。
便利なMT4スクリプト集
-
ラウンドナンバーに自動で水平ラインを引く方法|MT4スクリプト
-
市場ごとに高値と安値を色分けする|時間帯ブレイクアウト|MT4スクリプト
-
取引履歴をすべてCSVファイルに出力するスクリプト|MT4
-
リスクゼロの損益分岐点でストップ注文するスクリプト|ブレイクイーブン
-
MT4を便利にするスクリプトまとめ
-
すべてのチャートを一括で閉じる方法|通貨ペア選択も可|MT4スクリプト
-
S/L・T/P注文を一括でキャンセルする方法|MT4スクリプト
-
ストップロス(損切り)とテイクプロフィット(利食い)を一括で注文する方法
-
ポジション全決済と売りのみ・買いのみ決済を選択できる一括決済スクリプト
-
すべて・または選択したチャートを一括で開く方法|MT4スクリプト
-
チャートのトレンドラインまたはオブジェクトすべてを一括で削除する方法
-
チャートのタイムフレーム(期間•時間枠)を一括で変更するスクリプト