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

稍微修改了topicstarter的代码。

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

下面是一个关于欧元兑美元外汇工具的例子。

重要提示:止损价格设置得比较糟糕这是为了交换执行。

设置了一个买入止损限价,该限价被激活并作为限价单打开。




你可以在截图中看到,评论中存在价格。第一个价格(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.10239 / 1.10258)。而这是不方便的。是的,该位置在1.10265处开放。 预计将在1.10263开盘。在这里,我认为有2个百分点的滑坡。

看了看蜱虫基地。是的,测试是在2019年12月2日的真实蜱虫上进行的。

我们看到,有我们的刻度线(1.10265)。在截图中强调了这一点。而自从00:02:15 以来,这是第三次打勾之前的要求=1.10271(来自00:02:15.428)甚至更高虽然,在我们打钩的同时。也就是说,以更好的价格进入。结论:正如预期的那样,我们 在订单的止损部分得到了 2个点的滑落。

 
Denis Kirichenko:

这是 正确的做法吗?首先是止损价格,然后是行权价格。看一下文件

这样做是故意的,以便当stoplimit走到极限时,立即触发极限。当它被触发时,它似乎是在外面的某个地方,在订单中指定的价格,而不是在激活止损的价格(实际上是)。

 
Denis Kirichenko:

逻辑如下:如果市场卖价达到1.10263,订单的止损部分(行权价)就会被激活。而订单的限价部分应立即触发,因为其执行价格比市场价格(1.10268)更差。

有一个价格为123.的BUY_STOP_LIMIT。止损价是133。限制价格是111。

如果价格已经超过了止损价,限价就会被激活。如果价格返回到111,则开仓

如果价格没有超过止损价并返回到限价,则不会开仓。

不是这样的吗?

 
Denis Kirichenko:

在外汇的测试器中也可以检查出止损限价单。只需设置"执行"=Exchange



我检查了买入止损限价,具体如下:我把限价单的价格设置得比激活价差。该订单在激活时以市场价格(卖价)开盘。因此,看来测试器中的功能是有效的。

是的,在外汇工具上,通过交易所执行,它可以正常工作。

现在还要改变 "结算方式"=FORTS期货,看看它在交易所交易的工具上是如何运作的。

BSL_Forex-FORTS

如果你把计算方法=外汇放在交易所交易的工具上,它可以正常工作,但保证金却不能正确计算。

 
Sergey Chalyshev:

你在实际交易中 使用StopLimit

很明显,StopLimit 在测试器中的作用是不充分的

在实际交易中使用它有意义吗?有什么优势和劣势?

这种类型的订单使用起来没有意义。

立即下挂单 要容易得多,因为我们可以指定订单有效期的任何条款。

如果我们在交易所,但不在MQ服务器上,这个订单就能保证 按其中指定的价格运作

而且服务器会出现 "故障"。

 
慢慢学习
 
点赞