Перейти к содержанию

Операции с файлами

Пользователи платформы выражают обоснованную обеспокоенность по поводу запуска сиБотов и индикаторов с AccessRights.FullAccess. Это особенно актуально, когда исходный код недоступен, трудно точно знать, какие изменения будут внесены алгоритмом в файловую систему. В руководстве по правам доступа мы уже рекомендовали, чтобы сиБоты и индикаторы, которыми вы делитесь с другими, получали AccessRights.None.

Это руководство по API объясняет, как алгоритмы с ограниченными AccessRights могут безопасно выполнять операции с локальными файлами.

Операции с файлами за одну минуту!

  • Функция операций с файлами позволяет алгоритмам с ограниченными правами доступа работать с файлами и папками только внутри выделенной папки.
  • Имя папки соответствует имени сиБота или индикатора.
  • Все остальные каталоги файловой системы пользователя остаются надежно защищенными от несанкционированного доступа.
  • В API функция операций с файлами поддерживается только для алгоритмов .NET 6.0.

Правила операций с файлами

Любому алгоритму с ограниченными правами доступа разрешено выполнять операции с файлами только в выделенной папке файловой системы пользователя. Каждый тип алгоритма размещает свою собственную папку, как показано ниже (например, сиБоты и индикаторы), при этом для каждого имени алгоритма создается отдельная папка.

Documents
|-cAlgo
  |-Data
    |-cBots
      |-${cBot Name}
    |-Indicators
      |-${Indicator Name}

Примечание

Функция операций с файлами доступна только для алгоритмов .NET 6.0.

Следующие правила определяют, как функция операций с файлами работает в API:

1. Каждый алгоритм имеет доступ только к папке, соответствующей его имени (включая подпапки, если таковые имеются).

2. Если соответствующей папки нет, такая папка создается в файловой системе согласно приведенной выше схеме при первом запуске экземпляра.

3. Если новую папку невозможно создать, сиБот или индикатор не запустится, и будет сообщено об ошибке.

4. В коде алгоритма вам не нужно указывать полный путь к соответствующей папке. Вместо этого алгоритмы используют относительный путь.

5. Пространство имен System.IO предлагает множество классов (File, FileInfo, Directory. DirectoryInfo, Path и т. д.) для которых можно вызывать соответствующие методы для выполнения операций с файлами и папками.

Ниже приведены некоторые примеры методов, включенных в классы File и Directory.

Метод Описание
File.Create() Создает или перезаписывает файл в выделенном каталоге.
File.WriteAllText() Создает новый файл, записывает указанную строку в файл и закрывает файл.
File.Copy() Копирует существующий файл в новый файл. Перезапись файла с тем же именем не допускается.
File.Delete() Удаляет файл в выделенном каталоге.
Directory.CreateDirectory() Создает папку или подпапку.
Directory.Delete() Удаляет папку или подпапку.
Directory.Exists() Проверяет, существует ли указанная директория.
Directory.Move() Перемещает существующую директорию в новую указанную директорию.

Пример использования

При вызове метода TakeChartshot() не нужно указывать полный путь к целевой директории после File.WriteAllBytes. Благодаря функции работы с файлами чартшот будет сохранен в соответствующую директорию алгоритма, даже если права доступа установлены как AccessRights.None.

Пример создания сиБота

В приведенном ниже примере сиБот имеет AccessRights.None, но создает текстовый файл в соответствующей папке с именем "File Access Test" сразу после инициализации. Если рыночный ордер успешно размещен в OnStart(), сиБот записывает идентификатор позиции в созданный файл.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class MycBot : Robot
    {
        protected override void OnStart()
        {
            TradeResult result = ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000);

            if (result.IsSuccessful)
            {
                string positionId = result.Position.Id.ToString();
                {
                    File.WriteAllText("My positions.txt", $"{positionId}");
                } 
            }
        }
    }
}

Created File

Written Position ID

Параметр File

Тип параметра File позволяет алгоритмам принимать файлы от пользователей через API. Он дает алгоритмам возможность безопасно читать данные из выбранного пользователем файла на локальной машине и записывать их в него.

При определении в алгоритме:

  • В пользовательском интерфейсе cTrader параметр отображается как текстовое поле с кнопкой Обзор, которая открывает диалоговое окно выбора файла.
  • В cTrader CLI пользователи могут передать путь к файлу непосредственно в качестве значения параметра.
  • Алгоритм получает строго типизированный объект File со встроенными методами чтения и записи.

Примечание

Доступ к файлу ограничен только файлом, явно предоставленным пользователем, и не дает неограниченного доступа к локальной файловой системе.

Тип параметра File можно использовать для выполнения следующих операций в алгоритмах:

Операция Примеры
Ввод внешних данных Чтение CSV- или текстовых файлов, загрузка пользовательских наборов данных.
Постоянный вывод Запись логов в файл, экспорт результатов.
Обработка конфигурации Загрузка внешних файлов конфигурации, управление большими наборами параметров.

Чтобы определить параметр файла, объявите свойство типа File и добавьте к нему атрибут [Parameter].

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
using cAlgo.API;

namespace cAlgo.Robots;

[Robot(AccessRights = AccessRights.None)]
public class FileParameterTypeTest : Robot
{
    [Parameter(DefaultValue = @"C:\Data\input.txt")]
    public File DataFile { get; set; }

    protected override void OnStart()
    {
        Print($"Exists: {DataFile.Exists()}");
    }
}
Необязательное значение DefaultValue можно использовать для предварительного заполнения параметра путем к файлу, а тип File предоставляет набор высокоуровневых методов для взаимодействия с содержимым файла.

Вы можете прочитать весь файл как текст или как отдельные строки.

1
2
var text = DataFile.ReadAllText();
var lines = DataFile.ReadLines();

Операции записи перезаписывают существующее содержимое файла.

1
DataFile.WriteAllText("This is a test", EncodingType.Ascii);

Вы можете добавлять текст или несколько строк без перезаписи существующего содержимого.

1
2
DataFile.AppendAllText("This is a test", EncodingType.Utf8);
DataFile.AppendAllLines(new[] { "Line 1", "Line 2" }, EncodingType.Utf8);

Перед выполнением операций вы можете проверить, существует ли файл.

1
2
3
4
if (DataFile.Exists())
{
    Print("File is available");
}

Обзор

Функция работы с файлами в API по-прежнему позволяет алгоритмам с ограниченными правами доступа работать с локальными файлами и папками. Вы можете использовать методы из пространства имен System.IO языка C# для программирования того, как алгоритмы будут выполнять такие операции в пределах соответствующей папки. Таким образом, другие директории в файловой системе пользователя остаются полностью защищенными, даже если исходный код алгоритма недоступен.