記事"MQL5入門: シンプルなExpert Advisorとカスタムインディケーターの書き方"についてのディスカッション - ページ 3

 

質問4:記事には次のように書かれています:

...このプログラムでOrderSend 関数を呼び出すほとんどのケースに共通する値をrequest 構造に入れましょう:

   request.symbol      =Symbol();
   request.volume      =Lots;
   request.tp          =0;
   request.deviation   =0;
   request.type_filling=ORDER_FILLING_AON;

request.symbol 要素には、取引操作が実行される金融商品のシンボル名を、request.volume 要素には、金融商品の約定値を、request.tp 要素にはTakeProfit価格の値を入れます(注文のTakeProfit値が指定されない場合もあるので、request.tp 構造要素にはゼロを入れます)

しかし、なぜrequest.tp構造要素に ゼロを 入れるのでしょうか?なぜなら、 買い注文を保留している場合 、request.tp=0は、TPが常に現在のBid価格より下になることを意味するからです。そして、そのようなTP値を持つ注文は、TPパラメータの値が正しく指定されていないために拒否されるか、サーバーがそのような注文を受け付けた後、現在のBid価格で即座に執行されるべきである。

 

質問5:記事には次のように書かれています:

...OnTick 関数 、使用するローカル変数と その型を指定しましょう:

double h[], l[], ma[], atr_h[], atr_l[],
          lev_h, lev_l, StopLoss,
          StopLevel=_Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL),
          Spread   =NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_ASK) - SymbolInfoDouble(Symbol(),SYMBOL_BID),_Digits);

...StopLevel 変数は、STOP_LEVEL値(現在の価格から発注された注文までの最小距離)を格納するために使用されます(価格単位)。この値は、ポイント価格(定義済み変数_Point)とSTOP_LEVEL値の積(ポイント単位)として得られます。SymbolInfoInteger 関数はSTOP_LEVEL値を返します。この関数の最初のパラメータは計器のシンボル名で、2番目のパラメータは要求されたプロパティの識別子です。

MQL5リファレンス・マニュアルには、「SYMBOL_TRADE_STOPS_LEVELは、ストップ注文を設定するための、現在の終値からの最小マージン(pips) である」とも記載されています 。どちらの場合も、以下の不等式を満たす必要があるようです。

ORDER_PRICE_CURRENT-request.price>=SYMBOL_TRADE_STOPS_LEVEL(Sell_Stop注文の場合)。

なぜExpert AdvisorコードはBid(Ask)とStopLossの間の距離がStopLevelの最小インデントを超えていないかチェックするのですか?

               ...// 新しいStopLossが現在の価格に近くないか?
               && NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_BID)-StopLoss-StopLevel,_Digits)>0
               
               ...// 新しいStopLossが現在の価格に近くないか?
               && NormalizeDouble(StopLoss-SymbolInfoDouble(Symbol(),SYMBOL_ASK)-StopLevel,_Digits)>0

このようなチェックはすべてのケースで必要なのでしょうか、それとも特定のストラテジーの実装の特殊性なのでしょうか?要するに、StopLevelの最小値幅を超えるかどうかを確認するために、保留注文を発注する際に常にビッド(アスク)とStopLossの間の距離をチェックする必要がありますか?

 
Yedelkin:

しかし、なぜrequest.tpという構造要素に ゼロを入れるのでしょうか?なぜなら、未決の 買い注文がある 場合、request.tp=0は、TPが常に現在の Bid価格を下回ることを意味するからです。そして、そのようなTP値を持つ注文は、TPパラメータの値が正しく指定されていないために拒否されるか、サーバーがそのような注文を受け付けた後、現在のBid価格で即座に執行されるはずです。
ゼロはTPがないことを意味する。
 
Yedelkin:

要するに、StopLevel の最低証拠金を超えていないかどうかを確認するために、未決済注文を発注する際に常に Bid (Ask) と StopLoss の間の距離を確認する必要がありますか?

マーケットに非常に近い位置で設定注文を行う場合、保留注文のSL/TP/Entryの価格水準を常にチェックし、最低 証拠金を確認する必要があります。

