文章 "轻松快捷开发 MetaTrader 程序的函数库(第 三十四部分):延后交易请求 - 在特定条件下删除和修改订单与持仓"

 

新文章 轻松快捷开发 MetaTrader 程序的函数库(第 三十四部分):延后交易请求 - 在特定条件下删除和修改订单与持仓已发布:

在本文中,我们将完成延后请求交易概念的论述,并创建删除挂单,以及在特定条件下修改挂单和持仓的功能。 由此,我们将拥有完整的功能,令我们能够开发简单的自定义策略,或者根据用户定义的条件激活 EA 行为逻辑。

编译 EA,并在测试器中以可视化模式启动它。 若要检验管单删除、以及挂单和持仓修改,请开立两笔空头仓位,并下一笔空头挂单,不要设置止损和止盈价位。 接下来,创建延后请求,按价格修改挂单和持仓的止价位。 等待激活延后请求,并设置指定的止价位,然后删除挂单和持仓。

然后开立两笔多头仓位,并下一笔多头挂单。 之后,创建删除挂单、和按时间平仓的延后请求。


正如我们所见,止价位设置在给定延后请求激活价位的交点处。 持仓在指定时间后平仓,订单被删除。

作者:Artyom Trishkin

 

下午好!

感谢您的系列文章,感谢您为 MQL4 提供的代码!

关于实际例子。

任务是

  1. 当出现特定市场条件 时,在同一方向开立几个仓位,以相同的收盘水平计算亏损,以不同的水平计算盈利。
  2. 当下面/上面出现类似情况时,在同一方向上再开几个仓位,同样以相同的平仓亏损水平和不同的盈利水平开仓 + 将未平仓仓位的亏损水平改为零。
  3. 在确定第一组头寸的累计规模时,应考虑到资产负债表中 2% 的损失。
  4. 在确定第二套头寸的累计规模时,应考虑到 2% 的资金损失。
  5. 预计不会使用挂单。

我的 MQL4 Expert Advisor 已经实现了寻找进入点的算法,但还没有进行任何交易操作。

请注意,问题 ))

第一个系列中的哪些库、类、方法可以帮助我加快开发速度?


Рынок - новости, аналитика, прогнозы по рынкам - Блоги трейдеров и аналитика финансовых рынков
Рынок - новости, аналитика, прогнозы по рынкам - Блоги трейдеров и аналитика финансовых рынков
  • www.mql5.com
Рынок — это место, где обычно происходит обмен товара на деньги или товара на товар. Если доступ на рынок свободный, то производители и потребители проводят обмен в условиях конкуренции. Существует
 
Nikolai Karetnikov:

下午好!

感谢您的系列文章,感谢您为 MQL4 提供的代码!

关于实际例子。

有一项任务、

  1. 当出现某些市场条件 时,在同一方向开几个仓位,平仓亏损水平相同,盈利水平不同。
  2. 当下面/上面出现类似情况时,再开几个同方向的仓位,同样以相同的平仓亏损水平和不同的盈利水平开仓 + 将未平仓仓位的亏损水平改为零。
  3. 在确定第一组头寸的累计规模时,应考虑到资产负债表中 2% 的损失。
  4. 在确定第二组头寸的累计规模时,应考虑到 2% 的资金损失。
  5. 不考虑挂单

我的 MQL4 Expert Advisor 已经实现了寻找进入点的算法,但还没有交易操作。

请注意,问题 ))

第一个系列中的哪些库、类、方法可以帮助我加快开发速度?


描述不完整。

1.我们在开仓时,会立即将神奇数字中的第一组标识符设置为相同。现在可以通过标识符 1 搜索整个第一组。

2.打开仓位,立即将其设置为魔术号码中相同的第二组标识符。现在可以用标识符 2 搜索整个第二组。
2.1 打开第二组头寸后,在列表中选择第一组的所有头寸,并将其止损水平修改为计算出的盈亏平衡水平。该水平应独立计算。第一组头寸列表可用 - 其累计盈亏很容易计算。

