介绍
电子表格是一个相当古老的发明。此类现代程序具有强大的功能,可让您直观地分析以表格形式显示的数据。可以从不同的角度进行分析,而且分析速度非常快。它包括图形,汇总表,假设分析,条件单元格格式化等等。
我建议测试其中一些功能以分析自定义策略。
就我个人而言,我使用LibreOffice Calc是因为它是免费的,并且无论我在哪里工作都可以使用它:-)但是,相同的方法也适用于其他电子表格:Microsoft Excel,Google Sheets等。目前,它们都可以相互转换并具有相同的功能构造方程的原理。
因此,我假设您有某种电子表格程序。您还具有要分析的文本文件格式(* .txt或* .csv)的数据。本文简要介绍了如何导入此类文件。我将使用MetaTrader终端的历史记录,但是其他任何数据都可以,例如 杜高斯贝 要么 菲南。显然,您应该有一种配置信号的策略。这是在交易中应用商品主张所需要的全部。
我希望这篇文章对不同类别的交易者有用,所以我将尝试编写它,以便即使对于以前从未看过这种程序的人也可以理解。同时,即使一些经验丰富的交易员也不熟悉,它将涵盖一系列问题。
快速浏览表格 — for beginners
图1显示了一个典型的电子表格程序窗口。

图1。典型的电子表格程序窗口
任何表格都以“床单". 您可以将它们视为针对不同任务的单独“选项卡”。
每张纸都包含“细胞“。每个单元本质上都是一个很小但功能非常强大的计算器。
为了让程序了解我们现在要处理的单元格,每个单元格都具有坐标,例如在棋盘上或在战舰棋盘游戏中。这些坐标共同定义了一个唯一的单元格“地址该地址由列号或名称和行号组成(例如,图1显示了表光标突出显示的“ D19”单元格)。在突出显示的坐标名称和名称行中都可以看到该地址。
除坐标外,地址还可以包含工作表的名称,甚至可以包含表文件的名称。通常将相同的地址用作 名称 的细胞。但是,如果您愿意,可以设置自己的名称以明确说明此单元格或单元格范围存储的内容。您可以在名称行中查看(和更改)这些名称。
单元格可以包含简单数据(如引号或卷)或“公式”来计算其价值。
的contents of a highlighted cell can be seen (and changed) in the "equation line".
要编辑单元格值,请双击它或在公式行中进行更正。您还可以突出显示一个单元格,然后按 F2. 如果需要创建新文本,可以突出显示一个单元格并立即开始输入。但是,请记住,所有先前的数据都将从单元格中删除。
您可以按取消编辑而不保存编辑 ESC键 (键盘的左上角)。点击以确认编辑 输入 (光标向下移动)或 标签 (光标移到一边)。
如果突出显示了多个单元格, 输入 和 标签 仅在突出显示的片段中起作用。这可以用来加快工作速度。
至于其他按钮和菜单,我认为它们非常容易掌握。
入门:导入报价
让我们准备数据以测试策略。正如我所说,我将从终端中获取数据。为此,请按 Ctrl+S 在任何图表窗口中或选择 文件 -> 保存 在终端菜单中。终端提供通常的系统窗口以输入文件名和路径。
如果文件扩展名为* .csv,则通常一切正常。如果是* .txt, 那么在大多数情况下,您需要 右键点击 它并选择 “打开用” ->"Choose another app" 或先打开电子表格应用程序并从中打开文件,因为默认情况下系统倾向于使用记事本或其他文字处理器打开具有此扩展名的文件。
为了转换数字,请在转换窗口中选择适当的列。然后指示整数和小数部分的分隔符,并在必要时指示数字组的分隔符(对于体积)。在Excel中,这是使用“更多...”按钮完成的。在“计算”中,从“列类型”列表中选择“ English USA”。
还有另一个细微差别。成功导入后,在表中保留5至7千行是有意义的。事实是,数据越多,程序计算每个单元格的结果就越困难。同时,估计精度微不足道。例如,当比较5,000和100,000行数据的验证结果时,结果仅相差1%,而在后一种情况下的计算时间则显着增加。
一些使用表格的键盘快捷键
捷径
| 行动
|
Ctrl + 箭
| 去 最近的 连续数据行边框
|
标签 | 确认输入 然后去 对 cell
|
Shift + Tab
| 确认输入 然后去 剩下 cell
|
输入 | 确认输入 然后去牢房 下面
|
转移 + 输入
| 确认输入 然后去牢房 以上 |
Ctrl + D
| 填写 从上到下突出显示的列
|
转移 + Ctrl + 箭
| 突出 从当前位置 到连续范围的末端
|
如何用相同的方程式填充长列
对于小范围,可以使用图2所示的方法:将鼠标移至“选择标记”(表格光标右下角的正方形)。当鼠标光标变成细十字时,将此标记拖到所需的行或列。

