コンテンツにスキップ

cBotの取引操作

このガイドでは、Algo APIを使用して開発したcBotで実行できる主要な取引操作について詳しく説明します。

以下は、cBotでサポートされている操作の一部です:

  • 成行注文の送信。
  • 予約注文の実行。
  • 予約注文とオープンポジションの変更。
  • ポジションの決済と注文のキャンセル。
  • 取引イベント(ポジション、注文、関連するアクティビティ)の購読。

成行注文を送信する

ExecuteMarketOrder()メソッドが呼び出されると、成行注文が取引サーバーに送信されます。 新しいcBotを作成した後、このメソッドを成行注文のいくつかの定義されたプロパティ(通貨ペア、取引高、テイクプロフィット、ストップロスなど)とともに追加できます。 以下の例では、cBotが起動したときに成行注文を実行します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class TradeOperations : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "", 10, 10, "", false);
        }       
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import clr

clr.AddReference("cAlgo.API")

from cAlgo.API import *
from robot_wrapper import *

class TradeOperations():
    def on_start(self):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "", 10, 10, "", False)

ヒント

例では、いくつかの注文パラメータが意図的に未定義""のままにされています。 すべてのExecuteMarketOrder()パラメータのシグネチャと順序については、リファレンスを確認してください。

cBotをビルドしてインスタンスを追加すると、指定されたパラメータで成行注文が開始時に実行されたことがわかります。 トレードウォッチパネルのポジションタブとログタブには、対応するポジションとログエントリが表示されます。

Positions

Log

予約注文を実行する

cTraderは、ストップ注文、指値注文、ストップリミット注文の3種類の予約注文をサポートしています。 開始時に予約注文を実行するには、以前のcBotの例で成行注文を以下のコードスニペットに置き換えます。

1
2
3
PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
PlaceLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask - (Symbol.PipSize * 10), "", 10, 10, null, "", false);
PlaceStopLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), 2, "", 10, 10, null, "", false);
1
2
3
api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask - (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
api.PlaceStopLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), 2, "", 10, 10, None, "", False)

ヒント

メソッドのパラメータをすばやく確認するには、メソッド名と開き括弧を入力します。 追加情報を含むIntelliSenseポップアップが表示されます。

Image title

ヒント

cTrader Algoでメソッド/パラメータをクリックしてF1を押すと、コードウィンドウの右側にあるヘルプパネルに一致する検索結果が表示されます。 テキストカーソルがコードウィンドウの外にあり、F1を押すと、ヘルプセンターウィンドウが表示され、支援が提供されます。

cBotのビルドと実行が成功した後、トレードウォッチパネルに以下のレコードが表示されます。

Orders

Log

予約注文とオープンポジションを変更する

予約注文が実行されると、cBotのPendingOrdersコレクションで利用可能になります。 このコレクションを通じて、それらにアクセスして変更できます。 既存の予約注文は、以下のようにストップロスレベルを調整することで変更できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnStart()
{
    PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
    PlaceLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask - (Symbol.PipSize * 10), "", 10, 10, null, "", false);
    PlaceStopLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), 2, "", 10, 10, null, "", false);

    foreach(var order in PendingOrders.Where(p => p.SymbolName == SymbolName))
    {
        order.ModifyStopLossPips(20);
    }
}     
1
2
3
4
5
6
7
8
def on_start(self):
    api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
    api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask - (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
    api.PlaceStopLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), 2, "", 10, 10, None, "", False)

    for order in api.PendingOrders:
        if order.SymbolName == api.SymbolName:
            order.ModifyStopLossPips(20)

トレードウォッチパネルのログタブには、3つの予約注文が実行された直後に正常に変更されたことが表示されます。

Image title

異なる注文タイプが正常に実行された後、アカウントにポジションが開かれます。 すべてのオープンポジションは、cBotのPositionsコレクションで利用可能です。 前の例で予約注文を変更したのと同様に、オープンポジションを変更できます。 成行注文はポジションを開く最も速い方法であるため、このガイドの最初のcBotにポジション変更アクションを含むOnBar()メソッドを追加しましょう。

1
2
3
4
5
6
7
protected override void OnBar()
{
    foreach(var position in Positions.Where(p => p.SymbolName == SymbolName))
    {
        position.ModifyTakeProfitPips(20);
    }
}
1
2
3
4
def on_bar(self):
    for position in api.Positions:
        if position.SymbolName == api.SymbolName:
            position.ModifyTakeProfitPips(20)

