Order後のSLTPについて

 

基本的な動きに関しては特に問題なく動くようなコードは書いているのですが、、、

成行で基本Entryするので、SLTPを同時にセットできず、Entry後にしなきゃいけないっていう流れの中で、とりあえず下記のようにしています。

//---成行Entry用のrequestmの設定

if(!OrderSend(request, result)) {//Error}

//---少し間をあける
Sleep(3000);

//---一旦現在のポジションを取得し
int total = PositionsTotal();
//---for文で一つずつ☑しながら、条件にあてはめていく
for(int i = 0; i < total; i++)
{
 //---いろんなポジションがあるので、設定したマジックナンバーが一致し、SLとTPがまだ設定されていないポジションを見つける
 if(magic == 1111 && tp == 0 && sl == 0)
 {
  //---SLTPのセット
  
  if(!OrderSend(request, result)) { //Error }
 }
}

だいぶ省略しましたが、基本的にはドキュメントにある書き方をしています。

これで動作自体は意外と問題ないのですが、そのSL又はTPの設定値が3秒後の価格ラインとの差によりInvalid Stopsになる場合があります。

こういう場合みなさんならどのように書かれますか?


例えばEURJPYでは54ポイント(私の使ってる口座では)離れるつまり5.4pipsは離れたとこじゃないと注文はできませんが、設定したいのがEntryのpriceから10pips(100ポイント)としたいんです。

もしかすると、一瞬で10pips動いてしまって、そもそもSLだって話にもなるかもしれません。

でも、そこまでいかずに少ししたらTP方面に動いて設定ができるようになるかもしれません。


こういったところをみなさんはどのように考え、どのように設定されているのでしょうか?

 
Fetherion:

基本的な動きに関しては特に問題なく動くようなコードは書いているのですが、、、

成行で基本Entryするので、SLTPを同時にセットできず、Entry後にしなきゃいけないっていう流れの中で、とりあえず下記のようにしています。

だいぶ省略しましたが、基本的にはドキュメントにある書き方をしています。

これで動作自体は意外と問題ないのですが、そのSL又はTPの設定値が3秒後の価格ラインとの差によりInvalid Stopsになる場合があります。

こういう場合みなさんならどのように書かれますか?


例えばEURJPYでは54ポイント(私の使ってる口座では)離れるつまり5.4pipsは離れたとこじゃないと注文はできませんが、設定したいのがEntryのpriceから10pips(100ポイント)としたいんです。

もしかすると、一瞬で10pips動いてしまって、そもそもSLだって話にもなるかもしれません。

でも、そこまでいかずに少ししたらTP方面に動いて設定ができるようになるかもしれません。


こういったところをみなさんはどのように考え、どのように設定されているのでしょうか?

わたしの場合は、

①「SYMBOL_TRADE_STOPS_LEVEL」で、逆指値の最小値を取得して

②「POSITION_PRICE_OPEN」ポジションの始値、「SYMBOL_BID」シンボルの現在の売値、「SYMBOL_ASK」シンボルの現在の買値、を取得

SL,TPに設定する(指定された)ポイントと、ポジションタイプに応じて、①②を勘案して設定するようにしています。


//未決済チケットを取得
   uint   total = PositionsTotal();
   ulong  position_ticket;
   string position_symbol;
//--- 全ての保有ポジションを取得
   for (uint i = 0 ; i < total ; i++) {
      // ポジションチケット
      position_ticket = PositionGetTicket(i);

      position_symbol  = PositionGetString(POSITION_SYMBOL);// シンボル 

//--省略 いろいろ処理する

      //現在の終値から逆指値注文を配置する場合の最少のインデント
      int    stop_level = (int)SymbolInfoInteger(position_symbol, SYMBOL_TRADE_STOPS_LEVEL);

//--省略 いろいろ処理する

      ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);  // ポジションタイプ

      //--- 現在の価格レートの計算
      double openPrice  = PositionGetDouble(POSITION_PRICE_OPEN);
      double bid        = SymbolInfoDouble(position_symbol, SYMBOL_BID);
      double ask        = SymbolInfoDouble(position_symbol, SYMBOL_ASK);

//--省略 ポジションタイプに応じて、MqlTradeRequestを設定

      //--- リクエストの送信

   }

こんな感じです。

SL/TPが設定されていない未決済ポジションに指定幅のSL/TPを設定するようなEAを作成した時に、上記のようなコードを書きました。(実際はループの中ではリクエストの送信は行っていません)


理由: