StopLimit - página 7

 
Sergey Chalyshev:

Aparentemente ninguém a utiliza,

o pedido é aberto a preços inexistentes:

um exemplo simples a ser verificado:

//+------------------------------------------------------------------+
//|                                               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
      );
  }
//+------------------------------------------------------------------+

Isto é correto? Primeiro vem o preço limite de parada, e depois o preço de greve. VerDocumentação:

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=""       // комментарий
   )
 

Modificou um pouco o código do iniciador do tópico.

//+------------------------------------------------------------------+
//|                                               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();
        }*/
  }
//+------------------------------------------------------------------+

Aqui está um exemplo sobre o instrumento EURUSD.

Importante:O preço de parada é pior. Isto é para a execução de câmbio.

Foi definido um limite de parada de compra que foi ativado e aberto como uma ordem de limite.




Você pode ver na imagem da tela que há preços no comentário. O primeiro preço (1,10258) é o preço pedido quando a ordem foi colocada, o segundo (1,10268) é o preço de ativação da parte limite da ordem e o terceiro (1,10263) é o preço de ativação da parte de parada da ordem.

 

A lógica é a seguinte: se o preço pedido pelo mercado atingir 1,10263, então a parte de parada da ordem (o preço de greve) é ativada. E a parte limite da ordem deve acionar imediatamente, já que seu preço de greve é pior que o preço de mercado (1,10268).

Analisamos os arquivos de registro:

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]

Vemos que às00:02:15 a ordem se tornou uma ordem limite (a parte de parada foi acionada). E imediatamente se transformou em uma posição no mercado. E o que é interessante é que os troncos não dão um preço de compra como na primeira linha (1,10239 / 1,10258). E isso é inconveniente. Sim, a vaga está aberta em 1.10265. Aabertura estava prevista para 1.10263. Aqui eu acho que houve um deslize de 2pts.

Olhando para a base do carrapato. Sim, os testes foram em carrapatos reais a partir de 2 de dezembro de 2019.

Vemos que existe nosso carrapato (1.10265). Destacado na captura de tela. E desde00:02:15 este foi o terceiro tique. A pergunta anterior = 1,10271 (a partir de00:02:15.428) era ainda maior. Embora, ao mesmo tempo em que nosso tique. Ou seja, entrou a um preço melhor. Conclusão: Como esperado, temos um deslize de 2 pontos para a parte de parada do pedido.

 
Denis Kirichenko:

Isto é a coisa certa a fazer? Primeiro vem o preço de parada e depois o preço de greve. Veja a documentação:

Isto é feito intencionalmente de modo que quando o limite de parada vai até o limite, o limite é acionado imediatamente. Quando é acionado, parece estar em algum lugar lá fora, ao preço especificado no pedido e não ao preço que ativou o stoplimit (que na verdade era).

 
Denis Kirichenko:

A lógica é a seguinte: se o preço pedido pelo mercado atingir 1,10263, então a parte de parada da ordem (o preço de greve) é ativada. E a parte limite da ordem deve acionar imediatamente, já que seu preço de greve é pior que o preço de mercado (1,10268).

Há um preço de 123. O COMPRA_STOP_LIMIT. O preço de parada é 133. O preço limite é 111.

Se o preço tiver ultrapassado o preço limite, o preço limite é ativado. Se o preço voltar para 111, a posição é aberta.

Se o preço não tiver passado o preço limite e voltado ao preço limite, a posição não será aberta.

Não é assim?

 
Denis Kirichenko:

Uma ordem de limite de parada também pode ser verificada no testador para Forex. É suficiente definir "Execução" = Troca.



Eu verifiquei o limite de parada de compra da seguinte forma: eu defini o preço da ordem limite pior que o preço de ativação. O pedido foi aberto a preço de mercado (preço pedido) na ativação. Portanto, parece que a funcionalidade no Testador funciona.

Sim, em instrumentos forex, na execução de câmbio, funciona corretamente.

E agora também mudar "Método de Liquidação" =FORTS Futures, e ver como funciona em instrumentos negociados em bolsa.

BSL_Forex-FORTS

Se você colocar Método de cálculo = Forex no instrumento negociado em bolsa, ele funciona corretamente, mas a margem não é contada corretamente.

 
Sergey Chalyshev:

Você está usando oStopLimit no comércio real?

É claro que oStopLimit não funciona adequadamente no testador.

Faz sentido usá-lo no comércio real? Quais são as vantagens e desvantagens?

Este tipo de pedido não faz sentido.

É muito mais fácil fazer um pedido pendente imediatamente, pois podemos especificar qualquer prazo da vida útil do pedido.

Se estivermos na troca, mas não no servidor MQ, este pedido é garantido de funcionar pelo preço especificado no mesmo.

E o servidor pode "apresentar uma falha".