C# サンプルプログラムの解説

当社カスタマーサポートの対象外です

概要

C#(Microsoft C#)はMicrosoft社が開発したプログラミング言語です。
javaに似た言語体系をもちつつ、新たに一から設計されたオブジェクト指向プログラミング言語です。
コンパイル環境:.net Framework sdkインストール済みが条件。
コンパイルにはお手持ちのPCの環境変数にcsc.exeの格納Pathを御設定ください。
(csc.exeはWindowsXP以降ならC:\WINDOWS\Microsoft.NET\Framework\vX.X/以下に存在します。)
内容を変更したいときは
1、test.csをテキストエディタで開き、修正、上書き保存する。
2、make.batをダブルクリックして起動する。
(環境変数にcsc.exe格納フォルダのPathが設定されていないと失敗します。)
3、コンパイルエラーが出ないこと(warningは無視してかまいません)を確認し、exeの更新時間がmake.batを
起動した時間になっていることを確認する。
4、コマンドプロンプトを起動し、サンプルフォルダに移動、引数付きexe起動(アカウントIDとパスワードを付ける)test.exeを起動する。
起動例:test.exe xxxxxxxxxxx xxxxxxxxxxx
(サンプルexeを実行するだけならWindows XP以降なら特に問題ありません)

開発ツール:Windows付属のメモ帳でも十分ですが、専用に開発された統合開発環境を使って
開発するのが一般的です。
Express EditionがMicrosoftよりインターネットで無償で配布されているのでダウンロードしてみるのも
よろしいかもしれません。
その他注意事項:プログラムに関する一定の知識をお持ちの方を想定して解説させていただきますので、
ご了承ください。

下記リンクよりorder2goAPIをダウンロード、インストールしてください。

Order2go API ダウンロードはこちら

サンプルソース

また、解説用のサンプルソースは下記よりダウンロードできます。
ZIPで圧縮してありますので解凍してご使用ください。
サンプルソースを実行する場合、保存したフォルダにtest.logという空のファイルを作ってください。

注:サンプルソースは例外処理を行っておりませんので、参考資料としての範囲内でご利用ください。

ダウンロード

解説

サンプルソースをもとに各機能ごとに解説していきます。

ログインページトップへ

APIを使用する手順として、まずはシステムにログインしなければなりません。
リアル、もしくはデモの取引口座アカウントとパスワードをご用意ください。

