- 显示:
- 2149
- 等级:
- 已发布:
- 2014.02.05 09:36
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
初始组合数学函数库。
组合数学 是数学的一个分支, 是研究离散结构, 集合 (组合, 排列, 顺序排列 和 计数组合) 以及它们的关系 (例如, 偏序集)。组合数学与许多的 数学 领域有关联, 诸如 代数, 几何, 概率论 并在许多知识领域应用广泛 (例如在 遗传学, 计算机科学, 统计物理)。
1)第一函数:
//+------------------------------------------------------------------+ //| 数的阶乘 | //+------------------------------------------------------------------+ double factorial(int x);
阶乘是一个成长非常快速的函数。它的增长比任何多项式速度更快, 也比指数函数更快 (但比双指数函数慢)。
这就是为什么返回值必须是 double (双精度) 类型。这样做是因为阶乘增长过快, 已经是13!这已经不适合 long (长整数) 类型的范围。
2)第二函数:
//+------------------------------------------------------------------+ //| 组合 (组合) | //+------------------------------------------------------------------+ double combination(int N,int k);
组合可以从一些包含 N 元素的集合当中选出唯一的元素集合。每个集合将有 k 个元素。
假设有 10 个交易信号。并且对于交易系统, 仅使用其中 3 个。那么, 为了进一步分析, 将从 10 组信号集合中选择所有 可能集合 (3 信号)。
因此这样的集合的数量将是组合数量:
C(k,N) = C(3,10) = 120.
即, 有 120 唯一组合, 每组 3 个信号。
3)第三函数:
//+------------------------------------------------------------------+ //| 组合 (组合) 与重复 | //+------------------------------------------------------------------+ double _combination(int N,int k);
重复组合承认, 在某些集合中的元素可以出现一次以上。假设有五种水果。集合包括的 3 个元素有 2 个橙子和 1 个苹果。此集合是一个重复组合。橙子重复。
作为该组10 个信号集合和可能的集合 (3 信号), 我们发现了一些重复组合:
~C(k,N) = ~C(3,10) = 220.
4)第四函数:
//+------------------------------------------------------------------+ //| 顺序排列 | //+------------------------------------------------------------------+ double arrangement(int N,int k);
顺序排列与组合不同的一个事实在于, 整个集合不重要,重要的是集合中的元素顺序。假设有 2 个 3 元素的集合: 苹果-橙子-香蕉, 苹果-香蕉-橙子。在组合方面, 我们仅有一个组合 (一组参与者)。但以顺序排列看有 2 个组合 (参与者在集合中改变顺序)。
显然, 这里顺序排列比组合更多。例如, 从信号集合 (10 信号) 以及可能的集合 (3 信号), 我们可以得到更多的顺序排列:
A(k,N) = A(3,10) = 720.
5)第五函数:
//+------------------------------------------------------------------+ //| 重复顺序排列 | //+------------------------------------------------------------------+ double _arrangement(int N,int k);
即, 组合中的集合, 其中元素可以重复。
那么10 个信号集合和可能的集合 (3 信号), 我们可以得到许多重复的顺序排列:
~A(k,N) = ~A(3,10) = 1000.
6)第六函数:
//+------------------------------------------------------------------+ //| 排列 | //+------------------------------------------------------------------+ double permutation(int N);
排列可以知道有多少种改变集合中元素顺序的方法。
因此对于信号集合 (10 信号), 我们可以得到尽可能多的排列:
P(N) = P(10) = 3 628 800.
并且对于3 信号集合, 我们可以得到尽可能多的排列:
P(3) = 6.
排列数量 返回 阶乘。因此这是 3 和 10 元素排列的数量之间的差异。
7)第七函数:
//+------------------------------------------------------------------+ //| 重复排列 | //+------------------------------------------------------------------+ double _permutation(int &nM[]);
即, 组合中的集合, 其中元素可以重复。
Only 作为参数传递一个数组, 其中每个元素指示可以重复多少次。
例如, 这里有 3 个信号, 每个可重复一次, 则:
~P(N) = ~P({1,1,1}) = 6.
I.e. ~P({1,1,1}) = P(3).
假设第一信号可以重复 2 次, 则:
~P({2,1,1}) = 12.
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/1197