文章 "轻松快捷开发 MetaTrader 程序的函数库(第 二十四部分):基准交易类 - 无效参数自动纠正"

 

新文章 轻松快捷开发 MetaTrader 程序的函数库(第 二十四部分):基准交易类 - 无效参数自动纠正已发布:

在本文中,我们关注无效交易订单参数的处理程序,并改进交易事件类。 现今,所有交易事件(单个和在一次即时报价内同时发生的)均将在程序中正确定义。

通常,EA 应当能够根据形势采取行动,同时遵循用户定义的交易订单出错的处理逻辑。 因此,当检测到交易订单错误时,我们可以向 EA 提供以下指令:

  1. 干脆地退出交易方法,即由用户自行创建出错订单内无效参数的处理程序。
  2. 如果交易订单的无效值可被修复,则立即行动,并将其发送到服务器,
  3. 如果形势和错误相对应,则暂停片刻之后重发交易请求,或简单地重发相同参数的请求。

处理交易订单参数中的错误可能会导致以下几种结果之一:

  • 在用户消除错误源之前,无法使用 EA 继续交易。
  • 无法发送交易订单 — 退出交易方法。
  • 纠正无效值,并发送修复后的交易订单。
  • 立即发送初始参数的交易订单(此处假设交易条件已经改善)。
  • 等待,更新报价数据,并发送初始参数的交易订单。

在本文中,我们将开发交易订单出错处理程序,该程序将检查错误及其来源,并返回错误处理方法:

  • 禁止交易操作,
  • 中断交易操作,
  • 纠正无效参数,
  • 发送初始参数的交易请求,
  • 等待后重发交易请求(临时方案),
  • 创建延后交易请求(在后续文章中)

作者:Artyom Trishkin

 
请问老师,如何获取亏损单的相关信息?如亏损额、单号、下单量、开仓时间等。谢谢!
 
hsyhsy863 :
请问老师,如何获取亏损单的相关信息?如亏损额、单号、下单量、开仓时间等。谢谢!
Here you can ask your questions.
 
Artyom Trishkin:
Here you can ask your questions.
我的问题是利用你的程序设计自动交易程序时需要平亏损单,如何获取亏损单的单号?
 
hsyhsy863 :
我的问题是利用你的程序设计自动交易程序时需要平亏损单,如何获取亏损单的单号?

In the adviser:

//--- Get a list of all open positions
   CArrayObj* list=engine.GetListMarketPosition();
//--- Sort the list by profit, taking into the commission and swap
   list.Sort(SORT_BY_ORDER_PROFIT_FULL);
//--- Get the index of the position with the lowest profit (largest loss)
   int index=CSelect::FindOrderMin(list,ORDER_PROP_PROFIT_FULL);
   if(index>WRONG_VALUE)
     {
      //--- Get the position object with the largest loss and close the position by ticket
      COrder* position=list.At(index);
      if(position!=NULL)
         engine.ClosePosition(position.Ticket());
     }

The library should be connected in accordance with the expert example attached to this article.

 
Artyom Trishkin:

In the adviser:

The library should be connected in accordance with the expert example attached to this article.

谢谢!
 
你好,我在设计自动交易时发现:同时OP_BUYSTOP与OP_SELLSTOP时,只有OP_SELLSTOP挂上单而OP_BUYSTOP没有挂上,这是为什么?声明完全符合挂单条件但就挂不了单。
 
hsyhsy863 :
你好,我在设计自动交易时发现:同时OP_BUYSTOP与OP_SELLSTOP时,只有OP_SELLSTOP挂上单而OP_BUYSTOP没有挂上,这是为什么?声明完全符合挂单条件但就挂不了单。
Provide an example to reproduce this error.
 
Artyom Trishkin:
Provide an example to reproduce this error.
if(datetimeN5!=iTime(NULL,0,0))
{
if(ASWER(平仓,"上挂买数")==0) 
  {
   挂买(0.382,平仓);
   datetimeN5 = iTime(NULL, 0, 0);
   }}
if(datetimeN6!=iTime(NULL,0,0))
{
if(ASWER(平仓,"下挂卖数")==0) 
  {
   挂卖(0.382,平仓);
   datetimeN6 = iTime(NULL, 0, 0);

   }}

这是我挂买与挂卖的源码,按道理应该同时有两个挂单,但实际只有挂卖的单。

 
对不起,问题已解决,是我的失误!!!
 
hsyhsy863:
对不起,问题已解决,是我的失误!!!
OK