在贸易交易中的处理 - 页 9

 
JRandomTrader:

从机器人算法的角度来看,需要一个假想的位置:如果它已经打开了,就应该关闭它。

我应该补充的是,第一个帖子中的任务甚至更简单--我们需要实现限价订单网格的操作,网格中的每个节点都关闭其SL/TP。

例如,一个账户中只有一个这样的单向EA工作,其他的都没有。但我们在这里谈论的也是假想的立场。


而提出的问题不仅仅是关于网状物。同样的情况也会发生在套期保值中。在对冲方面有几个专家顾问,有人刚刚通过CloseBy关闭了几个位置。如果专家顾问是通过假想头寸实现的,那么这样的塌陷不会破坏逻辑。


一般来说,这可以通过虚拟交易环境来解决。它可以很容易地得到解决。这就是算法办公室在交易所运行其TS组合的方式。

 
Alexey Viktorov:

为了简化事情,是的。同意。

在这一点上,"运输经理 "还没有完全澄清这个问题和他的行动。

你说的止损单是什么意思?是针对全部头寸,还是只针对该EA所处理的部分?

当然,对于我们的EA正在工作的部分头寸,止损单是待定的卖出/买入止损和卖出/买入限制。

到目前为止,我已经意识到,由于OnTradeTransactions 存在大量的隐患,最好还是转到OnTrade。

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

当然,止损单是指由特定的EA处理的部分头寸的卖出/买入止损和卖出/买入限额的挂单。

到目前为止,我已经了解到,由于OnTradeTransactions 存在大量隐患,所以最好还是选择OnTrade。

只注意它们是一起工作的。我不记得哪个是第一个,哪个是第二个。但OnTradeTransactions至少有一些信息,不需要任何额外的代码,而 OnTrade则必须强行获得一切首先,我们必须确定是哪个事件触发了这个函数...

 

我已经写了一个交易捕捉器--它可能有助于确定什么和从哪里来(虽然有简单的处理,取决于交易类型)--没有参考订单和交易历史(例如,打印专家顾问ID)。

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE trans_type=trans.type;
   if(trans_type==TRADE_TRANSACTION_ORDER_ADD || trans_type==TRADE_TRANSACTION_ORDER_UPDATE || trans_type==TRADE_TRANSACTION_ORDER_DELETE ||
      trans_type==TRADE_TRANSACTION_HISTORY_ADD || trans_type==TRADE_TRANSACTION_HISTORY_UPDATE || trans_type==TRADE_TRANSACTION_HISTORY_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","order_type",EnumToString(trans.order_type));
      PrintFormat("%-15s: %s","orders_state",EnumToString(trans.order_state));
      PrintFormat("%-15s: %s","time_type",EnumToString(trans.time_type));
      if(trans.time_type==ORDER_TIME_SPECIFIED || trans.time_type==ORDER_TIME_SPECIFIED_DAY)
        {
         PrintFormat("%-15s: %s","time_expiration",TimeToString(trans.time_expiration,TIME_DATE|TIME_SECONDS));
        }
      else
        {
         PrintFormat("%-15s: %s","time_expiration","---");
        }
      PrintFormat("%-15s: %.8f","price",trans.price);
      if(trans.order_type==ORDER_TYPE_BUY_STOP_LIMIT || trans.order_type==ORDER_TYPE_SELL_STOP_LIMIT)
        {
         PrintFormat("%-15s: %.2f","price_trigger",trans.price_trigger);
        }
      else
        {
         PrintFormat("%-15s: %s","price_trigger","---");
        }
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      if(trans_type!=TRADE_TRANSACTION_ORDER_ADD && (trans.order_type==ORDER_TYPE_BUY || trans.order_type==ORDER_TYPE_SELL))
        {
         PrintFormat("%-15s: %d","position",trans.position);
        }
      else
        {
         PrintFormat("%-15s: %s","position","---");
        }
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_DEAL_ADD || trans_type==TRADE_TRANSACTION_DEAL_UPDATE || trans_type==TRADE_TRANSACTION_DEAL_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","deal",trans.deal);
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_POSITION)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
     }
   else if(trans_type==TRADE_TRANSACTION_REQUEST)
     {
      Print("---");
      Print(EnumToString(trans_type));
     }
  }
 
Илья Ребенок:

fxsaber 谢谢你的例子!

只是这不是一个真正的例子,它是对原始问题的一个完整解决方案。

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

当然,止损单是指由特定的EA处理的部分头寸的卖出/买入止损和卖出/买入限额的挂单。

到目前为止,我已经了解到,由于OnTradeTransactions 存在大量隐患,所以最好还是选择OnTrade。

继续保持良好的工作 :)

一个小提示 MqlTradeTransaction &trans -只有字段是相关的

Trade_transaction_deal_*字段

对于与交易处理有关的交易(TRADE_TRANSACTION_DEAL_AD,TRADE_TRANSACTION_DEAL_UPDATE和TRADE_TRANSACTION_DEAL_DELETE),在MqlTradeTransaction结构中填写以下字段

  • 交易 - 交易票。
  • order - 订单票据,交易在此基础上被执行。
  • symbol - 交易中金融工具的名称。
  • type - 贸易交易的类型。
  • deal_type - 交易的类型。
  • 价格 - 交易执行时的价格。
  • price_sl - 价格止损(如果在订单中指定,将被填入,交易在此基础上执行)。
  • price_tp - 获利的价格(如果在订单中指定,则在此基础上执行交易)。
  • 量 - 以手为单位的交易量。
  • 头寸 - 由于执行交易而打开、修改或关闭的头寸票。
  • position_by - 相反位置的票。仅用于关闭一个头寸的交易,由相反的头寸关闭(退出)。

