购买或出售执行后,帮助编码删除挂起

携程
23
携程  

我是MQL4中的新编码器。 

我正在使用EA,它将在执行单个挂单BuyStop或SellStop河北体彩并将其更改为“买入或卖出”后删除所有挂单。

我的结果好坏参半,如果对卖出执行卖出止损,删除买入止损似乎有效。
但是,如果将买入止损执行为买入,则卖出止损似乎会一直持续到最终关闭所有河北体彩时间为止。

我找不到我在做错的事情,因此执行从买入停损到买入将删除现有的卖出止损。
此外,似乎“关闭所有河北体彩”仅适用于待处理河北体彩,而不适用于所有河北体彩。 

这是正在发生的事情的屏幕截图。

 

 贸易窗口图

 

这是我正在使用的代码:

      bool t = checkchanneltime();
      if(OrdersTotal()==0 && t==true && DayOfWeek()>0)//Do 上ly if No orders placed, it is inside the channel time, 和 it is not Sunday(0)
      {
        switch(Minute())// look for channels every 15 minutes
        {
            case 0: 
            channelchecker();
            break;
            case 15: 
            channelchecker();
            break;
            case 30: 
            channelchecker();
            break;
            case 45: 
            channelchecker();
            break;
            default:
            break;
         } 
       }                       
     
      if(Hour()==closeAllOrdersTime)
      {
         deletepending();
         closeall();
      }
      
      for (int i = OrdersTotal()-1; i > 0; i--)// This code is supposed to check if any Pending have become buy or sell orders, 和 if so, delete all pending. 
      {
         if ( OrderSelect(i,SELECT_BY_POS,MODE_TRADES) )
         {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
            deletepending();
            }
         }
      }
   }

 以及deletependings和closeall()函数:

void deletepending()
{
   Alert("Deleting Pending");
   for(int w=0; w<OrdersTotal(); w++)
   {
      if(OrderSelect(w, SELECT_BY_POS,MODE_TRADES)==true)
      {
         if(OrderType()==OP_BUYSTOP||OrderType()==OP_SELLSTOP)
         {
            bool result=false;
            result=OrderDelete(OrderTicket());
         }
      }
   }
   
}
        
void closeall()
{

   Alert("Closing ALL");
   for(int i=1; i<OrdersTotal(); i++)
   {
      if(OrderSelect(i-1, SELECT_BY_POS, MODE_TRADES)==true)
      {
         if(OrderMagicNumber()==magic)
         {
            int j=0;
            while(j!=5)
               {
                  bool result=false;
                  result=OrderClose(OrderTicket(),OrderLots(),Bid,3,Pink);
                  PlaySound("news.wav");
                  j++;
               }
         }
      }
    }
   orderFlag = true;
} 

 

 任何帮助将不胜感激。

谢谢。 

携程
23
携程 2016.06.18 21:52:11  
对不起,在图像中说 得到好处,实际上应该说是止损平仓。
费尔南多·卡雷罗
5131
费尔南多·卡雷罗 2016.06.18 22:17:55  

为什么大多数用户坚持使用 待处理河北体彩 在EA的。 挂单适用于不能在屏幕24/5前面的人工执行的人工交易。

另一方面,EA可以并且可以24/5正常工作,因此请使用市场河北体彩,而您不必担心更新或关闭相反的挂单。

在您的EA中,只需跟踪两个买卖价格变量,当买入价超过这些阈值时,打开一个市场河北体彩并清除这两个变量!这就是全部!

额外的优势是,您可以在打开市场河北体彩之前跟踪和补偿点差,而使用挂单无法轻松地做到这一点。

携程
23
携程 2016.06.18 22:47:43  

您的方法是另一种方法,并且可以说是更好的方法,尽管它并不能真正回答问题,为什么会这样。 

我可以尝试使用您的方法,但是我需要重新做一些事情,以便仍能直观地向我展示通道和窗口在图表中的开始和结束位置。 可以使用这种惰性编码或其他方式,但是现在,作为一个初学者,这是我想到的唯一方法,并且让我(人类)能够逐步查看图表数据中的所有操作就像在测试仪中发生的一样 如果我将其与大量对象放置一起进行重做,我认为我也可以这样做,尽管这对我来说是另一个学习曲线。

因此,您的简单答案是,我做错了。 

如果放置 待处理河北体彩 真的只是为了人工执行的人工交易,那么为什么它完全包含在MQL4中?

