跳转至

在 cTrader 中处理文件

在本文及其对应的视频中,我们将解释如何在 cTrader 中处理文件。 通常,用户担心启动请求完全访问权限的 cBot 或指标。 特别是当没有源代码可用时,很难知道算法在使用这些权限做什么。 幸运的是,cTrader 提供了几种方法,允许算法访问本地机器上的文件,而无需提升权限。

写入算法目录

cTrader 允许所有算法访问具有以下地址的文件夹:

C:/Users/{username}/Documents/cAlgo/Data/{algoType}

,其中 algoTypecBotsIndicators

我们将创建一个示例 cBot 并演示如何以编程方式访问此目录。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System.IO;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class FileBot : Robot
    {

        protected override void OnStart()
        {
            File.WriteAllText("Hello World.txt", "Hello World!");
        }
    }
}

像往常一样,我们保存并构建 cBot,然后创建其实例。

实例启动后,我们可以导航到上面定义的文件夹。 在其中,我们应该看到包含我们在代码中指定的文本的 Hello World.txt 文件。

从算法目录读取

下一步是读取位于算法目录中的文件内容。 为此,我们可以重写 OnStart() 方法如下。

1
2
3
4
protected override void OnStart()
{
        Print(File.ReadAllText("Hello Word.txt"));
}

在我们构建并启动 cBot 后,我们将看到算法将文件中的字符串打印到 cTrader 日志中。

访问其他目录

请注意,我们之前执行的 cBot 操作都不需要为其提供提升的访问权限。 事实上,访问权限在类级别明确设置为 None

我们将尝试写入位于不同目录中的文件,看看会发生什么。 我们将修改代码以写入位于根 Documents 目录中的文件。

1
2
3
4
protected override void OnStart()
{
    File.WriteAllText("C://OneDrive//Documents//Hello World.txt", "Hello World!");
}

一旦我们再次构建并运行 cBot,我们将在日志中看到抛出异常,表明我们无权在此特定目录中写入。

为了解决这个问题,我们可以返回 cBot 代码并按如下方式更改其访问权限。

1
[Robot(AccessRights = AccessRights.FullAccess)]

我们构建并运行 cBot。 现在,机器人将访问指定目录并写入正确的文件,而不是抛出异常。

为了进一步演示访问权限的工作原理,我们将按如下方式修改 OnStart() 方法。

1
2
3
4
protected override void OnStart()
{
        Print(File.ReadAllText("C://OneDrive//Documents//Hello World.txt"));
}

我们还将访问权限设置回 None

1
[Robot(AccessRights = AccessRights.None)]

cBot 开始运行后,我们将看到它无法从文件中读取。