图2。 拖动填充
但是,对于大量数据,这将是 高度 不方便。
因此,使用下面的任何方法。
方法1。限制范围
的sequence of actions is shown in Figure 3.

图3。通过限制范围填写
- 在范围的顶部单元格中输入所需的方程式,然后确认输入。
- 使用名称字段移动到范围的最底部单元格。
- 按 Ctrl + 转移 + 向上箭头 移至范围中最上方的单元格并选择所有中间单元格。
- 按 Ctrl + D 用数据填充单元格。
该方法的一个小缺点是您需要知道范围最低行的编号。
方法2。使用相邻的连续范围
的sequence of actions is shown in Figure 4.

图4。使用相邻范围填写
- 选择具有必要方程式的单元格。
- 按 转移 + 左箭头 选择一个相邻的单元格。
- 按 标签 将表格光标移动到左侧的单元格。在这里,我们使用表格光标仅在应用的选择范围内移动的能力。
- Ctrl + 转移 + 向下箭头 —选择两列到连续范围的最低行。
- 转移 + 对 arrow —取消选择左列。右边的保持选中状态。
- Ctrl + D —用数据填充列。
注意图中方程式行的内容。将包含链接的方程式复制到另一个单元格时,此链接会根据光标位置自动更改。因此,这样的链接称为“相对”。
如果您需要 链接 到细胞 保持不变 在复制过程中,选择链接并按 F4. $号出现在行号和列名的前面,并且在复制等式时该值不会更改。
有时,您可能想要 只有特定的列或行 保持完整,而不是整个链接。在这种情况下,离开 $符号 在里面 不变的部分 仅(您可以按 F4 一两次以上)。
现在,我们掌握了加速工作的基本方法之后,就该着手制定战略了。
战略
让我们使用在标准“示例\移动平均值” EA中实现的策略。
在以下情况下开仓:
- 没有职位和
- 的candle crosses the Moving Average with its body (Open —在МА的一侧,关闭 — on the other.)
在以下情况下平仓:
- 有一个空缺职位,
- 的candle crosses the MA in the opposite direction to the opening.
添加指标数据
使用电子表格进行计算的显着特征是,计算小计通常需要单独保存。这使得更容易理解方程式和检测错误,并且还简化了基于来自相邻像元的数据构建方程式的过程。此外,这种“碎片化”有时会引起新的想法。
但是,让我们回到我们的任务。
导入并进行一些格式化之后,我的原始引号如下所示(图5):

图5。原始报价
注意整个表的名称和列名称之间的空白行。该行允许电子表格处理器将这两个块视为单独的表,因此我可以合并顶部范围的单元格,但仍对底部范围使用不同的过滤器-并且它们不会互相干扰。拆除管线可能会导致问题。
我已经修复了前几行和几列,以隐藏当前不需要的信息,但是所有数据仍然存在于表中(有关如何执行此操作,请参阅电子表格处理器的帮助)。
时间和日期在列中 A,开盘价在栏中 B,等等。表格的最后一行已编号 6038.
制定策略的第一步是建立指标。为了使指标可自定义,让我们添加另一个工作表并在那里创建变量表。我们将使用名称行为每个变量分配一个适当的名称,以便在准备方程式时清楚地知道在什么地方取什么。