再看看MqlTradeResult &result。

但现在你有1000行的代码了

 
prostotrader:

继续保持良好的工作 :)

一个小提示 MqlTradeTransaction &trans -只有字段是相关的

trade_transaction_deal_*.

对于与交易处理有关的交易(TRADE_TRANSACTION_DEAL_AD,TRADE_TRANSACTION_DEAL_UPDATE和TRADE_TRANSACTION_DEAL_DELETE),在MqlTradeTransaction结构中填写以下字段

  • 交易 - 交易票。
  • order - 订单票据,交易在此基础上被执行。
  • symbol - 交易中金融工具的名称。
  • type - 贸易交易的类型。
  • deal_type - 交易的类型。
  • 价格 - 交易执行时的价格。
  • price_sl - 价格止损(如果在订单中被指定,将被填补,交易在此基础上被执行)。
  • price_tp - 获利的价格(如果在订单中指定,则在此基础上执行交易)。
  • 量 - 以手为单位的交易量。
  • 头寸 - 由于执行交易而打开、修改或关闭的头寸票。
  • position_by - 相反位置的票。仅用于关闭一个头寸的交易,由相反的头寸关闭(退出)。

再看看MqlTradeResult &result。

但现在你有1000行的代码了

当然,我理解你的自尊心爆棚。经验,一切...

但我来这里不是为了讽刺一下,而是为了寻求帮助。如果你看高一点,你会看到我同意我在解析deal_add没有填入的字段时犯了一个错误。

我将感谢你提供更多建设性的帮助,我可以自己 "拉屎")我接受建设性的批评。

关于"And look at MqlTradeResult &result".

根据帮助,贸易交易结果只填写TRADE_TRANSACTION_REQUEST,而且必须只对这种类型的交易进行分析。

 

你有一个奇怪的认知。

我不会梦想 "在任何人身上拉屎",这可能是你对生活的看法,你自己可能也经常使用它。

你自己可能经常使用它。

不是我,而是fxsaber(a),因为他几乎在每一个话题中都推崇他的

但他自己并没有在真正的市场上进行交易,当然也没有在森林公园上进行交易!他是一个很好的例子。

同样的问题有简单和复杂的解决方案。

从你的问题来看,你是一个初学者。

但俗话说:"我们不寻求简单的方法"!

OnTradeTransaction功能 被专门设计来简化

"机器人开发中的程序员的生活,但老前辈们不愿意使用它。

因为他们已经习惯了OnTrade,不得不写一堆代码 来使其工作。

我已经告诉过你,订单 是头,不是交易!

如果初始订单的数量不是1,而是2,10,你会怎么做?

你设置了一个挂单,这意味着你不能 "严格 "控制它,更不用说控制交易了!

你不能 "严格 "控制它,如果你做任何交易,就更应该这样做!"。挂单有很多隐患。

但是,你选择了简单的方法,得到了一个可疑的现成的解决方案,而不是去尝试

但你选择了简单的方法,而不是自己尝试去弄清楚(有提示)。

祝你好运,我已不再参与。

 
prostotrader:

你有一个奇怪的认知。

我不会梦想 "在任何人身上拉屎",这可能是你对生活的看法,你自己可能也经常使用它。

你自己可能经常使用它。

不是我,而是fxsaber(a),因为他几乎在每一个话题中都推崇他的

但他自己并没有在真正的市场上进行交易,当然也没有在森林公园上进行交易!他是一个很好的例子。

同样的问题有简单和复杂的解决方案。

从你的问题来看,你是一个初学者。

但俗话说:"我们不寻求简单的方法"!

OnTradeTransaction函数 被专门设计用来使

机器人开发中的程序员的 "生活",但就是那些老前辈们不愿意使用它。

因为他们已经习惯了OnTrade,不得不写一堆代码 来使其工作。

我已经告诉过你,订单 是头,不是交易!

如果初始订单的数量不是1,而是2,10,你会怎么做?

你设置了一个挂单,这意味着你不能 "严格 "控制它,更不用说控制交易了!

你不能 "严格 "控制它,如果你做任何交易,就更应该这样做!"。挂单有很多隐患。

但是,你选择了简单的方法,得到一个可疑的现成解决方案,而不是试图

但你选择了简单的方法,而不是自己尝试去弄清楚(有提示)。

祝你好运,我已不再参与。

让我们从我不使用现成的解决方案这一事实开始。我不知道你为我编造了什么,但我还没有使用过这个主题中的任何解决方案(尽管我已经提取了一些有用的知识),我还在试验和摸索。一般来说,我从你的帖子中注意到,你喜欢猜测别人。无意冒犯。

至于订单量,是多少并不重要。这是一个允许我判断真正执行的量的交易。我认为这比通过适当的类型捕捉部分订单的执行要容易。此外,在其中一个话题中,有人指出,只有交易才能让你确信头寸已经被执行。

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

首先,我不使用现成的解决方案。我不知道你为我猜到了什么,但我还没有使用过这个话题中的任何解决方案(虽然我学到了一些有用的知识),我还在试验和摸索。一般来说,我从你的帖子中注意到,你喜欢猜测别人。无意冒犯。

至于订单量,是多少并不重要。这是一个允许我判断什么是真正的执行量的交易。我认为这比根据适当的订单类型捕捉部分订单的执行要容易。在其中一个话题中,有人指出,只有交易才能让我们确信立场已经被执行。

你是否忘记了如何阅读?

"祝你好运,我已经不再参与了。"