【JForex】配信レートの小数部の桁数を取得する関数は、便利でもあり不便でもある、、、
FX注文時の利食い/損切り計算で必須となる、レート配信の小数部の桁数取得ですが、JForexの場合はPips計算に特化しています。
https://www.dukascopy.com/client/javadoc/
> Enum Instrument
>> int getPipScale()
Returns decimal place count of one pip for the currency pair
>> double getPipValue()
Returns value of one pip for this currency pair
Instrumentは通貨ペアを保持する列挙型です。
> public Instrument instrument = Instrument.USDJPY;
また、MQLとは違ってJavaの列挙型はクラスなので、メソッドを持っていたりします。
利食い/損切りをpipsで指定している場合、
> double takeProfitPips = 100.0;
> double takeProfitValue = takeProfitPips * instrument.getPipValue();
とすれば計算出来るので便利です。
うん、便利なのですが・・・
注文時のレート指定に有効桁数以上の数値が含まれる場合、エラーになることがあります。(MT4/MQLと同じですね)
例えばUSDJPYの場合、配信レートの小数部有効桁数は3桁です。
USDJPYの注文時に、例えば2進数演算の影響で 113.33300000001 など小数部が多くなったレートを指定するとサーバーがエラーを返す事があるので、有効桁数の丸め処理が必要になります。(MQLのNormalizeDouble関数相当)
しかし、USDJPYのinstrument.getPipScale()は2を返しますので、有効桁数としては使えません。
どこを探しても、小数部有効桁数を取得するメソッドがInstrumentにありません…
一応、インターフェースIFinancialInstrumentにgetTickScale()というメソッドが用意されているのですが、Instrumentから取得出来ないのは納得いかないです。
それに、IFinancialInstrumentをInstrumentにimplementsするとしても、結局メソッドは実装しなきゃならないし、、、面倒すぎる!
とりあえず試行錯誤したところ、IContextからIFinancialInstrumentProvider経由でIFinancialInstrumentへ繋げられるようなので、今はそれで我慢しています。
まぁ、気になると言えば、IContext.getFinancialInstrumentProvider()の説明が、
> NOTE: Under development
となっている所ですかね。知らんがなw
これで、MQLのDigits()相当の関数は実装できることが分かったのですが、ストラテジー実装までの道程は長いなぁ…
ソースコート(onStartして終わるストラテジー)

実行結果

※小数部の有効桁数を導き出すのに、
> instrument.getPipScale() + 1;
としているソースコートも見掛けました。
FXのストラテジーとしては、この実装でも問題なさそうです。
https://www.dukascopy.com/client/javadoc/
> Enum Instrument
>> int getPipScale()
Returns decimal place count of one pip for the currency pair
>> double getPipValue()
Returns value of one pip for this currency pair
Instrumentは通貨ペアを保持する列挙型です。
> public Instrument instrument = Instrument.USDJPY;
また、MQLとは違ってJavaの列挙型はクラスなので、メソッドを持っていたりします。
利食い/損切りをpipsで指定している場合、
> double takeProfitPips = 100.0;
> double takeProfitValue = takeProfitPips * instrument.getPipValue();
とすれば計算出来るので便利です。
うん、便利なのですが・・・
注文時のレート指定に有効桁数以上の数値が含まれる場合、エラーになることがあります。(MT4/MQLと同じですね)
例えばUSDJPYの場合、配信レートの小数部有効桁数は3桁です。
USDJPYの注文時に、例えば2進数演算の影響で 113.33300000001 など小数部が多くなったレートを指定するとサーバーがエラーを返す事があるので、有効桁数の丸め処理が必要になります。(MQLのNormalizeDouble関数相当)
しかし、USDJPYのinstrument.getPipScale()は2を返しますので、有効桁数としては使えません。
どこを探しても、小数部有効桁数を取得するメソッドがInstrumentにありません…
一応、インターフェースIFinancialInstrumentにgetTickScale()というメソッドが用意されているのですが、Instrumentから取得出来ないのは納得いかないです。
それに、IFinancialInstrumentをInstrumentにimplementsするとしても、結局メソッドは実装しなきゃならないし、、、面倒すぎる!
とりあえず試行錯誤したところ、IContextからIFinancialInstrumentProvider経由でIFinancialInstrumentへ繋げられるようなので、今はそれで我慢しています。
まぁ、気になると言えば、IContext.getFinancialInstrumentProvider()の説明が、
> NOTE: Under development
となっている所ですかね。知らんがなw
これで、MQLのDigits()相当の関数は実装できることが分かったのですが、ストラテジー実装までの道程は長いなぁ…
ソースコート(onStartして終わるストラテジー)

実行結果

※小数部の有効桁数を導き出すのに、
> instrument.getPipScale() + 1;
としているソースコートも見掛けました。
FXのストラテジーとしては、この実装でも問題なさそうです。
テーマ : FX(外国為替証拠金取引)
ジャンル : 株式・投資・マネー