期货交易以最后价格开盘,而不是以买价或卖价开盘。这是否正常? - 页 2

 

罗曼阿列克谢-维克多罗夫,感谢你们的帮助。

在开仓交易后,我决定简单地检查一下真实的和计算的TP和SL的距离是否相同。如果它们不重合,我尝试在OnTrade()函数中重置它们。因此,实际开盘价与TP和SL之间的距离变得正确。令人惊讶的是,这种滑坡是这个符号的常态。该代码几乎在每次交易开盘时都会被触发。

//+------------------------------------------------------------------+
//|                          OnTrade()                               |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(HistoryDealSelect(last_trade_ticket))
     {
      // сделка выделилась успешно
      ulong pos_id = HistoryDealGetInteger(last_trade_ticket, DEAL_POSITION_ID);
      // идентификатор позиции сохранён
      if(HistorySelectByPosition(pos_id) && HistoryDealsTotal() == 1)
        {
         // история позиции сформирована
         // позиция состоит из одной сделки
         if(PositionSelectByTicket(pos_id))
           {
            // позиция выделена
            string symbol = PositionGetString(POSITION_SYMBOL);
            double pos_op = PositionGetDouble(POSITION_PRICE_OPEN);
            double pos_tp = NormalizeDouble(PositionGetDouble(POSITION_TP), _Digits);
            double pos_sl = NormalizeDouble(PositionGetDouble(POSITION_SL), _Digits);
            long pos_type = PositionGetInteger(POSITION_TYPE);
            long pos_mag = PositionGetInteger(POSITION_MAGIC);
            // параметры позиции получены
            int tp = int(GlobalVariableGet(global_tp));
            int sl = int(GlobalVariableGet(global_sl));
            double calc_tp_price = 0;
            double calc_sl_price = 0;
            if(pos_type == POSITION_TYPE_BUY)
              {
               // покупка
               // расчёт корректных тп и сл
               if(tp > 0)
                  calc_tp_price = NormalizeDouble(pos_op + tp * _Point, _Digits);
               if(sl > 0)
                  calc_sl_price = NormalizeDouble(pos_op - sl * _Point, _Digits);
              }
            if(pos_type == POSITION_TYPE_SELL)
              {
               // продажа
               // расчёт корректных тп и сл
               if(tp > 0)
                  calc_tp_price = NormalizeDouble(pos_op - tp * _Point, _Digits);
               if(sl > 0)
                  calc_sl_price = NormalizeDouble(pos_op + sl * _Point, _Digits);
              }
            if(pos_tp != calc_tp_price || pos_sl != calc_sl_price)
              {
               // обнаружен факт проскальзывания
               // исправить тейк и стоп
               MqlTradeRequest request;
               MqlTradeResult result;
               ZeroMemory(request);
               ZeroMemory(result);
               request.action = TRADE_ACTION_SLTP;
               request.position = pos_id;
               request.symbol = symbol;
               request.magic = pos_mag;
               request.tp = calc_tp_price;
               request.sl = calc_sl_price;
               if(!OrderSend(request, result) || result.retcode != TRADE_RETCODE_DONE)
                  Print("Ticket:", pos_id, " Error: ", ResultRetcode(result));
              }
           }
        }
     }
   last_trade_ticket = 0;
  }
//+------------------------------------------------------------------+
 
好话题。谢谢你,不要删除它。当我尝试套利时,出现了很多问题,在此回答。
 
Oleg Remizov:

罗曼阿列克谢-维克多罗夫,感谢你们的帮助。

在开仓交易后,我决定简单地检查一下真实的和计算的TP和SL的距离是否相同。如果它们不重合,我尝试在OnTrade()函数中重置它们。因此,实际开盘价与TP和SL之间的距离变得正确。令人惊讶的是,这种滑坡是这个符号的常态。该代码几乎在每次交易开盘时都会被触发。

