コンテンツにスキップ

cTraderでのファイル操作

この記事と対応する動画では、cTraderでファイルを操作する方法を説明します。 平均的に、ユーザーはcBotやインジケーターがデバイスへのフルアクセス権を要求することに懸念を持っています。 特にソースコードが利用できない場合、アルゴリズムがこれらの権限で何をしているのかを知るのは困難です。 幸い、cTraderはアルゴリズムがローカルマシン上のファイルにアクセスするためのいくつかの方法を提供しており、昇格された権限を必要としません。

アルゴディレクトリへの書き込み

cTraderはすべてのアルゴリズムが次のアドレスのフォルダにアクセスすることを許可します:

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

, ここでalgoTypecBotsまたはIndicatorsです。

例として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が実行を開始した後、ファイルから読み取ることができないことがわかります。