在贸易交易中的处理

 

晚上好。

伙计们,请帮助我。这个问题可能并不新鲜,但我没有找到一个解决方案(无论是在实践中还是在论坛上)。

我在终端中对2个不同的仪器运行2个不同的机器人。各地的魔法是不同的。机器人放置待定限额,程序OnTradeTransaction 允许我检测一个交易,并使用该交易放置待定止损单。

以下是贸易交易的代码

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

这是检查该交易是否属于机器人的函数的代码

bool getIsDealOfExpert(ulong dealTicket)
     {
      if(HistoryDealSelect(dealTicket) && HistoryDealGetInteger(dealTicket,DEAL_MAGIC)==magic_number && HistoryDealGetString(dealTicket,DEAL_SYMBOL)==symbol)
         return true;
      else
         return false;
     }

这是待定止损单的程序代码

void analyzeFilledOrder(ulong orderTicket,double volume)
  {
   bool isFindOrder=false;
   string fullComment;
   ENUM_ORDER_TYPE orderType;
   if(getIsOrderOfExpert(orderTicket,true)) //Если ордер из сделки уже в истории
     {
      fullComment=HistoryOrderGetString(orderTicket,ORDER_COMMENT);
      orderType=ENUM_ORDER_TYPE(HistoryOrderGetInteger(orderTicket,ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли в истории
     }
   if(!isFindOrder && getIsOrderOfExpert(orderTicket,false)) //Если не нашли ордер в истории и ордер есть не в истории
     {
      fullComment=OrderGetString(ORDER_COMMENT); 
      orderType=ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли не в истории
     }
   if(isFindOrder) //если хоть где-то нашли, то выставляем отложенные стоп ордера
     {
     //выставляем стоп ордера

这是搜索历史中的订单和历史外的订单的函数代码

bool getIsOrderOfExpert(ulong OrderTicket,bool isHistory)
     {
      bool is_expert=false;
      //если ордер находится в истории
      if(isHistory)
        {
         if(HistoryOrderSelect(OrderTicket) && HistoryOrderGetInteger(OrderTicket,ORDER_MAGIC)==magic_number && HistoryOrderGetString(OrderTicket,ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      else
        {
         if(OrderSelect(OrderTicket) && OrderGetInteger(ORDER_MAGIC)==magic_number && OrderGetString(ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      return is_expert;
     }

我将按照终端接收的顺序在日志文件中输出关于传入交易的信息。现在我有一个问题,我在用模拟账户交易时遇到过。

有时交易的顺序如下 TRADE_TRANSACTION_ORDER_DELETE, then TRADE_TRANSACTION_DEAL_AD, then TRADE_TRANSACTION_HISTORY_AD。在这种情况下,止损单往往不会在交易执行后下达。我想这是因为该订单已经被删除,但还没有被添加到历史中。这意味着我们无法在历史或终端中找到该交易的订单。虽然这很值得怀疑,但事实是没有下止损单,因为机器人在所有维度搜索订单后没有找到它(isFindOrder=false)。交易的顺序可能是正确的,但订单仍然无处可寻。 在所有情况下,机器人都能正确检测到交易,但没有进入下单阶段。然而,它也偶尔会正确工作,下单

我已经尝试了不同的方法,没有任何效果。我现在考虑在待定下单程序开始时增加一个1秒钟的间隔。我不知道还有什么地方可以挖掘。

请分享你的经验和想法。

 
Илья Ребенок:

晚上好。

伙计们,请帮助我。这个问题可能并不新鲜,但我没有找到一个解决方案(无论是在实践中还是在论坛上)。

我在终端中对2个不同的仪器运行2个不同的机器人。各地的魔法是不同的。机器人放置待定限额,程序OnTradeTransaction 允许我检测一个交易,并使用该交易放置待定止损单。

以下是贸易交易的代码

这是检查该交易是否属于机器人的函数的代码

这是待定止损单的程序代码

这是搜索历史中的订单和历史外的订单的函数代码

我将按照终端收到的顺序在日志中输出关于传入交易的信息。现在我有一个问题,我在用模拟账户交易时遇到过。

有时交易的顺序如下 TRADE_TRANSACTION_ORDER_DELETE, then TRADE_TRANSACTION_DEAL_AD, then TRADE_TRANSACTION_HISTORY_AD。在这种情况下,止损单往往不会在交易执行后下达。我想这是因为该订单已经被删除,但还没有被添加到历史中。这意味着我们无法在历史或终端中找到该交易的订单。虽然这很值得怀疑,但事实是没有下止损单,因为机器人在所有维度搜索订单后没有找到它(isFindOrder=false)。交易顺序可能是正确的,但顺序仍然无处可寻。

尝试了不同的方法,没有任何帮助。我现在想在一个程序的开始加入1秒的睡眠,以放置待定的订单,也许时间还不够。我甚至不知道还能在哪里挖掘。

请分享你的经验和想法。

我还没有开始翻阅所有的代码。我认为这种做法一点也不正确。

在交易类型TRADE_TRANSACTION_DEAL_ADD的时刻,我们必须选择trans.position并检查其魔力。

if(PositionSelectByTicket(trans.position) && PositionGetInteger(POSITION_MAGIC) == mag)

你也可以检查trans.symbol == _Symbol,并根据这些检查的结果做出决定。

 
Alexey Viktorov:

我没有研究过所有的代码。在我看来,这种做法一点也不正确。

在TRADE_TRANSACTION_DEAL_ADD交易类型的时刻,应该选择trans.position并检查它的magik。

你也可以检查trans.symbol == _Symbol,并根据这些检查的结果做出决定。

我忘了补充,模式是网状的。这个位置对所有机器人来说都是一样的。也就是说,一个机器人买了一个头寸,第二个机器人也买了,TRADE_TRANSACTION_DEAL_AD事件以相反的顺序出现,第一个机器人没有看到这个结果。

而且从逻辑上讲,我需要从交易中获得订单注释,位置在这里没有什么帮助。
 
Илья Ребенок:

请分享你的经验和想法。

一种情况

关于交易、自动交易系统和策略测试的论坛

虫子,虫子,问题

fxsaber, 2018.06.20 23:18

决定检查一下,当一个订单在系统中但不在终端中时,这些幻象订单的情况会持续多久。

// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

bool OrderIsExist( const ulong &OrderTicket )
{
  return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true);
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{
  static bool PrevIsExist = true;
  static ulong StartTime = 0;
  static ulong MaxInterval = 0;
  
  const ulong NowTime = GetMicrosecondCount();
  const bool IsExist = OrderIsExist(Trans.order);
    
  if (!IsExist)
  {
    Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
  
    if (PrevIsExist) 
      StartTime = NowTime;
  }
  else if (!PrevIsExist)
  {
    const ulong Interval = NowTime - StartTime;
    
    Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
    
    if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
      Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


结果

2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2)
2018.06.21 00:10:31.047 Trans.order = 2210967406
2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 
2018.06.21 00:10:31.080 Interval = 32643
2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3)
2018.06.21 00:10:31.080 Trans.order = 2210967406
2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true


32毫秒,一个订单在那里,但不在终端中!试想一下,如果交易逻辑在这个区间内执行,后果会怎样......。


有趣的是,幽灵订单最常出现在TRADE_TRANSACTION_ORDER_DELETETRADE_TRANSACTION_DEAL_ADD(更罕见)交易类型


非常糟糕的平台细微差别。


ZZY在5日的贸易交易速度有问题,很遗憾。


第二次

一个位置 上,订单总数增加了一个。

  • 它被执行,OrdersTotal减少了一个,但PositionsTotal没有增加一个换句话说,有一个位置,但终端不知道它。
  • 例如,没有头寸或订单 - 头寸总数=0,订单总数=0。

    你设置了一个市场订单。职位总数=0,订单总数=1。

    市场订单被执行 - OrdersTotal = 0。但职位总数=0!

     
    Илья Ребенок:

    我忘了补充,模式是网状的。这个位置对所有机器人来说都是一样的。

    这并不重要。该位置总是有一张票,但也可以通过符号选择。你可能要在交易量 或其他方面增加一个检查。例如,选择一个仓位的订单和交易,摇一摇就能找到合适的。但交易就是交易...而且没有人保证交易的一致性。不久前,甚至还有人警告说可能失去交易。


    鉴于你帖子中的附录,这一切都错了。在这种情况下,你需要更仔细地研究它。

     
    Илья Ребенок:

    尝试了不同的方法,没有任何效果。

    写一个需要执行的简单行动。

     
    fxsaber:

    一种情况


    第二次

    谢谢,我会读的,但乍一看,它证实了我的假设。

    阿列克谢-维克多罗夫

    这并不重要。该位置总是有一张票,但你也可以通过符号选择。你可能要增加一个关于交易量 或其他方面的检查。例如,选择一个仓位的订单和交易,摇一摇就能找到合适的。但交易就是交易...而且没有人保证交易的一致性。不久前,有一个关于可能失去交易的警告。


    考虑到你帖子中的附录,它并不完全适合。在这种情况下,你需要更仔细地研究它。

    看到一个关于交易损失的帖子,但那里的版主说这是过去的遗留问题,忘了把它从文件中删除。

    fxsaber:

    写一个要执行的简单动作。

    我不太明白写一个简单的动作)请解释。

     
    Илья Ребенок:


    看到一个关于丢失交易的帖子,但那里的版主说这是过去的遗留问题,忘了把它从文件中删除。

    他们做到了,但那不是很久以前。

     
    Илья Ребенок:

    我不太明白关于写一个简单的动作)请解释一下。

    贸易目标是什么?

     
    fxsaber:

    你的交易目标是什么?

    我们下限价单,当它们触发时,我们下止损单 和获利单。当止损单触发时,我们就删除获利,反之亦然。最初的限价票,我们在此基础上设置止损单和止盈,写在止损单和止盈的注释中。这就是为什么获得订单注释很重要,这样当止损订单触发时,你可以找到具有相同注释的止盈,并删除它。

    由于我们的机器人允许我们补仓,所以我们也应该下一个止损单和一个止盈单,并在买入更多仓位时对补仓单留下评论。

    1秒钟的睡眠可以是一个好主意吗?要为所有交易TRADE_TRANSACTION_ORDER_DELETETRADE_TRANSACTION_HISTORY_ADD 提供时间。

    Общие принципы - Торговые операции - MetaTrader 5
    Общие принципы - Торговые операции - MetaTrader 5
    • www.metatrader5.com
    Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
     

    Илья Ребенок:

    该机器人允许扩大规模,所以当我们买入更多的时候,我们也会下一个止损单和一个止盈单,并在票据中记录扩大规模。

    我们可以同时有>=2个接受和停止指令吗?