费尔南多·卡雷罗
5131
费尔南多·卡雷罗 2016.06.18 23:59:10  
携程:

您的方法是另一种方法,并且可以说是更好的方法,尽管它并不能真正回答问题,为什么会这样。 

我可以尝试使用您的方法,但是我需要重新做一些事情,以便仍能直观地向我展示通道和窗口在图表中的开始和结束位置。 可以使用这种惰性编码或其他方式,但是现在,作为一个初学者,这是我想到的唯一方法,并且让我(人类)能够逐步查看图表数据中的所有操作就像在测试仪中发生的一样 如果我将其与大量对象放置一起进行重做,我认为我也可以这样做,尽管这对我来说是另一个学习曲线。

因此,您的简单答案是,我做错了。 

如果挂单实际上仅用于人工执行的人工交易,那么为什么它完全包含在MQL4中?

EA还可以用于协助和支持手动交易,因此需要能够允许使用挂单。但是,对于可以在24/5时自动完全运行的EA,使用挂单绝对没有优势,实际上也有劣势。关于您的代码,这是我的建议:

  • 您的删除/关闭循环顺序错误。这样做时,您 应该倒数而不是倒数.
  • 当关闭市场定单时,使用 OrderClosePrice() 因为购买和 卖单 以不同的价格收盘 OrderClosePrice() 正确地反映出来(买单在卖出价处开盘,然后在买价处关闭,卖出河北体彩在买价处打开,并在卖价时关闭)。
  • 始终同时检查幻数和符号 这样EA才能“与他人一起玩”并且不会干扰其他EA (或其他图表上的本身)或手动交易。
  • 在检查已更改为市场河北体彩的待处理河北体彩时, 退出循环,否则它将无法正确索引,并且在之间删除河北体彩。
  • 也, OrderClose() 只关闭市场定单(不删除挂单)。因此,您必须同时调用“ CloseMarketOrders()”(请参见下文)和“ DeletePendingOrders()”(请参见下文),或者同时使用两者的功能(请参见“功能”CloseDeleteAllOrders()”)。
  • 实际上,您的代码中还有其他一些“错误”和不良做法,但目前,我仅关注您报告的问题。我们可以稍后再解决。

请注意,以下代码未经过测试,因为它是专门为回答您的查询而编写的:

void CheckMarketDeletePending()
{
   for( int i = OrdersTotal() - 1; i >= 0; i-- )
   {
      if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         if( ( OrderMagicNumber() == MyMagicNumber ) && ( OrderSymbol() == _Symbol ) )
         {
            if( ( OrderType() == OP_BUY ) || ( OrderType() == OP_SELL ) )
            {
               DeletePendingOrders();
               break;
            }
         }
      }
   }
}

void DeletePendingOrders()
{
   for( int i = OrdersTotal() - 1; i >= 0; i-- )
   {
      if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         if( ( OrderMagicNumber() == MyMagicNumber ) && ( OrderSymbol() == _Symbol ) )
         {
            if( ( OrderType() != OP_BUY ) && ( OrderType() != OP_SELL ) )
            {
               if( !OrderDelete( OrderTicket() ) )
               {
                  // Delete failed (need to deal with situation)
                  // Check Error Codes
               }
            }
         }
      }
   }
}
        
void CloseMarketOrders()
{
   for( int i = OrdersTotal() - 1; i >= 0; i-- )
   {
      if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         if( ( OrderMagicNumber() == MyMagicNumber ) && ( OrderSymbol() == _Symbol ) )
         {
            if( ( OrderType() == OP_BUY ) || ( OrderType() == OP_SELL ) )
            {
               if( !OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), MySlippagePoints ) )
               {
                  // Close failed (need to deal with situation)
                  // Check Error Codes
               }
            }
         }
      }
   }
}

void CloseDeleteAllOrders()
{
   for( int i = OrdersTotal() - 1; i >= 0; i-- )
   {
      if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         if( ( OrderMagicNumber() == MyMagicNumber ) && ( OrderSymbol() == _Symbol ) )
         {
            if( ( OrderType() == OP_BUY ) || ( OrderType() == OP_SELL ) )
            {
               if( !OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), MySlippagePoints ) )
               {
                  // Close failed (need to deal with situation)
                  // Check Error Codes
               }
            }
            else
            {
               if( !OrderDelete( OrderTicket() ) )
               {
                  // Delete failed (need to deal with situation)
                  // Check Error Codes
               }
            }
         }
      }
   }
}
携程
23
携程 2016.06.19 01:34:34  

