通貨ペア情報取得用
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を取得します。使いません。
メソッド
(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が返ってきます。
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よりも大きい数値になります。 |