StopLimit - ページ 7

 
Sergey Chalyshev:

どうやら誰も使っていないようです。

存在しない価格で注文が開始される。

は、簡単な例で確認することができます。

//+------------------------------------------------------------------+
//|                                               StopLimit_Test.mq5 |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
CTrade trade;

input int Deviation = 100;
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick tick;
   SymbolInfoTick(_Symbol,tick);
   trade.SetTypeFilling(ORDER_FILLING_RETURN);
   double ticksise=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);

   if(OrdersTotal()==0)
      trade.OrderOpen(
         _Symbol,                      // символ
         ORDER_TYPE_BUY_STOP_LIMIT,    // тип ордера
         1.0,                          // объем ордера
         tick.ask+Deviation*ticksise,  // цена исполнения
         tick.ask+10*ticksise,         // цена стоплимита
         0,                            // цена stop loss
         0                             // цена take profit
      );
  }
//+------------------------------------------------------------------+

これ でよいのでしょうか?最初に逆指値、次に権利行使価格が来る。ドキュメントを ご覧ください。

bool  OrderOpen(
   const string          symbol,          // символ
   ENUM_ORDER_TYPE       order_type,      // тип ордера
   double                volume,          // объем ордера
   double                limit_price,     // цена стоплимита
   double                price,           // цена исполнения
   double                sl,              // цена stop loss
   double                tp,              // цена take profit
   ENUM_ORDER_TYPE_TIME  type_time,       // тип по истечению
   datetime              expiration,      // истечение
   const string          comment=""       // комментарий
   )
 

トピックスターターのコードを少し修正しました。

//+------------------------------------------------------------------+
//|                                               StopLimit_Test.mq5 |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
CTrade trade;

input int Deviation = 5;
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick tick;
   SymbolInfoTick(_Symbol,tick);
   trade.SetTypeFilling(ORDER_FILLING_RETURN);
   double ticksise=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   if(OrdersTotal()==0)
     {
      ENUM_ORDER_TYPE ord_type=ORDER_TYPE_BUY_STOP_LIMIT;
      double ord_vol=0.1;
      double ask_pr=NormalizeDouble(tick.ask,_Digits);
      double ord_pr=NormalizeDouble(tick.ask+Deviation*ticksise,_Digits);
      double limit_pr=NormalizeDouble(tick.ask+10*ticksise,_Digits);
      string ord_comment=StringFormat("%0."+IntegerToString(_Digits)+"f;%0."+
                                      IntegerToString(_Digits)+"f;%0."+
                                      IntegerToString(_Digits)+"f",ask_pr,limit_pr,ord_pr);
      trade.OrderOpen(
         _Symbol,                     // символ
         ord_type,                    // тип ордера
         ord_vol,                     // объем ордера
         limit_pr,                    // цена стоплимита
         ord_pr,                      // цена исполнения
         0.,                          // цена stop loss
         0.,                          // цена take profit
         0,                           // тип по истечению
         0,                           // истечение
         ord_comment                  // комментарий
      );
     }
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
   PrintFormat(" %s",EnumToString(trans.type));
//---
   /*if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      DebugBreak();
     }
   else
      if(trans.type==TRADE_TRANSACTION_ORDER_UPDATE)
        {
         ENUM_ORDER_TYPE curr_ord_type=trans.order_type;
         if(curr_ord_type!=ORDER_TYPE_BUY_STOP_LIMIT)
            DebugBreak();
        }*/
  }
//+------------------------------------------------------------------+

以下は、EURUSDの例です。

重要:ストップリミットプライスは悪く設定 されています。交換実行のためです。

買いの逆指値が設定され、指値注文として有効化され、開設された。




スクリーンショットでは、コメントに価格が表示されているのがわかります。最初の価格(1.10258)は注文が出された時のアスク価格、2番目(1.10268)は注文のリミット部分の発動価格、3番目(1.10263)は注文のストップ部分の発動価格です。

 

ロジックは以下の通りです。市場の売値が1.10263に達した場合、注文のストップ部分(ストライクプライス)が有効になります。そして、指値注文の権利行使価格は市場価格(1.10268)よりも悪いので、指値注文の部分は直ちにトリガーされるはずです。

ログファイルを見るのです。