非常感谢你。 这是比我期望的更详细的解释。 我感谢本教程!

-CTripp 

阿兰·韦莱恩(Alain Verleyen)
40967
阿兰·韦莱恩(Alain Verleyen) 2016.06.19 12:43:29  
FMIC:

为什么大多数用户坚持在EA中使用待处理河北体彩。 挂单适用于不能在屏幕24/5前面的人工执行的人工交易。

为什么呢

待处理河北体彩 如果使用得当,在EA中也很有用。在本主题的示例中,它是 也许 更容易监控价格和下达市价河北体彩,但这并不意味着您可以制定一个通用规则,即挂单属于手动交易,在EA中无用。

但是,对于可以在24/5时完全自动运行的EA,有 使用挂单绝对没有优势,事实上 disadvantages.

请说明缺点?

有一些优点 :

  • 在动荡的市场中,一个待处理的河北体彩位于服务器端,这可能意味着您的河北体彩将在尚未通知您的EA价格更改的情况下执行。
  • 例如,如果您想在打开市场河北体彩时放置网格,则编码起来会更容易,更清晰(并非总是如此)。
  • 限价单以请求价执行 或更好,您没有市场河北体彩的保证。
威廉·罗德
24124
威廉·罗德 2016.06.19 14:17:21  

同意 FMIC.

  1. 在有多个河北体彩的情况下(一个EA多个图表,多个EA,手动交易) you 必须 在位置循环中关闭/删除/修改时倒数。养成总是倒数的习惯。 循环和关闭或删除河北体彩-MQL4论坛
  2. 无需过滤 OrderSelect 循环 表示您的代码与每个EA不兼容(包括其他图表和手动交易中的代码)。 当将另一种货币添加到另一张单独的图表时,该符号不等于Ordersymbol。 -MQL4论坛
费尔南多·卡雷罗
5131
费尔南多·卡雷罗 2016.06.19 15:11:09  
航海家:

为什么呢

如果使用适当,挂单在EA中也很有用。在本主题的示例中,它是 也许 更容易监控价格和下达市价河北体彩,但这并不意味着您可以制定一个通用规则,即挂单属于手动交易,在EA中无用。

请说明缺点?

有一些优点 :

  • 在动荡的市场中,一个待处理的河北体彩位于服务器端,这可能意味着您的河北体彩将在尚未通知您的EA价格更改的情况下执行。
  • 例如,如果您想在打开市场河北体彩时放置网格,则编码起来会更容易,更清晰(并非总是如此)。
  • 限价单以请求价执行 或更好,您没有市场河北体彩的保证。
  • 在瞬息万变的市场中,待处理河北体彩被放置在服务器端, 表示您的河北体彩将在您的EA尚未收到通知的情况下执行 价格改变了。
我不同意!在动荡的市场中,价差会迅速扩大,当您真的不希望挂单发生时,可以触发挂单(并大幅滑落)。正常下 网络延迟 在有条件的情况下,使用市价单是一个更好的选择。

通常,用户根据BID(而不是ASK)设置触发价格,因为这是历史数据和指标中可用的价格。但是,某些待处理河北体彩(例如BUY_STOP)以ASK价格触发,因此必须用价差(尤其是短期交易)补偿开盘价,以正确匹配BID价格条件,而又不能正确预测下河北体彩时进行交易。在价格接近开盘价时尝试补偿它,这意味着EA必须不断发送定单修改以调整开盘价,从而导致经纪人不必要的交易和过多的日志文件混乱。在更糟的情况下,需要删除待处理河北体彩,并在情况改善时重新创建,这也会导致流量过大,但由于STOP-LEVEL和FREEZE-LEVEL条件甚至可能无法实现。

我认为,处理我刚刚描述的方案的最佳方法是三步过程,首先是在满足入场条件但没有任何止损的情况下下达市价单,然后考虑实际开盘价(到期日)。滑移),相应地设置止损和止盈(但必要时设置一定的安全偏移量)。然后在EA中设置真实的止损和止盈(通过在退出条件下手动关闭河北体彩),以补偿卖出河北体彩的ASK价格关闭,因为我们无法预测止损价格为如果该价格基于指标的BID价格或历史数据,则被触发。但是,如果不需要那种复杂度,则使用具有真正的止损和止盈的两步过程(无安全偏移)。
  • 例如,如果您想在打开市场河北体彩时放置网格,则编码起来会更容易,更清晰(并非总是如此)。
