如何为活跃交易品种面板创建插件 VIDEO
插件使得在 活跃交易品种面板 (ASP) 中创建包含网页或其他 WebView 组件、计算器、分析或数据板、AI 工具等的新部分变得容易。
在本文及其对应的视频中,我们将向您展示如何使用插件在活跃交易品种面板中添加新部分。
创建插件 创建 WebView 部分 转到 Algo 应用程序并导航到 Plugins 选项卡。 点击新建 按钮以创建新插件。 勾选 From the list 选项并选择 ASP Section Example 。 为您的插件命名,例如“My ASP Example”。
点击 Create 按钮。
当代码编辑器出现时,将代码中的“My title”部分替换为您为插件选择的名称。
var block = Asp . SymbolTab . AddBlock ( "My ASP Example" );
您可以复制以下完整代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 using cAlgo.API ;
namespace cAlgo.Plugins
{
[Plugin(AccessRights = AccessRights.None)]
public class MyASPExample : Plugin
{
protected override void OnStart ()
{
var block = Asp . SymbolTab . AddBlock ( "My ASP Example" );
block . Index = 2 ;
block . Height = 500 ;
block . IsExpanded = true ;
var webView = new WebView ();
block . Child = webView ;
webView . NavigateAsync ( "https://ctrader.com/" );
}
}
}
点击 Build 按钮或按 Ctrl + B 构建插件。
再次导航到 Trade 应用程序,查看插件在 活跃交易品种面板 中显示的内容。 在我们的案例中,我们现在有一个显示 cTrader 论坛的 WebView 组件。
创建 VWAP 框 在此示例中,我们将用显示当前未平仓头寸的成交量加权平均价 (VWAP) 的框替换 WebView。
返回插件代码并删除 WebView 部分。
将块高度设置为 100。
定义两个将显示相关信息的文本框。
TextBlock _txtBuyVWAP ;
TextBlock _txtSellVWAP ;
为文本框添加一个面板。
var panel = new StackPanel
{
Orientation = Orientation . Vertical
};
初始化两个文本框。
_txtBuyVWAP = new TextBlock
{
Text = "Buy Text Box"
};
_txtSellVWAP = new TextBlock
{
Text = "Sell Text Box"
};
将文本框添加到面板中,并使面板成为插件块的子控件。
panel . AddChild ( _txtBuyVWAP );
panel . AddChild ( _txtSellVWAP );
block . Child = panel ;
您可以复制以下完整代码:
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 using cAlgo.API ;
namespace cAlgo.Plugins
{
[Plugin(AccessRights = AccessRights.None)]
public class MyASPExample : Plugin
{
TextBlock _txtBuyVWAP ;
TextBlock _txtSellVWAP ;
protected override void OnStart ()
{
var block = Asp . SymbolTab . AddBlock ( "ASP Section Example" );
block . Index = 2 ;
block . Height = 100 ;
block . IsExpanded = true ;
var panel = new StackPanel
{
Orientation = Orientation . Vertical
};
_txtBuyVWAP = new TextBlock
{
Text = "Buy Text Box"
};
_txtSellVWAP = new TextBlock
{
Text = "Sell Text Box"
};
panel . AddChild ( _txtBuyVWAP );
panel . AddChild ( _txtSellVWAP );
block . Child = panel ;
}
}
}
构建插件,然后转到 Trade 应用程序。
您应该看到两个文本框代替了 WebView 组件。
优化插件 为插件添加逻辑 转到插件代码并添加以下命名空间:
using System ;
using System.Linq ;
实现计算买入和卖出方向 VWAP 的逻辑。
var buyPositions = Positions . Where ( p => p . TradeType == TradeType . Buy );
_txtBuyVWAP . Text = "Buy Positions VWAF: " + Math . Round (( buyPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / buyPositions . Sum ( p => p . VolumeInUnits )), 5 );
var sellPositions = Positions . Where ( p => p . TradeType == TradeType . Sell );
_txtSellVWAP . Text = "Sell Positions VWAF: " + Math . Round (( sellPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / sellPositions . Sum ( p => p . VolumeInUnits )), 5 );
添加一个事件来处理开仓,确保在添加新头寸时 VWAP 数字自动更新。
Positions . Opened += Positions_Opened ;
private void Positions_Opened ( PositionOpenedEventArgs obj )
{
var buyPositions = Positions . Where ( p => p . TradeType == TradeType . Buy );
_txtBuyVWAP . Text = "Buy Positions VWAP: " + ( buyPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / buyPositions . Sum ( p => p . VolumeInUnits ));
var sellPositions = Positions . Where ( p => p . TradeType == TradeType . Sell );
_txtSellVWAP . Text = "Sell Positions VWAP: " + ( sellPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / sellPositions . Sum ( p => p . VolumeInUnits ));
}
您可以复制以下完整代码:
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 using System ;
using System.Linq ;
using cAlgo.API ;
namespace cAlgo.Plugins
{
[Plugin(AccessRights = AccessRights.None)]
public class MyASPExample : Plugin
{
TextBlock _txtBuyVWAP ;
TextBlock _txtSellVWAP ;
protected override void OnStart ()
{
var block = Asp . SymbolTab . AddBlock ( "ASP Section Example" );
block . Index = 2 ;
block . Height = 100 ;
block . IsExpanded = true ;
var panel = new StackPanel
{
Orientation = Orientation . Vertical
};
_txtBuyVWAP = new TextBlock
{
Text = "Buy Text Box"
};
_txtSellVWAP = new TextBlock
{
Text = "Sell Text Box"
};
panel . AddChild ( _txtBuyVWAP );
panel . AddChild ( _txtSellVWAP );
block . Child = panel ;
var buyPositions = Positions . Where ( p => p . TradeType == TradeType . Buy );
_txtBuyVWAP . Text = "Buy Positions VWAF: " + Math . Round (( buyPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / buyPositions . Sum ( p => p . VolumeInUnits )), 5 );
var sellPositions = Positions . Where ( p => p . TradeType == TradeType . Sell );
_txtSellVWAP . Text = "Sell Positions VWAF: " + Math . Round (( sellPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / sellPositions . Sum ( p => p . VolumeInUnits )), 5 );
Positions . Opened += Positions_Opened ;
}
private void Positions_Opened ( PositionOpenedEventArgs obj )
{
var buyPositions = Positions . Where ( p => p . TradeType == TradeType . Buy );
_txtBuyVWAP . Text = "Buy Positions VWAP: " + ( buyPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / buyPositions . Sum ( p => p . VolumeInUnits ));
var sellPositions = Positions . Where ( p => p . TradeType == TradeType . Sell );
_txtSellVWAP . Text = "Sell Positions VWAP: " + ( sellPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / sellPositions . Sum ( p => p . VolumeInUnits ));
}
}
}
再次构建插件并转到 Trade 应用程序。 现在,当您添加新的买入和卖出头寸时,您应该看到 VWAP 自动更新。
为插件添加样式 我们可以为 VWAP 框添加一些样式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 var textBoxStyle = new Style ();
textBoxStyle . Set ( ControlProperty . Margin , 5 );
textBoxStyle . Set ( ControlProperty . FontFamily , "Cambria" );
textBoxStyle . Set ( ControlProperty . FontSize , 16 );
textBoxStyle . Set ( ControlProperty . Width , 200 );
textBoxStyle . Set ( ControlProperty . ForegroundColor , Color . Yellow , ControlState . Hover );
_txtBuyVWAP = new TextBlock
{
ForegroundColor = Color . Green ,
Text = "Buy Text Box " ,
Style = textBoxStyle
};
_txtSellVWAP = new TextBlock
{
ForegroundColor = Color . Red ,
Text = "Sell Text Box" ,
Style = textBoxStyle
};
您可以复制以下完整代码:
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 using System ;
using System.Linq ;
using cAlgo.API ;
namespace cAlgo.Plugins
{
[Plugin(AccessRights = AccessRights.None)]
public class MyASPExample : Plugin
{
TextBlock _txtBuyVWAP ;
TextBlock _txtSellVWAP ;
protected override void OnStart ()
{
var block = Asp . SymbolTab . AddBlock ( "ASP Section Example" );
block . Index = 2 ;
block . Height = 100 ;
block . IsExpanded = true ;
var panel = new StackPanel
{
Orientation = Orientation . Vertical
};
var textBoxStyle = new Style ();
textBoxStyle . Set ( ControlProperty . Margin , 5 );
textBoxStyle . Set ( ControlProperty . FontFamily , "Cambria" );
textBoxStyle . Set ( ControlProperty . FontSize , 16 );
textBoxStyle . Set ( ControlProperty . Width , 200 );
textBoxStyle . Set ( ControlProperty . ForegroundColor , Color . Yellow , ControlState . Hover );
_txtBuyVWAP = new TextBlock
{
ForegroundColor = Color . Green ,
Text = "Buy Text Box " ,
Style = textBoxStyle
};
_txtSellVWAP = new TextBlock
{
ForegroundColor = Color . Red ,
Text = "Sell Text Box" ,
Style = textBoxStyle
};
panel . AddChild ( _txtBuyVWAP );
panel . AddChild ( _txtSellVWAP );
block . Child = panel ;
var buyPositions = Positions . Where ( p => p . TradeType == TradeType . Buy );
_txtBuyVWAP . Text = "Buy Positions VWAF: " + Math . Round (( buyPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / buyPositions . Sum ( p => p . VolumeInUnits )), 5 );
var sellPositions = Positions . Where ( p => p . TradeType == TradeType . Sell );
_txtSellVWAP . Text = "Sell Positions VWAF: " + Math . Round (( sellPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / sellPositions . Sum ( p => p . VolumeInUnits )), 5 );
Positions . Opened += Positions_Opened ;
}
private void Positions_Opened ( PositionOpenedEventArgs obj )
{
var buyPositions = Positions . Where ( p => p . TradeType == TradeType . Buy );
_txtBuyVWAP . Text = "Buy Positions VWAP: " + ( buyPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / buyPositions . Sum ( p => p . VolumeInUnits ));
var sellPositions = Positions . Where ( p => p . TradeType == TradeType . Sell );
_txtSellVWAP . Text = "Sell Positions VWAP: " + ( sellPositions . Sum ( p => p . EntryPrice * p . VolumeInUnits ) / sellPositions . Sum ( p => p . VolumeInUnits ));
}
}
}
再次构建插件。
最后,转到 交易 应用程序,查看样式如何改变了 VWAP 框。
总结 我们希望本文能帮助您了解如何将网页、WebView 组件、文本块和其他有用的对象添加到“活跃品种面板”。