정지 제한 - 페이지 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= ""        // комментарий
   )
 

topikstarter 코드를 약간 수정했습니다.

 //+------------------------------------------------------------------+
//|                                               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)은 주문 시 매도 가격, 두 번째(1.10268)는 주문 제한 부분의 활성화 가격, 세 번째(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에 열릴 것으로 예상되었습니다 . 여기에서 2pp의 미끄러짐이 있었다고 생각합니다.

틱 베이스를 살펴보자. 예, 테스트는 2019년 12월 2일부터 실제로 진행되었습니다.

틱(1.10265)이 있음을 알 수 있습니다. 스크린샷에서 강조 표시했습니다. 그리고 00:02:15 부터 번째 틱 이었습니다 . 이전 질문 = 1.10271( 00 : 02 : 15.428부터 )은 훨씬 더 높았습니다. 우리의 진드기와 동시에. 저것들. 최고의 가격에 들어갔다. 결론: 예상대로 주문의 중지 부분에 대해 2pp의 슬립이 발생했습니다.   

 
Denis Kirichenko :

하지만 맞나요? 먼저 스탑 리밋 가격이 오고 그 다음 실행 가격이 나옵니다. 문서 를 보십시오:

이것은 스톱 리미트가 리미트에 들어갈 때 리미트가 즉시 작동하도록 특별히 수행됩니다. 트리거되면 정지 제한을 활성화한 곳이 아니라 애플리케이션에 표시된 가격으로 멀리 어딘가에 있는 것으로 판명되었습니다(실제로는).

[삭제]  
Denis Kirichenko :

논리는 다음과 같습니다. 시장 매도호가가 1.10263에 도달하면 주문의 중지 부분(실행 가격)이 활성화됩니다. 그리고 이론적으로 주문의 제한 부분은 즉시 작동해야 합니다. 행사가가 시장 가격(1.10268)보다 낮습니다.

가격은 123입니다. BUY_STOP_LIMIT. 정지 가격 133. 제한 가격 111.

가격이 정지 표시를 넘으면 제한이 활성화됩니다. 가격이 111로 돌아오면 포지션이 열립니다 .

가격이 스톱에 도달하지 않고 한도에 도달하면 포지션이 열리지 않습니다.

안 그래?

 
Denis Kirichenko :

지정가 지정가 주문은 테스터 및 Forex에서 확인할 수 있습니다. "Execution" = Exchange 로 설정하는 것으로 충분합니다.



나는 다음과 같이 매수 스톱 한도를 확인했습니다. 지정가 주문의 가격을 활성화 가격보다 더 나쁘게 설정했습니다. 활성화되면 시장(호가)에서 주문이 열렸습니다. 그래서 테스터의 기능이 작동하는 것 같습니다.

예, 교환 실행과 함께 외환 상품에서 올바르게 작동합니다.

이제 "결제 방법"=FORTS 선물을 변경하면 교환 상품에서 어떻게 작동하는지 알 수 있습니다.

BSL_Forex FORTS

거래소에서 정산방식 = Forex로 설정하면 정상작동하지만 마진이 제대로 계산되지 않습니다.

 
Sergey Chalyshev :

실시간 거래에서 StopLimit을 사용합니까?

StopLimit이 테스터에서 적절하게 작동하지 않는 것은 분명합니다.

실제 거래에서 사용하는 것이 의미가 있습니까? 장점과 단점은 무엇입니까?

이런 종류의 주문을 사용할 이유가 없습니다.

주문 수명 기간을 지정할 수 있기 때문에 보류 중인 주문을 즉시 배치하는 것이 훨씬 쉽습니다.

MQ 서버가 아닌 교환기에 있는 이 주문은 표시된 가격 으로 작동하도록 보장됩니다 .

그리고 서버는 "결함"이 될 수 있습니다.