图6。 Variable sheet
现在,让我们回到数据表。首先,将引号索引写入列表中的 G 专栏略微简化了最终方程式。它等于行索引减去3:
=ROW()-3
在方程式中 G4 单元格,将其扩展到所有较低的单元格,以使MA计算方程式保持通用。如果MA(偏移量+期间)超过了现有数据,那么平均计算就变得毫无意义。
的SMA calculation equation itself is written in Н4 主要数据表的外观,如下所示:
=如果( G4>(MovingPeriod+MovingShift), AVERAGE( INDIRECT( "E" & ( ROW()-MovingShift-MovingPeriod) & ":" & "E" & ( ROW()-MovingShift) ) ), "" )
输入需要链接到其他单元格的方程式时,可以用鼠标指定单元格。
的current equation starts from calling the 如果() 功能。您可能会猜到,这是条件检查功能。所有布尔表达式,例如 和, 要么 , 不,也可以用作以后需要的功能。
调用函数时,参数在括号中指定,并用逗号(如本例)或分号分隔。
的如果 函数接受三个参数: 健康)状况, 条件为真时的值 和 条件为假时的值.
在这种情况下,我用它来检查是否有足够的数据来计算MA曲线的完整点。如果没有足够的数据,只需 保存一个空字符串。除此以外, 计算平均值 值在一定范围内。
的间接 功能 返回由设置的范围内的值(或多个值) 文字字串。这正是我所需要的,因为应该基于输入值形成用于计算平均值的所需范围的地址。
的&电子表格程序中的符号表示两行的串联。因此,我已经“合并”了来自的地址 几个部分。第一部分是收盘价(“Е”)所在的列名称,第二部分是根据当前行数减去平均长度并减去偏移量计算得出的“远程”地址。该表达式的第三部分是冒号,指示范围的连续性。紧随其后的是列名和行名,考虑了移位。我决定不要过分强调它们。我希望,&符可以帮助您解决。
的equation should be extended to all the rows below.
结果,我们得到这样的东西:

图7。加上МА计算后的表格
我们可以看到, Н 列开始仅出现在行中 22 (第19个条目)。其原因在 图6.
现在我们有了初始数据以及指标数据。现在是实施该战略的时候了。
实施策略
我们将以简单的信号形式实施该策略。如果МА向下交叉,则单元格将接收值“ -1”,否则 —“ 1”。如果目前没有交集,则该单元格包含空字符串值。
移动到单元格 I4。单元格的基本公式如下所示:
=如果( AND( B4>H4,E4<H4 ),-1 , 如果( AND( B4<H4,E4>H4 ), 1 , "") )
您可以在图表上检查它,它可以工作。但这是一个简单的逆方程。它不允许跟踪交易状态。您可以对其进行试验并获得有趣的结果,但是我们现在的任务是实施该策略 开头描述 的文章。因此,我们需要在每个小节(每行)上记录交易状态。
J 专栏对此非常适合。中的等式 J4 单元格如下所示:
=如果(AND(I4=-1,J3=""), -1 ,如果(AND(I4=1,J3=""), 1 ,如果(OR(AND(I4="",J3=1),AND(I4="",J3=-1),I4=J3), J3 ,"")))
如果发生事件(交叉路口),请检查先前交易的状态。如果交易是开放的,并且交叉点发生在相反的方向,请将其关闭。如果交易完成,则将其打开。在所有其他情况下,只需保存状态即可。
让我们介绍另一个带有信号的专栏,以便清楚地了解如果在我们的数据所对应的时期内实施了该策略,我们将在何处买卖,以及为了便于分析该策略。
信号名称可以从帮助中获取,该帮助可以在变量表上创建。

