算法、解决方法、其性能的比较

 

在这个主题中,我们将讨论解决这些或那些问题的不同方法,并比较提出的解决方案的性能。

欢迎大家来讨论问题和解决问题的方法;)

 

我提议解决一个问题。

  1. 编写一个函数,在每次调用时,接受并写入 一些伪随机数,这将是一个有条件的"蜜糖劫"。

2.编写第二个函数,调用第一个函数的伪 随机 次数,并将(生成的)条件 "medjic "传递给它。

3.编写第三个函数,通过用户传递的"交易"号码(任何序号)返回"medjic"号码。


要求。

  1. 写入 "medjic "的内存消耗应尽可能接近 "medjic "的数量,而这些数量事先是未知的
  2. 职能部门应快速工作。

//--------------------------------------------------------

我认为正在讨论的图书馆有解决这个问题的工具。


所有这三个函数都是模拟EA订单的工作,这些订单的数量是事先不知道的。因此,这项任务符合我们的主题。

 
Реter Konow:

我提议解决一个问题。

  1. 写一个函数,在每次调用时接受并写入 一些伪随机数,这将是一个有条件的"medjic"。

2.编写第二个函数,调用第一个函数的伪 随机 次数,并传递给它一个(生成的)条件 "medjic"。

3.编写第三个函数,它将通过"交易"(任何序列号)的数量返回"medjik"的数量,这是由用户转让的。

要求。

  1. 写入 "medgies "的内存消耗应尽可能接近 "medgies "的数量,而 "medgies "的数量是事先不知道的
  2. 这些功能必须快速工作。

我认为有关的图书馆有工具来解决这个问题。

所有这三个功能都是模仿专家顾问订单的工作,其数量是事先不知道的。因此,这个问题符合我们的主题。

Piotr,我相信任何功能都必须有一些好处。我不太明白这三种功能中的任何一种有什么好处?

 
Victor Ziborov:

彼得,我认为每个功能都必须有一定的好处。我不太清楚这三种功能有什么积极作用?

这是https://www.mql5.com/ru/forum/221917 的一个分支。

在这里,我们正在测试图书馆提出的解决方案在实践中的有效性。

在该主题中,有人提出,将medjic命令写成字符串,然后将其放入数组的解决方案是低效的。

新的Generic库也有解决这个问题的方法。

有意思的是,确认或反驳了向字符串写入是一种无效的解决方案的说法。

我认为这将是有用的,也是有趣的,看看实践会显示什么。


所有想要的人,都可以在图书馆工具包的帮助下尝试解决这个任务。

我将尝试用我自己的方式来解决这项任务。

然后我们将比较性能。

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2017.12.07
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 

Reg Konow,如果你要组织什么,请在一个体面的层面上进行,而不是自发地和从.....stand。

条款应明确、不含糊,并有具体的例子....。
以下是仔细阅读整个第一段后产生的问题清单。

  1. Написать функцию, которая на каждом обращении будет принимать и записывать некоторое псевдо-случайное число, которое будет условным "меджиком".

1)为什么将没有意义的文字加粗?
2) 取一个指针是对一个函数的 "调用",还是还不是?该函数被调用。
3)"写数字 "一词通常是在处理文件时使用的。这是一个不准确的说法,指的是在内存中处理数据,还是在程序运行之间仍然需要保存数据?
4)如果你愿意,伪随机数可以是负数,但魔术不是。那么我们有什么:魔法还是一定范围内的伪随机?哪一个?

 
Sergey Dzyublik:

Reg Konow,如果你要组织什么,请在一个体面的层面上进行,而不是自发地和从.....stand。

条款应明确、不含糊,并有具体的例子....
以下是仔细阅读整个第一段后产生的问题清单。

1)为什么将没有意义的文字加粗?
2) 取一个指针是对一个函数的 "调用",还是还不是?该函数被调用。
3)"写数字 "一词通常是在处理文件时使用的。这是一个不准确的说法,指的是在内存中处理数据,还是在程序运行之间仍然需要保存数据?
4)如果你愿意,伪随机数可以是负数,但魔术不是。那么我们有什么:魔法还是一定范围内的伪随机?哪一个?

主要任务。

通过交易号码实现对特定魔术师的快速访问

有必要将魔术师写进 "字典",并通过交易号码访问他们。

订单的数量事先是不知道的,因此字典的大小是未知的。

