文章 "在 MQL5 中创建做市商算法"

 

新文章 在 MQL5 中创建做市商算法已发布:

做市商是如何运作的?让我们探讨一下这个问题,创建一个初级的做市商算法。

很多人认为做市商根本不承担任何风险。然而,情况并非如此。做市商的主要风险是库存风险。这种风险在于头寸可能朝一个方向急剧变动,而无法关闭头寸并从价差中获利。例如,当疯狂的人群抛售某种资产时,做市商被迫买断全部供应。结果,价格变成负数,导致做市商蒙受损失。 

公司会试图通过使用特殊的价差居中公式和确定最佳买卖价格来避免这种风险。但这并非总能实现。即使价格不是最优的,做市商的工作也是为市场提供流动性,即使暂时亏损,他们也必须完成这项工作。

作者:Yevgeniy Koshtenko

 

尤金,谢谢你的文章!我在货币市场知识方面的许多空白几乎都被填补了。

还有一个细微差别:如果测试的货币对有后缀或前缀,您文章的一些读者 可能 无法策略测试器中启动 智能交易系统。他们应该考虑到这一点,并在 Expert Advisor 参数设置中加以说明。

不过如此--一切都是超级棒的!.....!

再见,弗拉基米尔。

 
MrBrooklin #:

尤金,感谢你的文章!我在货币市场知识方面的许多空白几乎都被填补上了。

还有一个细微差别:如果测试的货币对有后缀或前缀,您文章的一些读者 可能 无法策略测试器中启动 智能交易系统。他们应该考虑到这一点,并在 Expert Advisor 参数设置中加以说明。

否则,一切都将是超级棒的!..!

再见,弗拉基米尔。

非常感谢!我明天会在另一家经纪公司检查前缀。如有需要,我将进行补充)

 

尤金,昨天我没有仔细查看 "智能交易系统 "的代码,因为我对文章的文字部分更感兴趣,所以没有就黄色标注的代码部分提出问题:

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int CountOrders(string symb,ENUM_ORDER_TYPE type)
  {
   int count=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(OrderGetTicket(i)))
        {
         if(OrderGetInteger(ORDER_TYPE)==type && PositionGetString(POSITION_SYMBOL)==symb && PositionGetInteger(POSITION_MAGIC)==Magic)
            count++;
        }
     }
   return(count);
  }

我立即注意到了您的警告:以下是计算未结订单和未结头寸的 函数。CountOrders 和 CountTrades 用于计算某个符号的未结订单和头寸,同时考虑到神奇的 EA 数字。它们在代码中尚未实际使用,但将在未来版本中使用,届时我将最终编写一个正常函数,用于集中限价之间的价差....。

但我不太明白--这是您的想法还是应该有所不同?

弗拉基米尔

 
MrBrooklin 未结头寸的 函数。CountOrders 和 CountTrades 用于计算某个符号的未结订单和头寸,同时考虑到神奇的 EA 数字。它们在代码中还未实际使用,但将在未来版本中使用,届时我将最终编写一个正常函数,用于集中限价之间的价差....。

但我不太明白--这是您的想法还是应该有所不同?

弗拉基米尔

这是我的本意--否则,"智能交易系统 "就会开始将其 "魔术师 "的订单与其他订单混淆)Symb 打算在将来制作一个多货币版本的 "智能交易系统"。我还没有设法做到这一点)))))。

 
Yevgeniy Koshtenko #:

这是有意为之--因为否则 EA 可能会开始将其魔术师的订单与其他人的订单混淆)象征性地说它打算在将来制作一个多货币版本的 EA。但我还未能做到)))))。

订单的一切都很清楚,但为什么在此功能中要检查符号和魔术师的位置?))

再见,弗拉基米尔。

 

这是 MQ 的耻辱,而不是一篇文章。怎么能允许发表这样的文章?

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int CountTrades(string symb)
  {
   int count=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==symb && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            count++;
           }
        }
     }
   return(count);
  }

根据文档,PositionGetTicket(i)"该函数按未结 头寸列表中的索引返回头寸的票据,并自动选择该头寸以便进一步处理......"。如果一个仓位已被选中,为什么还要使用PositionSelectByTicket 函数通过其交易票据来选择该仓位?你们是在教新人如何不这样做吗?

弗拉基米尔的话很中肯。而您的回答与此完全无关......如果我们使用订单????,为什么还要检查符号和位置 魔法?

 

除了代码,我也不喜欢文本部分。

它是垃圾,不过是一纸空文。

这是一个有趣的话题,没有争议。

我们在创造什么样的市场,有什么意义?

无法创造是事实,因为作者缺乏矩阵。

而外面有很多这样的矩阵。

我们有必要至少再考虑......十年,也许我们会成功的。

作为一个开始和改进的方法--好吧,我支持这一点。

 

Renat Akhtyamov #:

我们在创造什么样的做市商,有什么意义?

事实上,这是不可能创造出来的,因为作者缺乏必要的矩阵

您不应该斜着看这篇文章,而应该从头到尾,即完整地看,这样就不会产生这样的问题了。

完全同意 阿列克谢-维克托罗夫的批评,即在没有使用PositionSelectByTicket() 函数情况下,已经选择了一张票。顺便说一句,我自己也没注意到这一点。

但还是要感谢这篇文章!

致敬,弗拉基米尔

 
MrBrooklin #:

篇文章 不应该斜着读,而应该从头到尾读,即完整地读,这样就不会出现这样的问题。

我完全同意 Alexey Viktorov 的批评,即在不使用 PositionSelectByTicket () 函数的情况下,已经选择了票据。顺便说一句,我自己也没有注意到这一点。

但还是要感谢这篇文章!

致敬,弗拉基米尔

不是选中一张票,而是选中一个位置,以便通过相应函数处理其属性。

 
Alexey Viktorov #:

不是选择一张机票,而是选择一个位置,以便通过相应的功能处理其属性。

嗨,阿列克谢,谢谢你的解释。))当我写这封信时,我依据的是相同的文档(用黄色标出):

Функция возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней 
при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.

ulong  PositionGetTicket(
   int  index      // 项目列表中的编号
   );

Параметры

index

[in]  Индекс позиции в списке открытых позиций, начиная с 0.

Возвращаемое значение

Тикет позиции. В случае неудачного выполнения возвращает 0.

敬上,弗拉基米尔。