图8。添加交易名称帮助后的变量表
注意名称行:在这里我将名称设置为 整个 选择范围,而不是单个单元格。
现在我们可以在 К4 主表的单元格(带有数据):
=如果(AND(J3=1,J2=""),INDEX(DealTypes,1),如果(AND(J3=-1,J2=""),INDEX(DealTypes,2),如果(OR(AND(J3="",J2=1),AND(J3="",J2=-1)),INDEX(DealTypes,3),"")))
的deal is opened 后 下一根蜡烛打开时发出信号。因此,请注意该方程式中指标的移动。
如果没有交易(状态列中的前一个单元为空)并且信号已到达,请指定应进行的交易类型。如果交易已经开始,则根据信号关闭交易。
的指数 函数接受要执行搜索的范围作为第一个参数。在我们的情况下,它是由名称设置的。第二个参数是行的索引 在范围内。如果范围由几列组成,请设置必要的列。如果指定了多个范围,并用分号分隔,则还应设置范围索引,从1开始(分别是第三个和第四个参数)。
结果,在将该方程式扩展到下面的所有单元格并应用条件格式设置后(为了更具视觉吸引力,因为在分析过程中不需要格式化),我们将获得大约以下内容:

图9。交易信号
分析策略
为了分析策略的获利能力,我需要计算交易期间价格行进的距离。最简单的方法是分几个阶段。
首先,选择交易价格。如果已开始交易,请在信号旁边的栏中设置价格(L),然后将其复制到每个后续单元格中,直到达成交易为止。如果没有交易,则将空行写入单元格。中的等式 L4 cell:
=如果(K4=INDEX(DealTypes;1);B4+Spread;如果(K4=INDEX(DealTypes;2); B4 ;如果(OR(K4=INDEX(DealTypes;3);N(L3)=0); "" ;L3)))
如果信号单元(К4)具有“买入”字样,交易开盘价等于蜡烛开盘价加点差。如果单词是“卖出”,则简单地写出蜡烛开盘价,如果是“关闭”(或者前一列单元格不包含数字) —一个空字符串,并且如果同一列的前一个单元格是数字,而signal列中没有单词,则只需复制前一个单元格。

图10。交易开盘价
因此,我们将能够轻松计算交易完成时的交易利润。
确保扩展下面的公式。
我们可以立即计算相邻列中的开盘价和收盘价之间的差。但是,相反,我们将做一些更棘手的事情。我们将计算出 N 列,以便仅可以排序唯一数据并随后计算其频率。
在当前最简单的评估案例中,由于我的目的是评估策略效率,因此我将不使用任何资金管理。因此,以点为单位计算价格差就足够了。例如:
=如果(K4=INDEX(DealTypes;3);如果(I3=-1;ROUND((B4-L3)/Point);ROUND((L3-B4)/Point)); "" )
显然,我们无需检查平均条件,而只需乘以(B3-L3)*I3 ,但对于初学者而言,在视觉上不太清楚。
现在是时候提到上述技巧了。在 М 柱, 编号所有唯一条目 关于交易范围,使非唯一交易没有数字。
=如果(N4<>"";如果(COUNTIF(N$3:N4;N4)=1;MAX(M3:M$4)+1;"");"")
的external condition is quite clear: if the right cell (N4)不是空的,请检查它是否唯一,并在必要时对其编号,否则请留空字符串。
但是编号如何工作?
的计数if 如果单元格值与第二个参数中指定的条件相对应,则函数对指定范围内的数字量进行计数。假设方程是针对 M71 细胞。的 N71 单元格包含数字531(请参见图11)。这个数字从未见过。
如果在条件单元格中未指示动作符号,则假定我们要检查两个值的相等性。该数字等于其自身(N71=N71), 因此,让我们尝试计算。计算始终从 N$3 单元格(注意三个数字前的美元符号),直到当前单元格(方程式中没有美元符号)。查看整个 N$3:N71 范围,并尝试计算此范围内的531个数字的总数。由于以前没有这样的数字,所以总数为1(正好是现在找到的数字)。这表示满足条件:函数结果为1。因此,我们采用以下范围:等式位于从第一个具有数字(M$4),直到当前单元格(M70)。如果之前有任何数字,则取其中最大的数字并加1。如果不是,则最大的为0,因此第一个序列号已准备好!

图11。编号。影响细胞(范围终点)

