今回は、ユーザーがプログラムの外から変数の中身を設定可能な外部パラメーターをストラテジーで使用する方法を解説します。
外部パラメーターを定義しておけば、ライブトレードやバックテストでストラテジーを開始する前にパラメーター定義ダイアログが表示され、プログラムを変更することなくストラテジーの挙動を変更することができます。
また、ストラテジーの最適化を行う際はこの外部パラメーターを使用して行うことになります。
外部パラメーターの定義方法
ユーザーが後から変更可能な外部パラメーターを使用するには、publicで宣言したメンバ変数の直前に「@Configurable」表記で注釈をつけます。
@Configurableの後ろにはカッコと二重引用符を使用してパラメーター名を定義します。
1 2 3 4 |
public class Strategy implements IStrategy { @Configurable("通貨ペア名") public Instrument instrument = Instrument.EURUSD; |
上のコードのようにInstrument型を外部パラメーターに指定すると、通貨ペア名を選択可能なドロップダウンリストを表示できます。
デフォルト値として、「EURUSD」を指定しているので、ストラテジー実行直後に表示されるダイアログは下記のようになります。
「@Configurable」の指定で、下記のようにvalueやdescription、obligatory 等を指定すれば、パラメーター名の設定だけではなく、パラメーターの説明文を指定したり、必須パラメーターとして指定することもできます。
valueにはパラメーター名を、descriptionにはパラメーターの説明文を設定します。
また、obligatoryにtrueを指定するとパラメーターを必須パラメーターにすることができます。
1 2 3 4 |
public class Strategy implements IStrategy { @Configurable(value ="通貨ペア名", description = "ツールチップで説明文を表示", obligatory = true) public Instrument instrument; |
上のコードでストラテジーを実行すると下記のダイアログが表示されます。
valueで指定した文字列「通貨ペア名」がパラメーター名として表示され、descriptionで設定した文字列が、パラメーター名の上にマウスカーソルを乗せた際に表示されるツールチップ内に表示されます。
今回は、外部パラメーターを初期化していないので通貨ペア名のリストボックスは空白となっています。
obligatoryをtrueに設定したため、通貨ペア名のリストボックスが空白のまま「起動」ボタンを押した場合、下記のように必須パラメーターが設定されてないというエラーダイアログが表示されます。
「@Configurable」の指定で「readonly」をtrueに設定すると、変更不可能な外部パラメーターとして定義できます。
ユーザーに設定情報は見せたいけれど変更はさせたくない場合等に使用します。
例えば、ストラテジーのタイムフレームとしては15分足を使用しますとユーザーに明示だけしたい場合は以下のように記述できます。
1 2 3 4 |
public class Strategy implements IStrategy { @Configurable(value = "タイムフレーム", readOnly = true) public Period selectedPeriod = Period.FIFTEEN_MINS; |
readOnlyにtrueを指定しているため、パラメーター定義ダイアログではタイムフレーム値は変更できなくなります。
数値を外部パラメーターにすると、パラメーター定義ダイアログには上下ボタン付き数値入力コントロールが表示されます。
「@Configurable」の指定で「stepsize」を設定すると、数値入力コントロールの上下ボタンを押した際の変動量を指定できます。
stepsizeを指定しなければ上下ボタンを押した際に1ずつ変動しますが、以下のように記述すれば、0.01ずつ変動させることができます。
1 2 3 4 |
public class Strategy implements IStrategy { @Configurable(value = "取引数量" , stepSize = 0.01) public double amount = 0.01; |
サポートしているパラメータータイプ
以下は、JForexでサポートされているパラメーターのタイプ一覧です。
パラメータータイプ | Java言語での型 | パラメーター定義ダイアログ上のコントロール |
数値 | int, double, short, long, Integer, Double, Short, Long | 上下ボタン付き数値入力コントロール |
ブーリアン(真理値) | boolean, Boolean | チェックボックス |
文字 | String | テキストボックス |
ファイル | java.util.File | ファイルパス選択機能付きテキストフィールド |
日付 | java.util.Calendar, java.util.Date, long and Long with Configurable.datetimeAsLong = true | 日付選択ボックス |
色 | java.util.Color | 色選択コントロール |
列挙 | any enum or Enum or a class containing self-typed public static final fields | 単一選択コンボボックス |
コレクション | java.util.Collection of any enum or Enum or a class containing self-typed public static final fields | 複数選択ダイアログ |
IFeedDescriptor | IFeedDescriptor implementations from com.dukascopy.api.feed.util | Data feed選択ダイアログ |
サポートしているパラメータータイプを全部使ってみるとこんな感じになります。
ソースは以下です。黄色くハイライトさせた部分がスケルトンコードへ追記した箇所です。
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
package jforex; import java.util.*; import com.dukascopy.api.*; import com.dukascopy.api.feed.IFeedDescriptor; import com.dukascopy.api.feed.util.RenkoFeedDescriptor; import java.io.File; import java.awt.Color; public class Strategy implements IStrategy { @Configurable("数値") public int intParam = 2; @Configurable("ブーリアン") public boolean boolParam = true; @Configurable("文字") public String textParam = "テキスト"; @Configurable("ファイル") public File file = new File(""); @Configurable("日付") public Calendar currentTime = Calendar.getInstance(); @Configurable("色") public Color color = new Color(255, 0, 0); @Configurable("列挙") public Instrument instrument = Instrument.EURUSD; @Configurable("コレクション") public Set<Instrument> instruments = new HashSet<Instrument>( Arrays.asList(new Instrument[] {Instrument.EURUSD, Instrument.AUDCAD}) ); @Configurable("IFeedDescriptor") public IFeedDescriptor renkoFeedDescriptor = new RenkoFeedDescriptor(Instrument.EURUSD, PriceRange.TWO_PIPS, OfferSide.ASK); private IEngine engine; private IConsole console; private IHistory history; private IContext context; private IIndicators indicators; private IUserInterface userInterface; public void onStart(IContext context) throws JFException { this.engine = context.getEngine(); this.console = context.getConsole(); this.history = context.getHistory(); this.context = context; this.indicators = context.getIndicators(); this.userInterface = context.getUserInterface(); } public void onAccount(IAccount account) throws JFException { } public void onMessage(IMessage message) throws JFException { } public void onStop() throws JFException { } public void onTick(Instrument instrument, ITick tick) throws JFException { } public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException { } } |
日付に特定の日を設定する
外部パラメーターで日付を扱う際、初期値として特定の日をセットしたい時があります。
Calenderオブジェクトは日付を初期化するコンストラクタがないため、特定日時をセットするには、静的初期化ブロックを用いてオブジェクトを初期化します。
外部パラメータとして使用するカレンダー型変数に初期化したオブジェクトをコピーすれば、設定した初期値をパラメーター定義ダイアログに表示できます。
1 2 3 4 5 6 7 |
private static Calendar myCalendar; static{ myCalendar = Calendar.getInstance(); myCalendar.set(2016,Calendar.MAY,1,16,30,30); } @Configurable("日時") public Calendar particularTime = myCalendar; |
実行すると以下のように初期化した値で表示されます。
日時をミリ秒で指定する方法もあります。
ミリ秒指定を使用するには、ミリ秒値を格納するlong型変数を定義し、@Configurableのパラメータに「datetimeAsLong = true」を記述します。
以下は当日の21時をデフォルト値として表示させる例です。
カレンダーオブジェクトを初期化し、カレンダーオブジェクトのgetTimeInMilis関数でミリ秒を取得して、long型の変数に格納しています。
1 2 3 4 5 6 7 8 9 |
private static Calendar calTodayAt21pm; static { calTodayAt21pm = Calendar.getInstance(); calTodayAt21pm.set(Calendar.HOUR_OF_DAY, 21); calTodayAt21pm.set(Calendar.MINUTE, 0); calTodayAt21pm.set(Calendar.SECOND, 0); } @Configurable(value="日時", datetimeAsLong=true) public long timeInMillis = calTodayAt21pm.getTimeInMillis(); |
実行するとこうなります。
まとめ
今回は、外部パラメーターの定義方法について解説しました。
コメント