Ir para o conteúdo

Trabalhar com ficheiros no cTrader

Neste artigo e no vídeo correspondente, explicaremos como pode trabalhar com ficheiros no cTrader. Em média, os utilizadores estão preocupados com o lançamento de cBots ou indicadores que solicitam direitos de acesso total aos seus dispositivos. Especialmente quando não há código-fonte disponível, é difícil saber o que o algoritmo está a fazer com estas permissões. Felizmente, o cTrader fornece vários métodos que permitem que os algos acedam a ficheiros na sua máquina local sem necessitar de permissões elevadas.

Escrever no diretório do algo

O cTrader permite que todos os algos acedam a uma pasta com este endereço:

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

, onde algoType é cBots ou Indicators.

Vamos criar um exemplo de cBot e demonstrar como pode aceder a este diretório programaticamente.

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

Como habitualmente, guardamos e criamos o cBot e, em seguida, criamos a sua instância.

Depois de a instância iniciar, podemos navegar até à pasta definida acima. Nela, deveremos ver o ficheiro Hello World.txt contendo o texto que especificámos no nosso código.

Ler do diretório do algo

O próximo passo é ler o conteúdo de um ficheiro localizado no diretório do algo. Para tal, podemos reescrever o nosso método OnStart() da seguinte forma.

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

Depois de criarmos e lançarmos o nosso cBot, veremos que o algo imprime a string do ficheiro no registo do cTrader.

Aceder a outros diretórios

Note que nenhuma das operações que o nosso cBot realizou anteriormente exigiu que lhe fossem fornecidos direitos de acesso elevados. Na verdade, os direitos de acesso foram explicitamente definidos como None ao nível da classe.

Vamos tentar escrever num ficheiro localizado num diretório diferente e ver o que acontece. Vamos modificar o nosso código para escrever num ficheiro localizado no diretório raiz Documents.

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

Assim que criarmos e executarmos o cBot novamente, veremos uma exceção a ser lançada no registo indicando que não estamos autorizados a escrever neste diretório específico.

Para resolver isto, podemos voltar ao código do cBot e alterar os seus direitos de acesso da seguinte forma.

1
[Robot(AccessRights = AccessRights.FullAccess)]

Criamos e executamos o cBot. Em vez de lançar uma exceção, o bot irá agora aceder ao diretório especificado e escrever no ficheiro correto.

Para mais uma demonstração de como funcionam os direitos de acesso, vamos modificar o método OnStart() da seguinte forma.

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

Também vamos definir os direitos de acesso de volta para None.

1
[Robot(AccessRights = AccessRights.None)]

Depois de o cBot começar a ser executado, veremos que falha ao ler do ficheiro.