同样,我不同意!鉴于我在上一点中描述的复杂性,市场河北体彩本质上总是会提高代码效率,并且我认为,在正确编码的EA中,市场河北体彩将更加清晰。即使对于网格,您也可以轻松地做到这一点,并通过市场河北体彩更加有效地进行管理。我知道,因为我早在2012年就仅使用市场河北体彩对几种复杂的网格策略进行了编码,然后才意识到数学上基于网格对冲的策略注定会失败,并且再也不会编码。
  • 限价单以要求的价格或更高的价格执行,市场河北体彩没有这种保证。

不好意思这么说,但这绝对是不正确的!如果您监视挂单执行(在真实的真实账户上),您会发现它受到影响 正滑和负滑 就像市场河北体彩一样。但是,在策略测试器中,挂单总是以“完美”价格被错误触发,而这并不是真实的实时交易中发生的情况。这也是为什么如此多的挂单回测会给出这种“出色”结果,而只在真实的实时交易中被打破的众多原因之一。即使策略测试器中的市场河北体彩仍未遭受实际滑点,但它们确实比挂单更真实地描述了价格开盘。止损和止盈也以策略测试器中错误的“完美”价格触发,但是,如果EA代码能够在回测期间使用“虚拟”止损(同时仍在使用实时实际止损),则也将提供更现实的结果。

EA中挂单的真正优势只有一个,那就是在巨大的网络延迟甚至系统故障的情况下,即使EA无法正确通信,挂单仍将被触发。但是,这仅在长期或中期交易中可以接受。在短期交易中,尤其是在快速的时间框架和缩水时,根本不触发河北体彩实际上更安全,因为如果您确实遇到网络问题,您将无法及时监视和管理未结河北体彩。会导致损失。在这样的短期交易场景中,即使挂单已经关联了获利和止损,这将允许服务器在无需太多EA干预的情况下对其进行处理,但是在波动期间,滑单仍然会遭受滑点的影响。如果EA无法跟踪它,则无法获得补偿,在这种情况下,比后悔更安全。

请注意,我给出的所有以上观点和论点都是基于我多年来编写和使用的自己的EA的逻辑以及实际经验。一开始(早在2011年),我就编写了几个带有待定河北体彩的EA,并在它们“上线”时很快意识到了这些缺点。从那时起,我一直使用市场河北体彩进行编码,并且从不回避这个决定。

阿兰·韦莱恩(Alain Verleyen)
40967
阿兰·韦莱恩(Alain Verleyen) 2016.06.19 19:42:56  
FMIC:

我会尽一切可能让您安静。这不是关于不同意或同意,而是关于事实,而事实是没有理由说“挂单 在任何情况下都适用于手动交易。这似乎是一些编码人员习惯用黑白思维的习惯,但现实世界是灰色的。

祝一切顺利。

费尔南多·卡雷罗
5131
费尔南多·卡雷罗 2016.06.20 07:31:27  
航海家:

我会尽一切可能让您安静。这不是关于不同意或同意,而是关于事实,而事实是没有理由说在所有情况下和所有情况下“挂单都用于人工交易”。这里的一些编码人员似乎习惯用黑白思维,但现实世界只是灰色。

祝一切顺利。

每个人都可以自由地做,因为他们认为最适合自己的交易(手动或使用EA)。我们俩都是根据适合我们观点的事实发表意见。如果您关注该论坛并查看我的所有帖子,您将发现这是我第一次表达出对使用此功能的缺点的看法。 待处理河北体彩 一般在EA中。但是,我并不是唯一这样做的人。我知道,在这个论坛上至少还有一个人表达了类似的观点,但是我从未与他讨论过。

在这个论坛的外面,我认识到其他一些与我有相同观点的人,但是绝大多数编码人员都赞成在EA中使用挂单。即使我们是少数派,也不会自动将我们“品牌化”为不正确。世界上大多数人都在道路的右侧行驶,这就是“少数”与“多数”的一个例子。但是,考虑到大多数人口是“右撇子”(和“右眼”),最合适的选择是在道路的左侧行驶。但是,只有少数几个国家这样做(它们在少数国家中)。