Przejdź do treści

Praca z plikami w cTrader

W tym artykule i odpowiadającym mu filmie wyjaśnimy, jak można pracować z plikami w cTrader. Przeciętnie użytkownicy obawiają się uruchamiania cBotów lub wskaźników żądających pełnych praw dostępu do ich urządzenia. Zwłaszcza gdy kod źródłowy nie jest dostępny, trudno jest wiedzieć, co algorytm robi z tymi uprawnieniami. Na szczęście cTrader udostępnia kilka metod, które umożliwiają algorytmom dostęp do plików na komputerze lokalnym bez konieczności posiadania podwyższonych uprawnień.

Zapisywanie w katalogu algorytmu

cTrader umożliwia wszystkim algorytmom dostęp do folderu o tym adresie:

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

, gdzie algoType to cBots lub Indicators.

Utworzymy przykładowego cBota i pokażemy, jak można uzyskać dostęp do tego katalogu programowo.

 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!");
        }
    }
}

Jak zwykle zapisujemy i kompilujemy cBota, a następnie tworzymy jego instancję.

Po uruchomieniu instancji możemy przejść do folderu zdefiniowanego powyżej. W nim powinniśmy zobaczyć plik Hello World.txt zawierający tekst, który określiliśmy w naszym kodzie.

Odczytywanie z katalogu algorytmu

Następnym krokiem jest odczytanie zawartości pliku znajdującego się w katalogu algorytmu. Aby to zrobić, możemy przepisać naszą metodę OnStart() w następujący sposób.

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

Po skompilowaniu i uruchomieniu naszego cBota zobaczymy, że algorytm drukuje ciąg znaków z pliku do dziennika cTrader.

Dostęp do innych katalogów

Należy zauważyć, że żadna z operacji wykonywanych wcześniej przez naszego cBota nie wymagała zapewnienia mu podwyższonych praw dostępu. W rzeczywistości prawa dostępu zostały wyraźnie ustawione na None na poziomie klasy.

Spróbujemy zapisać do pliku znajdującego się w innym katalogu i zobaczymy, co się stanie. Zmodyfikujemy nasz kod, aby zapisywać do pliku znajdującego się w głównym katalogu Documents.

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

Po ponownym skompilowaniu i uruchomieniu cBota zobaczymy wyjątek zgłoszony w dzienniku wskazujący, że nie mamy uprawnień do zapisu w tym konkretnym katalogu.

Aby to rozwiązać, możemy wrócić do kodu cBota i zmienić jego prawa dostępu w następujący sposób.

1
[Robot(AccessRights = AccessRights.FullAccess)]

Kompilujemy i uruchamiamy cBota. Zamiast zgłaszać wyjątek, bot uzyska teraz dostęp do określonego katalogu i zapisze do właściwego pliku.

Aby jeszcze raz zademonstrować, jak działają prawa dostępu, zmodyfikujemy metodę OnStart() w następujący sposób.

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

Ustawimy również prawa dostępu z powrotem na None.

1
[Robot(AccessRights = AccessRights.None)]

Po uruchomieniu cBota zobaczymy, że nie udaje mu się odczytać z pliku.