3. 此项是累计交易量吗?如果是,则在开第一组头寸之前计算。

4. 此项是总交易量吗?如果是,那么在建立第二组头寸之前计算一下。但资金将取决于第一组占用的保证金及其盈亏--自由资金的浮动盈亏。

5.5. 挂单请求只是方便用于设置开仓组的所有必要条件。提前计划,设定预期。我并不坚持--这是规划交易战术和技术的一种手段。

答案--所有这些都是在第一部分实现预期目标。我不明白的问题 - 没有尝试的东西。因此,我只能用文字来表达。

 

Artem,下午好

您的工作能力超乎想象,非常感谢。

我有一个想法:在大多数情况下,我的 MT4 测试终端都是以投资者模式连接到真实交易账户 的。

这样做的目的是最大限度地利用测试仪中的交易账户条件(掉期、佣金、止损位--任何在 TDS 中没有掉期的条件)。

但是,库会检测到账户中的交易是被禁止的,并拒绝交易。在测试器中。

也许应该明确放宽在测试器中工作的某些限制?

显然是这样:

//--- 检查该账户的交易权限(如果与交易服务器有连接的话)
   else if(!this.m_account.TradeAllowed() && !::MQLInfoInteger(MQL_TESTER))
     {
      //--- 将错误代码写入列表并返回 false - 没有必要进一步检查
      this.m_error_reason_flags=TRADE_REQUEST_ERR_FLAG_ERROR_IN_LIST;
      this.AddErrorCodeToList(MSG_LIB_TEXT_ACCOUNT_NOT_TRADE_ENABLED);
      return false;
     }

我已经添加了我的检查,但这可能不是唯一可以在测试器中忽略的检查。

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
, то позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out). В...
 
Igor Ryabchikov:

Artem,下午好

工作能力超乎想象,非常感谢

我有一个想法:在大多数情况下,我的 MT4 测试终端都是以投资者模式连接到真实交易账户 的。

这样做的目的是在测试仪中最大限度地利用交易账户的条件(掉期、佣金、止损位--任何在 TDS 中没有掉期的条件)。

但是,库会检测到账户交易是被禁止的,并拒绝交易。在测试器中

也许应该明确放宽在测试器中工作的某些限制?

显然是这样:

我已经添加了我的限制,但这可能不是在测试器中唯一可以忽略的限制?

谢谢,我会解决的。

 

你好@Artyom Trishkin,感谢您提供这段代码。

我尝试在 MT4 中运行修改后的版本,但没有测试按钮来监听账户/交易事件:

01:17:13.849 删除

01:17:13.733 取消登录原因 4

01:15:36.860 OnDoEasyEvent:位置关闭

01:15:36.860 - Position closed: 2020.08.20 23:45:29.000 -EURUSD Closed Sell #573015195 at price 1.18610, Profit -0.13 USD

01:15:35.489 CEventsCollection::CreateNewEvent, 768 行:此事件已在列表中

01:15:35.019 OnDoEasyEvent:位置已关闭

01:15:35.019 - Position closed: 2020.08.20 23:45:27.000 -EURUSD Closed Buy #573015193 at price 1.18623, Profit -0.13 USD

01:15:30.144 OnDoEasyEvent:开仓

01:15:30.144 - Position opened: 2020.08.20 23:45:29.000 -EURUSD Opened 0.01 Sell #573015195 [0.01 Market-order Sell #573015195] at price 1.18610

01:15:28.724 OnDoEasyEvent:开仓

01:15:28.724 - Position opened: 2020.08.20 23:45:28.000 -EURUSD Opened 0.01 Buy #573015194 [0.01 Market-order Buy #573015194] at price 1.18623

01:15:28.263 OnDoEasyEvent:开仓

01:15:28.257 - Position opened: 2020.08.20 23:45:27.000 -EURUSD Opened 0.01 Buy #573015193 [0.01 Market-order Buy #573015193] at price 1.18623

