关于OnTradeTransaction函数的问题 - 页 5

 
papaklass:

OnTradeTransaction()是一个交易事件的RUNNER。是什么触发了这个事件并不重要,重要的是这个事件发生了。

以下是文件的摘录。

OrderSend() / OrderSendAsync() 是交易函数。

对于OnTradeTransaction()来说,你用哪个函数来发送交易订单,OrderSend()或OrderSendAsync()没有区别。

我已经读过很多次了,之前创建的主题 ...我不会说一个字。

但尽管如此,我的结论是,在一堆交易中丢失一个交易比在一秒钟内丢失一个交易更有可能,甚至可能连一个(秒钟)都没有。这正是我想了解的情况。试图了解你 对此事的看法如果他们是相当罕见的单身,失去交易的概率是多少?

 
papaklass:
就概率而言,我不知道。

我只能依靠迈克尔根据自己的经验提出的单一意见。如果他在半年内没有从一堆订单中失去一笔交易,那么我们将假设有一笔订单不会失去。

我正在慢慢地掌握它,试图不打破逻辑,但有时一个人的方式会妨碍另一个人......。

 
AlexeyVik:

我们将不得不依靠迈克尔根据自己的经验提出的单一意见。如果他在六个月内没有从一堆订单中丢失过一笔交易,那么我们将假设有一笔订单不会丢失。

我正在慢慢掌握它,尽量不破坏逻辑,但有时会发现一个干扰另一个......。

阿列克谢,问自己一个简单的问题。

哪种方法更好,是在每个命令之后翻阅历史记录,还是1次,或者永远不 翻阅,以仔细检查订单(OnTradeTransaction 没有被触发)?

验证并不容易实现(顺便说一下,我的例子有错误),但主要原则是每个订单都有自己的魔力。

还有一件事。我已经说过,每个人都可以自由地走自己的路....。

 
Mikalas:

阿列克谢,问自己一个简单的问题。

是在每个命令后挖掘历史记录,还是一次或永远不 重复检查订单(OnTradeTransaction没有工作)?

验证并不容易实现(顺便说一下,我的例子有错误),但主要原则是每个订单都有自己的魔力。

还有一件事。我已经说过,每个人都可以自由地走自己的路....。

迈克尔,正是这个简单问题的简单答案让我陷入了这整个讨论。而到目前为止,我还不打算放弃它。但我仍然不明白,在OrderSend()命令或挂单激活后,或在使用止损/止赢平仓 期间,是否可能出现交易损失。

从你的第一个回答中,我了解到即使是OrderSendAsync() 你也不会丢失交易我试图理解它,以便决定是否有必要在这种相当罕见的交易中进行检查。此外,考虑到我所分配的东西。