もし、マーケットから離れた合理的なモード(数十ポイントから数百ポイント)でストップまたは未決注文を使用する場合は、このようなチェックを省略することができます。

 
Renat:

マーケットに非常に近い位置で注文を設定する場合、未決済注文のSL/TP/Entry価格レベルを常にチェックし、最小インデントを確認する必要があります。

質問5.1.

Expert Advisorに各保留注文について、Entry price/SL/TPの3つのレベルを計算させています。

エントリー価格水準が現在の市場価格に対してどの程度近いか/遠いかは事前に分からないため、エントリー価格水準が最低証拠 金に準拠しているかどうかをチェックしても問題は生じません。

しかし、残りの2つのSL/TPレベルはどのレベルに対してチェックすべきでしょうか?SL/TPレベルを現在の市場価格に照らしてチェックするのは、いささか非論理的です。なぜなら、エントリー価格レベルは現在の市場価格からかなり離れた場所にある可能性があり、そのようなチェックは全く意味をなさなくなるからです。そのため、Expert Advisorで|Entry price-TP(SL)|>SYMBOL_TRADE_STOPS_LEVEL という条件をチェックするようにしました。一般的に、Expert Advisorはこのような条件でも問題なく動作しますが、EAコードを最適化し始めたとき、サーバーによる未決注文処理の観点から、このようなチェックが必要なのか疑問に思いました。EAコードはこの条件をチェックすることによって過負荷になることはありません(EAストラテジー自体はそのようなチェックを必要としません)。

言い換えれば、3つのEntry price/SL/TPレベルを持つペンディングオーダーは、常に最小マージンのSL/TPレベルをチェックすべきでしょうか?もしそうであれば、どのレベル(価格)に対する最小マージンをチェックすべきでしょうか?

 

投稿を編集する機能がありません。そこで、ここに追加します:

= 各保留注文について、Expert Advisor はエントリー価格/SL/TP の 3 つのレベルを個別に計算します。保留注文を 市場に近づける」という目的は追求されていません。 =

 

ペンディング・レベルのSLとTPは、エントリー価格から最小レベル以上離れないように評価されます。

MT4でも同じように機能します。

 
Renat:

保留レベルのSLとTPは、エントリー価格から最低限離れるように評価されます。

MT4でも同じように機能します。

よし、これですべて理解できた。つまり、EAのコードを簡単にすることはできないのです。当初、すべては記事に従って、つまり正しく行われていました。

そして、私はMT4に精通していないので、このような質問は「ダミーから」です。ありがとうございました!

 
Renat:

...マーケットに非常に近い位置で注文を設定する作業がある場合、保留中の注文のSL/TP/Entry価格レベルの最小インデントを常にチェックする。

... 保留注文のSLとTPは、エントリー価格から推定されます。

質問6: 保留注文を発注する際に、最小の刻みをチェックすることは明確です。次に、未決済ポジションのTP/SLを変更する際に、最小マージンをチェックすることの特殊性について質問があります。

状況:オープンポジションには固定TPと「プルアップ」SLがあり、価格が有利な方向に動くと固定TPに近づきます。未決済注文の設定と 同様に、エキスパートアドバイザーが未決済ポジションのTP/SLを変更する注文を送信するたびに、TPとSLの両方のレベルに関して最小インデントをチェックします。

しかし、CTradeクラスのPositionModify 関数の説明では、tpパラメータは「Take Profitがトリガーされる新しい価格(または、変更が必要ない場合は、以前の値)」であると指定されています。

従って、質問は、以前に設定されたTPレベルの変更が必要ない場合、未決済ポジションのTP/SLを変更する注文を送信するとき、現在(実際)の価格からこのTPレベルの最小マージンをチェックする必要がありますか?それとも、そのような状況では、変更するSLに関連する最小マージンだけをチェックすれば十分なのでしょうか?

言い換えれば、未決済ポジションのTP/SLを変更する注文を送信する際、このTPレベルが以前にすでに設定されており、変更される可能性がない場合、TPに関連する最小マージンをチェックしないことは可能ですか? そして、変更の注文では、以前のTP値を指定するだけですか?

 

indicator_TP_en.mql5」をダウンロード後、「indicator_TP.mql5」にリネームしてください。