图12。编号(范围起点)
在图11中,我尝试使用内置的分析工具来显示影响给定单元的单元。带有箭头的点表示范围或“精确”单元格的开始,而矩形表示范围。为了清楚起见,我附上了图12,以表明箭头是连续的,并且准确地从
N$3,并显示进行比较的范围的起点。
此外,我将再添加两列值:结果类型和处理“模块”。
对于结果类型,我使用数字:买入交易-1,卖出交易-2。在这种情况下,结果可以是正数或负数,具体取决于我们是否因交易结果而获利或亏损。这将使最终分析方程式更短。
这是写入的等式
О4 细胞:
=如果(AND(N(N4)>0;I3=-1); 1 ;如果(AND(N(N4)<0;I3=-1); -1 ;如果(AND(N(N4)>0;I3=1); 2 ;如果(AND(N(N4)<0;I3=1); -2 ;""))))
“模块”就是不考虑符号的盈亏金额。这是对直到交易结束信号到达之前价格在一个方向上走了多远的描述。这可以帮助您选择止损并获利(即使原始策略不需要)。
的"module" equation is quite primitive and set in
P4:
=如果(N4<>"";ABS(N4);"")
为了建立频率图(概率图),最好将交易结果数据按升序排列。由于原始数据是按时间排序的,因此不能将它们复制到另一张纸上。
鉴于每个唯一的利润结果都有自己的唯一编号(М 列),至少有两种方法可以将未排序的数据复制到新工作表中。
其中一项是使用标准过滤器,简单地选择“非空”单元格 М 列,然后从 N 列,然后使用特殊粘贴(仅值)将其粘贴到另一张纸上。
第二种方法是使用方程式。它的优点是,当原始数据(相同的变量或其他变量,如果您决定使用其他测试范围)更改时,数据本身也会更改。缺点是可能仍然无法分类。您仍然必须使用“复制/粘贴”对其进行排序。
当将已排序和未排序的数据放在同一张纸上时,对我来说更方便,因为复制数据所需的操作更少。因此,我将显示一个选项,其中使用等式复制未排序的数据,然后手动再次将其复制以进行排序。
关于新 利润数据 工作表中,在 А2:
=VLOOKUP( ROW(1:1);'GBPUSDH1-Metaquotes-demo'。$M$3:$N$6038; 2 )
的行(1:1) 函数返回第一行的编号。当向下填充单元格时,行号会更改,因此,将显示第二,第三行等的编号。
Vlookup looks for 一些价值 (第一个参数) 范围 (第二个参数),然后返回位于同一检测到的行中的值,尽管 在第三个参数指定的列中 (在我们的示例中,这是指定范围的第2列)。换句话说,所有编号(唯一)的数值都是从 N 以1开头的列。
在使用标准过滤器定义了主表上的最后一个数字之后,您可以使用 范围限制方法.
的following actions are shown in the Figure 13 animation.

图13。复制数据进行排序
现在我们需要描述获利和不获利交易的频率,即建立概率系列。
在 D2 同一张纸的单元格(利润数据),我们可以写出以下等式:
=COUNTIF('GBPUSDH1-Metaquotes-demo'。$N$4:$N$6038;C2)/COUNT('GBPUSDH1-Metaquotes-demo'。$N$4:'GBPUSDH1-Metaquotes-demo'。$N$6038)
它描述每个利润值的频率(或概率)。
的计数 函数计算间隔中的数值数量, 计数if 如果相同 健康)状况 满足(在这种情况下,只有其值等于 C 计算列单元格)。
通常建议进行间隔变化系列。从理论上讲,可以说交易数量可能很大。
的size of the interval is recommended to be calculated using the equation:
=(MAX($'利润数据'。C2:$'利润数据'。C214)-MIN($'利润数据'。C2:$'利润数据'。C214))/(1+3,222*LOG10(COUNT('GBPUSDH1-Metaquotes-demo'。$N$4:'GBPUSDH1-Metaquotes-demo'。$N$6038)))
我把这个等式放在'变数'。E7 单元格并将其命名为“间隔”。间隔过大。我不清楚总体上概率是如何分布的,所以我将其除以4。最终数 — 344 -事实证明对于我的目的而言更可接受。
在里面 '利润数据在工作表中,我将排序列表中的第一个数字复制到了 F2:
=C2
所有其他单元格均填充有以下公式:
=F2+Interval
的cells were filled in till the last value exceeded the maximum deal value.
G2 单元格包含以下公式:
=COUNTIFS('GBPUSDH1-Metaquotes-demo'。$N$4:$N$6038;">="&F2;'GBPUSDH1-Metaquotes-demo'。$N$4:$N$6038;"<"&F3)/COUNT('GBPUSDH1-Metaquotes-demo'。$N$4:$N$6038)
国家 (与 计数if)允许接受多个条件,并将其与“ AND”运算符结合在一起。其余部分相同。
当构建这两个系列时,我们立即希望看到它们的图形表示。幸运的是,任何电子表格处理器都可以实现这一目标。

