通貨ペア情報取得用
Robotクラス(本体)が持つプロパティSymbolから様々な通貨ペアの情報が取得できます。SymbolのインターフェースはSymbolInfoインターフェースを継承しています。
SymbolInfoインターフェース
通貨ペアの基本情報を参照するためのインターフェースです。
public interface SymbolInfo
関連するインターフェース:Symbol
プロパティ
(string) Name
通貨ペアの名前を取得します。”EURUSD"とか。これをそのまま発注などに使用します。
(int) Digits
価格の小数点以下の桁数を取得します。
(double) PipSize
1pipあたりの価格を取得します。
(double) PipValue
1pipあたりの価格を口座通貨額に換算して取得します。
(double) TickSize
値動きの最小幅を取得します。
(double) TickValue
値動きの最小幅を口座通貨額に換算して取得します。
(double) VolumeInUnitsMax
最大発注通貨量を取得します。
(double) VolumeInUnitsMin
最小発注通貨量を取得します。
(double) VolumeInUnitsStep
発注通貨量の最小増減幅を取得します。
(IReadOnlyList<LeverageTier>) DynamicLeverage
通貨ペアの通貨量別のレバレッジを取得します。
(double) LotSize
1ロット当たりの通貨量を取得します。
(MarketHours) MarketHours
マーケットが開いてる時間を取得します。FXだけなら気にしなくていいです。
(string) Description
通貨の説明を取得します。EURUSDなら”Euro vs US Dollar"とかになります。
(long) Id
IDを取得します。使いません。
(以下はcTrader4.5で追加)
(double) Commission
トレード時の片道手数料を取得します。(単位はCommisionType次第)
(SymbolCommissionType) CommissionType
手数料タイプを取得します。
(double) SwapLong
買いポジション保有時のスワップ金額を取得します。
(double) SwapShort
売りポジション保有時のスワップ金額を取得します。
(DayOfWeek?) Swap3DaysRollOver
スワップ3倍付の曜日を取得します。
(double) MinStopLossDistance
最小のストップロス距離を取得します。(MT4で「ストップレベル」と呼ばれてるやつです)
(double) MinTakeProfitDistance
最小のテイクプロフィット距離を取得します。
(SymbolMinDistanceType) MinDistanceType
上記Min~Disanceの単位を取得します。PipsもしくはPercentageを返します。
(Asset) BaseAsset
通貨ペアのベース通貨を取得します。(EURUSDならEURの部分)
(Asset) QuoteAsset
通貨ペアの決済通貨を取得します。(EURUSDならUSDの部分)
(double) MinCommission
最低手数料を取得します。単位はMinCommissionAssetによります。
(SymbolMinCommissionType) MinCommissionType
最低手数料の単位を取得します。AssetもしくはQuoteAssetを返します。Assetなら単位は口座通貨、QuoteAssetなら単位は決済通貨(EURGBPならポンド)になります。
(bool) IsTradingEnable
通貨ペアがトレード可能かどうかを取得します。
(SymbolTradingMode) TradingMode
通貨ペアのトレードモードを返します。FullAccess(トレード可能)か、CloseOnly(決済のみ可能)か、DisabledWithPendingOrderExecution(待機注文のみ執行可能)か、FullyDisabled(トレード不可)のいずれかを返します。
(int) GracePeriod
スワップフリー口座でポジションを取得してから手数料がかからない日数を取得します。
(double) AdministrativeCharge
スワップフリー口座でポジション維持にかかる手数料を取得します。
(DayOfWeek?) AdministrativeCharge3DaysRollOver
スワップフリー口座でポジション維持にかかる手数料が3倍になる曜日を取得します。
(double)PnLConversionFeeRate
Gets the symbol profit and loss conversion fee rate... だそうです。(意味わからん)
メソッド
(double) NormalizeVolumeInUnits(double volume[, RoundingMode roundingMode])
volumeを発注可能な量に調整して返します。例えばvolumeに12345を渡すと、(VolumeInUnitsStepが1000なら)12000が返ってきます。最低でもVolumeInUnitsMinが返りますので0やマイナスの値渡しても大丈夫です。
逆に言えばVolume計算値がマイナスだったときは発注しないような想定のプログラムだった場合でもこのメソッド通したら発注できてしまうので注意が必要です。defaultはToNearest。
(double) QuantityToVolumeInUnits(double quantity)
ロット数を通貨量に変換します。quantitiy*LotSizeが返ってきます。
(double) VolumeInUnitsToQuantity(double volume)
通貨量をロット数に変換します。volume/LotSizeが返ってきます。
(double) GetEstimatedMargin(TradeType tradeType, double volume)
(cTrader4.5以降) トレード方向と数量から必要証拠金料を取得します。
(double) AmountRisked(double volume, double stopLossInPIps)
(cTrader4.6以降) 指定ボリュームで指定Pipsにストップを置く場合の損失額を返します。当然決済時の為替レートによっても変わるため、あくまで目安です。
LeverageTierインターフェース
SymbolInfoのDynamicLeverageの要素です。発注量によって異なる最大レバレッジを参照します。
public interface LeverageTier
プロパティ
(double) Leverage
最大レバレッジを取得します。
(double)Volume
Leverageが有効な最大通貨量を取得します。(DynamicLeverageの最後の要素だけ扱いが違うかも?)
サンプルコード
Print("この口座の最大レバレッジは{0}倍", Account.PreciseLeverage);
Print("最大発注数は{0}通貨", Symbol.VolumeInUnitsMax);
Print("{0}の通貨量別レバレッジ", SymbolName);
foreach (var lt in Symbol.DynamicLeverage) {
var lots = Symbol.VolumeInUnitsToQuantity(lt.Volume);
if (lt != Symbol.DynamicLeverage.Last()) {
Print("{0:#,0}通貨({1:#,0}Lots)までは最大レバレッジ{2}倍", lt.Volume, lots, lt.Leverage);
} else {
Print("{0:#,0}通貨({1:#,0}Lots)以上は最大レバレッジ{2}倍?", lt.Volume, lots, lt.Leverage);
}
}
実行してみると最大レバレッジが表示されます。
Symbolインターフェース
通貨ペアの基本情報に加え、BidやAskなどリアルタイムの情報を参照するためのインターフェースです。
public interface Symbol : SymbolInfo
SymbolInfoから継承されており、リアルタイムの情報を参照するためのメンバが追加されています。
プロパティ
(double) Ask
Ask値 (買う場合の価格) を取得します。
(double) Bid
Bid値 (売る場合の価格) を取得します。
(double) Spread
スプレッド (AskとBidの差) を取得します。Pipsじゃなく純粋な価格差です。
(double) UnrealizedGrossProfit
保有中ポジションの総利益を取得します。
(double) UnrealizedNetProfit
保有中ポジションのスワップ、手数料を加味した総利益を取得します。
SymbolInfoのプロパティ
Name、Digits、PipSize、PipValue、VolumeInUnitsMax、VolumeInUnitsMinなど。上記参照。
メソッド
SymbolInfoのメソッド
NormalizeVolumeInUnits、QuantityToVolumeInUnits、VolumeInUnitsToQuantity。
サンプルコード
Pips関連の計算にSymbol.PipSizeはとにかくよく使います。利益額や損失額の計算となるとSymbol.PipValueも結構使います。
// 1本前のローソク足の高値をストップロスに指定して売り発注
// 最大損失が10,000円以内におさまるようエントリーボリュームを調整する
// 最大損失とストップロスPipsを設定
double maxLoss = 10000;
var stopLossPips = Math.Round((Bars.Last(1).High - Bid)/Symbol.PipSize, 1);
var spreadPips = Symbol.Spread / Symbol.PipSize;
// stopLossPipsがスプレッド以下だったらなにもせず止める
if (stopLossPips < spreadPips) Stop();
// volumeを計算する
var volume = maxLoss / (Symbol.PipValue * (stopLossPips + spreadPips));
Print("maxLoss={0}, pipvalue={1}, losspips={2}", maxLoss, Symbol.PipValue, stopLossPips);
Print(volume);
volume = Symbol.NormalizeVolumeInUnits(volume, RoundingMode.Down);
//発注
ExecuteMarketOrder(TradeType.Sell, SymbolName, volume, "SymbolSampleCode", stopLossPips, null);
デモ口座で試してみてください。手数料分はずれますが、ストップロス位置で最大損失くらいになるようエントリーされるのが確認できると思います。
RoundingMode列挙型
Symbol.NormalizeVolumeInUnitsでの計算方式を表す列挙型です。
ToNearest | 近い値。奇数丸めっぽいです。2500も3500も3000になります。 |
Down | 切り捨て。NormalizeVolumeInUnits(volume, RoundingMode.Down) の結果は指定したvolumeよりも小さい数値になります。 |
Up | 切り上げ。NormalizeVolumeInUnits(volume, RoundingMode.Up) の結果はvolumeよりも大きい数値になります。 |
SymbolCommissionType列挙型
手数料の計算方式を表す列挙型です。
UsdPerMillionVolume | 100万通貨(USD)あたりで計算され、単位はUSDです。 |
UsdPerOneLot | 1ロットあたり計算され単位はUSDです。 |
PercentageOfTradingVolume | トレード総量の比率(%)で計算されます。 |
QuoteCurrencyPerOneLot | 1ロットあたりで計算され、単位は決済通貨です。 |
たとえばUSDCADでCommisionが10、CommisionTypeが"UsdPerMillionVolume"の場合、100万ドルの取引あたり10ドルの手数料ということなので、1lot(10万通貨)トレードしたときの手数料は片道1ドルということになります。
少しわかりにくいですが、GBPUSDで同じ値だった場合は手数料は1lot片道1ポンドになります。(10万通貨=10万ポンド=約12万ドル=手数料は(100万ドルあたり10ドルなので)約1.2ドル=手数料は1ポンド)