01:14:49.639 已初始化

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象结构

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象结构

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象结构

01:14:22.120 帐户 ****:**** (****) **** USD, 1:100, 对冲, 模拟账户MetaTrader 4

01:14:20.357 加载成功


我的测试代码可能出了什么问题?

 
Mohammad Bazrkar :

您好@Artyom Trishkin,感谢您提供的代码。

我试着在 MT4 中运行修改后的版本,但没有测试按钮来监听账户/交易事件:

01:17:13.849 删除

01:17:13.733 取消登录原因 4

01:15:36.860 OnDoEasyEvent:位置关闭

01:15:36.860 - Position closed: 2020.08.20 23:45:29.000 -EURUSD Closed Sell #573015195 at price 1.18610, Profit -0.13 USD

01:15:35.489 CEventsCollection::CreateNewEvent, 768 行:此事件已在列表中

01:15:35.019 OnDoEasyEvent:位置已关闭

01:15:35.019 - Position closed: 2020.08.20 23:45:27.000 -EURUSD Closed Buy #573015193 at price 1.18623, Profit -0.13 USD

01:15:30.144 OnDoEasyEvent:开仓

01:15:30.144 - Position opened: 2020.08.20 23:45:29.000 -EURUSD Opened 0.01 Sell #573015195 [0.01 Market-order Sell #573015195] at price 1.18610

01:15:28.724 OnDoEasyEvent:开仓

01:15:28.724 - Position opened: 2020.08.20 23:45:28.000 -EURUSD Opened 0.01 Buy #573015194 [0.01 Market-order Buy #573015194] at price 1.18623

01:15:28.263 OnDoEasyEvent:开仓

01:15:28.257 - Position opened: 2020.08.20 23:45:27.000 -EURUSD Opened 0.01 Buy #573015193 [0.01 Market-order Buy #573015193] at price 1.18623

01:14:49.639 已初始化

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象结构

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象结构

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象结构

01:14:22.120 帐户 ****:**** (****) **** USD, 1:100, 对冲, 模拟账户MetaTrader 4

01:14:20.357 载入成功


我的测试代码可能出了什么问题?

我不知道你改了什么...

 

我删掉了一些与按钮有关的代码,但仍有可能删除 一些必要的代码。我现在把它附上。

但是,您是否同意,没有捕捉到第二收盘买入位置的错误与我的更改无关?

附加的文件:
mhdbzr-34.mq4  46 kb
 
Mohammad Bazrkar :

我删掉了一些与按钮有关的代码,但仍有可能删除一些必要的代码。现在附上。

但是,您是否同意,没有捕捉到第二收盘买入位置的错误与我的更改无关?

测试顾问的工作没有错误吗?

 
Artyom Trishkin:

测试顾问的工作是否无误?

我运行修改后的 EA 来观察我的事件,然后手动进行一些交易并尽快平仓。
我不使用测试 EA 开仓/平仓。


这些 "账户 "错误出现在默认的 TestDoEasyPart34.ex4 中。

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象 结构

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象结构

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象结构

 
Mohammad Bazrkar:
我运行修改后的 EA 来观察我的事件,然后手动进行一些交易并尽快平仓。
我不使用测试 EA 开仓/平仓。


这些 "账户 "错误出现在默认的 TestDoEasyPart34.ex4 中。

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象 结构

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象结构

01:14:22.120 CAccount::Load:无法从 uchar 数组创建对象结构

会的。因为存储账户数据的方法已经改变。这已作为警告写在文章末尾:
-----
供您参考:
由于我们改变了账户对象的结构(改变了用于存储账户字符串属性的 uchar 数组的大小,并增加了一个整数属性),所有以前保存的账户对象文件将不再能正确加载。如果它们在 \Files\DoEasy\Accounts\ 目录下的终端公共文件夹中,那么在启动本测试顾问之前必须全部删除 - 当从一个账户切换到另一个账户时,它们将以新的对象结构大小重新创建。
-----