注:ログインし、使い終わりましたら必ずログアウトしてください。

    static string username;
    static string password;
    //static string connection = "Demo";
    //static string url = "www.fxcorporate.com";
    static string connection = "Real";
    static string url = "fxcmj.fxcorporate.com/Hosts.jsp";

    public static void Main(string[] args)
    {
        if (args.Length < 2)
        {
            Console.WriteLine("Not Enough Parameters!");
            Console.WriteLine("USAGE: [application].exe [username] [password]");
            return;
        }

        username = args[0];
        password = args[1];

        Console.WriteLine("Creating O2G Objects....");
        fxCore = new FXCore.CoreAut();
        tradeDesk = (FXCore.TradeDeskAut)fxCore.CreateTradeDesk("trader");
        Console.WriteLine("O2G Objects created.");

        Console.WriteLine("Logging in with user '{0}'.....", username);
        tradeDesk.Login(username, password, url, connection);
        Console.WriteLine("Logged in.");

1. Order2GoのCoreオブジェクトを呼び出します。

        fxCore = new FXCore.CoreAut();
        

Order2GoApiをインストールしていない場合、ここでエラーが出ます。

2. コアオブジェクトからtraderオブジェクトを呼び出します。

        tradeDesk = (FXCore.TradeDeskAut)fxCore.CreateTradeDesk("trader");

これは顧客側からの操作に関するオブジェクトです。

3. ログインをします。usernameとpasswordはここで使われます。

    //static string connection = "Demo";
    //static string url = "www.fxcorporate.com";
    static string connection = "Real";
    static string url = "fxcmj.fxcorporate.com/Hosts.jsp";
        tradeDesk.Login(username, password, url, connection);

リアル口座の場合は"Real"の方を、デモ口座の場合は"Demo"の方をお使いください。

リアルタイムレート取得ページトップへ

注文条件を設定するためには、現在のレートを取得する必要があります。
各通貨ペア、先物オプション(CFD)のリアルタイムレートを取得してみましょう。

        Console.WriteLine("Creating event sink, assigning event handling methods, and subscribing....");
        eventSink = new FXCore.TradeDeskEventsSinkClass();

        handler = new FXCore.ITradeDeskEvents_OnRowChangedEventHandler(FxCore_RowChanged);

        eventSink.ITradeDeskEvents_Event_OnRowChanged += handler;
        subscriptionId = tradeDesk.Subscribe(eventSink);
        Console.WriteLine("Subscribed.");

        Console.WriteLine("Putting application in a loop....");
        //取得したい時間分入力してください。ここでは0.1秒を200回分まわしています
        for (int i = 0; i < 200; i++)
        {
            Thread.Sleep(100);
        }

        Console.WriteLine("Loop finished running.");

        Console.WriteLine("MSGS: {0}  received.", msgCount);

        Console.WriteLine("Unsubscribing...");
        tradeDesk.Unsubscribe(subscriptionId);
        subscriptionId = -1;
        eventSink = null;
        Console.WriteLine("Unsubscribed.");

    public static void FxCore_RowChanged(object _table, string rowId)
    {
        FXCore.ITableAut table = _table as FXCore.ITableAut;

        if (table != null && table.Type == "offers")
        {
            FXCore.IRowAut row = (FXCore.IRowAut)table.FindRow("OfferID", rowId, 0);

            if (row != null)
            {
                msgCount++;
                string instr = row.CellValue("Instrument").ToString();
                string bid = row.CellValue("Bid").ToString();
                string ask = row.CellValue("Ask").ToString();
                uint offerId = uint.Parse(row.CellValue("OfferID").ToString());

                DateTime dtNow = DateTime.Now;
                string r_str = "RATE UPDATE! -> " + dtNow.ToString() + " : " + instr + " Ask:" + ask + " Bid:" + bid;
                StreamWriter writer =
                      new StreamWriter("test.log", true, Encoding.GetEncoding("UTF-8"));
                writer.WriteLine(r_str);
                writer.Close();

                if ("AUD/JPY".Equals(instr) && (double.Parse(ask)) > 60.25)
                {
                    Open_Trade(offerId);
                }

            }
        }
    }

1. リアルタイムレート取得時間を設定します。

        //取得したい時間分入力してください。
        for (int i = 0; i < 200; i++)
        {
            Thread.Sleep(100);
        }

ここでは20秒、リアルタイムレートを取得しています。
forでloopしている間はレート取得が続いているということです。
好きな値を御入力ください。

2. リアルタイムレート取得のメソッドを設定します。

        Console.WriteLine("Creating event sink, assigning event handling methods, and subscribing....");
        eventSink = new FXCore.TradeDeskEventsSinkClass();

        handler = new FXCore.ITradeDeskEvents_OnRowChangedEventHandler(FxCore_RowChanged);

        eventSink.ITradeDeskEvents_Event_OnRowChanged += handler;
        subscriptionId = tradeDesk.Subscribe(eventSink);
        Console.WriteLine("Subscribed.");

ここではイベントOnRowChangedExを指定し登録しています。
イベントについては各自ご確認ください。

3. リアルタイムレート取得のメソッドを取り除きます。

        Console.WriteLine("Unsubscribing...");
        tradeDesk.Unsubscribe(subscriptionId);
        subscriptionId = -1;
        eventSink = null;
        Console.WriteLine("Unsubscribed.");

イベントFxCore_RowChangedを解放しています。

4. リアルタイムレート取得のメソッド本体です。

    public static void FxCore_RowChanged(object _table, string rowId)

イベントメソッドです。レートの更新毎にこのメソッドが呼ばれます。
この中では色々なレートに関する値が取得できます。

5. ファイル書き込みです。

                StreamWriter writer =
                      new StreamWriter("test.log", true, Encoding.GetEncoding("UTF-8"));
                writer.WriteLine(r_str);
                writer.Close();

logファイルに書き出しています。必ずtest.logファイルを用意してください。
test.logには
RATE UPDATE! -> 2010/08/23 15:16:17 : GBP/CHF Ask:1.61082 Bid:1.61029
以上のようなリアルタイムレートが書き込まれます。

成行注文ページトップへ

成行注文を出します。
今回はUSD/JPYのレートが一定値になったら注文が出るようにします。
注:条件設定に注意してください。思いもよらない件数の注文が出るかもしれません。

    public static void FxCore_RowChanged(object _table, string rowId)
    {
        FXCore.ITableAut table = _table as FXCore.ITableAut;

        if (table != null && table.Type == "offers")
        {
            FXCore.IRowAut row = (FXCore.IRowAut)table.FindRow("OfferID", rowId, 0);

            if (row != null)
            {
                msgCount++;
                string instr = row.CellValue("Instrument").ToString();
                string bid = row.CellValue("Bid").ToString();
                string ask = row.CellValue("Ask").ToString();
                uint offerId = uint.Parse(row.CellValue("OfferID").ToString());

                DateTime dtNow = DateTime.Now;
                string r_str = "RATE UPDATE! -> " + dtNow.ToString() + " : " + instr + " Ask:" + ask + " Bid:" + bid;
                StreamWriter writer =
                      new StreamWriter("test.log", true, Encoding.GetEncoding("UTF-8"));
                writer.WriteLine(r_str);
                writer.Close();

                if ("AUD/JPY".Equals(instr) && (double.Parse(ask)) == 60.25)
                {
                    Open_Trade(offerId);
                }

            }
        }
    }

    public static void Open_Trade(uint offerId)
    {

        FXCore.TableAut accounts = (FXCore.TableAut)tradeDesk.FindMainTable("accounts");
        string accountId = (string)accounts.CellValue(1, "AccountID");
        int minAmount = (int)accounts.CellValue(1, "BaseUnitSize");
        Console.WriteLine("Got the table. AccountID: {0}, Lot Size: {1}.", accountId, minAmount);

        Console.WriteLine("Getting object reference to table 'Offers' and getting Instrument, Ask, and QuoteID for ANY first available instrument...");
        FXCore.TableAut offers = (FXCore.TableAut)tradeDesk.FindMainTable("offers");
        string inst = (string)offers.CellValue(offerId, "Instrument");
        double rate = (double)offers.CellValue(offerId, "Ask");
        string quoteId = (string)offers.CellValue(1, "QuoteID");
        Console.WriteLine("Got the table. Instrument: {0}, Ask Rate: {1}, QuoteID: {2}.", inst, rate, quoteId);

        Console.WriteLine("Creating output variables...");
        object orderId, di;

        // This OpenTrade2() method is called with specific ask price and ask's quoteID
        Console.WriteLine("Opening a buy trade using our variables.....");
        tradeDesk.OpenTrade2(accountId, inst, true, minAmount, rate, quoteId, 0, tradeDesk.SL_NONE, 0, 0, 0, out orderId, out di);
        Console.WriteLine("Buy Trade Executed. OrderID is: " + orderId);

    }

1. 通貨AUD/JPYでaskが60.25円になったら注文を出します。

                if ("AUD/JPY".Equals(instr) && (double.Parse(ask)) == 60.25)
                {
                    Open_Trade(offerId);
                }

ご自分で好きな条件を設定してください。(通貨やレート、指定より上になったら起動など色々動かせます)

2. 注文数量を指定します。

        int minAmount = (int)accounts.CellValue(1, "BaseUnitSize");

注文時の数量を設定します。ここではBaseUnitSizeを指定しています。弊社では注文数量のマイクロ化により1が指定されます。

3. 注文通貨を設定します。

        string inst = (string)offers.CellValue(offerId, "Instrument");

注文を出したい通貨を指定します。リアルタイムレートのofferIdを指定してください。

4. askなのかbidなのか注文レートを設定します。

        double rate = (double)offers.CellValue(offerId, "Ask");

askかbidを設定します。また、リアルタイムレートのofferIdを指定してください。

5. 成行注文をリクエストします。

        tradeDesk.OpenTrade2(accountId, inst, true, minAmount, rate, quoteId, 0, tradeDesk.SL_NONE, 0, 0, 0, out orderId, out di);

分かりにくいパラメータを左から順に説明をします。

3つ目の引数 true:buyかsellかを指定します。trueだと買い、falseだと売りです。

7つ目の引数 0:marketRangeです。order2goAPIで成行注文を出す場合、
自分でマーケットレンジを指定する必要があります。
これを0に設定すると、指定したレートのみで約定するように発注するため、
これ以外のレートでは約定しません。
(相場の流動性などによっては、約定に失敗する可能性が高まります。)

8つ目の引数 oTradeDesk.SL_NONE:ストップやリミットを設定するパラメータです。指定しない場合はoTradeDesk.SL_NONEを入れてください。

詳しいパラメータなどの説明はorder2goAPIがインストールされたフォルダにあるHelpファイルをご覧ください。

免責事項:

サンプルプログラムや解説ページは当社のカスタマーサポート対象外であり、質問に対してお答えすることはできません。
サンプルプログラムや解説ページのご利用は、お客様の責任において行われるものとし、利用によって生じたあらゆる損害に対して、当社は一切の責任を負いません。
サンプルプログラムや解説ページは無償で提供されますが、プログラムやページの情報に何ら欠陥がないことを保証するものではありません。

  • 口座開設・資料請求
  • 法人口座のご案内
  • デモトレード 無料体験
  • ダウジョーンズFXCM米ドルインデックスバスケット
低スプレッドでアグレッシブな取引を!
メンテナンス・マージン制度 証拠金 1% までポジションを維持!
Video library
NDD VS DD
Live Chat
コールミーサービス
取引ツール
  • お客様ログイン
  • シストレログイン

ページトップ

コンテンツ一覧