我的EA做了一个重复输入 - 页 9

 

你好

这种方法只有在当前头寸大小为零,并且新的交易以所需的头寸大小成功执行时才有效。

请看代码。

#include <Trade\Trade.mqh>

//--- global variables
CTrade trade;
bool position_opened=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   bool conditions_to_open;
   ENUM_ORDER_TYPE order_type;
   double lot;
   double price,sl,tp;

//---...set variables

//--- inside OnTick()
   if(conditions_to_open && !position_opened) //-- Or position_opened==false
     {
      if(trade.PositionOpen(_Symbol,order_type,lot,price,sl,tp,"comment")
         && 
         (trade.ResultRetcode()==10009 || trade.ResultRetcode()==10008)) //-- Or others condition according to your needs
        {
         //--- set the global variable to true to avoid duplicate orders
         position_opened=true;
         Print("Success!");
        }
      else
        {
         Print("Error = ",GetLastError(), "trade error = ", trade.ResultRetcode());
         //--- Sets the global variable to false
         // position_opened=false;                                         //-- Not needed as position_opened is already false
         return;
        }

     }
//--- 
  }


但是,如果您的EA正在调转头寸:从多头转为空头,或者反之亦然,并且这个动作是在两个不同的交易中执行的呢?

在第一笔交易后,"position_opened "布尔值被设置为 "TRUE",EA无法打开第二笔交易,因为条件是检查"if(condition_to_open && !position_opened)",所以第二笔交易将被阻止。

如果仓位大小只是部分打开呢?你需要第二笔交易来使你的仓位规模达到正确的大小。


最后,"长话短说",你总是需要PositionSelect(Symbol())函数来计算当前的头寸大小,这就是问题的起点(和这个论坛主题)。

在关键时刻,当EA调用PositionSelect(Symbol())时,终端尚未更新当前头寸大小,EA使用错误的头寸大小工作,并向交易服务器发送了新的双倍订单。


我认为(figurelli)的方法更好,因为你不得不等待,直到EA将PositionSelect(Symbol())函数更新为正确的仓位大小。


bool fatalError=false; // atention: declare this as global

....

if(fatalError == false) 
      {
      if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) 
            {
            Print("Position opened in ", Symbol());
            int maxTimeout=0;
            while(!PositionSelect(Symbol())) 
                     {
                     Sleep(100);
                     maxTimeout++;
                     if(maxTimeout > 100) 
                           {
                           Print("### PositionSelect fatal error!");
                           fatalError = true;
                           break;
                           }
                     }
            Print("--> PositionSelect delay=",maxTimeout * 100);
            break;
            }
      }
 
snelle_moda:

你好

这种方法只有在当前头寸大小为零,并且新的交易以所需的头寸大小成功执行时才有效。

请看代码。


但是,如果您的EA正在调转头寸:从多头转为空头,或者反之亦然,并且这个动作是在两个不同的交易中执行的呢?

在第一笔交易后,"position_opened "布尔值被设置为 "TRUE",EA无法打开第二笔交易,因为条件是检查"if(condition_to_open && !position_opened)",所以第二笔交易将被阻止。

如果仓位大小只是部分打开呢?你需要第二笔交易来使你的仓位规模达到正确的大小。


最后,"长话短说",你总是需要PositionSelect(Symbol())函数来计算当前的头寸大小,这就是问题的起点(和这个论坛主题)。

在关键时刻,当EA调用PositionSelect(Symbol())时,终端尚未更新当前头寸大小,EA使用错误的头寸大小工作,并向交易服务器发送了新的双倍订单。


我认为(figurelli)的方法更好,因为你不得不等待,直到EA更新PositionSelect(Symbol())函数。


你是对的,两种方法都有局限性。

这个问题的根源现在已经明确了。每个人都必须根据自己的策略来调整自己的代码。我不认为有一种通用的方法可以适用于所有情况。

 
我们是否需要为伟大而强大的mql5提供一个OrderSendReliable()库?
 
Ubzen:
我们是否需要为伟大而强大的mql5建立一个OrderSendReliable()库?
我不认为讽刺会有什么帮助。尽管这显然是一个糟糕的设计,导致了这样的复杂性。
 
angevoyageur:

你是对的,两种方法都有局限性。

这个问题的根源现在已经明确了。每个人都必须根据自己的策略来调整自己的代码。我不认为有一种通用的方法可以适用于所有情况。


或者我们必须等待Metaquotes的人自己的 "官方声明"。

服务台是否已经有了回应?

 
angevoyageur: 我不认为讽刺能有什么帮助。尽管这显然是一个糟糕的设计,导致了这样的复杂性

如果我同意你的观点,你会认为这是没有帮助的吗?.

我只是教了睡到终止交易的解决方案,这让我想起了OrderSendReliable()。我教这些会被更优雅地解决。

这也让我想起了old_documents的处理方法......在那里,它的内容是{和所有的交易都应该停止}。

总之,道歉并不是要挑剔mql5。

 
snelle_moda:


或者我们必须等待Metaquotes的人自己的 "官方声明"。

服务台是否已经有了回应?

不,我只是在想这个问题......如果所有相关的人都就这个问题向ServiceDesk写一张票,可能会很有用。然而,我非常怀疑MQ是否愿意改变这种设计。但我们可以试试。

人们可以写信给ServiceDesk,并在这里报告票号。我的是

错误MetaTrader 5 MQL打开开始。2013.12.23 19:08,#916435
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 
Ubzen:

如果我同意你的观点,你会认为这是没有帮助的吗? .

我只是教了睡到终止交易的解决方案,让我想起了OrderSendReliable()。我教这些会被更优雅地解决。

这也让我想起了old_documents的处理方法......在这里,它的内容是{和所有的交易都应该停止}。

总之,道歉并不是要挑剔mql5。

我想知道类似的问题是否也存在于mql4中,在过去的几个月里,我在mql4论坛上至少读到了2个用户抱怨双重交易的主题。我不确定这是否相关,但可能值得检查 这些主题。你也读过这些内容吗?
 
angevoyageur: 我想知道在mql4中是否也存在类似的问题,我在过去几个月中在mql4论坛上至少读到了2个用户抱怨双重交易的主题。我不确定这是否相关,但可能值得检查这些主题。你也读过这些内容吗?

是的,但很难判断其是否因为编码不良。双重交易是一个问题,甚至在多重交易线程之前。它的传统处理方式是snelle_moda的处理方式。

 
Ubzen:

是的,但很难判断其是否因为编码不良。双重交易是一个问题,甚至在多重交易线程之前。它的传统处理方式是snelle_moda的处理方式。

我不确定我理解你的意思。我们在这个话题中讨论的这个问题不是由糟糕的编码造成的,而是由mql5中糟糕的设计造成的(这是我的观点,或者说这只是一个错误?)你说的 "多个交易线 "是什么意思?
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.