纯粹从逻辑上讲,如果 OrderSend()在得到回复之前不终止,交易就不会丢失。但激活挂单和平仓并不符合我的逻辑。如果这种情况下的交易是在MT5内触发的,分别不会丢失,但如果通过服务器...我不知道。(但我想直觉告诉我,服务器向我发送了一个答案并激活了OnTradeTransaction()。

 

伙计们,问题是这样的。

如果我开了一个头寸,OnTradeTransaction只处理TRADE_TRANSACTION_DEAL_AD...一切都很好。

例如,如果放置一个SellStop,只有TRADE_TRANSACTION_ORDER_ADD被触发。一切也都很正常。

但如果我设置了一个头寸和一个挂单,TRADE_TRANSACTION_DEAL_ADD会起作用 TRADE_TRANSACTION_ORDER_ADD会起 两次 作用。

为什么会这样呢?

#include <Trade\Trade.mqh>


double point, FirstOpenPrice, TakeProfit, SecondOpenPrice, MaxPrice , MinPrice, SecondTake;
bool  NewStart;
       
    CTrade Trade;
    MqlTradeResult v_res, v_result;
    MqlTradeTransaction v_Trans;

/*******************Expert initialization function*******************/
int OnInit()
{
 point = _Digits%2 == 0 ? _Point : _Point * 10;
  NewStart = true;
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
 if(NewStart)
  {
   Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
    Trade.SellStop(0.78, SymbolInfoDouble(_Symbol, SYMBOL_BID)-52*point, Symbol(), 0.0, 0.0, 0, 0);
   NewStart = false;
  }
}/*******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{

  ENUM_TRADE_TRANSACTION_TYPE type = (ENUM_TRADE_TRANSACTION_TYPE)trans.type;
   
   switch(type)
    {
     case TRADE_TRANSACTION_ORDER_ADD:
      {
       Print("order add    * Тикет ордера * ", trans.order);
        Print("order add    * Объём ордера * ", trans.volume);
       break;
      }
     case TRADE_TRANSACTION_DEAL_ADD:
      {
       Print("deal add    * Тикет сделки * ", trans.deal);
        Print("deal add    * Объём сделки * ", trans.volume);
       break;
      }
     default: break;
    }

}/*******************************************************************/
 
AlexeyVik:

伙计们,问题是这样的。

如果我开了一个头寸,OnTradeTransaction只处理TRADE_TRANSACTION_DEAL_AD...一切都很好。

例如,如果放置一个SellStop,只有TRADE_TRANSACTION_ORDER_ADD被触发。一切也都很正常。

但如果我设置了一个头寸和一个挂单,TRADE_TRANSACTION_DEAL_ADD会起作用 TRADE_TRANSACTION_ORDER_ADD会起 两次 作用。

何以如此?

你一定是哪里搞错了。在这两种情况下必须至少有两个事件:TRADE_TRANSACTION_ORDER_ADD和TRADE_TRANSACTION_DEAL_ADD。为什么你没有得到TRADE_TRANSACTION_ORDER_ADD,目前还不清楚。

试着注释掉这个开关,打印OnTradeTransaction中收到的所有事件的完整日志。

 
C-4:

你在什么地方搞错了。在这两种情况下,至少要有两个事件:TRADE_TRANSACTION_ORDER_ADD和TRADE_TRANSACTION_DEAL_ADD。为什么你没有得到TRADE_TRANSACTION_ORDER_ADD,目前还不清楚。

试着注释掉这个开关,打印OnTradeTransaction中收到的所有事件的完整日志。

是的,我试过了。Print(EnumToString(type))是在switch(type)之前打印的;它完全按照我的描述打印。

下面是重复的实验。




 

我自己检查了你的代码。- 一切运作正常。

选项,而不发送止损单来 跟进。

2015.02.10 18:32:03.332 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:32:03.331 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

可以选择发送止损单。

2015.02.10 18:35:59.633 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_UPDATE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_AD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD


即,全周期的时间是一个惊喜:稳定在60-70毫秒。干得好,开发者们!
 
C-4:

我自己检查了你的代码。- 一切运作正常。

变体,而不在事后发送止损单

选择与发送止损单。

即,全周期的时间是令人惊喜的:稳定在60-70毫秒。开发者做得很好,他们做得很好!

显然,这是交易的损失...而且,首先,(摘录自文件资料)

而这些交易到达终端的顺序是不保证的

瓦西里,这是一个测试器还是一个演示?我有一个测试员的样品。我想知道在测试器中的OnTradeTransaction操作和在账户中的操作是否有区别。我偶尔会检查一下。


ps;事实证明,在失去一笔交易后,它突然出现在下一次OnTradeTransaction的激活。

 
AlexeyVik:

显然,这是交易的损失...而且,首先,(摘自文件),(摘自文件)。

瓦西里,这是一个测试器还是一个演示?我有测试者的样本。我想知道OnTradeTransaction在测试者和账户中的触发是否有区别。我偶尔会检查一下。


ps;事实证明,在失去一笔交易后,下次激活OnTradeTransaction时突然出现。

不,交易不会丢失,只是可能不按一定的顺序来。

只有TRADE_TRANSACTION_REQUEST总是排在第一位,否则你就不会得到订单的票据。

仔细阅读文件。