尽量用限价单来执行交易,而不是用市场价格,但买入时指定最佳卖出价,卖出时指定最佳买入价。该订单应立即按所述价格执行,当然,除非在此期间卖出价或买入价发生变化。

 
Vitalii Ananev:

尽量不根据市场来执行交易,而是通过限价订单来执行,但订单中的价格表示买入时的最佳卖出价或卖出时的最佳买入价。该订单应立即按所述价格执行,当然,除非在此期间卖出价或买入价发生变化。

限价订单的执行情况良好。有时甚至以比出价更高的价格。

 
Oleg Remizov:

....甚至有时比申请表上的价格更优惠。

因此,价格已经改变。

这里有一个提示:)使用限价订单,你可以像开立市场订单一样开立头寸,但你也可以调整滑点。外汇交易员习惯于在买入价以下下限价。而限价卖单应该放在卖价之上。你可以下限价单,在问价或更高的价格买入。它将以下一个最佳价格执行。例如,市场上的卖价是5,8,10,20,35。发送限价单,在10点买入,将在5点启动交易。如果安全订单包含价格变化,而最佳价格在20,你的订单将不会被执行,但会在纠察队中显示为10。这样一来,我们就限制了可能出现的滑坡的规模。

 
Vitalii Ananev:

因此,价格已经改变。

让我告诉你一个小窍门:)使用限价订单,你可以像开立市场订单一样开立头寸,但你也可以调整滑点。外汇交易员习惯于在买入价以下下限价。而限价卖单应该放在卖价之上。你可以下限价单,在问价或更高的价格买入。它将以下一个最佳价格执行。例如,市场上的卖价是5,8,10,20,35。发送限价单,在10点买入,将在5点启动交易。如果安全订单包含价格变化,而最佳价格在20,你的订单将不会被执行,但会在纠察队中显示为10。这样,我们就限制了可能的滑坡。

这不是一个 "如何做",而是交换执行的原则。))
这就是为什么我之前告诉Aleh,要了解交换订单的工作方式。
通过了解它们的工作方式,你可以提高你的交易质量。


在Quik中,你可以在白天为同一个工具建立不同的定向头寸。
现在这是个好主意))
 
Roman:

这不是一个聪明的把戏,这是交易所执行的原则。))
这就是我之前告诉奥列格的原因,要了解交换订单的工作原理。
了解他们的工作方式,你就可以提高你的交易质量。

对于在Quik工作的人来说,这里有一个聪明的技巧。
在Quik,你可以在白天为一个乐器开不同的仓位。
现在,这是一个很好的诀窍)。

我把它写成了一个关于这个金钱把戏的笑话,最后还加了一个笑脸。

但我不知道快板中的多方位位置。交易所是否允许你这样做?

 
Vitalii Ananev:

我把这句话写成了一个笑话,说的是最后有一个笑脸的把戏。

但我不知道QuickBooks中的多方位位置。交易所是否允许你这样做?

我不知道谁允许这样做))交易所或快速交易所的服务器。
普通头寸可以持有到主要清算,在清算时,它们将被关闭,数量相等。
也就是说,如果2个是多头,1个是空头,那么1个在清算后仍是多头。
事实上,在白天,你可以固定损失,但不是为了实现它,如果你期待反弹,你可以减少损失。
,如果反转发生,你可以从交易中获得利润。总的来说,在好的手中,它是一个好的工具。

 
Roman:

我不知道谁让你这么做的 ))交易所,或快餐店。
分歧的头寸可以保持到主要清算,在清算时它们将被关闭,数量相等。
也就是说,如果2个是多头,1个是空头,那么1个在清算后仍是多头。
事实上,在白天,你可以固定损失,但不是为了实现它,如果你期待反弹,你可以减少损失。
,如果反转发生,你可以从交易中获得利润。一般来说,在熟练掌握的情况下,它是一个好工具。

我明白了。我不做日内交易,只做长线和短线。

 
Oleg Remizov:

交易工具的规格。

这是在什么市场上交易的?