独自のキューブを作成する

ダイアグラムからキューブを作成する場合と同様に、F# コードに基づいて独自のキューブを作成できます。このようなキューブは、ダイアグラムから作成したキューブよりも高機能になります。

コードからキューブを作成するには、独自要素 フォルダー内に作成する必要があります。

Designer_Source_Code_Elem_00

以下の例では、キューブは DiagramExternalElement クラスを継承し、次のようになります。

/// <summary>
/// 入力ソケットと出力ソケットの使用方法を示すサンプルダイアグラム要素です。
///
/// 詳細:
/// https://doc.stocksharp.com/topics/designer/strategies/using_code/fsharp/creating_your_own_cube.html
/// </summary>
type EmptyDiagramElement() as this =
	inherit DiagramExternalElement()

	// パラメーターの作成方法を示すプロパティの例です。
	let minValueParam =
		this.AddParam<int>("MinValue", 10)
			.SetBasic(true)  // パラメーターを basic モードで表示します。
			.SetDisplay("パラメーター", "最小値", "最小値パラメーターの説明", 10)

	// 出力ソケットは DiagramExternal 属性でマークされたイベントです。
	let output1Event = new Event<Unit>()
	let output2Event = new Event<Unit>()

	[<CLIEvent>]
	[<DiagramExternal>]
	member this.Output1 = output1Event.Publish

	[<CLIEvent>]
	[<DiagramExternal>]
	member this.Output2 = output2Event.Publish

	// 新しい引数を受信するたびに Process メソッドを呼び出したい場合は、
	// 次のプロパティをコメント解除します。
	// (すべての入力引数を受信するまで待つ必要はありません)。
	//
	// this.WaitAllInput をオーバーライド
	//     with get () = false

	// 入力ソケットは DiagramExternal 属性でマークされたメソッドパラメーターです。

	[<DiagramExternal>]
	member this.Process(candle: CandleMessage, diff: Unit) =
		let res = candle.ClosePrice + diff

		if diff >= minValueParam.Value then
			// 最初の出力イベントをトリガーします。
			output1Event.Trigger(res)
		else
			// 2 番目の出力イベントをトリガーします。
			output2Event.Trigger(res)

	override this.Start() =
		base.Start()
		// 必要に応じて開始前のロジックを追加します。

	override this.Stop() =
		base.Stop()
		// 必要に応じて停止後のロジックを追加します。

	override this.Reset() =
		base.Reset()
		// 必要に応じて内部状態をリセットするロジックを追加します。

このコードでは、キューブに 2 つの入力ソケットと 2 つの出力ソケットがあります。入力ソケットは、メソッドに DiagramExternalAttribute 属性を適用することで定義されます。

[<DiagramExternal>]
member this.Process(candle: CandleMessage, diff: Unit) =

出力ソケットは、イベントに属性を適用することで定義されます。キューブの例では、このようなイベントが 2 つあります。

let output1Event = new Event<Unit>()
let output2Event = new Event<Unit>()

[<CLIEvent>]
[<DiagramExternal>]
member this.Output1 = output1Event.Publish

[<CLIEvent>]
[<DiagramExternal>]
member this.Output2 = output2Event.Publish

したがって、出力ソケットも 2 つになります。

さらに、キューブのプロパティを作成する方法を示しています。

let minValueParam =
	this.AddParam<int>("MinValue", 10)
		.SetBasic(true)  // パラメーターを basic モードで表示します。
		.SetDisplay("パラメーター", "最小値", "最小値パラメーターの説明", 10)

DiagramElementParam クラスを使用すると、設定を保存および復元する方法が自動的に利用されます。

最小値 プロパティは基本プロパティとしてマークされており、基本プロパティ モードで表示されます。

コメントアウトされている WaitAllInput プロパティは、入力ソケットを持つメソッド呼び出しのタイミングを担います。

// this.WaitAllInput をオーバーライド
//     with get () = false

コメント解除すると、少なくとも 1 つの値が到着した時点で、プロセス メソッドが常に呼び出されます (この例では、ローソク足または数値のいずれかです)。

作成されたキューブをダイアグラムに追加するには、パレットの 独自要素 セクションで作成したキューブを選択する必要があります。

Designer_Source_Code_Elem_01

Warning

F# コードのキューブは、F# コードで作成されたストラテジーでは使用できません。キューブから作成されたストラテジーでのみ使用できます。

関連項目

インジケーターの作成