* 目次 [#w2892cc0] #contents * はじめに [#m6ecd251] 半自動RangeBreakoutEAを作る このページは半自動RangeBreakoutのEAを作るメモである。 手動だと、レジサポライン付近で待機していないといけないのが時間がもったいないとおもったので、半自動化しようと思った。 * EAだいたいの動き [#jd9da880] このEAは、トレンドフォロー時専用のEAなのである。なので、三角持ち合い状態のレンジを絶対にエントリーしないようにするため、どこからどこまでがトレンドゾーンなのかは裁量で判断する必要がある。 * 仕様 [#o3b436ee] - 指定した時刻で自動売買を停止できるように設定できるようにする。 - ブレークアウト時は指定したロットで2つの注文を入れる。下がる兆しがあれば半分を利確するためである。 - レジストラインの値はEA実行時に手動で入力する - 入力した値に基づいてStopBuyオーダを設定する。エントリーはレジストラインに対してスワップポイント+1ポイント上に設定する。スワップポイントは必要経費。 - ロスカットは、レジストラインに対してスワップポイント+30ポイント下に置く - ロスカット時は、直近高値にレジストラインの値を再度設置する - 利確ポイントは複数の条件で利確する。 * 利確条件 [#qf741547] - リスクリワード、レンジ幅に対して指定した倍率のポイントにデフォルトで入れる。 -- 5移動平均の傾きが横ばいになったら、1つ利確する - 移動平均が下向きになったら、2つ目を利確する - 急激な値上がりをした場合は利確をし急激な値上がりの半値で再エントリーする2つのローソク足までを再エントリーの期限とする。 - 2つ目の利確時に売り注文も入れる - 売り注文が1つのとき、5期間移動平均と20期間移動平均がデッドクロスしたらもう一つ売り注文を入れる - 5期間移動平均が横ばいになったら売り注文を1つ閉じる - 5期間移動平均が上向きになったら、売り注文を閉じる * 微調整 [#r6a7eb7d] 利確の判定で出来高の増加が3期間連続の場合は、条件を厳しめに利確する ** 入力項目 [#l3680bd9] - 自動売買開始時刻と終了時刻: UTCまたは日本時間で指定可能。 - タイムゾーン: ユーザーが選択可能。 - レジスタンスライン値とサポートライン値: 手動入力。 - リスク許容金額: ドルで入力し、ロスカット金額から自動でロットサイズを計算。 - 移動平均傾きの閾値: ユーザーが指定したATRのn%を使用。 - 動作モード: ブレークアウト待ち、レジストラインブレークアウト中、利確後売り待ち、売り中 ** メソッド [#y99dda37] - トレンド判定: レジスタンスとサポートラインの範囲内をボックス相場と判断。 - エントリー注文設定: レジスタンスまたはサポートラインを超えた際の注文設定。 - 利確判定: 指定条件に基づく利確タイミングの判定。 - ロスカット判定: レジスタンスまたはサポートラインに基づくロスカット位置の設定。 - 移動平均傾き判定: 指定されたATRのパーセンテージを閾値として使用。 ** 共通メソッド [#oa4c8748] - 価格データ取得: 現在の価格データの取得。 - 時間チェック: 指定された時間が到達したかのチェック。 * 詳細設計 [#s6e28787] ** 入力項目 [#wd37db52] - 自動売買開始時刻と終了時刻: -- 変数 input string inputStartTime = "2023.01.01 00:00"; input string inputEndTime = "2023.12.31 23:59"; -- 書式: YYYY.MM.DD HH:MM(年月日 時分) - タイムゾーン: -- Enum: TimeZone(UTC、JST) -- 変数: input TimeZone timeZone = UTC;(デフォルトはUTC) - レジスタンスライン値とサポートライン値: -- 変数: input double resistanceLine; input double supportLine; - リスク金額: -- 変数: input double riskMoney; ** グローバル変数 [#sc75ec85] - currentTick (MqlTick型): -- 説明: 現在の市場のティックデータを保持する。これには価格やボリューム情報が含まれる。 -- 使用例: MqlTick currentTick; - trade (CTrade型): -- 説明: 取引操作を管理するためのオブジェクト。注文の発注やポジションの管理に使用される。 -- 使用例: CTrade trade; - 5期間移動平均 (MA) ハンドルとバッファ: -- ハンドル: int handleMA5; -- バッファ: double bufferMA5[]; - 20期間移動平均 (MA) ハンドルとバッファ: -- ハンドル: int handleMA20; -- バッファ: double bufferMA20[]; -- 説明: 20期間移動平均のデータを保持。 - ATR ハンドルとバッファ: -- ハンドル: int handleATR; -- バッファ: double bufferATR[]; -- 説明: 平均真の範囲 (ATR) のデータを保持。 ** メソッド [#u2460688] - トレンド判定 (IsTrend): -- 引数: double resistanceLine, double supportLine -- 戻り値: bool (トレンドがある場合は true) -- 機能: レジスタンスとサポートラインの範囲内をボックス相場と判断し、トレンドの有無を判定。 - エントリー注文設定 (SetEntryOrder): -- 引数: double lineValue, bool isResistance -- 戻り値: なし -- 機能: レジスタンスまたはサポートラインを超えた際にエントリー注文を設定。 - 利確判定 (CheckTakeProfit): -- 引数: double takeProfitLevel -- 戻り値: bool (利確する場合は true) -- 機能: 指定条件に基づいて利確するタイミングを判定。 - ロスカット判定 (CheckStopLoss): -- 引数: double stopLossLevel -- 戻り値: bool (ロスカットする場合は true) -- 機能: レジスタンスまたはサポートラインに基づいてロスカット位置を設定。 - 移動平均傾き判定 (CheckMovingAverageSlope): -- 引数: double atrThreshold -- 戻り値: int (傾きの状態を表す) -- 機能: 指定されたATRのパーセンテージを閾値として移動平均の傾きを判断。 * 実装計画 [#o913638c] 手始めに以下の2項目を実装するのを目標にする ** ステップ1: 指定時間範囲での売買機能の実装 [#nfc594ac] *** 時間管理メソッドの開発: [#fad61f3f] - 時間管理メソッドの開発: - これにより、EAは指定された時間範囲内でのみ取引を行います。 *** Buy Stop オーダーの実装: [#le54bf2c] - 時間管理メソッドの開発: -- 指定された時間範囲を管理し、現在時刻がその範囲内かを判断するメソッドを開発。 -- これにより、EAは指定された時間範囲内でのみ取引を行います。 - Buy Stop オーダーの実装: -- レジスタンスラインを超えた際にBuy Stop オーダーを発注する機能を実装。 -- 市場がレジスタンスラインを超えると、EAは自動的に取引を開始します。 ** ステップ2: ロスカット検出と再エントリー機能の実装 [#g3a7a4d7] - ロスカット検出メソッドの開発: -- 取引がロスカットに達したかを検出するメソッドを開発。 -- これにより、EAは取引が不利になった場合にそれを認識し、適切に対応できます。 - ロスカット後の再エントリー: -- ロスカットが発生した後、再度条件が満たされるとBuy Stop オーダーを再発注。 -- これにより、市場が再び有利な方向に動いた場合に、EAは追加の利益を得るチャンスを持ちます。