2019.12.12 21:08:10.306 2019.12.02 00:00:11   buy stop limit 0.10 EURUSD at 1.10263 (1.10268) (1.10239 / 1.10258)
2019.12.12 21:08:10.310 2019.12.02 00:00:11   CTrade::OrderSend: buy stop limit 0.10 EURUSD at 1.10263 (1.10268) [done]
2019.12.12 21:08:10.310 2019.12.02 00:00:11    TRADE_TRANSACTION_ORDER_ADD
2019.12.12 21:08:10.310 2019.12.02 00:00:11    TRADE_TRANSACTION_REQUEST
2019.12.12 21:08:10.312 2019.12.02 00:02:15   order [#2  buy stop limit 0.10 EURUSD at 1.10263 (1.10268)] triggered
2019.12.12 21:08:10.312 2019.12.02 00:02:15    TRADE_TRANSACTION_ORDER_UPDATE
2019.12.12 21:09:18.333 2019.12.02 00:02:15   order [#2  buy limit 0.10 EURUSD at 1.10268] triggered
2019.12.12 21:09:18.333 2019.12.02 00:02:15   deal #2  buy 0.10 EURUSD at 1.10265 done (based on order #2)
2019.12.12 21:09:18.333 2019.12.02 00:02:15   deal performed [#2  buy 0.10 EURUSD at 1.10265]
2019.12.12 21:09:18.333 2019.12.02 00:02:15   order performed buy 0.10 at 1.10265 [#2  buy limit 0.10 EURUSD at 1.10268]

00:02:15 、注文が指値注文に変わったことがわかります(ストップ部分がトリガーされたのです)。そして、それはすぐに市場でのポジションに変わりました。そして面白いのは、ログには1行目のようなビッド・アスクの価格(1.10239 / 1.10258)は出ていないことです。そして、それは不便なことです。はい、1.10265でポジションをオープンしています。 1.10263でオープンすることが予想さ れた。ここで、2ptsのズレが生じたと思います。

ティック基盤を見ているところ。はい、テストは2019年12月2日からの本物のティックを使って行いました。

私たちのティック(1.10265)があることがわかります。スクリーンショットで強調表示しました。そして、00:02:15からこれが3回目の刻みと なった。前回のアスク=1.10271(00:02:15.428~)はさらに 高値更新。とはいえ、私たちのティックと同じタイミングでつまり、より良い価格でエントリーされた。結論:予想 通り、ストップ部分の注文で2ポイントのスリッページが発生しました。

 
Denis Kirichenko:

これは 正しいことなのでしょうか?最初に逆指値、次に権利行使価格が来る。ドキュメントを見て ください。

これは、stoplimitが限界に達したとき、すぐにリミットを発動させるために意図的に行っているものです。トリガーされると、注文で指定された価格ではなく、stoplimitを作動させた価格(実際にはそうだった)で、どこか外の世界にいるように見えます。

削除済み  
Denis Kirichenko:

ロジックは以下の通りです。市場の売値が1.10263に達した場合、注文のストップ部分(ストライクプライス)が有効になります。また、指値注文の権利行使価格は市場価格(1.10268)よりも悪いので、指値注文の部分は直ちにトリガーされるはずです。

123の価格があります。 BUY_STOP_LIMITです。ストップ高は133円です。指値は111です。

価格がストップ価格を超えた場合、指値が有効になります。価格が111に戻れば、ポジションがオープン されます。

価格がストップ価格を通過し、リミット価格に戻っていない場合、ポジションは開設されません。

そんな感じではないでしょうか?

 
Denis Kirichenko:

FXでもテスターで逆指値注文を確認することができます。実行」=「Exchange」と設定すればよい。



買い指値は以下のように確認しました。指値注文の価格をアクティベーション価格より悪く設定しました。注文は、起動時に市場価格(アスク価格)で始まりました。ということで、Testerに搭載されている機能は動作するようです。

はい、取引所取引のFX商品では、正しく動作します。

そして今度は「決済方法」=FORTS Futuresも変更し、取引所取引商品での動作を確認します。

BSL_Forex-FORTS

取引所取引商品で計算方法=FXとした場合、正しく動作しますが、証拠金が正しくカウントされません。

 
Sergey Chalyshev:

実際の取引でStopLimitを 使用していますか?

テスターではStopLimitが十分に機能 しないことは明らかです。

実際の取引で使うことに意味はあるのでしょうか?メリットとデメリットを教えてください。

このような注文は使う意味がない。

注文の有効期間を任意に指定できるため、すぐに保留注文を 出すことができ、非常に楽である。

取引所にはいるがMQサーバーにはいない場合、この注文はその中で指定された価格で動作することが保証 されています。

そして、サーバーが「不具合」を起こすこともあります。