图14。 “立即”概率分布图

图15。完成交易概率的区间分布图
图14展示了概率密度的负向偏移。图15显示了从-942到2154的清晰可见的峰值以及在8944处的峰值(一个交易)。
我相信,分析表不会造成任何特定的困难(考虑已分析的所有内容)。

图16。一些统计计算
的only new thing here is using the 总和 该函数接受两个间隔作为参数,并返回这些间隔成员的乘积之和(例如,第一行到第一行,第二行到第二行,依此类推)。我使用此函数来计算预期收益。我决定不应用任何更复杂的集成方法。
的expected payoff is significantly less than the obtained profit and fluctuates around 0 in percentage terms.
因此,该策略有效,但可能会有很大的亏损。它可能会在非常强劲的趋势下完美运行(如果不是那么孤单,则飙升9000点似乎很有趣),但是,该公寓很可能会付出巨大的代价。通过引入挂单(例如获利(约420-500点))或一些趋势过滤器,需要对策略进行认真的修改。改进需要进一步的研究。
在测试器中运行策略

图17。 “示例\移动平均值” EA测试结果
老实说,EA的结果令我感到惊讶。它可能在表建议关闭的情况下打开交易,反之亦然,因为它的决定可能基于或多或少的数据(例如,在我的表中,25.11.2019从19:00开始,给EA任务从一天的开始就开始)。
一些交易看起来如下,这让我感到惊讶。

图18。我对算法的理解会错吗?还是测试仪有问题?
最有可能的是,我只是搜索得不够好而未能在算法中找到这种行为的原因。
第二个奇怪的事实是,EA交易比我的桌子建议的多20笔交易。但是尽管如此,结果还是很接近我的,看起来似乎很奇怪。
测试仪中的EA
| 表 |
预期收益 — +0.07 (几乎为0)
| 预期收益 — -0.76 — +0.41 (在0左右波动)
|
有利可图的交易 — 26.52%/ 73.48%
| 有利可图的交易 — 29.22%/ 70.78% (考虑到交易数量的8%的差异,此处的3%的差异可以忽略不计)
|
测试人员的获利曲线图与使用该表得出的曲线图非常相似:在0附近波动,相差约±500点,2月份出现峰值:

图19。表获利图

图20。测试员盈利图
桌子的准备和大量的修补工作大约花费了半个小时。为了开发EA,我决定使用现成的EA。大概花了10分钟才能粗略地找出算法。但是,无需编写 新 了解我的EA可能不会使用它...仅当我意识到该策略值得时,开发EA才是合理的。此外,我目前更喜欢手动交易:-)
结论
我相信,电子表格是测试和制定策略的非常好的工具,特别是对于那些没有编程技能的人,以及那些愿意快速创建原型并将其转换为MQL的人而言。
当然,电子表格处理器公式有时类似于程序代码,并且在那里的格式不太清晰。
但是,电子表格的清晰度,能够立即测试新想法,突出显示影响单元格,任何形式的图表等的能力使电子表格成为必不可少的工具。
如果您将交易日志保存在表中或能够将其导入,则使用电子表格处理器可以使您轻松地改善策略并检测交易中的错误。