はじめに
前回はEA開発用テンプレートを利用して、逆張りシステムEAを作る過程を解説しました。
前回作った逆張りシステムEAのコード全体記述は下記のリンクから確認ができます↓
今回からは待機注文用EA開発テンプレートを作っていきたいと思います。
待機注文は、成行注文のようにマーケットの現在値でポジションを持つのではなく、特定の価格に到達したらポジションを持つような要求をトレードサーバーにする注文方式です。
これまでの講座では待機注文も簡単に扱えるように、OriginalTrade.mqhファイルやOriginalCpending.mqhファイルにオリジナルクラスや関数群を作ってきました。
※詳細は↓の記事群をご参照ください。
- MQL5 EA講座 第86回「待機注文関数を作る-その1-」
- MQL5 EA講座 第87回「待機注文関数を作る-その2-」
- MQL5 EA講座 第88回「待機注文情報取得用のクラスを追加する」
- MQL5 EA講座 第89回「待機注文情報取得用クラスにpublic関数を実装する」
これらのクラスや関数を集約させたインクルードファイルを取り込んで、待機注文用EA開発テンプレートも別に作ってしまおう、というのが今回やろうとしている事です。
EAはそもそも「こういう条件になったら、こういう売買をしてください」という指示を与えただけのものです。「こういう条件になったら」という部分をif文で制御させる+成行注文、という組み合わせの記述をすれば、待機注文コードを使わなくても殆どのトレード戦略は実現できます。
その一方で、トレード戦略次第では待機注文を使ったコード記述の方がシンプルになったりすることもありますし、逆により複雑な条件付き注文を実現するには待機注文が必要な局面もあります。
具体的な取引戦略や目的に応じて、どちらの注文形式(成行注文/待機注文)でも、簡単にEAを作れるようにしておけば鬼に金棒です。
今回待機注文用EA開発テンプレートの作成過程を解説し、次回テンプレートを使って実際にEAを1つ作っていきたいと思います。それをもってMQL5でEA作ろう講座は一旦完結です。
待機注文用EA開発テンプレート作成のロードマップ
待機注文用EA開発テンプレートの作成は以下の手順を踏んで進めていきます。
・インクルードファイルに「OriginalCpending.mqh」ファイルを追加し、インスタンスを宣言する。
・OnTick関数内の発注記述を成行注文記述から待機注文記述に変更する。
1つ1つ順を追って見ていきましょう。
EA開発用テンプレートから新規ファイルを作成する
待機注文用EA開発テンプレートは1から作る訳ではありません。
大半の記述は第125回~129回で作ったEA開発用テンプレートのものをそのまま流用し、一部の記述を変更する形で進めていきます。
EA開発用テンプレートのプログラムファイルをメタエディターで開き、「ファイル」メニューから「名前を付けて保存」を選択して別ファイルを作りましょう。
※新たに作ったファイルは仮に「Template For PendingOrder EA」としました。
EA開発用テンプレートのコード記述全体は↓の記事をご参照ください。
インクルードファイルに「OriginalCpending.mqh」ファイルを追加し、インスタンスを宣言する
新たに作った「Template For PendingOrder EA」ファイルに記述を追加していきます。
EA開発用テンプレートには既にいくつかのインクルードファイルが取り込まれていますが、
ここにさらにOriginalCpending.mqhファイルをインクルードさせます。
インクルードさせる場所はグローバル領域の中であればどこでも構いませんが、可読性を考えるとインクルード記述群の一番下あたりが良いでしょう。
// ペンディング注文関連のクラスをインクルード
#include <OriginalCpending.mqh>
OriginalCpending Pending; //ペンディング注文関連の情報を扱うインスタンス
OriginalCpending.mqhファイルには待機注文に関する情報(オーダー番号や注文数など)を取得・管理する為のクラスや関数が集約されています。
※待機注文自体を行う関数はOriginalCpending.mqhファイルに集約されています。OriginalCpending.mqhファイルに入っているのはあくまで「待機注文に関する情報」の操作・管理を行う関数群がまとめられています。
OriginalCpending.mqhファイルの記述全体は↓の記事をご参照ください
OriginalCpendingをデータ型としたインスタンスを宣言します。
インスタンス名は「Pending」としました。
※なお、EA開発用テンプレート作成の段階でインクルードされているファイルは以下の通りです。
- OriginalTrade.mqhファイル(注文関連のクラスや関数が盛り込まれているファイル)
- OriginalPrice.mqhファイル(価格情報取得・管理に関連する機能が盛り込まれているファイル)
- OriginalMoneyManagement.mqhファイル(資金管理関連の機能が盛り込まれているファイル)
- OriginalTrailingStop.mqhファイル(トレーリングストップやブレイクイーブンストップに関連する機能が盛り込まれているファイル)
- OriginalIndicators.mqhファイル(インジケータを扱う為の機能が盛り込まれているファイル)
- OriginalTimer.mqhファイル(トレードタイマーに関する機能が盛り込まれているファイル)
グローバル変数を追加する
続いてグローバル変数を追加していきます。
※今回input変数ブロックには特に追加記述はありません。
//+------------------------------------------------------------------+
//| グローバル変数 |
//+------------------------------------------------------------------+
ulong glBuyTicket, glSellTicket;//ポジション番号を格納する変数
bool glBuyPlaced, glSellPlaced; // 買い注文と売り注文が配置されたかどうかを示すフラグ
ポジション番号を格納する「glBuyTicket」「glSellTicket」はEA開発用テンプレートの段階で宣言したものです。
その下にbool型の「glBuyPlaced」「glSellPlaced」というグローバル変数を追加しました。
これらの変数は待機注文が正しく正しくセッティングされたかどうかを確認するフラグとして使用します。待機注文の処理を担う各種関数は注文後、その注文が成功したかどうかの結果を戻り値として返すように作ってあります。
※詳しくはMQL5 EA講座 第87回「待機注文関数を作る-その2-」をご覧ください。
OnTick関数内の注文条件箇所の記述を変更する
OnInit関数内の記述については特に従来のEA開発用テンプレートのものから変更・追加箇所はありません。
続いてOnTick関数内の変更に移ります。
OnTick関数内も、基本的には従来のEA開発用テンプレートの記述をそのまま使いますが、2か所ほど変更を施します。
まずは買いと売りの注文条件箇所の部分です。
買い注文条件箇所の変更
現状では買い注文の条件は以下のようになっています。
// 買い注文について
if(Positions.GetBuyPosCount(MagicNumber) == 0)//買いポジションがなければ
これを待機注文用EA開発テンプレートを作るにあたり以下のように変更します。
// 買い注文について
if(Positions.GetBuyPosCount(MagicNumber) == 0 // 買いポジションがない場合
&&
Pending.BuyLimitNum(_Symbol) == 0 // 買いリミット注文がない場合
&&
Pending.BuyStopNum(_Symbol) == 0 // 買いストップ注文がない場合
&&
Pending.BuyStopLimitNum(_Symbol) == 0 // 買いストップリミット注文がない場合
EA開発用テンプレートの時は、この売買条件の箇所は「買いポジションがない場合」としていたのですが、待機注文用EA開発テンプレートに作り替えるにあたり、「買いポジションがなく、買いリミット注文がなく、買いストップ注文がなく、買いストップリミット注文がない時」としました。
テンプレートなので、売買条件の制御に関する記述はなるべくシンプルなものにしておくのが望ましいのですが、待機注文の場合は原則として注文を出した後、即時にポジションが有効化する訳ではありませんから、一応「ポジションも同方向の待機注文もない時」という状態を最低条件として付けくわえた形です。
BuyLimitNum関数は買いリミット待機注文の数を取得するメンバ関数です。所属しているクラスはOriginalCpendingクラスになります。
※リミット注文とはマーケットの現在値よりも、有利な価格でポジションを持つことを目的とした注文形態のことです。
BuyStopNum関数は、同じくOriginalCpendingクラスの、買いストップ待機注文の数を取得するメンバ関数です。
※ストップ注文とは、現在値よりも不利な価格(=高く)でポジションを持つ事を目的とした注文形態のことです。
BuyStopLimitNum関数も、同じくOriginalCpendingクラスの、買いストップリミットの待機注文の数を取得するメンバ関数です。
※ストップリミット注文はストップとリミットの両方の価格を指定します。相場がブレイクアウトする形でストッププライスに到達した後、価格がいったん押し目を作ることを想定して最終的にリミット価格でポジションを持ちます。
詳しくは↓
.stoplimit →stoplimit待機注文のリミット価格を設定する
をご覧ください。
売り注文条件箇所の変更
売り注文の条件にも買いの時と同様の変更を行います。
現状では売り注文の条件は以下のようになっています。
// 売り注文について
if(Positions.GetSellPosCount(MagicNumber) == 0)// 売りポジションがなければ
これを以下のように変更します。
// 売り注文について
if(Positions.GetSellPosCount(MagicNumber) == 0 // 売りポジションがない場合
&&
Pending.SellLimitNum(_Symbol) == 0 // 売りリミット注文がない場合
&&
Pending.SellStopNum(_Symbol) == 0 // 売りストップ注文がない場合
&&
Pending.SellStopLimitNum(_Symbol) == 0 // 売りストップリミット注文がない場合
) // 売りポジションがなく、売り待機注文もなければ
条件文を「売りポジションがない場合」から「売りポジションがなく、売りリミット注文がなく、売りストップ注文がなく、売りストップリミット注文がない時」に変更しました。
OnTick関数内の発注記述を成行注文記述から待機注文記述に変更する
最後にOnTick関数内の発注記述を成行注文記述から待機注文記述に変更します。
具体的に言うと先程の「OnTick関数内の注文条件箇所の記述を変更する」セクションで変更したif文内の()条件を満たした後に実行される{}内の記述についてです。
当然買い注文、売り注文両方の記述を変更します。まずは買い注文から。
買い注文箇所の記述変更
買い注文箇所の記述は現状以下のようになっています。
{
//買い注文を出す
glBuyTicket = Trade.Buy(_Symbol,tradeSize);
if(glBuyTicket > 0)
{
// 開いたポジションの価格を取得
double openPrice = PositionOpenPrice(glBuyTicket);
double buyStop = CalBuySL(_Symbol, StopLoss, openPrice); // ストップロス計算
if(buyStop > 0)
buyStop =ModifyLowerStopLevel(_Symbol, buyStop); // ストップロスの設定が有効かチェック
double buyProfit = CalBuyTP(_Symbol, TakeProfit, openPrice); // テイクプロフィット計算
if(buyProfit > 0)
buyProfit =ModifyUpperStopLevel(_Symbol, buyProfit); // テイクプロフィットの設定が有効かチェック
// ストップロスとテイクプロフィットを設定
if(buyStop > 0 || buyProfit > 0)
Trade.SetSLTP(glBuyTicket, buyStop, buyProfit);
glSellTicket = 0; // 売りチケットリセット
}
}//買い注文記述の終わり
これを以下のように変更します。
{
double orderPrice = 0; // 注文価格を格納する変数
orderPrice =ModifyUpperStopLevel(_Symbol, orderPrice); // ストップロスの設定が有効かチェック
double buyStop = CalBuySL(_Symbol, StopLoss, orderPrice); // ストップロス計算
double buyProfit = CalBuyTP(_Symbol, TakeProfit, orderPrice); // テイクプロフィット計算
glBuyPlaced=Trade.BuyStop(_Symbol, tradeSize, orderPrice, buyStop, buyProfit); // 買いストップ注文を配置
}//買い注文記述の終わり
ローカル変数「orderPrice」は最終的に待機注文を発注する際の買値価格が格納される想定です。
その下のModifyUpperStopLevel関数はストップレベルの設定が有効かチェックし違反しているようであれば修正する関数です。
成行注文の時は、この関数はストップロスやテイクプロフィットの価格を設定する際に使われるのですが、待機注文の場合はすぐに約定させず、「将来この価格になったら・・・」という戦略上の想定があったうえで価格を設定するので買値価格の設定にもストップレベルに違反していないかチェックが必要という訳です。
ModifyUpperStopLevel関数の処理によって、「orderPrice」の値には現在値付近の価格情報が入るようになっています。※詳細は講座記事第80回の「ModifyUpperStopLevel関数の処理実装記述」セクションをご覧ください。
これを基本として「orderPrice」の値に最終的にどのような値が格納されるのか、という点については作るEAごとに記述を追加して調整していきます(この部分については次回の講座で具体例を解説予定です)
最終的な買値価格が「orderPrice」に格納されている事を受けてdouble型のローカル変数「buyStop」を宣言しCalBuySL関数の戻り値を代入します。
※CalBuySL関数についての詳細は講座記事第77回の「CalBuySL関数の処理実装記述」セクションをご覧ください。
同様に、double型のローカル変数「buyProfit」を宣言し、CalBuyTP関数の戻り値を代入します。
CalBuyTP関数は買いポジションのテイクプロフィット値を算出する、OriginalTrade.mqhファイル内に作った独立関数です。
※CalBuyTP関数についての詳細は講座記事第77回の「CalBuyTP関数の処理実装記述」セクションをご覧ください。
最後に「Trade」インスタンスからBuyStop関数を呼び出し待機注文を発注します。
※BuyStop関数は買いの逆指値待機注文を出すためのオリジナル関数です。BuyStop関数については講座記事第87回の「BuyStop関数の戻り値と引数構成について」セクションをご覧ください。
売り注文箇所の記述変更
売り注文箇所の記述は現状以下のようになっています。
{
//新規売り注文を出す
glSellTicket = Trade.Sell(_Symbol,tradeSize);
if(glSellTicket > 0)
{
// 開いたポジションの価格を取得
double openPrice = PositionOpenPrice(glSellTicket);
double sellStop = CalSellSL(_Symbol,StopLoss,openPrice);// ストップロス計算
if(sellStop > 0)
sellStop = ModifyUpperStopLevel(_Symbol,sellStop); // ストップロスの設定が有効かチェック
double sellProfit = CalSellTP(_Symbol,TakeProfit,openPrice);// テイクプロフィット計算
if(sellProfit > 0)
sellProfit = ModifyLowerStopLevel(_Symbol,sellProfit); // テイクプロフィットの設定が有効かチェック
// ストップロスとテイクプロフィットを設定
if(sellStop > 0 || sellProfit > 0)
Trade.SetSLTP(glSellTicket,sellStop,sellProfit);
glBuyTicket = 0;//買いチケットリセット
}
}//売り注文の記述終わり
これを以下のように変更します。
{
double orderPrice = 0; // 注文価格を格納する変数
orderPrice =ModifyLowerStopLevel(_Symbol, orderPrice); // ストップロスの設定が有効かチェック
double sellStop = CalSellSL(_Symbol,StopLoss,orderPrice);// ストップロス計算
double sellProfit = CalSellTP(_Symbol,TakeProfit,orderPrice);// テイクプロフィット計算
glSellPlaced = Trade.SellStop(_Symbol, tradeSize, orderPrice, sellStop, sellProfit); // 売りストップ注文を配置
}//売り注文の記述終わり
ローカル変数「orderPrice」は最終的に待機注文を発注する際の売値価格が格納される想定です。
その下のModifyLowerStopLevel関数はストップレベルの設定が有効かチェックし違反しているようであれば修正する関数です。
ModifyLowerStopLevel関数の処理によって、「orderPrice」の値には現在値付近の価格情報が入るようになっています。※詳細は講座記事第80回の「ModifyLowerStopLevel関数の処理実装記述」セクションをご覧ください。
ただし、買い注文の時にも書いたように「orderPrice」の値に最終的にどのような値が格納されるのか、という点については作るEAごとに記述を追加して調整していきます。
最終的な売値価格が「orderPrice」に格納されている事を受けてdouble型のローカル変数「sellStop」を宣言しCalSellSL関数の戻り値を代入します。
CalSellSL関数は売りポジションのストップロス値を算出する、OriginalTrade.mqhファイル内に作った独立関数です。
※CalSellSL関数についての詳細は講座記事第77回の「CalSellSL関数の処理実装記述」セクションをご覧ください。
同じようにdouble型のローカル変数「sellProfit」を宣言し、CalSellTP関数の戻り値を代入します。
CalSellTP関数は売りポジションのテイクプロフィットを値を算出する、OriginalTrade.mqhファイル内に作った独立関数です。
※CalSellTP関数についての詳細は講座記事第77回の「CalSellTP関数の処理実装記述」セクションをご確認ください。
最後に「Trade」インスタンスからSellStop関数を呼び出し待機注文を発注します。
※SellStop関数は売りの逆指値待機注文を出すためのオリジナル関数です。SellStop関数については講座記事第87回の「SellStop関数の戻り値と引数構成について」セクションをご覧ください。
おまけ
買いの最終発注関数にBuyStop関数を、売りの最終発注関数にSellStop関数を配置した訳ですが、ここは別にBuyLimit関数やSellLimit関数でも構いません。
BuyStop関数やSellStop関数は現在値よりも不利な価格でポジションを持つことになりますが、相場のトレンドと同じ方向にポジションを取る事になります。
逆にBuyLimit関数やSellLimit関数や現在値よりも有利な価格でポジションを持つことになりますが、相場のトレンドとは逆方向にポジションを取る事になります。
次回の講座でブレイクアウト戦略を採用したEAを作る予定なので、BuyStop関数やSellStop関数を便宜上配置しましたが、実際にこの待機注文用EA開発テンプレートを利用してEAを開発する際に逆張り戦略を採用するのであれば、発注関数をBuyLimit関数やSellLimit関数に変更して頂ければと思います。
glBuyPlaced=Trade.BuyStop(_Symbol, tradeSize, orderPrice, buyStop, buyProfit);
//↑ ココをTrade.BuyLimitに変える
まとめ
今回は待機注文用EA開発テンプレートの作成する過程を解説しました。
基本的な記述はEA開発用テンプレートのものを残しつつ、新たなインクルードファイルである
「OriginalCpending.mqh」ファイルを追加し、そのインスタンスを宣言しました。
そして、グローバル領域には2つのグローバル変数を追加しました。
input変数やOnInit関数内には特に追加・修正する箇所はないのでEA開発用テンプレートの記述がそのまま残っています。
OnTick関数内の記述においては、注文条件を制御しているif文内の記述を待機注文用に修正した上で、対応する{}内の記述も成行注文の実行関数から、待機注文の実行関数に変更しました。
※それぞれのプロセスにおける詳細は当記事の
・「インクルードファイルに「OriginalCpending.mqh」ファイルを追加し、インスタンスを宣言する」
・「グローバル変数を追加する」
セクションをそれぞれご覧ください。
今回作成した待機注文用EA開発テンプレートの全体記述は以下の通りです。
//+------------------------------------------------------------------+
//| Template For PendingOrder EA |
//| MQL5ssei |
//| https://mqlinvestmentlab.com/ |
//+------------------------------------------------------------------+
#property copyright "MQL5ssei"
#property link "https://mqlinvestmentlab.com/"
// 注文関連
#include <OriginalTrade.mqh> // 注文関連機能を提供するファイルをインクルード
OriginalCTrade Trade; // 取引のための主要インスタンス
OriginalCPositions Positions; // ポジション管理のためのインスタンス
// 価格情報
#include <OriginalPrice.mqh> // 価格データ取得のためのファイルをインクルード
OriginalCBars Price; // 価格情報を管理するインスタンス
// 資金管理
#include <OriginalMoneyManagement.mqh> // 資金管理機能を提供するファイルをインクルード
// トレーリングストップ
#include <OriginalTrailingStop.mqh> // トレーリングストップ機能を提供するファイルをインクルード
OriginalCTrailing Trailing; // トレーリングストップを管理するインスタンス
// インジケータ
#include <OriginalIndicators.mqh> // インジケータを扱うためのファイルをインクルード
// タイマー
#include <OriginalTimer.mqh> // タイマー機能を提供するファイルをインクルード
CTradeSession Session; // トレーディングセッションを管理するインスタンス
OriginalCNewBar NewBar; // 新しいバーが生成されたかを検出するインスタンス
// ペンディング注文関連のクラスをインクルード
#include <OriginalCpending.mqh>
OriginalCpending Pending; //ペンディング注文関連の情報を扱うインスタンス
//+------------------------------------------------------------------+
//| Input変数 |
//+------------------------------------------------------------------+
input group "基本取引設定" // 基本取引設定のグループ化
input ulong Slippage = 3; // スリッページ設定
input ulong MagicNumber = 123; // EA識別番号
input bool TradeOnNewBar = true; // 新しいバーでの取引を行うかどうか
input group "資金管理" // 資金管理設定のグループ化
input bool UseMoneyManagement = false; // マネーマネジメントを使用するかどうか
input double RiskPercent = 2; // リスク許容度(%)
input double FixedVolume = 0.1; // 固定取引量
input group "ストップロスとテイクプロフィット" // ストップロスとテイクプロフィット設定のグループ化
input int StopLoss = 0; // ストップロスの設定値
input int TakeProfit = 0; // テイクプロフィットの設定値
input group "トレーリングストップ" // トレーリングストップ設定のグループ化
input bool UseTrailingStop = false; // トレーリングストップを使用するかどうか
input int TrailingStop = 500; // トレーリングストップの距離
input int MinimumProfit = 200; // トレーリングを開始する最小利益
input int Step = 20; // トレーリングのステップ
input group "ブレイクイーブン" // ブレイクイーブン設定のグループ化
input bool UseBreakEven = false; // ブレイクイーブンを使用するかどうか
input int BreakEvenProfit = 300; // ブレイクイーブンに設定する利益
input int LockProfit = 0; // 利益を確保するためのロック量
input group "トレードタイマー" // トレードタイマー設定のグループ化
input bool UseTimer = false; // トレードタイマーを使用するかどうか
input int StartHour = 0; // トレード開始時間(時)
input int StartMinute = 0; // トレード開始時間(分)
input int EndHour = 0; // トレード終了時間(時)
input int EndMinute = 0; // トレード終了時間(分)
input bool UseLocalTime = false; //ローカル時間を使うかどうか
//+------------------------------------------------------------------+
//| グローバル変数 |
//+------------------------------------------------------------------+
ulong glBuyTicket, glSellTicket;//ポジション番号を格納する変数
bool glBuyPlaced, glSellPlaced; // 買い注文と売り注文が配置されたかどうかを示すフラグ
//+------------------------------------------------------------------+
//| OnInit関数 |
//+------------------------------------------------------------------+
int OnInit()
{
// フィルポリシーを取得する
ENUM_ORDER_TYPE_FILLING filltype = FillPolicy();
// EAのマジックナンバーを設定する
Trade.SetMagicNumber(MagicNumber);
// 注文実行時の許容スリッページを設定する
Trade.SetDeviation(Slippage);
// 取得したフィルポリシーを設定する
Trade.SetFillType(filltype);
// 初期化が完了したことを示す(0 = 成功)
return(0);
}
//+------------------------------------------------------------------+
//| OnTick関数 |
//+------------------------------------------------------------------+
void OnTick()
{
// 新しいバーがあるかどうかの初期状態をtrueと仮定し、バーシフトを0に設定
bool newBar = true;
int barShift = 0;
// 新しいバーでの取引を行う場合の処理
if(TradeOnNewBar == true)
{
// 現在のシンボルと期間で新しいバーが始まったかどうかをチェック
newBar = NewBar.CheckNewBar(_Symbol,_Period);
// 新しいバーが確認された場合、バーシフトを1に設定
barShift = 1;
}
// トレードタイマーの設定
bool timerOn = true;
// トレードタイマーを使用する場合の処理
if(UseTimer == true)
{
// 指定された時間内で取引が許可されているかどうかをチェック
timerOn = Session.DailySessionTimer(StartHour, StartMinute, EndHour, EndMinute, UseLocalTime);
}
//価格情報をアップデートする
Price.Update(_Symbol,_Period);
// 注文関連の記述
// 新しいバーかつトレードタイマーが許可している時のみ注文処理を行う
if(newBar == true && timerOn == true)
{
// ロット調整
double tradeSize;
//資金管理モードONなら設定したリスクに応じたロットを算出
if(UseMoneyManagement == true)
tradeSize = MoneyRiskManagement(_Symbol,FixedVolume,RiskPercent,StopLoss);
//固定ロットを指定
else
tradeSize = VerifyVolume(_Symbol,FixedVolume);
// 買い注文について
if(Positions.GetBuyPosCount(MagicNumber) == 0 // 買いポジションがない場合
&&
Pending.BuyLimitNum(_Symbol) == 0 // 買いリミット注文がない場合
&&
Pending.BuyStopNum(_Symbol) == 0 // 買いストップ注文がない場合
&&
Pending.BuyStopLimitNum(_Symbol) == 0 // 買いストップリミット注文がない場合
) // 買いポジションがなく、買い待機注文もなければ
{
double orderPrice = 0; // 注文価格を格納する変数
orderPrice =ModifyUpperStopLevel(_Symbol, orderPrice); // ストップロスの設定が有効かチェック
double buyStop = CalBuySL(_Symbol, StopLoss, orderPrice); // ストップロス計算
double buyProfit = CalBuyTP(_Symbol, TakeProfit, orderPrice); // テイクプロフィット計算
glBuyPlaced=Trade.BuyStop(_Symbol, tradeSize, orderPrice, buyStop, buyProfit); // 買いストップ注文を配置
}//買い注文記述の終わり
// 売り注文について
if(Positions.GetSellPosCount(MagicNumber) == 0 // 売りポジションがない場合
&&
Pending.SellLimitNum(_Symbol) == 0 // 売りリミット注文がない場合
&&
Pending.SellStopNum(_Symbol) == 0 // 売りストップ注文がない場合
&&
Pending.SellStopLimitNum(_Symbol) == 0 // 売りストップリミット注文がない場合
) // 売りポジションがなく、売り待機注文もなければ
{
double orderPrice = 0; // 注文価格を格納する変数
orderPrice =ModifyLowerStopLevel(_Symbol, orderPrice); // ストップロスの設定が有効かチェック
double sellStop = CalSellSL(_Symbol,StopLoss,orderPrice);// ストップロス計算
double sellProfit = CalSellTP(_Symbol,TakeProfit,orderPrice);// テイクプロフィット計算
glSellPlaced = Trade.SellStop(_Symbol, tradeSize, orderPrice, sellStop, sellProfit); // 売りストップ注文を配置
}//売り注文の記述終わり
}// 注文関連の記述終わり
// ポジション番号を取得
ulong tickets[]; // チケット番号を格納するための配列
Positions.GetTotalPosNum(MagicNumber, tickets); // 全ポジションのポジション番号を取得
int numTickets = ArraySize(tickets); // 取得したポジションの数を格納
// トレーリングストップ処理
if(UseTrailingStop == true && numTickets > 0) // トレーリングストップが有効かつオープンポジションが存在する場合
{
for(int i = 0; i < numTickets; i++) // オープンポジションの数だけループ
{
// 各ポジションに対してトレーリングストップ処理を適用
Trailing.TrailingStop(tickets[i], TrailingStop, MinimumProfit, Step);
}
}//トレーリングストップ記述の終わり
// ブレイクイーブン処理
if(UseBreakEven == true && numTickets > 0) // ブレイクイーブンが有効かつオープンポジションが存在する場合
{
for(int i = 0; i < numTickets; i++) // オープンポジションの数だけループ
{
// 各ポジションに対してブレイクイーブン処理を適用
Trailing.BreakEven(tickets[i], BreakEvenProfit, LockProfit);
}
} // ブレイクイーブン処理の終わり
}//全体記述の終わり
//+------------------------------------------------------------------+
次回は今回作った待機注文用EA開発テンプレートを使って実際にEAを作る過程をお届けします。
今回は以上とさせていただきます。
最後までお読みいただきありがとうございました。
コメント