ログに反映されているように、オープンポジションは最初に開かれたバーで変更されました。

Image title

ポジションの決済と注文のキャンセル

以下のcBotの例では、金曜日の11:00(UTC)にOnTick()メソッドを呼び出して、すべての建てられたポジションを決済し、すべての予約注文をキャンセルします。

 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
namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class TradeOperations : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "", 10, 10, "", false);
            PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
        }  

        protected override void OnTick()
        {
            if(Server.Time.DayOfWeek == DayOfWeek.Friday && Server.Time.Hour >= 11)
            {
                foreach(var position in Positions.Where(p => p.SymbolName == SymbolName))
                {
                    position.Close();    
                }

                foreach(var order in PendingOrders.Where(p => p.SymbolName == SymbolName))
                {
                    order.Cancel();
                }
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class TradeOperations():
    def on_start(self):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "", 10, 10, "", False)
        api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)

    def on_tick(self):
        # Friday == 5 (Sunday=0)
        if api.Server.Time.DayOfWeek == 5 and api.Server.Time.Hour >= 11:
            for position in api.Positions:
                if position.SymbolName == api.SymbolName:
                    position.Close()
            for order in api.PendingOrders:
                if order.SymbolName == api.SymbolName:
                    order.Cancel()

Image title

取引イベントのサブスクライブ

cTraderでは、アルゴリズム開発者が取引イベントをサブスクライブし、取引活動を監視することができます。これらがcBotによって開始されたか、手動で開始されたかに関係なく監視可能です。 これは、前述の2つのコレクションPositionsPendingOrdersで利用可能なイベントをリスニングすることで実現されます。

ポジションに関しては3つのイベントが利用可能です:

  • Open
  • Modified
  • Closed

これらは、それぞれ口座でポジションを開く、変更する、決済するときにトリガーされます。

以下のコードスニペットでは、3つのイベントがOnStart()メソッドで宣言され、呼び出されるメソッドが割り当てられています。 これにより、使用するためのコードシグネチャが自動的に作成されます。 その後、各イベントメソッドにPrint()ステートメントが追加されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
protected override void OnStart()
{
    Positions.Opened += Positions_Opened;
    Positions.Modified += Positions_Modified;
    Positions.Closed += Positions_Closed;                    
}  

private void Positions_Opened(PositionOpenedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was opened");
}

private void Positions_Modified(PositionModifiedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was modified");
}

private void Positions_Closed(PositionClosedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was closed");
}   
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def on_start(self):
    api.Positions.Opened += self.positions_opened
    api.Positions.Modified += self.positions_modified
    api.Positions.Closed += self.positions_closed

def positions_opened(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was opened")

def positions_modified(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was modified")

def positions_closed(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was closed")

OpenModifiedClosedイベントを実行するのがあなたかcBotかに関わらず、アルゴリズムは毎回これらのイベントに反応し、以下のログに示すようにメッセージを出力します。

Image title

同様に、予約注文に関連するイベントをサブスクライブすることもできます。 予約注文に関しては4つのイベントが利用可能です:

  • Created
  • Modified
  • Filled
  • Cancelled

4つのイベントは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
protected override void OnStart()
{
    PendingOrders.Created += PendingOrders_Created;
    PendingOrders.Modified += PendingOrders_Modified;
    PendingOrders.Filled += PendingOrders_Filled;
    PendingOrders.Cancelled += PendingOrders_Cancelled;
}

private void PendingOrders_Created(PendingOrderCreatedEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was created");
}

private void PendingOrders_Modified(PendingOrderModifiedEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was modified");
}

private void PendingOrders_Filled(PendingOrderFilledEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was filled");
}

private void PendingOrders_Cancelled(PendingOrderCancelledEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was cancelled");
}       
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def on_start(self):
    api.PendingOrders.Created += self.pending_orders_created
    api.PendingOrders.Modified += self.pending_orders_modified
    api.PendingOrders.Filled += self.pending_orders_filled
    api.PendingOrders.Cancelled += self.pending_orders_cancelled

def pending_orders_created(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was created")

def pending_orders_modified(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was modified")

def pending_orders_filled(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was filled")

def pending_orders_cancelled(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was cancelled")

予約注文に関連するイベントをサブスクライブすると、cBotは手動およびプログラムされた取引活動の両方に反応します。

Image title

概要

結論として、cTraderはアルゴリズム開発者にcBotによって実行できる印象的な取引操作のアーセナルを提供します。 これらを巧みに適用することで、カスタマイズされた洗練された取引戦略を追求することができます。

Image title