在Forex Tester中,用户需要修改策略参数,例如,该策略应该在哪种货币上起作用,或者它应该对订单使用什么止损等。
可以使用以下8种类型参数:
ot_Longword - unsigned integer, 0..4294967295
ot_Integer - signed integer, -2147483648..2147483647
ot_Double - double, 5.0 x 10^-324 .. 1.7 x 10^308
ot_String - text string
ot_Boolean - true/false
ot_EnumType - you can define list of strings for this parameter, internal value will be position in this list 0...N-1
ot_Timeframe - this parameter represents available timeframes PERIOD_M1..PERIOD_W1
ot_Currency - this parameter contains currency name and will allow you to choose currency from currency list in dialog
在初始化函数InitStrategy中我们就应该定义参数,可以分为以下5步:
RegOption - 创建新参数
AddSeparator - 添加参数分隔符(可以理解一组参数的小标题 )
AddOptionValue - 添加到下拉列表的枚举值.
SetOptionRange - 检查输入的正确值,可以设置范围。 仅适用于 longword、integer 和 double 类型的参数。
SetOptionDigits - 定义对话框中小数点位数(仅对double类型有效)
首先我们需要定义一个变量来存放参数:
var
Delta: double = 3.46;
该参数将在第一次启动时初始化为3.46,之后这个值将自动存储在这个策略的ini文件中。
和一些额外的字符串在InitStrategy过程:
RegOption('Delta', ot_Double, Delta); // 创建参数(名称,类型,选项)
SetOptionRange('Delta', 0, 100); //定义参数范围0-100
SetOptionDigits('Delta', 2); //参数小数点后最多2位
全部代码如下:
library DemoStrategy;
uses
SysUtils, StrategyInterfaceUnit, TechnicalFunctions;
// 外部参数
var
Delta: double = 3.46;
procedure InitStrategy; stdcall;
begin
StrategyShortName('DemoStrategy'); //策略名
StrategyDescription('Demo strategy that does nothing'); //策略简短描述
RegOption('Delta', ot_Double, Delta); // 创建参数(名称,类型,选项)
SetOptionRange('Delta', 0, 100); //定义参数范围0-100
SetOptionDigits('Delta', 2); //参数小数点后最多2位
end;
procedure DoneStrategy; stdcall;
begin
end;
procedure ResetStrategy; stdcall;
begin
end;
procedure GetSingleTick; stdcall;
begin
end;
exports
InitStrategy,
DoneStrategy,
ResetStrategy,
GetSingleTick;
end.
你也可以省略掉SetOptionRange和SetOptionDigits,这种情况下将不控制范围并默认使用小数点后两位,不过为了出幺蛾子,还是严谨点写上为好.
加载到ForexTester之后的界面如下:
让我们添加更多简单的参数:
StopLoss: integer = 20;
Days: longword = 7;
UseStopLoss: boolean = true;
RegOption('StopLoss', ot_Integer, StopLoss);
RegOption('Days', ot_Longword, Days);
RegOption('UseStopLoss', ot_Boolean, UseStopLoss);
添加完成之后,我们将看到:
下面实例展示使用 AddSeparator 之间添加分隔符。
首先是枚举, 它的内部表示是整数:
List: integer = 0;
在InitStrategy过程中,我们将添加这样的行:
RegOption('List', ot_EnumType, List);
AddOptionValue('List', 'string 1');
AddOptionValue('List', 'string 2');
AddOptionValue('List', 'string 3');
List := 1;
这里我们创建了3个字符串的下拉列表'string 1'..'string 1',设置默认值为字符串2。(因为我们从0开始计数)见下图:
完整的代码如下:
library DemoStrategy;
uses
SysUtils, StrategyInterfaceUnit, TechnicalFunctions;
// 外部参数
var
Delta: double = 3.46;
StopLoss: integer = 20;
Day: longword = 7;
UseStopLoss: boolean = true;
List: Integer = 0;
procedure InitStrategy; stdcall;
begin
StrategyShortName('DemoStrategy'); //策略名
StrategyDescription('Demo strategy that does nothing'); //策略简短描述
RegOption('Delta', ot_Double, Delta); // 创建参数(名称,类型,选项)
RegOption('止损', ot_Integer, StopLoss); // 创建参数(名称,类型,选项)
RegOption('天数', ot_Longword, Day); // 创建参数(名称,类型,选项)
RegOption('是否', ot_Boolean, UseStopLoss); // 创建参数(名称,类型,选项)
AddSeparator('分隔符');
RegOption('列表', ot_EnumType, List);
AddOptionValue('列表', '选项1');
AddOptionValue('列表', '选项2');
AddOptionValue('列表', '选项3');
SetOptionRange('Delta', 0, 100); //定义参数范围0-100
SetOptionDigits('Delta', 2); //参数小数点后最多2位
end;
procedure DoneStrategy; stdcall;
begin
end;
procedure ResetStrategy; stdcall;
begin
end;
procedure GetSingleTick; stdcall;
begin
end;
exports
InitStrategy,
DoneStrategy,
ResetStrategy,
GetSingleTick;
end.