然而,访问必须是快速的,而且分配的内存量必须是可接受的。

我建议的任务旨在模仿一个EA的工作,该EA下订单,然后通过交易号码获得他们的法师,与他们进一步合作。

你可以用你喜欢的方式来解决问题。

一个魔术师的具体数字并不重要。它可以是任何数字。这只是一个模拟。


已添加。

纠正了上面的"通过交易号实现对特定魔法的快速访问"。 " .

 

如果我们加上三个神奇的数字。10, 11, 12
那么他们的交易号码是什么?0, 1, 2?

 
Sergey Dzyublik:

如果我们加上三个神奇的数字。10, 11, 12
那么他们的交易号码是什么?0, 1, 2?

在另一个主题中,有识之士说,不可能做出一个有效的解决方案,把魔术师写到绳子上,并从绳子上迅速 "飞 "出来。

然而,在我看来,如果未来的认股权证数量未知,那么唯一好的解决办法就是把魔术师写到弦上。

我认为速度上不会有损失。

这里有一个实际的证明。

//+------------------------------------------------------------------+
//|                                                        Magic.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
string All_magics;
int    order_number;
int    Random_orders_of_strategy;
//+------------------------------------------------------------------+
void Save_magic(int magic)
{
 order_number++;
 //---------------------------------
 //Записываем каждый магик вместе с порядковым номером ордера.
 //---------------------------------
 All_magics +=  "_" + (string)order_number + "_" + (string)magic;
 //---------------------------------
}
//+------------------------------------------------------------------+
void Trading()
{
 Random_orders_of_strategy = MathRand();
 
 //----------------------------------------
 //Имитируем открытие неопределенного количества ордеров стратегии.
 //----------------------------------------
 for(int a1 =  0; a1 < Random_orders_of_strategy; a1++)
   {
    int this_magic = MathRand();
    //----------------------------
    Save_magic(this_magic);
    //----------------------------
   }
 //----------------------------------------
}
//+------------------------------------------------------------------+
int Get_magic(int deal_number)
{
 //--------------------------------------------
 //Получаем начало строки магика.
 //--------------------------------------------
 int Magic_position_start =  StringFind(All_magics,"_" + (string)deal_number + "_",0) + 3;
 //--------------------------------------------
 //Получаем конец строки магика.
 //--------------------------------------------
 int Magic_position_end   =  StringFind(All_magics,"_" + (string)(deal_number + 1) + "_",0);
 //--------------------------------------------
 //Получаем количество цифр из которых состоит магик.
 //--------------------------------------------
 int Magic_lenght         =  Magic_position_end - Magic_position_start;
 //--------------------------------------------
 //Извлекаем магик из общей строки.
 //--------------------------------------------
 string Magic             =  StringSubstr(All_magics,Magic_position_start,Magic_lenght);
 //--------------------------------------------
 //Возвращаем цифровое значение магика.
 //--------------------------------------------
 return((int)Magic);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Trading();
   //--------------------------
   ulong t1 = GetMicrosecondCount();
   Get_magic(1);
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   Print("Время исполнения функции Get_magic() при количестве ордеров ",Random_orders_of_strategy," равно ",t2 - t1);
   //--------------------------
   Print("Random_orders_of_strategy  ",Random_orders_of_strategy);
   Print("magic 1:  ",Get_magic(1),"  magic 2: ",Get_magic(2),"  magic 3: ",Get_magic(3));
   
  }
//+------------------------------------------------------------------+


也许有人会发现我的解决方案是有用的......

(该代码在15 微秒 内从24,000多个魔法指令中找到正确的魔法!)

(而且,没有浪费一个字节的额外内存)。

如果有人能使它更快,请。
 
Sergey Dzyublik:

如果我们加上三个神奇的数字。10, 11, 12
那么他们的交易号码是什么?0, 1, 2?

不,交易号码必须以1开头。
 

这是一个有趣的问题,关于这个问题。

例如,有一个多货币的EA,其中下一手订单是基于在不同货币对上已经开出的订单结果。


开启订单的条件 - 如果有开启信号,总手数不超过0.1,总缩水不超过存款的101%。

选项一:将所有数据填入数组,并在下一个订单被请求时取回(我们不能在每个tick都开新的订单)。


第二版--每次我们发出打开下一个订单的请求时,我们应该检查所有交易在当前时间 的所有可用数据



哪种解决方案会更快,成本更低?

 

遗憾的是 )