﻿<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.hs633.com:8080/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.hs633.com:8080/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=John</id>
		<title>tradeStar帮助系统 - 用户贡献 [zh-cn]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.hs633.com:8080/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=John"/>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/John"/>
		<updated>2026-04-05T10:40:32Z</updated>
		<subtitle>用户贡献</subtitle>
		<generator>MediaWiki 1.19.1</generator>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83</id>
		<title>自由DLL接口规范</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83"/>
				<updated>2016-11-14T06:54:14Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 返回值类型 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=简介=&lt;br /&gt;
相比传统DLL接口(飞狐接口），自由DLL接口的特点是参数更加灵活，由用户指定传入的参数，参数类型是c/c++的标准数据类型。&lt;br /&gt;
&lt;br /&gt;
传统DLL必须引入一个CalcInfo的结构化参数，通过它来传入行情数据，这种设计的好处是用户操心得少一些，因为数据总是有的，不利之处是限制了发挥，难以返回多个序列结果，难以接入没有按接口要求编写的DLL。&lt;br /&gt;
&lt;br /&gt;
自由DLL接口，不再传入CalcInfo参数，取而代之的是，用户必须自己负责传入所有的数据。获得的回报是，&lt;br /&gt;
&lt;br /&gt;
1.支持任意多的参数。&lt;br /&gt;
&lt;br /&gt;
2.支持引用参数，也就是说，可以改变参数的值并返回给公式系统。&lt;br /&gt;
&lt;br /&gt;
3.更灵活的参数传递。例如，可以根据需要传入地址，也可以传入值。&lt;br /&gt;
&lt;br /&gt;
4.支持逐根的计算。每次只计算一根的值并返回单值。自由DLL只能在逐根模式下运行。&lt;br /&gt;
&lt;br /&gt;
与传统接口DLL一样，自由接口DLL也必须放置在FmlDLL目录下。&lt;br /&gt;
&lt;br /&gt;
=自由DLL声明=&lt;br /&gt;
&lt;br /&gt;
为了让公式系统知道DLL的参数格式，调用前需要使用extern语句进行声明&lt;br /&gt;
&lt;br /&gt;
 extern 返回值类型 函数名(参数类型1, 参数类型2...);&lt;br /&gt;
&lt;br /&gt;
参数的个数没有限制&lt;br /&gt;
&lt;br /&gt;
=参数类型=&lt;br /&gt;
&lt;br /&gt;
传入DLL的参数有类型限制，目前支持的C类型包括&lt;br /&gt;
float, double, int,BOOL, LONG, DWORD, float*, LPCWSTR等&lt;br /&gt;
不支持double *&lt;br /&gt;
&lt;br /&gt;
=返回值类型=&lt;br /&gt;
&lt;br /&gt;
函数可以返回 int, float, char, bool 等类型，或无返回。&lt;br /&gt;
&lt;br /&gt;
若要在DLL内修改一条序列或者修改整个数组，可以通过传序列参数或数组参数的方法，在DLL里面赋值。DLL 里面都使用 float * 来接收参数。&lt;br /&gt;
&lt;br /&gt;
=自由DLL接口的调用=&lt;br /&gt;
&lt;br /&gt;
*声明过的函数，可以通过函数名直接调用，无需通过&amp;quot;DLLName@FuncName&amp;quot;格式或RefDLL使用。&lt;br /&gt;
&lt;br /&gt;
*使用时必须将DLL放在软件安装目录下的FmlDll子目录下&lt;br /&gt;
&lt;br /&gt;
*字符串使用单引号，双引号是另一种格式的引用，不能混用&lt;br /&gt;
&lt;br /&gt;
*DLL 需要在 .def 文件中 EXPORTS 项添加要调用的函数，否则有可能找不到函数&lt;br /&gt;
&lt;br /&gt;
*DLL名称和函数名都是大小写敏感的，代码声明和公式调用时需要匹配。&lt;br /&gt;
&lt;br /&gt;
=DLL公式参数传递例子=&lt;br /&gt;
&lt;br /&gt;
*无参数时的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test1();&lt;br /&gt;
 test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test1()&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入单值的公式例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test2(int, float, bool, char);&lt;br /&gt;
 Variables:&lt;br /&gt;
  NumericSimple var1,&lt;br /&gt;
  NumericSeries var2,&lt;br /&gt;
  NumericArray var3[10];&lt;br /&gt;
 &lt;br /&gt;
 var1 := 1;&lt;br /&gt;
 var2[0] := 2;&lt;br /&gt;
 var3[0] := 65;&lt;br /&gt;
 &lt;br /&gt;
 test2(1, 2, 1, 65);&lt;br /&gt;
 test2(var1, var2[0], var1, var3[0]);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c)&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入字符串的公式例子&lt;br /&gt;
&lt;br /&gt;
公式里面的字符串变量是宽字符，编码是GB2312,DLL里面可以使用MultiByteToWideChar/MultiByteToWideChar进行字符转换&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test3(LPCWSTR);&lt;br /&gt;
 Variables:&lt;br /&gt;
   String var1;&lt;br /&gt;
 &lt;br /&gt;
 var1 := 'test string1';&lt;br /&gt;
 &lt;br /&gt;
 test3(NumToStr(close,3));&lt;br /&gt;
 test3('aaa');&lt;br /&gt;
 test3(var1);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test3(const wchar_t* p);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 #include &amp;lt;string&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 // 窄字符转宽字符&lt;br /&gt;
 static std::wstring a2w(LPCSTR lpa)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = MultiByteToWideChar(936, 0, lpa, -1, NULL, 0);&lt;br /&gt;
 &lt;br /&gt;
 	std::wstring s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	MultiByteToWideChar(936, 0, lpa, (int)strlen(lpa), (LPWSTR)s.c_str(), (int)s.size());&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 宽字符转窄字符&lt;br /&gt;
 static std::string w2a(LPCWSTR lpw)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = WideCharToMultiByte(936, 0, lpw, -1, NULL, 0, NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	std::string s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	WideCharToMultiByte(936, 0, lpw, (int)wcslen(lpw), (LPSTR)s.c_str(), (int)s.size(), NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test3(const wchar_t *p)&lt;br /&gt;
 {&lt;br /&gt;
 	std::wstring sw = p; &lt;br /&gt;
 	std::string sa = w2a(sw.c_str());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入序列的公式例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test4(NumericSeries, int, NumericArray, int);&lt;br /&gt;
 Variables:&lt;br /&gt;
   NumericSeries var1,&lt;br /&gt;
   NumericArray var2[5];&lt;br /&gt;
 &lt;br /&gt;
 var1 := close;&lt;br /&gt;
 var2[1] := 1;&lt;br /&gt;
 var2[2] := 2;&lt;br /&gt;
 var2[3] := 3;&lt;br /&gt;
 var2[4] := 4;&lt;br /&gt;
 var2[5] := 5;&lt;br /&gt;
 &lt;br /&gt;
 //var2 数组实际大小是5+1&lt;br /&gt;
 test4(var1, BarsCount(close), var2, 6);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test4(float *pf1, int n1, float *pf2, int n2);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test4(float *pf1, int n1, float *pf2, int n2)&lt;br /&gt;
 {&lt;br /&gt;
 	&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入引用的公式例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test5(NumericRef);&lt;br /&gt;
 Variables:&lt;br /&gt;
   NumericSimple var1;&lt;br /&gt;
 &lt;br /&gt;
 var1 := 3;&lt;br /&gt;
 test5(var1);&lt;br /&gt;
 comment(var1);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test5(float *pf);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test5(float *pf)&lt;br /&gt;
 {&lt;br /&gt;
 	*pf = 9;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=DLL的返回值=&lt;br /&gt;
&lt;br /&gt;
新格式DLL可返回单值，序列和数组。单值类型大致分为两种：数值类型和字符串类型，可以通过函数返回值直接返回。&lt;br /&gt;
&lt;br /&gt;
*返回单值类型的c语言例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用例子&lt;br /&gt;
 extern 'FoxFunc.dll' int test6();&lt;br /&gt;
 extern 'FoxFunc.dll' float test7();&lt;br /&gt;
 extern 'FoxFunc.dll' LPCWSTR test8();&lt;br /&gt;
 &lt;br /&gt;
 k1: test6(),OwnerScale;&lt;br /&gt;
 k2: test7(),OwnerScale;&lt;br /&gt;
 comment(test8);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) int __stdcall test6();&lt;br /&gt;
 __declspec(dllexport) float __stdcall test7();&lt;br /&gt;
 __declspec(dllexport) wchar_t* __stdcall test8();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) int __stdcall test6()&lt;br /&gt;
 {&lt;br /&gt;
 	return 1;&lt;br /&gt;
 }&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) float __stdcall test7()&lt;br /&gt;
 {&lt;br /&gt;
 	return 0.5f;&lt;br /&gt;
 }&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) wchar_t* __stdcall test8()&lt;br /&gt;
 {&lt;br /&gt;
 	return L&amp;quot;test string 1&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*返回序列或数组&lt;br /&gt;
&lt;br /&gt;
若要返回序列或数组，则把需要返回的序列赋值目标当作参数传递给DLL，在DLL内部直接修改已达到赋值。&lt;br /&gt;
注意逐根运行模式下，每一根K线都会调用dll，所以通常每次调用只需要赋值比上一根K线新增加的类型，&lt;br /&gt;
例如计算收盘价均值时，每次在BarPos位置填入当根K线的均值即可。由此可见，这种应用下通常需要把&lt;br /&gt;
BarPos(当前是第几根K线)作为参数传入Dll中。返回序列和数组可以参考上面传入序列的公式例子。&lt;br /&gt;
&lt;br /&gt;
下面一个例子是在图形上输出当前是第几根K线的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式中的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test9(NumericSeries, int);&lt;br /&gt;
 &lt;br /&gt;
 MyIndi:0;&lt;br /&gt;
 test9(MyIndi, BarPos);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明文件&lt;br /&gt;
 __declspec(dllexport) void __stdcall test9(float *pf, int n);&lt;br /&gt;
&lt;br /&gt;
 // c+= .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test9(float *pf, int n)&lt;br /&gt;
 {&lt;br /&gt;
 	// 每根都会调用一次，所以每次只需赋值当前根&lt;br /&gt;
 	pf[n - 1] = n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=DLL的参数类型参考=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!-    类型  !!   公式 !!   DLL&lt;br /&gt;
|-&lt;br /&gt;
| 数值 || NumericSimple || float, int, char, bool&lt;br /&gt;
|-&lt;br /&gt;
| 字符串 || LPCWSTR || wchar_t*&lt;br /&gt;
|-&lt;br /&gt;
| 数值引用 || NumericRef || float*&lt;br /&gt;
|-&lt;br /&gt;
| 序列 || NumericSeries || float*&lt;br /&gt;
|-&lt;br /&gt;
| 数组 || NumericArray || float*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=无效数据表示=&lt;br /&gt;
公式系统使用std的无效浮点数表示无效值，浮点无效值的一个重要特征是 f != f 为真，可作为判断依据，&lt;br /&gt;
其它运算皆输出无效值，其它比较皆输出假。当序列作为指标输出时，开始和结束两段的无效值自动截除，不作为指标输出。&lt;br /&gt;
例如要输出5日均线，序列的前4个值可填充无效值（填充0时会使指标线变形）&lt;br /&gt;
 #include &amp;lt;limits&amp;gt;&lt;br /&gt;
 #define INVALID_NUMERIC std::numeric_limits&amp;lt;float&amp;gt;::quiet_NaN()&lt;br /&gt;
无效值在公式里可以用 Invalid 关键字指定，例如&lt;br /&gt;
 k1:Invalid;&lt;br /&gt;
则k1指标线不会输出&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=编写调用公式=&lt;br /&gt;
&lt;br /&gt;
=开发DLL的详细例子=&lt;br /&gt;
&lt;br /&gt;
=实例下载=&lt;br /&gt;
&lt;br /&gt;
[[Category:公式系统]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=调用Windows系统DLL=&lt;br /&gt;
调用win32提供的系统DLL，与调用自己编写的DLL是一样的。&lt;br /&gt;
&lt;br /&gt;
只要知道windows系统函数所属的DLL和函数名，参数等信息就可以直接使用，例如&lt;br /&gt;
&lt;br /&gt;
 extern 'kernel32.dll' int GetTickCount();&lt;br /&gt;
 tickcount:GetTickCount();&lt;br /&gt;
&lt;br /&gt;
=调用.Net DLL=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
跟一般DLL不同的是，.net DLL在声明时，除了函数名信息，还要提供命名空间、类名的信息，例如：&lt;br /&gt;
&lt;br /&gt;
  extern 'RzRq.dll' void RzRq.Grabber.GetFinance( LPCWSTR stockCode);&lt;br /&gt;
&lt;br /&gt;
这里的RzRq就是命名空间，而Grabber则是类的名称，GetFinance是函数名&lt;br /&gt;
&lt;br /&gt;
另外，在.net DLL中，除了可以用参数来传递数据，还可以使用GetVarData, SetVarData这两个函数在.net和公式引擎间交换数据。&lt;br /&gt;
&lt;br /&gt;
.net DLL开发过程如下：&amp;lt;br&amp;gt;&lt;br /&gt;
1. visual studio 新建一个类库 工程，用C#或者VB.net，Managed C++都可以，这里以C#为例&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:dotnet1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2.添加 金魔方 .net　api dll 引用，位置位于金魔方安装目录下 DotNetBridge.dll&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
3.新建或者修改 从 Formula 继承 一个类，Formula 是金魔方.net api的类，从此类继承可以访问 GetVarData等接口函数，需要用 fox.api 命名空间&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet4.png]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83</id>
		<title>自由DLL接口规范</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83"/>
				<updated>2016-11-14T06:51:05Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* DLL的参数类型 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=简介=&lt;br /&gt;
相比传统DLL接口(飞狐接口），自由DLL接口的特点是参数更加灵活，由用户指定传入的参数，参数类型是c/c++的标准数据类型。&lt;br /&gt;
&lt;br /&gt;
传统DLL必须引入一个CalcInfo的结构化参数，通过它来传入行情数据，这种设计的好处是用户操心得少一些，因为数据总是有的，不利之处是限制了发挥，难以返回多个序列结果，难以接入没有按接口要求编写的DLL。&lt;br /&gt;
&lt;br /&gt;
自由DLL接口，不再传入CalcInfo参数，取而代之的是，用户必须自己负责传入所有的数据。获得的回报是，&lt;br /&gt;
&lt;br /&gt;
1.支持任意多的参数。&lt;br /&gt;
&lt;br /&gt;
2.支持引用参数，也就是说，可以改变参数的值并返回给公式系统。&lt;br /&gt;
&lt;br /&gt;
3.更灵活的参数传递。例如，可以根据需要传入地址，也可以传入值。&lt;br /&gt;
&lt;br /&gt;
4.支持逐根的计算。每次只计算一根的值并返回单值。自由DLL只能在逐根模式下运行。&lt;br /&gt;
&lt;br /&gt;
与传统接口DLL一样，自由接口DLL也必须放置在FmlDLL目录下。&lt;br /&gt;
&lt;br /&gt;
=自由DLL声明=&lt;br /&gt;
&lt;br /&gt;
为了让公式系统知道DLL的参数格式，调用前需要使用extern语句进行声明&lt;br /&gt;
&lt;br /&gt;
 extern 返回值类型 函数名(参数类型1, 参数类型2...);&lt;br /&gt;
&lt;br /&gt;
参数的个数没有限制&lt;br /&gt;
&lt;br /&gt;
=参数类型=&lt;br /&gt;
&lt;br /&gt;
传入DLL的参数有类型限制，目前支持的C类型包括&lt;br /&gt;
float, double, int,BOOL, LONG, DWORD, float*, LPCWSTR等&lt;br /&gt;
不支持double *&lt;br /&gt;
&lt;br /&gt;
=返回值类型=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
公式中，有些类型的名字与C不同。&lt;br /&gt;
其中，float*，有可能是NumericRef，也可能是NumericSeries，还可以是NumericArray 。&lt;br /&gt;
但打算传入单值，并改变值返回，那么用NumericRef，如果打算传入序列那么用NumericSeries，如果传入数组，那么用NumericArray 。&lt;br /&gt;
&lt;br /&gt;
=自由DLL接口的调用=&lt;br /&gt;
&lt;br /&gt;
*声明过的函数，可以通过函数名直接调用，无需通过&amp;quot;DLLName@FuncName&amp;quot;格式或RefDLL使用。&lt;br /&gt;
&lt;br /&gt;
*使用时必须将DLL放在软件安装目录下的FmlDll子目录下&lt;br /&gt;
&lt;br /&gt;
*字符串使用单引号，双引号是另一种格式的引用，不能混用&lt;br /&gt;
&lt;br /&gt;
*DLL 需要在 .def 文件中 EXPORTS 项添加要调用的函数，否则有可能找不到函数&lt;br /&gt;
&lt;br /&gt;
*DLL名称和函数名都是大小写敏感的，代码声明和公式调用时需要匹配。&lt;br /&gt;
&lt;br /&gt;
=DLL公式参数传递例子=&lt;br /&gt;
&lt;br /&gt;
*无参数时的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test1();&lt;br /&gt;
 test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test1()&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入单值的公式例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test2(int, float, bool, char);&lt;br /&gt;
 Variables:&lt;br /&gt;
  NumericSimple var1,&lt;br /&gt;
  NumericSeries var2,&lt;br /&gt;
  NumericArray var3[10];&lt;br /&gt;
 &lt;br /&gt;
 var1 := 1;&lt;br /&gt;
 var2[0] := 2;&lt;br /&gt;
 var3[0] := 65;&lt;br /&gt;
 &lt;br /&gt;
 test2(1, 2, 1, 65);&lt;br /&gt;
 test2(var1, var2[0], var1, var3[0]);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c)&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入字符串的公式例子&lt;br /&gt;
&lt;br /&gt;
公式里面的字符串变量是宽字符，编码是GB2312,DLL里面可以使用MultiByteToWideChar/MultiByteToWideChar进行字符转换&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test3(LPCWSTR);&lt;br /&gt;
 Variables:&lt;br /&gt;
   String var1;&lt;br /&gt;
 &lt;br /&gt;
 var1 := 'test string1';&lt;br /&gt;
 &lt;br /&gt;
 test3(NumToStr(close,3));&lt;br /&gt;
 test3('aaa');&lt;br /&gt;
 test3(var1);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test3(const wchar_t* p);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 #include &amp;lt;string&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 // 窄字符转宽字符&lt;br /&gt;
 static std::wstring a2w(LPCSTR lpa)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = MultiByteToWideChar(936, 0, lpa, -1, NULL, 0);&lt;br /&gt;
 &lt;br /&gt;
 	std::wstring s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	MultiByteToWideChar(936, 0, lpa, (int)strlen(lpa), (LPWSTR)s.c_str(), (int)s.size());&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 宽字符转窄字符&lt;br /&gt;
 static std::string w2a(LPCWSTR lpw)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = WideCharToMultiByte(936, 0, lpw, -1, NULL, 0, NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	std::string s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	WideCharToMultiByte(936, 0, lpw, (int)wcslen(lpw), (LPSTR)s.c_str(), (int)s.size(), NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test3(const wchar_t *p)&lt;br /&gt;
 {&lt;br /&gt;
 	std::wstring sw = p; &lt;br /&gt;
 	std::string sa = w2a(sw.c_str());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入序列的公式例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test4(NumericSeries, int, NumericArray, int);&lt;br /&gt;
 Variables:&lt;br /&gt;
   NumericSeries var1,&lt;br /&gt;
   NumericArray var2[5];&lt;br /&gt;
 &lt;br /&gt;
 var1 := close;&lt;br /&gt;
 var2[1] := 1;&lt;br /&gt;
 var2[2] := 2;&lt;br /&gt;
 var2[3] := 3;&lt;br /&gt;
 var2[4] := 4;&lt;br /&gt;
 var2[5] := 5;&lt;br /&gt;
 &lt;br /&gt;
 //var2 数组实际大小是5+1&lt;br /&gt;
 test4(var1, BarsCount(close), var2, 6);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test4(float *pf1, int n1, float *pf2, int n2);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test4(float *pf1, int n1, float *pf2, int n2)&lt;br /&gt;
 {&lt;br /&gt;
 	&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入引用的公式例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test5(NumericRef);&lt;br /&gt;
 Variables:&lt;br /&gt;
   NumericSimple var1;&lt;br /&gt;
 &lt;br /&gt;
 var1 := 3;&lt;br /&gt;
 test5(var1);&lt;br /&gt;
 comment(var1);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test5(float *pf);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test5(float *pf)&lt;br /&gt;
 {&lt;br /&gt;
 	*pf = 9;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=DLL的返回值=&lt;br /&gt;
&lt;br /&gt;
新格式DLL可返回单值，序列和数组。单值类型大致分为两种：数值类型和字符串类型，可以通过函数返回值直接返回。&lt;br /&gt;
&lt;br /&gt;
*返回单值类型的c语言例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用例子&lt;br /&gt;
 extern 'FoxFunc.dll' int test6();&lt;br /&gt;
 extern 'FoxFunc.dll' float test7();&lt;br /&gt;
 extern 'FoxFunc.dll' LPCWSTR test8();&lt;br /&gt;
 &lt;br /&gt;
 k1: test6(),OwnerScale;&lt;br /&gt;
 k2: test7(),OwnerScale;&lt;br /&gt;
 comment(test8);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) int __stdcall test6();&lt;br /&gt;
 __declspec(dllexport) float __stdcall test7();&lt;br /&gt;
 __declspec(dllexport) wchar_t* __stdcall test8();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) int __stdcall test6()&lt;br /&gt;
 {&lt;br /&gt;
 	return 1;&lt;br /&gt;
 }&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) float __stdcall test7()&lt;br /&gt;
 {&lt;br /&gt;
 	return 0.5f;&lt;br /&gt;
 }&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) wchar_t* __stdcall test8()&lt;br /&gt;
 {&lt;br /&gt;
 	return L&amp;quot;test string 1&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*返回序列或数组&lt;br /&gt;
&lt;br /&gt;
若要返回序列或数组，则把需要返回的序列赋值目标当作参数传递给DLL，在DLL内部直接修改已达到赋值。&lt;br /&gt;
注意逐根运行模式下，每一根K线都会调用dll，所以通常每次调用只需要赋值比上一根K线新增加的类型，&lt;br /&gt;
例如计算收盘价均值时，每次在BarPos位置填入当根K线的均值即可。由此可见，这种应用下通常需要把&lt;br /&gt;
BarPos(当前是第几根K线)作为参数传入Dll中。返回序列和数组可以参考上面传入序列的公式例子。&lt;br /&gt;
&lt;br /&gt;
下面一个例子是在图形上输出当前是第几根K线的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式中的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test9(NumericSeries, int);&lt;br /&gt;
 &lt;br /&gt;
 MyIndi:0;&lt;br /&gt;
 test9(MyIndi, BarPos);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明文件&lt;br /&gt;
 __declspec(dllexport) void __stdcall test9(float *pf, int n);&lt;br /&gt;
&lt;br /&gt;
 // c+= .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test9(float *pf, int n)&lt;br /&gt;
 {&lt;br /&gt;
 	// 每根都会调用一次，所以每次只需赋值当前根&lt;br /&gt;
 	pf[n - 1] = n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=DLL的参数类型参考=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!-    类型  !!   公式 !!   DLL&lt;br /&gt;
|-&lt;br /&gt;
| 数值 || NumericSimple || float, int, char, bool&lt;br /&gt;
|-&lt;br /&gt;
| 字符串 || LPCWSTR || wchar_t*&lt;br /&gt;
|-&lt;br /&gt;
| 数值引用 || NumericRef || float*&lt;br /&gt;
|-&lt;br /&gt;
| 序列 || NumericSeries || float*&lt;br /&gt;
|-&lt;br /&gt;
| 数组 || NumericArray || float*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=无效数据表示=&lt;br /&gt;
公式系统使用std的无效浮点数表示无效值，浮点无效值的一个重要特征是 f != f 为真，可作为判断依据，&lt;br /&gt;
其它运算皆输出无效值，其它比较皆输出假。当序列作为指标输出时，开始和结束两段的无效值自动截除，不作为指标输出。&lt;br /&gt;
例如要输出5日均线，序列的前4个值可填充无效值（填充0时会使指标线变形）&lt;br /&gt;
 #include &amp;lt;limits&amp;gt;&lt;br /&gt;
 #define INVALID_NUMERIC std::numeric_limits&amp;lt;float&amp;gt;::quiet_NaN()&lt;br /&gt;
无效值在公式里可以用 Invalid 关键字指定，例如&lt;br /&gt;
 k1:Invalid;&lt;br /&gt;
则k1指标线不会输出&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=编写调用公式=&lt;br /&gt;
&lt;br /&gt;
=开发DLL的详细例子=&lt;br /&gt;
&lt;br /&gt;
=实例下载=&lt;br /&gt;
&lt;br /&gt;
[[Category:公式系统]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=调用Windows系统DLL=&lt;br /&gt;
调用win32提供的系统DLL，与调用自己编写的DLL是一样的。&lt;br /&gt;
&lt;br /&gt;
只要知道windows系统函数所属的DLL和函数名，参数等信息就可以直接使用，例如&lt;br /&gt;
&lt;br /&gt;
 extern 'kernel32.dll' int GetTickCount();&lt;br /&gt;
 tickcount:GetTickCount();&lt;br /&gt;
&lt;br /&gt;
=调用.Net DLL=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
跟一般DLL不同的是，.net DLL在声明时，除了函数名信息，还要提供命名空间、类名的信息，例如：&lt;br /&gt;
&lt;br /&gt;
  extern 'RzRq.dll' void RzRq.Grabber.GetFinance( LPCWSTR stockCode);&lt;br /&gt;
&lt;br /&gt;
这里的RzRq就是命名空间，而Grabber则是类的名称，GetFinance是函数名&lt;br /&gt;
&lt;br /&gt;
另外，在.net DLL中，除了可以用参数来传递数据，还可以使用GetVarData, SetVarData这两个函数在.net和公式引擎间交换数据。&lt;br /&gt;
&lt;br /&gt;
.net DLL开发过程如下：&amp;lt;br&amp;gt;&lt;br /&gt;
1. visual studio 新建一个类库 工程，用C#或者VB.net，Managed C++都可以，这里以C#为例&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:dotnet1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2.添加 金魔方 .net　api dll 引用，位置位于金魔方安装目录下 DotNetBridge.dll&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
3.新建或者修改 从 Formula 继承 一个类，Formula 是金魔方.net api的类，从此类继承可以访问 GetVarData等接口函数，需要用 fox.api 命名空间&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet4.png]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83</id>
		<title>自由DLL接口规范</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83"/>
				<updated>2016-11-14T06:46:32Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=简介=&lt;br /&gt;
相比传统DLL接口(飞狐接口），自由DLL接口的特点是参数更加灵活，由用户指定传入的参数，参数类型是c/c++的标准数据类型。&lt;br /&gt;
&lt;br /&gt;
传统DLL必须引入一个CalcInfo的结构化参数，通过它来传入行情数据，这种设计的好处是用户操心得少一些，因为数据总是有的，不利之处是限制了发挥，难以返回多个序列结果，难以接入没有按接口要求编写的DLL。&lt;br /&gt;
&lt;br /&gt;
自由DLL接口，不再传入CalcInfo参数，取而代之的是，用户必须自己负责传入所有的数据。获得的回报是，&lt;br /&gt;
&lt;br /&gt;
1.支持任意多的参数。&lt;br /&gt;
&lt;br /&gt;
2.支持引用参数，也就是说，可以改变参数的值并返回给公式系统。&lt;br /&gt;
&lt;br /&gt;
3.更灵活的参数传递。例如，可以根据需要传入地址，也可以传入值。&lt;br /&gt;
&lt;br /&gt;
4.支持逐根的计算。每次只计算一根的值并返回单值。自由DLL只能在逐根模式下运行。&lt;br /&gt;
&lt;br /&gt;
与传统接口DLL一样，自由接口DLL也必须放置在FmlDLL目录下。&lt;br /&gt;
&lt;br /&gt;
=自由DLL声明=&lt;br /&gt;
&lt;br /&gt;
为了让公式系统知道DLL的参数格式，调用前需要使用extern语句进行声明&lt;br /&gt;
&lt;br /&gt;
 extern 返回值类型 函数名(参数类型1, 参数类型2...);&lt;br /&gt;
&lt;br /&gt;
参数的个数没有限制&lt;br /&gt;
&lt;br /&gt;
=参数类型=&lt;br /&gt;
&lt;br /&gt;
传入DLL的参数有类型限制，目前支持的C类型包括&lt;br /&gt;
float, double, int,BOOL, LONG, DWORD, float*, LPCWSTR等&lt;br /&gt;
不支持double *&lt;br /&gt;
&lt;br /&gt;
=返回值类型=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
公式中，有些类型的名字与C不同。&lt;br /&gt;
其中，float*，有可能是NumericRef，也可能是NumericSeries，还可以是NumericArray 。&lt;br /&gt;
但打算传入单值，并改变值返回，那么用NumericRef，如果打算传入序列那么用NumericSeries，如果传入数组，那么用NumericArray 。&lt;br /&gt;
&lt;br /&gt;
=自由DLL接口的调用=&lt;br /&gt;
&lt;br /&gt;
*声明过的函数，可以通过函数名直接调用，无需通过&amp;quot;DLLName@FuncName&amp;quot;格式或RefDLL使用。&lt;br /&gt;
&lt;br /&gt;
*使用时必须将DLL放在软件安装目录下的FmlDll子目录下&lt;br /&gt;
&lt;br /&gt;
*字符串使用单引号，双引号是另一种格式的引用，不能混用&lt;br /&gt;
&lt;br /&gt;
*DLL 需要在 .def 文件中 EXPORTS 项添加要调用的函数，否则有可能找不到函数&lt;br /&gt;
&lt;br /&gt;
*DLL名称和函数名都是大小写敏感的，代码声明和公式调用时需要匹配。&lt;br /&gt;
&lt;br /&gt;
=DLL公式参数传递例子=&lt;br /&gt;
&lt;br /&gt;
*无参数时的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test1();&lt;br /&gt;
 test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test1()&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入单值的公式例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test2(int, float, bool, char);&lt;br /&gt;
 Variables:&lt;br /&gt;
  NumericSimple var1,&lt;br /&gt;
  NumericSeries var2,&lt;br /&gt;
  NumericArray var3[10];&lt;br /&gt;
 &lt;br /&gt;
 var1 := 1;&lt;br /&gt;
 var2[0] := 2;&lt;br /&gt;
 var3[0] := 65;&lt;br /&gt;
 &lt;br /&gt;
 test2(1, 2, 1, 65);&lt;br /&gt;
 test2(var1, var2[0], var1, var3[0]);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c)&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入字符串的公式例子&lt;br /&gt;
&lt;br /&gt;
公式里面的字符串变量是宽字符，编码是GB2312,DLL里面可以使用MultiByteToWideChar/MultiByteToWideChar进行字符转换&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test3(LPCWSTR);&lt;br /&gt;
 Variables:&lt;br /&gt;
   String var1;&lt;br /&gt;
 &lt;br /&gt;
 var1 := 'test string1';&lt;br /&gt;
 &lt;br /&gt;
 test3(NumToStr(close,3));&lt;br /&gt;
 test3('aaa');&lt;br /&gt;
 test3(var1);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test3(const wchar_t* p);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 #include &amp;lt;string&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 // 窄字符转宽字符&lt;br /&gt;
 static std::wstring a2w(LPCSTR lpa)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = MultiByteToWideChar(936, 0, lpa, -1, NULL, 0);&lt;br /&gt;
 &lt;br /&gt;
 	std::wstring s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	MultiByteToWideChar(936, 0, lpa, (int)strlen(lpa), (LPWSTR)s.c_str(), (int)s.size());&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 宽字符转窄字符&lt;br /&gt;
 static std::string w2a(LPCWSTR lpw)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = WideCharToMultiByte(936, 0, lpw, -1, NULL, 0, NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	std::string s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	WideCharToMultiByte(936, 0, lpw, (int)wcslen(lpw), (LPSTR)s.c_str(), (int)s.size(), NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test3(const wchar_t *p)&lt;br /&gt;
 {&lt;br /&gt;
 	std::wstring sw = p; &lt;br /&gt;
 	std::string sa = w2a(sw.c_str());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入序列的公式例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test4(NumericSeries, int, NumericArray, int);&lt;br /&gt;
 Variables:&lt;br /&gt;
   NumericSeries var1,&lt;br /&gt;
   NumericArray var2[5];&lt;br /&gt;
 &lt;br /&gt;
 var1 := close;&lt;br /&gt;
 var2[1] := 1;&lt;br /&gt;
 var2[2] := 2;&lt;br /&gt;
 var2[3] := 3;&lt;br /&gt;
 var2[4] := 4;&lt;br /&gt;
 var2[5] := 5;&lt;br /&gt;
 &lt;br /&gt;
 //var2 数组实际大小是5+1&lt;br /&gt;
 test4(var1, BarsCount(close), var2, 6);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test4(float *pf1, int n1, float *pf2, int n2);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test4(float *pf1, int n1, float *pf2, int n2)&lt;br /&gt;
 {&lt;br /&gt;
 	&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入引用的公式例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test5(NumericRef);&lt;br /&gt;
 Variables:&lt;br /&gt;
   NumericSimple var1;&lt;br /&gt;
 &lt;br /&gt;
 var1 := 3;&lt;br /&gt;
 test5(var1);&lt;br /&gt;
 comment(var1);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test5(float *pf);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test5(float *pf)&lt;br /&gt;
 {&lt;br /&gt;
 	*pf = 9;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=DLL的返回值=&lt;br /&gt;
&lt;br /&gt;
新格式DLL可返回单值，序列和数组。单值类型大致分为两种：数值类型和字符串类型，可以通过函数返回值直接返回。&lt;br /&gt;
&lt;br /&gt;
*返回单值类型的c语言例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用例子&lt;br /&gt;
 extern 'FoxFunc.dll' int test6();&lt;br /&gt;
 extern 'FoxFunc.dll' float test7();&lt;br /&gt;
 extern 'FoxFunc.dll' LPCWSTR test8();&lt;br /&gt;
 &lt;br /&gt;
 k1: test6(),OwnerScale;&lt;br /&gt;
 k2: test7(),OwnerScale;&lt;br /&gt;
 comment(test8);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) int __stdcall test6();&lt;br /&gt;
 __declspec(dllexport) float __stdcall test7();&lt;br /&gt;
 __declspec(dllexport) wchar_t* __stdcall test8();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) int __stdcall test6()&lt;br /&gt;
 {&lt;br /&gt;
 	return 1;&lt;br /&gt;
 }&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) float __stdcall test7()&lt;br /&gt;
 {&lt;br /&gt;
 	return 0.5f;&lt;br /&gt;
 }&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) wchar_t* __stdcall test8()&lt;br /&gt;
 {&lt;br /&gt;
 	return L&amp;quot;test string 1&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*返回序列或数组&lt;br /&gt;
&lt;br /&gt;
若要返回序列或数组，则把需要返回的序列赋值目标当作参数传递给DLL，在DLL内部直接修改已达到赋值。&lt;br /&gt;
注意逐根运行模式下，每一根K线都会调用dll，所以通常每次调用只需要赋值比上一根K线新增加的类型，&lt;br /&gt;
例如计算收盘价均值时，每次在BarPos位置填入当根K线的均值即可。由此可见，这种应用下通常需要把&lt;br /&gt;
BarPos(当前是第几根K线)作为参数传入Dll中。返回序列和数组可以参考上面传入序列的公式例子。&lt;br /&gt;
&lt;br /&gt;
下面一个例子是在图形上输出当前是第几根K线的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式中的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test9(NumericSeries, int);&lt;br /&gt;
 &lt;br /&gt;
 MyIndi:0;&lt;br /&gt;
 test9(MyIndi, BarPos);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明文件&lt;br /&gt;
 __declspec(dllexport) void __stdcall test9(float *pf, int n);&lt;br /&gt;
&lt;br /&gt;
 // c+= .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test9(float *pf, int n)&lt;br /&gt;
 {&lt;br /&gt;
 	// 每根都会调用一次，所以每次只需赋值当前根&lt;br /&gt;
 	pf[n - 1] = n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=DLL的参数类型=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!    - !!   单值 !!   序列 !!   数组 !!   引用&lt;br /&gt;
|-&lt;br /&gt;
| 数值 || NumericSimple || NumericSeries || NumericArray || NumericRef&lt;br /&gt;
|-&lt;br /&gt;
| 字符串 || String || - || StringArray || StringRef&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
其中，公式中NumericSimpe，在DLL中对应float（64位版本对应double）&amp;lt;br&amp;gt;&lt;br /&gt;
公式中NumericSeries，NumericArray，NumericRef，在DLL中都对应float* (64位版本对应double*)，具体的区别只是数据长度的不同。NumericSeries是随K线增长自动增长的，NumericArray是定长数组，而NumericRef是单值。&lt;br /&gt;
&lt;br /&gt;
=无效数据表示=&lt;br /&gt;
公式系统使用std的无效浮点数表示无效值，浮点无效值的一个重要特征是 f != f 为真，可作为判断依据，&lt;br /&gt;
其它运算皆输出无效值，其它比较皆输出假。当序列作为指标输出时，开始和结束两段的无效值自动截除，不作为指标输出。&lt;br /&gt;
例如要输出5日均线，序列的前4个值可填充无效值（填充0时会使指标线变形）&lt;br /&gt;
 #include &amp;lt;limits&amp;gt;&lt;br /&gt;
 #define INVALID_NUMERIC std::numeric_limits&amp;lt;float&amp;gt;::quiet_NaN()&lt;br /&gt;
无效值在公式里可以用 Invalid 关键字指定，例如&lt;br /&gt;
 k1:Invalid;&lt;br /&gt;
则k1指标线不会输出&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=编写调用公式=&lt;br /&gt;
&lt;br /&gt;
=开发DLL的详细例子=&lt;br /&gt;
&lt;br /&gt;
=实例下载=&lt;br /&gt;
&lt;br /&gt;
[[Category:公式系统]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=调用Windows系统DLL=&lt;br /&gt;
调用win32提供的系统DLL，与调用自己编写的DLL是一样的。&lt;br /&gt;
&lt;br /&gt;
只要知道windows系统函数所属的DLL和函数名，参数等信息就可以直接使用，例如&lt;br /&gt;
&lt;br /&gt;
 extern 'kernel32.dll' int GetTickCount();&lt;br /&gt;
 tickcount:GetTickCount();&lt;br /&gt;
&lt;br /&gt;
=调用.Net DLL=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
跟一般DLL不同的是，.net DLL在声明时，除了函数名信息，还要提供命名空间、类名的信息，例如：&lt;br /&gt;
&lt;br /&gt;
  extern 'RzRq.dll' void RzRq.Grabber.GetFinance( LPCWSTR stockCode);&lt;br /&gt;
&lt;br /&gt;
这里的RzRq就是命名空间，而Grabber则是类的名称，GetFinance是函数名&lt;br /&gt;
&lt;br /&gt;
另外，在.net DLL中，除了可以用参数来传递数据，还可以使用GetVarData, SetVarData这两个函数在.net和公式引擎间交换数据。&lt;br /&gt;
&lt;br /&gt;
.net DLL开发过程如下：&amp;lt;br&amp;gt;&lt;br /&gt;
1. visual studio 新建一个类库 工程，用C#或者VB.net，Managed C++都可以，这里以C#为例&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:dotnet1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2.添加 金魔方 .net　api dll 引用，位置位于金魔方安装目录下 DotNetBridge.dll&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
3.新建或者修改 从 Formula 继承 一个类，Formula 是金魔方.net api的类，从此类继承可以访问 GetVarData等接口函数，需要用 fox.api 命名空间&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet4.png]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83</id>
		<title>自由DLL接口规范</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83"/>
				<updated>2016-11-14T06:35:47Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=简介=&lt;br /&gt;
相比传统DLL接口(飞狐接口），自由DLL接口的特点是参数更加灵活，由用户指定传入的参数，参数类型是c/c++的标准数据类型。&lt;br /&gt;
&lt;br /&gt;
传统DLL必须引入一个CalcInfo的结构化参数，通过它来传入行情数据，这种设计的好处是用户操心得少一些，因为数据总是有的，不利之处是限制了发挥，难以返回多个序列结果，难以接入没有按接口要求编写的DLL。&lt;br /&gt;
&lt;br /&gt;
自由DLL接口，不再传入CalcInfo参数，取而代之的是，用户必须自己负责传入所有的数据。获得的回报是，&lt;br /&gt;
&lt;br /&gt;
1.支持任意多的参数。&lt;br /&gt;
&lt;br /&gt;
2.支持引用参数，也就是说，可以改变参数的值并返回给公式系统。&lt;br /&gt;
&lt;br /&gt;
3.更灵活的参数传递。例如，可以根据需要传入地址，也可以传入值。&lt;br /&gt;
&lt;br /&gt;
4.支持逐根的计算。每次只计算一根的值并返回单值。自由DLL只能在逐根模式下运行。&lt;br /&gt;
&lt;br /&gt;
与传统接口DLL一样，自由接口DLL也必须放置在FmlDLL目录下。&lt;br /&gt;
&lt;br /&gt;
=自由DLL声明=&lt;br /&gt;
&lt;br /&gt;
为了让公式系统知道DLL的参数格式，调用前需要使用extern语句进行声明&lt;br /&gt;
&lt;br /&gt;
 extern 返回值类型 函数名(参数类型1, 参数类型2...);&lt;br /&gt;
&lt;br /&gt;
参数的个数没有限制&lt;br /&gt;
&lt;br /&gt;
=参数类型=&lt;br /&gt;
&lt;br /&gt;
传入DLL的参数有类型限制，目前支持的C类型包括&lt;br /&gt;
float, double, int,BOOL, LONG, DWORD, float*, LPCWSTR等&lt;br /&gt;
不支持double *&lt;br /&gt;
&lt;br /&gt;
=返回值类型=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
公式中，有些类型的名字与C不同。&lt;br /&gt;
其中，float*，有可能是NumericRef，也可能是NumericSeries，还可以是NumericArray 。&lt;br /&gt;
但打算传入单值，并改变值返回，那么用NumericRef，如果打算传入序列那么用NumericSeries，如果传入数组，那么用NumericArray 。&lt;br /&gt;
&lt;br /&gt;
=自由DLL接口的调用=&lt;br /&gt;
&lt;br /&gt;
*声明过的函数，可以通过函数名直接调用，无需通过&amp;quot;DLLName@FuncName&amp;quot;格式或RefDLL使用。&lt;br /&gt;
&lt;br /&gt;
*使用时必须将DLL放在软件安装目录下的FmlDll子目录下&lt;br /&gt;
&lt;br /&gt;
*字符串使用单引号，双引号是另一种格式的引用，不能混用&lt;br /&gt;
&lt;br /&gt;
*DLL 需要在 .def 文件中 EXPORTS 项添加要调用的函数，否则有可能找不到函数&lt;br /&gt;
&lt;br /&gt;
*DLL名称和函数名都是大小写敏感的，代码声明和公式调用时需要匹配。&lt;br /&gt;
&lt;br /&gt;
=DLL公式参数传递例子=&lt;br /&gt;
&lt;br /&gt;
*无参数时的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test1();&lt;br /&gt;
 test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test1()&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入单值的公式例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test2(int, float, bool, char);&lt;br /&gt;
 Variables:&lt;br /&gt;
  NumericSimple var1,&lt;br /&gt;
  NumericSeries var2,&lt;br /&gt;
  NumericArray var3[10];&lt;br /&gt;
 &lt;br /&gt;
 var1 := 1;&lt;br /&gt;
 var2[0] := 2;&lt;br /&gt;
 var3[0] := 65;&lt;br /&gt;
 &lt;br /&gt;
 test2(1, 2, 1, 65);&lt;br /&gt;
 test2(var1, var2[0], var1, var3[0]);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c)&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入字符串的公式例子&lt;br /&gt;
&lt;br /&gt;
公式里面的字符串变量是宽字符，编码是GB2312,DLL里面可以使用MultiByteToWideChar/MultiByteToWideChar进行字符转换&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test3(LPCWSTR);&lt;br /&gt;
 Variables:&lt;br /&gt;
   String var1;&lt;br /&gt;
 &lt;br /&gt;
 var1 := 'test string1';&lt;br /&gt;
 &lt;br /&gt;
 test3(NumToStr(close,3));&lt;br /&gt;
 test3('aaa');&lt;br /&gt;
 test3(var1);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test3(const wchar_t* p);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 #include &amp;lt;string&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 // 窄字符转宽字符&lt;br /&gt;
 static std::wstring a2w(LPCSTR lpa)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = MultiByteToWideChar(936, 0, lpa, -1, NULL, 0);&lt;br /&gt;
 &lt;br /&gt;
 	std::wstring s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	MultiByteToWideChar(936, 0, lpa, (int)strlen(lpa), (LPWSTR)s.c_str(), (int)s.size());&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 宽字符转窄字符&lt;br /&gt;
 static std::string w2a(LPCWSTR lpw)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = WideCharToMultiByte(936, 0, lpw, -1, NULL, 0, NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	std::string s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	WideCharToMultiByte(936, 0, lpw, (int)wcslen(lpw), (LPSTR)s.c_str(), (int)s.size(), NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test3(const wchar_t *p)&lt;br /&gt;
 {&lt;br /&gt;
 	std::wstring sw = p; &lt;br /&gt;
 	std::string sa = w2a(sw.c_str());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入序列的公式例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test4(NumericSeries, int, NumericArray, int);&lt;br /&gt;
 Variables:&lt;br /&gt;
   NumericSeries var1,&lt;br /&gt;
   NumericArray var2[5];&lt;br /&gt;
 &lt;br /&gt;
 var1 := close;&lt;br /&gt;
 var2[1] := 1;&lt;br /&gt;
 var2[2] := 2;&lt;br /&gt;
 var2[3] := 3;&lt;br /&gt;
 var2[4] := 4;&lt;br /&gt;
 var2[5] := 5;&lt;br /&gt;
 &lt;br /&gt;
 //var2 数组实际大小是5+1&lt;br /&gt;
 test4(var1, BarsCount(close), var2, 6);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test4(float *pf1, int n1, float *pf2, int n2);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test4(float *pf1, int n1, float *pf2, int n2)&lt;br /&gt;
 {&lt;br /&gt;
 	&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入引用的公式例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test5(NumericRef);&lt;br /&gt;
 Variables:&lt;br /&gt;
   NumericSimple var1;&lt;br /&gt;
 &lt;br /&gt;
 var1 := 3;&lt;br /&gt;
 test5(var1);&lt;br /&gt;
 comment(var1);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test5(float *pf);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test5(float *pf)&lt;br /&gt;
 {&lt;br /&gt;
 	*pf = 9;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=DLL的返回值=&lt;br /&gt;
&lt;br /&gt;
新格式DLL可返回单值，序列和数组。单值类型大致分为两种：数值类型和字符串类型，可以通过函数返回值直接返回。&lt;br /&gt;
&lt;br /&gt;
*返回单值类型的c语言例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用例子&lt;br /&gt;
 extern 'FoxFunc.dll' int test6();&lt;br /&gt;
 extern 'FoxFunc.dll' float test7();&lt;br /&gt;
 extern 'FoxFunc.dll' LPCWSTR test8();&lt;br /&gt;
 &lt;br /&gt;
 k1: test6(),OwnerScale;&lt;br /&gt;
 k2: test7(),OwnerScale;&lt;br /&gt;
 comment(test8);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) int __stdcall test6();&lt;br /&gt;
 __declspec(dllexport) float __stdcall test7();&lt;br /&gt;
 __declspec(dllexport) wchar_t* __stdcall test8();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) int __stdcall test6()&lt;br /&gt;
 {&lt;br /&gt;
 	return 1;&lt;br /&gt;
 }&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) float __stdcall test7()&lt;br /&gt;
 {&lt;br /&gt;
 	return 0.5f;&lt;br /&gt;
 }&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) wchar_t* __stdcall test8()&lt;br /&gt;
 {&lt;br /&gt;
 	return L&amp;quot;test string 1&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*返回序列或数组&lt;br /&gt;
&lt;br /&gt;
若要返回序列或数组，则把需要返回的序列赋值目标当作参数传递给DLL，在DLL内部直接修改已达到赋值。&lt;br /&gt;
注意逐根运行模式下，每一根K线都会调用dll，所以通常每次调用只需要赋值比上一根K线新增加的类型，&lt;br /&gt;
例如计算收盘价均值时，每次在BarPos位置填入当根K线的均值即可。由此可见，这种应用下通常需要把&lt;br /&gt;
BarPos(当前是第几根K线)作为参数传入Dll中。&lt;br /&gt;
&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test4(float*pReturn, int nIndex)&lt;br /&gt;
 {&lt;br /&gt;
 	pReturn[nIndex-1] = 123;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test5(float*pReturn, int nLen)&lt;br /&gt;
 {&lt;br /&gt;
 	for(int i=0;i&amp;lt;nLen;i++)&lt;br /&gt;
 		pReturn[i] = 0;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 variable:&lt;br /&gt;
   NumericSeries mySequence(0);&lt;br /&gt;
 array:&lt;br /&gt;
   myArray[100](1);&lt;br /&gt;
 &lt;br /&gt;
 extern 'MyDll2.dll' void my_test4(NumericSeries mySequence, int nIndex);&lt;br /&gt;
 extern 'MyDll2.dll' void my_test5(NumericArray myArray, int nLen);&lt;br /&gt;
 my_test4(mySequence, BarPos);&lt;br /&gt;
 my_test5(myArray, 100);&lt;br /&gt;
&lt;br /&gt;
=DLL的参数类型=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!    - !!   单值 !!   序列 !!   数组 !!   引用&lt;br /&gt;
|-&lt;br /&gt;
| 数值 || NumericSimple || NumericSeries || NumericArray || NumericRef&lt;br /&gt;
|-&lt;br /&gt;
| 字符串 || String || - || StringArray || StringRef&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
其中，公式中NumericSimpe，在DLL中对应float（64位版本对应double）&amp;lt;br&amp;gt;&lt;br /&gt;
公式中NumericSeries，NumericArray，NumericRef，在DLL中都对应float* (64位版本对应double*)，具体的区别只是数据长度的不同。NumericSeries是随K线增长自动增长的，NumericArray是定长数组，而NumericRef是单值。&lt;br /&gt;
&lt;br /&gt;
=无效数据表示=&lt;br /&gt;
公式系统使用std的无效浮点数表示无效值，浮点无效值的一个重要特征是 f != f 为真，可作为判断依据，&lt;br /&gt;
其它运算皆输出无效值，其它比较皆输出假。当序列作为指标输出时，开始和结束两段的无效值自动截除，不作为指标输出。&lt;br /&gt;
例如要输出5日均线，序列的前4个值可填充无效值（填充0时会使指标线变形）&lt;br /&gt;
 #include &amp;lt;limits&amp;gt;&lt;br /&gt;
 #define INVALID_NUMERIC std::numeric_limits&amp;lt;float&amp;gt;::quiet_NaN()&lt;br /&gt;
无效值在公式里可以用 Invalid 关键字指定，例如&lt;br /&gt;
 k1:Invalid;&lt;br /&gt;
则k1指标线不会输出&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=编写调用公式=&lt;br /&gt;
&lt;br /&gt;
=开发DLL的详细例子=&lt;br /&gt;
&lt;br /&gt;
=实例下载=&lt;br /&gt;
&lt;br /&gt;
[[Category:公式系统]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=调用Windows系统DLL=&lt;br /&gt;
调用win32提供的系统DLL，与调用自己编写的DLL是一样的。&lt;br /&gt;
&lt;br /&gt;
只要知道windows系统函数所属的DLL和函数名，参数等信息就可以直接使用，例如&lt;br /&gt;
&lt;br /&gt;
 extern 'kernel32.dll' int GetTickCount();&lt;br /&gt;
 tickcount:GetTickCount();&lt;br /&gt;
&lt;br /&gt;
=调用.Net DLL=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
跟一般DLL不同的是，.net DLL在声明时，除了函数名信息，还要提供命名空间、类名的信息，例如：&lt;br /&gt;
&lt;br /&gt;
  extern 'RzRq.dll' void RzRq.Grabber.GetFinance( LPCWSTR stockCode);&lt;br /&gt;
&lt;br /&gt;
这里的RzRq就是命名空间，而Grabber则是类的名称，GetFinance是函数名&lt;br /&gt;
&lt;br /&gt;
另外，在.net DLL中，除了可以用参数来传递数据，还可以使用GetVarData, SetVarData这两个函数在.net和公式引擎间交换数据。&lt;br /&gt;
&lt;br /&gt;
.net DLL开发过程如下：&amp;lt;br&amp;gt;&lt;br /&gt;
1. visual studio 新建一个类库 工程，用C#或者VB.net，Managed C++都可以，这里以C#为例&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:dotnet1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2.添加 金魔方 .net　api dll 引用，位置位于金魔方安装目录下 DotNetBridge.dll&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
3.新建或者修改 从 Formula 继承 一个类，Formula 是金魔方.net api的类，从此类继承可以访问 GetVarData等接口函数，需要用 fox.api 命名空间&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet4.png]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83</id>
		<title>自由DLL接口规范</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83"/>
				<updated>2016-11-14T06:22:07Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=简介=&lt;br /&gt;
相比传统DLL接口(飞狐接口），自由DLL接口的特点是参数更加灵活，由用户指定传入的参数，参数类型是c/c++的标准数据类型。&lt;br /&gt;
&lt;br /&gt;
传统DLL必须引入一个CalcInfo的结构化参数，通过它来传入行情数据，这种设计的好处是用户操心得少一些，因为数据总是有的，不利之处是限制了发挥，难以返回多个序列结果，难以接入没有按接口要求编写的DLL。&lt;br /&gt;
&lt;br /&gt;
自由DLL接口，不再传入CalcInfo参数，取而代之的是，用户必须自己负责传入所有的数据。获得的回报是，&lt;br /&gt;
&lt;br /&gt;
1.支持任意多的参数。&lt;br /&gt;
&lt;br /&gt;
2.支持引用参数，也就是说，可以改变参数的值并返回给公式系统。&lt;br /&gt;
&lt;br /&gt;
3.更灵活的参数传递。例如，可以根据需要传入地址，也可以传入值。&lt;br /&gt;
&lt;br /&gt;
4.支持逐根的计算。每次只计算一根的值并返回单值。自由DLL只能在逐根模式下运行。&lt;br /&gt;
&lt;br /&gt;
与传统接口DLL一样，自由接口DLL也必须放置在FmlDLL目录下。&lt;br /&gt;
&lt;br /&gt;
=自由DLL声明=&lt;br /&gt;
&lt;br /&gt;
为了让公式系统知道DLL的参数格式，调用前需要使用extern语句进行声明&lt;br /&gt;
&lt;br /&gt;
 extern 返回值类型 函数名(参数类型1, 参数类型2...);&lt;br /&gt;
&lt;br /&gt;
参数的个数没有限制&lt;br /&gt;
&lt;br /&gt;
=参数类型=&lt;br /&gt;
&lt;br /&gt;
传入DLL的参数有类型限制，目前支持的C类型包括&lt;br /&gt;
float, double, int,BOOL, LONG, DWORD, float*, LPCWSTR等&lt;br /&gt;
不支持double *&lt;br /&gt;
&lt;br /&gt;
=返回值类型=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
公式中，有些类型的名字与C不同。&lt;br /&gt;
其中，float*，有可能是NumericRef，也可能是NumericSeries，还可以是NumericArray 。&lt;br /&gt;
但打算传入单值，并改变值返回，那么用NumericRef，如果打算传入序列那么用NumericSeries，如果传入数组，那么用NumericArray 。&lt;br /&gt;
&lt;br /&gt;
=自由DLL接口的调用=&lt;br /&gt;
&lt;br /&gt;
*声明过的函数，可以通过函数名直接调用，无需通过&amp;quot;DLLName@FuncName&amp;quot;格式或RefDLL使用。&lt;br /&gt;
&lt;br /&gt;
*使用时必须将DLL放在软件安装目录下的FmlDll子目录下&lt;br /&gt;
&lt;br /&gt;
*字符串使用单引号，双引号是另一种格式的引用，不能混用&lt;br /&gt;
&lt;br /&gt;
*DLL 需要在 .def 文件中 EXPORTS 项添加要调用的函数，否则有可能找不到函数&lt;br /&gt;
&lt;br /&gt;
*DLL名称和函数名都是大小写敏感的，代码声明和公式调用时需要匹配。&lt;br /&gt;
&lt;br /&gt;
=DLL公式参数传递例子=&lt;br /&gt;
&lt;br /&gt;
*无参数时的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test1();&lt;br /&gt;
 test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test1()&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入单值的公式例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test2(int, float, bool, char);&lt;br /&gt;
 Variables:&lt;br /&gt;
  NumericSimple var1,&lt;br /&gt;
  NumericSeries var2,&lt;br /&gt;
  NumericArray var3[10];&lt;br /&gt;
 &lt;br /&gt;
 var1 := 1;&lt;br /&gt;
 var2[0] := 2;&lt;br /&gt;
 var3[0] := 65;&lt;br /&gt;
 &lt;br /&gt;
 test2(1, 2, 1, 65);&lt;br /&gt;
 test2(var1, var2[0], var1, var3[0]);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c)&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入字符串的公式例子&lt;br /&gt;
&lt;br /&gt;
公式里面的字符串变量是宽字符，编码是GB2312,DLL里面可以使用MultiByteToWideChar/MultiByteToWideChar进行字符转换&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test3(LPCWSTR);&lt;br /&gt;
 Variables:&lt;br /&gt;
   String var1;&lt;br /&gt;
 &lt;br /&gt;
 var1 := 'test string1';&lt;br /&gt;
 &lt;br /&gt;
 test3(NumToStr(close,3));&lt;br /&gt;
 test3('aaa');&lt;br /&gt;
 test3(var1);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test3(const wchar_t* p);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 #include &amp;lt;string&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 // 窄字符转宽字符&lt;br /&gt;
 static std::wstring a2w(LPCSTR lpa)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = MultiByteToWideChar(936, 0, lpa, -1, NULL, 0);&lt;br /&gt;
 &lt;br /&gt;
 	std::wstring s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	MultiByteToWideChar(936, 0, lpa, (int)strlen(lpa), (LPWSTR)s.c_str(), (int)s.size());&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 宽字符转窄字符&lt;br /&gt;
 static std::string w2a(LPCWSTR lpw)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = WideCharToMultiByte(936, 0, lpw, -1, NULL, 0, NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	std::string s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	WideCharToMultiByte(936, 0, lpw, (int)wcslen(lpw), (LPSTR)s.c_str(), (int)s.size(), NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test3(const wchar_t *p)&lt;br /&gt;
 {&lt;br /&gt;
 	std::wstring sw = p; &lt;br /&gt;
 	std::string sa = w2a(sw.c_str());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入序列的公式例子&lt;br /&gt;
&lt;br /&gt;
 // 公式声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test4(NumericSeries, int, NumericArray, int);&lt;br /&gt;
 Variables:&lt;br /&gt;
   NumericSeries var1,&lt;br /&gt;
   NumericArray var2[5];&lt;br /&gt;
 &lt;br /&gt;
 var1 := close;&lt;br /&gt;
 var2[1] := 1;&lt;br /&gt;
 var2[2] := 2;&lt;br /&gt;
 var2[3] := 3;&lt;br /&gt;
 var2[4] := 4;&lt;br /&gt;
 var2[5] := 5;&lt;br /&gt;
 &lt;br /&gt;
 //var2 数组实际大小是5+1&lt;br /&gt;
 test4(var1, BarsCount(close), var2, 6);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test4(float *pf1, int n1, float *pf2, int n2);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test4(float *pf1, int n1, float *pf2, int n2)&lt;br /&gt;
 {&lt;br /&gt;
 	&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入引用的公式例子&lt;br /&gt;
&lt;br /&gt;
=DLL的返回值=&lt;br /&gt;
&lt;br /&gt;
新格式DLL可返回单值，序列和数组。单值类型大致分为两种：数值类型和字符串类型，可以通过函数返回值直接返回。&lt;br /&gt;
*返回单值类型的c语言例子&lt;br /&gt;
 //返回整数&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) int WINAPI my_test1()&lt;br /&gt;
 {&lt;br /&gt;
 	return 1;&lt;br /&gt;
 }&lt;br /&gt;
 //返回浮点&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) float WINAPI my_test2()&lt;br /&gt;
 {&lt;br /&gt;
 	return 2.0f;&lt;br /&gt;
 }&lt;br /&gt;
 //返回字符串&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) LPCWSTR WINAPI my_test3()&lt;br /&gt;
 {&lt;br /&gt;
 	return L&amp;quot;TEST STRING&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 extern 'MyDll2.dll' int my_test1();&lt;br /&gt;
 extern 'MyDll2.dll' float my_test2();&lt;br /&gt;
 extern 'MyDll2.dll' LPCWSTR my_test3();&lt;br /&gt;
 k1: my_test1;&lt;br /&gt;
 k2: my_test2;&lt;br /&gt;
 comment(my_test3);&lt;br /&gt;
&lt;br /&gt;
若要返回序列或数组，则把需要返回的序列赋值目标当作参数传递给DLL，在DLL内部直接修改已达到赋值。&lt;br /&gt;
注意逐根运行模式下，每一根K线都会调用dll，所以通常每次调用只需要赋值比上一根K线新增加的类型，&lt;br /&gt;
例如计算收盘价均值时，每次在BarPos位置填入当根K线的均值即可。由此可见，这种应用下通常需要把&lt;br /&gt;
BarPos(当前是第几根K线)作为参数传入Dll中。&lt;br /&gt;
*返回序列和数组的例子&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test4(float*pReturn, int nIndex)&lt;br /&gt;
 {&lt;br /&gt;
 	pReturn[nIndex-1] = 123;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test5(float*pReturn, int nLen)&lt;br /&gt;
 {&lt;br /&gt;
 	for(int i=0;i&amp;lt;nLen;i++)&lt;br /&gt;
 		pReturn[i] = 0;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 variable:&lt;br /&gt;
   NumericSeries mySequence(0);&lt;br /&gt;
 array:&lt;br /&gt;
   myArray[100](1);&lt;br /&gt;
 &lt;br /&gt;
 extern 'MyDll2.dll' void my_test4(NumericSeries mySequence, int nIndex);&lt;br /&gt;
 extern 'MyDll2.dll' void my_test5(NumericArray myArray, int nLen);&lt;br /&gt;
 my_test4(mySequence, BarPos);&lt;br /&gt;
 my_test5(myArray, 100);&lt;br /&gt;
&lt;br /&gt;
=DLL的参数类型=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!    - !!   单值 !!   序列 !!   数组 !!   引用&lt;br /&gt;
|-&lt;br /&gt;
| 数值 || NumericSimple || NumericSeries || NumericArray || NumericRef&lt;br /&gt;
|-&lt;br /&gt;
| 字符串 || String || - || StringArray || StringRef&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
其中，公式中NumericSimpe，在DLL中对应float（64位版本对应double）&amp;lt;br&amp;gt;&lt;br /&gt;
公式中NumericSeries，NumericArray，NumericRef，在DLL中都对应float* (64位版本对应double*)，具体的区别只是数据长度的不同。NumericSeries是随K线增长自动增长的，NumericArray是定长数组，而NumericRef是单值。&lt;br /&gt;
&lt;br /&gt;
=无效数据表示=&lt;br /&gt;
公式系统使用std的无效浮点数表示无效值，浮点无效值的一个重要特征是 f != f 为真，可作为判断依据，&lt;br /&gt;
其它运算皆输出无效值，其它比较皆输出假。当序列作为指标输出时，开始和结束两段的无效值自动截除，不作为指标输出。&lt;br /&gt;
例如要输出5日均线，序列的前4个值可填充无效值（填充0时会使指标线变形）&lt;br /&gt;
 #include &amp;lt;limits&amp;gt;&lt;br /&gt;
 #define INVALID_NUMERIC std::numeric_limits&amp;lt;float&amp;gt;::quiet_NaN()&lt;br /&gt;
无效值在公式里可以用 Invalid 关键字指定，例如&lt;br /&gt;
 k1:Invalid;&lt;br /&gt;
则k1指标线不会输出&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=编写调用公式=&lt;br /&gt;
&lt;br /&gt;
=开发DLL的详细例子=&lt;br /&gt;
&lt;br /&gt;
=实例下载=&lt;br /&gt;
&lt;br /&gt;
[[Category:公式系统]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=调用Windows系统DLL=&lt;br /&gt;
调用win32提供的系统DLL，与调用自己编写的DLL是一样的。&lt;br /&gt;
&lt;br /&gt;
只要知道windows系统函数所属的DLL和函数名，参数等信息就可以直接使用，例如&lt;br /&gt;
&lt;br /&gt;
 extern 'kernel32.dll' int GetTickCount();&lt;br /&gt;
 tickcount:GetTickCount();&lt;br /&gt;
&lt;br /&gt;
=调用.Net DLL=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
跟一般DLL不同的是，.net DLL在声明时，除了函数名信息，还要提供命名空间、类名的信息，例如：&lt;br /&gt;
&lt;br /&gt;
  extern 'RzRq.dll' void RzRq.Grabber.GetFinance( LPCWSTR stockCode);&lt;br /&gt;
&lt;br /&gt;
这里的RzRq就是命名空间，而Grabber则是类的名称，GetFinance是函数名&lt;br /&gt;
&lt;br /&gt;
另外，在.net DLL中，除了可以用参数来传递数据，还可以使用GetVarData, SetVarData这两个函数在.net和公式引擎间交换数据。&lt;br /&gt;
&lt;br /&gt;
.net DLL开发过程如下：&amp;lt;br&amp;gt;&lt;br /&gt;
1. visual studio 新建一个类库 工程，用C#或者VB.net，Managed C++都可以，这里以C#为例&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:dotnet1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2.添加 金魔方 .net　api dll 引用，位置位于金魔方安装目录下 DotNetBridge.dll&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
3.新建或者修改 从 Formula 继承 一个类，Formula 是金魔方.net api的类，从此类继承可以访问 GetVarData等接口函数，需要用 fox.api 命名空间&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet4.png]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83</id>
		<title>自由DLL接口规范</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83"/>
				<updated>2016-11-14T06:02:41Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=简介=&lt;br /&gt;
相比传统DLL接口(飞狐接口），自由DLL接口的特点是参数更加灵活，由用户指定传入的参数，参数类型是c/c++的标准数据类型。&lt;br /&gt;
&lt;br /&gt;
传统DLL必须引入一个CalcInfo的结构化参数，通过它来传入行情数据，这种设计的好处是用户操心得少一些，因为数据总是有的，不利之处是限制了发挥，难以返回多个序列结果，难以接入没有按接口要求编写的DLL。&lt;br /&gt;
&lt;br /&gt;
自由DLL接口，不再传入CalcInfo参数，取而代之的是，用户必须自己负责传入所有的数据。获得的回报是，&lt;br /&gt;
&lt;br /&gt;
1.支持任意多的参数。&lt;br /&gt;
&lt;br /&gt;
2.支持引用参数，也就是说，可以改变参数的值并返回给公式系统。&lt;br /&gt;
&lt;br /&gt;
3.更灵活的参数传递。例如，可以根据需要传入地址，也可以传入值。&lt;br /&gt;
&lt;br /&gt;
4.支持逐根的计算。每次只计算一根的值并返回单值。自由DLL只能在逐根模式下运行。&lt;br /&gt;
&lt;br /&gt;
与传统接口DLL一样，自由接口DLL也必须放置在FmlDLL目录下。&lt;br /&gt;
&lt;br /&gt;
=自由DLL声明=&lt;br /&gt;
&lt;br /&gt;
为了让公式系统知道DLL的参数格式，调用前需要使用extern语句进行声明&lt;br /&gt;
&lt;br /&gt;
 extern 返回值类型 函数名(参数类型1, 参数类型2...);&lt;br /&gt;
&lt;br /&gt;
参数的个数没有限制&lt;br /&gt;
&lt;br /&gt;
=参数类型=&lt;br /&gt;
&lt;br /&gt;
传入DLL的参数有类型限制，目前支持的C类型包括&lt;br /&gt;
float, double, int,BOOL, LONG, DWORD, float*, LPCWSTR等&lt;br /&gt;
不支持double *&lt;br /&gt;
&lt;br /&gt;
=返回值类型=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
公式中，有些类型的名字与C不同。&lt;br /&gt;
其中，float*，有可能是NumericRef，也可能是NumericSeries，还可以是NumericArray 。&lt;br /&gt;
但打算传入单值，并改变值返回，那么用NumericRef，如果打算传入序列那么用NumericSeries，如果传入数组，那么用NumericArray 。&lt;br /&gt;
&lt;br /&gt;
=自由DLL接口的调用=&lt;br /&gt;
&lt;br /&gt;
*声明过的函数，可以通过函数名直接调用，无需通过&amp;quot;DLLName@FuncName&amp;quot;格式或RefDLL使用。&lt;br /&gt;
&lt;br /&gt;
*使用时必须将DLL放在软件安装目录下的FmlDll子目录下&lt;br /&gt;
&lt;br /&gt;
*字符串使用单引号，双引号是另一种格式的引用，不能混用&lt;br /&gt;
&lt;br /&gt;
*DLL 需要在 .def 文件中 EXPORTS 项添加要调用的函数，否则有可能找不到函数&lt;br /&gt;
&lt;br /&gt;
*DLL名称和函数名都是大小写敏感的，代码声明和公式调用时需要匹配。&lt;br /&gt;
&lt;br /&gt;
=DLL公式参数传递例子=&lt;br /&gt;
&lt;br /&gt;
*无参数时的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test1();&lt;br /&gt;
 test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test1()&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入单值的公式例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test2(int, float, bool, char);&lt;br /&gt;
 Variables:&lt;br /&gt;
  NumericSimple var1,&lt;br /&gt;
  NumericSeries var2,&lt;br /&gt;
  NumericArray var3[10];&lt;br /&gt;
 &lt;br /&gt;
 var1 := 1;&lt;br /&gt;
 var2[0] := 2;&lt;br /&gt;
 var3[0] := 65;&lt;br /&gt;
 &lt;br /&gt;
 test2(1, 2, 1, 65);&lt;br /&gt;
 test2(var1, var2[0], var1, var3[0]);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c)&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入字符串的公式例子&lt;br /&gt;
&lt;br /&gt;
公式里面的字符串变量是宽字符，编码是GB2312,DLL里面可以使用MultiByteToWideChar/MultiByteToWideChar进行字符转换&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test3(LPCWSTR);&lt;br /&gt;
 Variables:&lt;br /&gt;
   String var1;&lt;br /&gt;
 &lt;br /&gt;
 var1 := 'test string1';&lt;br /&gt;
 &lt;br /&gt;
 test3(NumToStr(close,3));&lt;br /&gt;
 test3('aaa');&lt;br /&gt;
 test3(var1);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test3(const wchar_t* p);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 #include &amp;lt;string&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 // 窄字符转宽字符&lt;br /&gt;
 static std::wstring a2w(LPCSTR lpa)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = MultiByteToWideChar(936, 0, lpa, -1, NULL, 0);&lt;br /&gt;
&lt;br /&gt;
 	std::wstring s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	MultiByteToWideChar(936, 0, lpa, (int)strlen(lpa), (LPWSTR)s.c_str(), (int)s.size());&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 宽字符转窄字符&lt;br /&gt;
 static std::string w2a(LPCWSTR lpw)&lt;br /&gt;
 {&lt;br /&gt;
 	size_t l = WideCharToMultiByte(936, 0, lpw, -1, NULL, 0, NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	std::string s;&lt;br /&gt;
 	s.resize(l - 1);&lt;br /&gt;
 &lt;br /&gt;
 	WideCharToMultiByte(936, 0, lpw, (int)wcslen(lpw), (LPSTR)s.c_str(), (int)s.size(), NULL, NULL);&lt;br /&gt;
 &lt;br /&gt;
 	return s;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test3(const wchar_t *p)&lt;br /&gt;
 {&lt;br /&gt;
 	std::wstring sw = p; &lt;br /&gt;
 	std::string sa = w2a(sw.c_str());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*传入序列的公式例子&lt;br /&gt;
&lt;br /&gt;
=DLL的返回值=&lt;br /&gt;
&lt;br /&gt;
新格式DLL可返回单值，序列和数组。单值类型大致分为两种：数值类型和字符串类型，可以通过函数返回值直接返回。&lt;br /&gt;
*返回单值类型的c语言例子&lt;br /&gt;
 //返回整数&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) int WINAPI my_test1()&lt;br /&gt;
 {&lt;br /&gt;
 	return 1;&lt;br /&gt;
 }&lt;br /&gt;
 //返回浮点&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) float WINAPI my_test2()&lt;br /&gt;
 {&lt;br /&gt;
 	return 2.0f;&lt;br /&gt;
 }&lt;br /&gt;
 //返回字符串&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) LPCWSTR WINAPI my_test3()&lt;br /&gt;
 {&lt;br /&gt;
 	return L&amp;quot;TEST STRING&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 extern 'MyDll2.dll' int my_test1();&lt;br /&gt;
 extern 'MyDll2.dll' float my_test2();&lt;br /&gt;
 extern 'MyDll2.dll' LPCWSTR my_test3();&lt;br /&gt;
 k1: my_test1;&lt;br /&gt;
 k2: my_test2;&lt;br /&gt;
 comment(my_test3);&lt;br /&gt;
&lt;br /&gt;
若要返回序列或数组，则把需要返回的序列赋值目标当作参数传递给DLL，在DLL内部直接修改已达到赋值。&lt;br /&gt;
注意逐根运行模式下，每一根K线都会调用dll，所以通常每次调用只需要赋值比上一根K线新增加的类型，&lt;br /&gt;
例如计算收盘价均值时，每次在BarPos位置填入当根K线的均值即可。由此可见，这种应用下通常需要把&lt;br /&gt;
BarPos(当前是第几根K线)作为参数传入Dll中。&lt;br /&gt;
*返回序列和数组的例子&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test4(float*pReturn, int nIndex)&lt;br /&gt;
 {&lt;br /&gt;
 	pReturn[nIndex-1] = 123;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test5(float*pReturn, int nLen)&lt;br /&gt;
 {&lt;br /&gt;
 	for(int i=0;i&amp;lt;nLen;i++)&lt;br /&gt;
 		pReturn[i] = 0;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 variable:&lt;br /&gt;
   NumericSeries mySequence(0);&lt;br /&gt;
 array:&lt;br /&gt;
   myArray[100](1);&lt;br /&gt;
 &lt;br /&gt;
 extern 'MyDll2.dll' void my_test4(NumericSeries mySequence, int nIndex);&lt;br /&gt;
 extern 'MyDll2.dll' void my_test5(NumericArray myArray, int nLen);&lt;br /&gt;
 my_test4(mySequence, BarPos);&lt;br /&gt;
 my_test5(myArray, 100);&lt;br /&gt;
&lt;br /&gt;
=DLL的参数类型=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!    - !!   单值 !!   序列 !!   数组 !!   引用&lt;br /&gt;
|-&lt;br /&gt;
| 数值 || NumericSimple || NumericSeries || NumericArray || NumericRef&lt;br /&gt;
|-&lt;br /&gt;
| 字符串 || String || - || StringArray || StringRef&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
其中，公式中NumericSimpe，在DLL中对应float（64位版本对应double）&amp;lt;br&amp;gt;&lt;br /&gt;
公式中NumericSeries，NumericArray，NumericRef，在DLL中都对应float* (64位版本对应double*)，具体的区别只是数据长度的不同。NumericSeries是随K线增长自动增长的，NumericArray是定长数组，而NumericRef是单值。&lt;br /&gt;
&lt;br /&gt;
=无效数据表示=&lt;br /&gt;
公式系统使用std的无效浮点数表示无效值，浮点无效值的一个重要特征是 f != f 为真，可作为判断依据，&lt;br /&gt;
其它运算皆输出无效值，其它比较皆输出假。当序列作为指标输出时，开始和结束两段的无效值自动截除，不作为指标输出。&lt;br /&gt;
例如要输出5日均线，序列的前4个值可填充无效值（填充0时会使指标线变形）&lt;br /&gt;
 #include &amp;lt;limits&amp;gt;&lt;br /&gt;
 #define INVALID_NUMERIC std::numeric_limits&amp;lt;float&amp;gt;::quiet_NaN()&lt;br /&gt;
无效值在公式里可以用 Invalid 关键字指定，例如&lt;br /&gt;
 k1:Invalid;&lt;br /&gt;
则k1指标线不会输出&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=编写调用公式=&lt;br /&gt;
&lt;br /&gt;
=开发DLL的详细例子=&lt;br /&gt;
&lt;br /&gt;
=实例下载=&lt;br /&gt;
&lt;br /&gt;
[[Category:公式系统]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=调用Windows系统DLL=&lt;br /&gt;
调用win32提供的系统DLL，与调用自己编写的DLL是一样的。&lt;br /&gt;
&lt;br /&gt;
只要知道windows系统函数所属的DLL和函数名，参数等信息就可以直接使用，例如&lt;br /&gt;
&lt;br /&gt;
 extern 'kernel32.dll' int GetTickCount();&lt;br /&gt;
 tickcount:GetTickCount();&lt;br /&gt;
&lt;br /&gt;
=调用.Net DLL=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
跟一般DLL不同的是，.net DLL在声明时，除了函数名信息，还要提供命名空间、类名的信息，例如：&lt;br /&gt;
&lt;br /&gt;
  extern 'RzRq.dll' void RzRq.Grabber.GetFinance( LPCWSTR stockCode);&lt;br /&gt;
&lt;br /&gt;
这里的RzRq就是命名空间，而Grabber则是类的名称，GetFinance是函数名&lt;br /&gt;
&lt;br /&gt;
另外，在.net DLL中，除了可以用参数来传递数据，还可以使用GetVarData, SetVarData这两个函数在.net和公式引擎间交换数据。&lt;br /&gt;
&lt;br /&gt;
.net DLL开发过程如下：&amp;lt;br&amp;gt;&lt;br /&gt;
1. visual studio 新建一个类库 工程，用C#或者VB.net，Managed C++都可以，这里以C#为例&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:dotnet1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2.添加 金魔方 .net　api dll 引用，位置位于金魔方安装目录下 DotNetBridge.dll&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
3.新建或者修改 从 Formula 继承 一个类，Formula 是金魔方.net api的类，从此类继承可以访问 GetVarData等接口函数，需要用 fox.api 命名空间&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet4.png]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83</id>
		<title>自由DLL接口规范</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83"/>
				<updated>2016-11-14T05:31:31Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=简介=&lt;br /&gt;
相比传统DLL接口(飞狐接口），自由DLL接口的特点是参数更加灵活，由用户指定传入的参数，参数类型是c/c++的标准数据类型。&lt;br /&gt;
&lt;br /&gt;
传统DLL必须引入一个CalcInfo的结构化参数，通过它来传入行情数据，这种设计的好处是用户操心得少一些，因为数据总是有的，不利之处是限制了发挥，难以返回多个序列结果，难以接入没有按接口要求编写的DLL。&lt;br /&gt;
&lt;br /&gt;
自由DLL接口，不再传入CalcInfo参数，取而代之的是，用户必须自己负责传入所有的数据。获得的回报是，&lt;br /&gt;
&lt;br /&gt;
1.支持任意多的参数。&lt;br /&gt;
&lt;br /&gt;
2.支持引用参数，也就是说，可以改变参数的值并返回给公式系统。&lt;br /&gt;
&lt;br /&gt;
3.更灵活的参数传递。例如，可以根据需要传入地址，也可以传入值。&lt;br /&gt;
&lt;br /&gt;
4.支持逐根的计算。每次只计算一根的值并返回单值。自由DLL只能在逐根模式下运行。&lt;br /&gt;
&lt;br /&gt;
与传统接口DLL一样，自由接口DLL也必须放置在FmlDLL目录下。&lt;br /&gt;
&lt;br /&gt;
=自由DLL声明=&lt;br /&gt;
&lt;br /&gt;
为了让公式系统知道DLL的参数格式，调用前需要使用extern语句进行声明&lt;br /&gt;
&lt;br /&gt;
 extern 返回值类型 函数名(参数类型1, 参数类型2...);&lt;br /&gt;
&lt;br /&gt;
参数的个数没有限制&lt;br /&gt;
&lt;br /&gt;
=参数类型=&lt;br /&gt;
&lt;br /&gt;
传入DLL的参数有类型限制，目前支持的C类型包括&lt;br /&gt;
float, double, int,BOOL, LONG, DWORD, float*, LPCWSTR等&lt;br /&gt;
不支持double *&lt;br /&gt;
&lt;br /&gt;
=返回值类型=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
公式中，有些类型的名字与C不同。&lt;br /&gt;
其中，float*，有可能是NumericRef，也可能是NumericSeries，还可以是NumericArray 。&lt;br /&gt;
但打算传入单值，并改变值返回，那么用NumericRef，如果打算传入序列那么用NumericSeries，如果传入数组，那么用NumericArray 。&lt;br /&gt;
&lt;br /&gt;
=DLL公式例子=&lt;br /&gt;
&lt;br /&gt;
无参数时的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test1();&lt;br /&gt;
 test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test1()&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
传入单值的公式例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test2(int, float, bool, char);&lt;br /&gt;
 Variables:&lt;br /&gt;
  NumericSimple var1,&lt;br /&gt;
  NumericSeries var2,&lt;br /&gt;
  NumericArray var3[10];&lt;br /&gt;
 &lt;br /&gt;
 var1 := 1;&lt;br /&gt;
 var2[0] := 2;&lt;br /&gt;
 var3[0] := 65;&lt;br /&gt;
 &lt;br /&gt;
 test2(1, 2, 1, 65);&lt;br /&gt;
 test2(var1, var2[0], var1, var3[0]);&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c);&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test2(int i, float f, bool b, char c)&lt;br /&gt;
 {&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
注意事项：&lt;br /&gt;
*字符串使用单引号，双引号是另一种格式的引用，不能混用&lt;br /&gt;
*DLL 需要在 .def 文件中 EXPORTS 项添加要调用的函数，否则有可能找不到函数&lt;br /&gt;
*公式中函数名大小写要与DLL中的一致&lt;br /&gt;
&lt;br /&gt;
// C 代码里的声明&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_ma2(float*, float*, int, int)&lt;br /&gt;
公式里面的声明 &lt;br /&gt;
// 公式里面的声明&lt;br /&gt;
  extern 'MyDll2.dll' void  my_ma2(NumericSeries ResultBuffer, NumericSeries DataBuffer, int n, int barpos);&lt;br /&gt;
&lt;br /&gt;
根据声明的不同，运行模式的不同，同一公式传入DLL的数值可能不同。&lt;br /&gt;
&lt;br /&gt;
以一句myFunc( close )为例：&lt;br /&gt;
&lt;br /&gt;
如果myfunc的声明是 extern 'myDll' void myFunc( float x );&lt;br /&gt;
&lt;br /&gt;
则传入的实际是close[0]。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果myfunc的声明是 extern 'myDll' void myFunc( NumericSeries x );&lt;br /&gt;
则传入的实际是close的整个序列的起始地址&lt;br /&gt;
&lt;br /&gt;
=自由DLL接口的调用=&lt;br /&gt;
&lt;br /&gt;
声明过的函数，可以通过函数名直接调用，无需通过&amp;quot;DLLName@FuncName&amp;quot;格式或RefDLL使用。&lt;br /&gt;
&lt;br /&gt;
使用时必须将DLL放在软件安装目录下的FmlDll子目录下&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DLL名称和函数名都是大小写敏感的，代码声明和公式调用时需要匹配。&lt;br /&gt;
&lt;br /&gt;
=DLL的返回值=&lt;br /&gt;
新格式DLL可返回单值，序列和数组。单值类型大致分为两种：数值类型和字符串类型，可以通过函数返回值直接返回。&lt;br /&gt;
*返回单值类型的c语言例子&lt;br /&gt;
 //返回整数&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) int WINAPI my_test1()&lt;br /&gt;
 {&lt;br /&gt;
 	return 1;&lt;br /&gt;
 }&lt;br /&gt;
 //返回浮点&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) float WINAPI my_test2()&lt;br /&gt;
 {&lt;br /&gt;
 	return 2.0f;&lt;br /&gt;
 }&lt;br /&gt;
 //返回字符串&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) LPCWSTR WINAPI my_test3()&lt;br /&gt;
 {&lt;br /&gt;
 	return L&amp;quot;TEST STRING&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 extern 'MyDll2.dll' int my_test1();&lt;br /&gt;
 extern 'MyDll2.dll' float my_test2();&lt;br /&gt;
 extern 'MyDll2.dll' LPCWSTR my_test3();&lt;br /&gt;
 k1: my_test1;&lt;br /&gt;
 k2: my_test2;&lt;br /&gt;
 comment(my_test3);&lt;br /&gt;
&lt;br /&gt;
若要返回序列或数组，则把需要返回的序列赋值目标当作参数传递给DLL，在DLL内部直接修改已达到赋值。&lt;br /&gt;
注意逐根运行模式下，每一根K线都会调用dll，所以通常每次调用只需要赋值比上一根K线新增加的类型，&lt;br /&gt;
例如计算收盘价均值时，每次在BarPos位置填入当根K线的均值即可。由此可见，这种应用下通常需要把&lt;br /&gt;
BarPos(当前是第几根K线)作为参数传入Dll中。&lt;br /&gt;
*返回序列和数组的例子&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test4(float*pReturn, int nIndex)&lt;br /&gt;
 {&lt;br /&gt;
 	pReturn[nIndex-1] = 123;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test5(float*pReturn, int nLen)&lt;br /&gt;
 {&lt;br /&gt;
 	for(int i=0;i&amp;lt;nLen;i++)&lt;br /&gt;
 		pReturn[i] = 0;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 variable:&lt;br /&gt;
   NumericSeries mySequence(0);&lt;br /&gt;
 array:&lt;br /&gt;
   myArray[100](1);&lt;br /&gt;
 &lt;br /&gt;
 extern 'MyDll2.dll' void my_test4(NumericSeries mySequence, int nIndex);&lt;br /&gt;
 extern 'MyDll2.dll' void my_test5(NumericArray myArray, int nLen);&lt;br /&gt;
 my_test4(mySequence, BarPos);&lt;br /&gt;
 my_test5(myArray, 100);&lt;br /&gt;
&lt;br /&gt;
=DLL的参数类型=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!    - !!   单值 !!   序列 !!   数组 !!   引用&lt;br /&gt;
|-&lt;br /&gt;
| 数值 || NumericSimple || NumericSeries || NumericArray || NumericRef&lt;br /&gt;
|-&lt;br /&gt;
| 字符串 || String || - || StringArray || StringRef&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
其中，公式中NumericSimpe，在DLL中对应float（64位版本对应double）&amp;lt;br&amp;gt;&lt;br /&gt;
公式中NumericSeries，NumericArray，NumericRef，在DLL中都对应float* (64位版本对应double*)，具体的区别只是数据长度的不同。NumericSeries是随K线增长自动增长的，NumericArray是定长数组，而NumericRef是单值。&lt;br /&gt;
&lt;br /&gt;
=无效数据表示=&lt;br /&gt;
公式系统使用std的无效浮点数表示无效值，浮点无效值的一个重要特征是 f != f 为真，可作为判断依据，&lt;br /&gt;
其它运算皆输出无效值，其它比较皆输出假。当序列作为指标输出时，开始和结束两段的无效值自动截除，不作为指标输出。&lt;br /&gt;
例如要输出5日均线，序列的前4个值可填充无效值（填充0时会使指标线变形）&lt;br /&gt;
 #include &amp;lt;limits&amp;gt;&lt;br /&gt;
 #define INVALID_NUMERIC std::numeric_limits&amp;lt;float&amp;gt;::quiet_NaN()&lt;br /&gt;
无效值在公式里可以用 Invalid 关键字指定，例如&lt;br /&gt;
 k1:Invalid;&lt;br /&gt;
则k1指标线不会输出&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=编写调用公式=&lt;br /&gt;
&lt;br /&gt;
=开发DLL的详细例子=&lt;br /&gt;
&lt;br /&gt;
=实例下载=&lt;br /&gt;
&lt;br /&gt;
[[Category:公式系统]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=调用Windows系统DLL=&lt;br /&gt;
调用win32提供的系统DLL，与调用自己编写的DLL是一样的。&lt;br /&gt;
&lt;br /&gt;
只要知道windows系统函数所属的DLL和函数名，参数等信息就可以直接使用，例如&lt;br /&gt;
&lt;br /&gt;
 extern 'kernel32.dll' int GetTickCount();&lt;br /&gt;
 tickcount:GetTickCount();&lt;br /&gt;
&lt;br /&gt;
=调用.Net DLL=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
跟一般DLL不同的是，.net DLL在声明时，除了函数名信息，还要提供命名空间、类名的信息，例如：&lt;br /&gt;
&lt;br /&gt;
  extern 'RzRq.dll' void RzRq.Grabber.GetFinance( LPCWSTR stockCode);&lt;br /&gt;
&lt;br /&gt;
这里的RzRq就是命名空间，而Grabber则是类的名称，GetFinance是函数名&lt;br /&gt;
&lt;br /&gt;
另外，在.net DLL中，除了可以用参数来传递数据，还可以使用GetVarData, SetVarData这两个函数在.net和公式引擎间交换数据。&lt;br /&gt;
&lt;br /&gt;
.net DLL开发过程如下：&amp;lt;br&amp;gt;&lt;br /&gt;
1. visual studio 新建一个类库 工程，用C#或者VB.net，Managed C++都可以，这里以C#为例&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:dotnet1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2.添加 金魔方 .net　api dll 引用，位置位于金魔方安装目录下 DotNetBridge.dll&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
3.新建或者修改 从 Formula 继承 一个类，Formula 是金魔方.net api的类，从此类继承可以访问 GetVarData等接口函数，需要用 fox.api 命名空间&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet4.png]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83</id>
		<title>自由DLL接口规范</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83"/>
				<updated>2016-11-14T05:19:23Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=简介=&lt;br /&gt;
相比传统DLL接口(飞狐接口），自由DLL接口的特点是参数更加灵活，由用户指定传入的参数，参数类型是c/c++的标准数据类型。&lt;br /&gt;
&lt;br /&gt;
传统DLL必须引入一个CalcInfo的结构化参数，通过它来传入行情数据，这种设计的好处是用户操心得少一些，因为数据总是有的，不利之处是限制了发挥，难以返回多个序列结果，难以接入没有按接口要求编写的DLL。&lt;br /&gt;
&lt;br /&gt;
自由DLL接口，不再传入CalcInfo参数，取而代之的是，用户必须自己负责传入所有的数据。获得的回报是，&lt;br /&gt;
&lt;br /&gt;
1.支持任意多的参数。&lt;br /&gt;
&lt;br /&gt;
2.支持引用参数，也就是说，可以改变参数的值并返回给公式系统。&lt;br /&gt;
&lt;br /&gt;
3.更灵活的参数传递。例如，可以根据需要传入地址，也可以传入值。&lt;br /&gt;
&lt;br /&gt;
4.支持逐根的计算。每次只计算一根的值并返回单值。自由DLL只能在逐根模式下运行。&lt;br /&gt;
&lt;br /&gt;
与传统接口DLL一样，自由接口DLL也必须放置在FmlDLL目录下。&lt;br /&gt;
&lt;br /&gt;
=自由DLL声明=&lt;br /&gt;
&lt;br /&gt;
为了让公式系统知道DLL的参数格式，调用前需要使用extern语句进行声明&lt;br /&gt;
&lt;br /&gt;
 extern 返回值类型 函数名(参数类型1, 参数类型2...);&lt;br /&gt;
&lt;br /&gt;
参数的个数没有限制&lt;br /&gt;
&lt;br /&gt;
=参数类型=&lt;br /&gt;
&lt;br /&gt;
传入DLL的参数有类型限制，目前支持的C类型包括&lt;br /&gt;
float, double, int,BOOL, LONG, DWORD, float*, LPCWSTR等&lt;br /&gt;
不支持double *&lt;br /&gt;
&lt;br /&gt;
=返回值类型=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
公式中，有些类型的名字与C不同。&lt;br /&gt;
其中，float*，有可能是NumericRef，也可能是NumericSeries，还可以是NumericArray 。&lt;br /&gt;
但打算传入单值，并改变值返回，那么用NumericRef，如果打算传入序列那么用NumericSeries，如果传入数组，那么用NumericArray 。&lt;br /&gt;
&lt;br /&gt;
无参数时的例子：&lt;br /&gt;
&lt;br /&gt;
 // 公式里面的声明与调用&lt;br /&gt;
 extern 'FoxFunc.dll' void test1();&lt;br /&gt;
 test1();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // c++ .h 函数声明&lt;br /&gt;
 __declspec(dllexport) void __stdcall test1();&lt;br /&gt;
&lt;br /&gt;
 // c++ .cpp 函数实现&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test1()&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
传入单值的公式例子：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意事项：&lt;br /&gt;
1. 字符串使用单引号，双引号是另一种格式的引用，不能混用&lt;br /&gt;
1. DLL 需要在 .def 文件中 EXPORTS 项添加要调用的函数，否则有可能找不到函数&lt;br /&gt;
1. 公式中函数名大小写要与DLL中的一致&lt;br /&gt;
&lt;br /&gt;
// C 代码里的声明&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_ma2(float*, float*, int, int)&lt;br /&gt;
公式里面的声明 &lt;br /&gt;
// 公式里面的声明&lt;br /&gt;
  extern 'MyDll2.dll' void  my_ma2(NumericSeries ResultBuffer, NumericSeries DataBuffer, int n, int barpos);&lt;br /&gt;
&lt;br /&gt;
根据声明的不同，运行模式的不同，同一公式传入DLL的数值可能不同。&lt;br /&gt;
&lt;br /&gt;
以一句myFunc( close )为例：&lt;br /&gt;
&lt;br /&gt;
如果myfunc的声明是 extern 'myDll' void myFunc( float x );&lt;br /&gt;
&lt;br /&gt;
则传入的实际是close[0]。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果myfunc的声明是 extern 'myDll' void myFunc( NumericSeries x );&lt;br /&gt;
则传入的实际是close的整个序列的起始地址&lt;br /&gt;
&lt;br /&gt;
=自由DLL接口的调用=&lt;br /&gt;
&lt;br /&gt;
声明过的函数，可以通过函数名直接调用，无需通过&amp;quot;DLLName@FuncName&amp;quot;格式或RefDLL使用。&lt;br /&gt;
&lt;br /&gt;
使用时必须将DLL放在软件安装目录下的FmlDll子目录下&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DLL名称和函数名都是大小写敏感的，代码声明和公式调用时需要匹配。&lt;br /&gt;
&lt;br /&gt;
=DLL的返回值=&lt;br /&gt;
新格式DLL可返回单值，序列和数组。单值类型大致分为两种：数值类型和字符串类型，可以通过函数返回值直接返回。&lt;br /&gt;
*返回单值类型的c语言例子&lt;br /&gt;
 //返回整数&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) int WINAPI my_test1()&lt;br /&gt;
 {&lt;br /&gt;
 	return 1;&lt;br /&gt;
 }&lt;br /&gt;
 //返回浮点&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) float WINAPI my_test2()&lt;br /&gt;
 {&lt;br /&gt;
 	return 2.0f;&lt;br /&gt;
 }&lt;br /&gt;
 //返回字符串&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) LPCWSTR WINAPI my_test3()&lt;br /&gt;
 {&lt;br /&gt;
 	return L&amp;quot;TEST STRING&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 extern 'MyDll2.dll' int my_test1();&lt;br /&gt;
 extern 'MyDll2.dll' float my_test2();&lt;br /&gt;
 extern 'MyDll2.dll' LPCWSTR my_test3();&lt;br /&gt;
 k1: my_test1;&lt;br /&gt;
 k2: my_test2;&lt;br /&gt;
 comment(my_test3);&lt;br /&gt;
&lt;br /&gt;
若要返回序列或数组，则把需要返回的序列赋值目标当作参数传递给DLL，在DLL内部直接修改已达到赋值。&lt;br /&gt;
注意逐根运行模式下，每一根K线都会调用dll，所以通常每次调用只需要赋值比上一根K线新增加的类型，&lt;br /&gt;
例如计算收盘价均值时，每次在BarPos位置填入当根K线的均值即可。由此可见，这种应用下通常需要把&lt;br /&gt;
BarPos(当前是第几根K线)作为参数传入Dll中。&lt;br /&gt;
*返回序列和数组的例子&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test4(float*pReturn, int nIndex)&lt;br /&gt;
 {&lt;br /&gt;
 	pReturn[nIndex-1] = 123;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test5(float*pReturn, int nLen)&lt;br /&gt;
 {&lt;br /&gt;
 	for(int i=0;i&amp;lt;nLen;i++)&lt;br /&gt;
 		pReturn[i] = 0;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 variable:&lt;br /&gt;
   NumericSeries mySequence(0);&lt;br /&gt;
 array:&lt;br /&gt;
   myArray[100](1);&lt;br /&gt;
 &lt;br /&gt;
 extern 'MyDll2.dll' void my_test4(NumericSeries mySequence, int nIndex);&lt;br /&gt;
 extern 'MyDll2.dll' void my_test5(NumericArray myArray, int nLen);&lt;br /&gt;
 my_test4(mySequence, BarPos);&lt;br /&gt;
 my_test5(myArray, 100);&lt;br /&gt;
&lt;br /&gt;
=DLL的参数类型=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!    - !!   单值 !!   序列 !!   数组 !!   引用&lt;br /&gt;
|-&lt;br /&gt;
| 数值 || NumericSimple || NumericSeries || NumericArray || NumericRef&lt;br /&gt;
|-&lt;br /&gt;
| 字符串 || String || - || StringArray || StringRef&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
其中，公式中NumericSimpe，在DLL中对应float（64位版本对应double）&amp;lt;br&amp;gt;&lt;br /&gt;
公式中NumericSeries，NumericArray，NumericRef，在DLL中都对应float* (64位版本对应double*)，具体的区别只是数据长度的不同。NumericSeries是随K线增长自动增长的，NumericArray是定长数组，而NumericRef是单值。&lt;br /&gt;
&lt;br /&gt;
=无效数据表示=&lt;br /&gt;
公式系统使用std的无效浮点数表示无效值，浮点无效值的一个重要特征是 f != f 为真，可作为判断依据，&lt;br /&gt;
其它运算皆输出无效值，其它比较皆输出假。当序列作为指标输出时，开始和结束两段的无效值自动截除，不作为指标输出。&lt;br /&gt;
例如要输出5日均线，序列的前4个值可填充无效值（填充0时会使指标线变形）&lt;br /&gt;
 #include &amp;lt;limits&amp;gt;&lt;br /&gt;
 #define INVALID_NUMERIC std::numeric_limits&amp;lt;float&amp;gt;::quiet_NaN()&lt;br /&gt;
无效值在公式里可以用 Invalid 关键字指定，例如&lt;br /&gt;
 k1:Invalid;&lt;br /&gt;
则k1指标线不会输出&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=编写调用公式=&lt;br /&gt;
&lt;br /&gt;
=开发DLL的详细例子=&lt;br /&gt;
&lt;br /&gt;
=实例下载=&lt;br /&gt;
&lt;br /&gt;
[[Category:公式系统]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=调用Windows系统DLL=&lt;br /&gt;
调用win32提供的系统DLL，与调用自己编写的DLL是一样的。&lt;br /&gt;
&lt;br /&gt;
只要知道windows系统函数所属的DLL和函数名，参数等信息就可以直接使用，例如&lt;br /&gt;
&lt;br /&gt;
 extern 'kernel32.dll' int GetTickCount();&lt;br /&gt;
 tickcount:GetTickCount();&lt;br /&gt;
&lt;br /&gt;
=调用.Net DLL=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
跟一般DLL不同的是，.net DLL在声明时，除了函数名信息，还要提供命名空间、类名的信息，例如：&lt;br /&gt;
&lt;br /&gt;
  extern 'RzRq.dll' void RzRq.Grabber.GetFinance( LPCWSTR stockCode);&lt;br /&gt;
&lt;br /&gt;
这里的RzRq就是命名空间，而Grabber则是类的名称，GetFinance是函数名&lt;br /&gt;
&lt;br /&gt;
另外，在.net DLL中，除了可以用参数来传递数据，还可以使用GetVarData, SetVarData这两个函数在.net和公式引擎间交换数据。&lt;br /&gt;
&lt;br /&gt;
.net DLL开发过程如下：&amp;lt;br&amp;gt;&lt;br /&gt;
1. visual studio 新建一个类库 工程，用C#或者VB.net，Managed C++都可以，这里以C#为例&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:dotnet1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2.添加 金魔方 .net　api dll 引用，位置位于金魔方安装目录下 DotNetBridge.dll&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
3.新建或者修改 从 Formula 继承 一个类，Formula 是金魔方.net api的类，从此类继承可以访问 GetVarData等接口函数，需要用 fox.api 命名空间&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet4.png]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83</id>
		<title>自由DLL接口规范</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E8%87%AA%E7%94%B1DLL%E6%8E%A5%E5%8F%A3%E8%A7%84%E8%8C%83"/>
				<updated>2016-11-14T03:36:44Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=简介=&lt;br /&gt;
相比传统DLL接口(飞狐接口），自由DLL接口的特点是参数更加灵活，由用户指定传入的参数，参数类型是c/c++的标准数据类型。&lt;br /&gt;
&lt;br /&gt;
传统DLL必须引入一个CalcInfo的结构化参数，通过它来传入行情数据，这种设计的好处是用户操心得少一些，因为数据总是有的，不利之处是限制了发挥，难以返回多个序列结果，难以接入没有按接口要求编写的DLL。&lt;br /&gt;
&lt;br /&gt;
自由DLL接口，不再传入CalcInfo参数，取而代之的是，用户必须自己负责传入所有的数据。获得的回报是，&lt;br /&gt;
&lt;br /&gt;
1.支持任意多的参数。&lt;br /&gt;
&lt;br /&gt;
2.支持引用参数，也就是说，可以改变参数的值并返回给公式系统。&lt;br /&gt;
&lt;br /&gt;
3.更灵活的参数传递。例如，可以根据需要传入地址，也可以传入值。&lt;br /&gt;
&lt;br /&gt;
4.支持逐根的计算。每次只计算一根的值并返回单值。自由DLL只能在逐根模式下运行。&lt;br /&gt;
&lt;br /&gt;
与传统接口DLL一样，自由接口DLL也必须放置在FmlDLL目录下。&lt;br /&gt;
&lt;br /&gt;
=自由DLL声明=&lt;br /&gt;
&lt;br /&gt;
为了让公式系统知道DLL的参数格式，调用前需要使用extern语句进行声明&lt;br /&gt;
&lt;br /&gt;
 extern 返回值类型 函数名(参数类型1, 参数类型2...);&lt;br /&gt;
&lt;br /&gt;
参数的个数没有限制&lt;br /&gt;
&lt;br /&gt;
=参数类型=&lt;br /&gt;
&lt;br /&gt;
传入DLL的参数有类型限制，目前支持的C类型包括&lt;br /&gt;
float, double, int,BOOL, LONG, DWORD, float*, LPCWSTR等&lt;br /&gt;
不支持double *&lt;br /&gt;
&lt;br /&gt;
=返回值类型=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
公式中，有些类型的名字与C不同。&lt;br /&gt;
其中，float*，有可能是NumericRef，也可能是NumericSeries，还可以是NumericArray 。&lt;br /&gt;
但打算传入单值，并改变值返回，那么用NumericRef，如果打算传入序列那么用NumericSeries，如果传入数组，那么用NumericArray 。&lt;br /&gt;
&lt;br /&gt;
无参数时的例子：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
// 公式里面的声明与调用&lt;br /&gt;
extern 'FoxFunc.dll' void test1();&lt;br /&gt;
test1();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
// c++ .h 函数声明&lt;br /&gt;
__declspec(dllexport) void __stdcall test1();&lt;br /&gt;
&lt;br /&gt;
// c++ .cpp 函数实现&lt;br /&gt;
extern &amp;quot;C&amp;quot; __declspec(dllexport) void __stdcall test1()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
传入单值的公式例子：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意事项：&lt;br /&gt;
1. 字符串使用单引号，双引号是另一种格式的引用，不能混用&lt;br /&gt;
1. DLL 需要在 .def 文件中 EXPORTS 项添加要调用的函数，否则有可能找不到函数&lt;br /&gt;
1. 公式中函数名大小写要与DLL中的一致&lt;br /&gt;
&lt;br /&gt;
// C 代码里的声明&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_ma2(float*, float*, int, int)&lt;br /&gt;
公式里面的声明 &lt;br /&gt;
// 公式里面的声明&lt;br /&gt;
  extern 'MyDll2.dll' void  my_ma2(NumericSeries ResultBuffer, NumericSeries DataBuffer, int n, int barpos);&lt;br /&gt;
&lt;br /&gt;
根据声明的不同，运行模式的不同，同一公式传入DLL的数值可能不同。&lt;br /&gt;
&lt;br /&gt;
以一句myFunc( close )为例：&lt;br /&gt;
&lt;br /&gt;
如果myfunc的声明是 extern 'myDll' void myFunc( float x );&lt;br /&gt;
&lt;br /&gt;
则传入的实际是close[0]。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果myfunc的声明是 extern 'myDll' void myFunc( NumericSeries x );&lt;br /&gt;
则传入的实际是close的整个序列的起始地址&lt;br /&gt;
&lt;br /&gt;
=自由DLL接口的调用=&lt;br /&gt;
&lt;br /&gt;
声明过的函数，可以通过函数名直接调用，无需通过&amp;quot;DLLName@FuncName&amp;quot;格式或RefDLL使用。&lt;br /&gt;
&lt;br /&gt;
使用时必须将DLL放在软件安装目录下的FmlDll子目录下&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DLL名称和函数名都是大小写敏感的，代码声明和公式调用时需要匹配。&lt;br /&gt;
&lt;br /&gt;
=DLL的返回值=&lt;br /&gt;
新格式DLL可返回单值，序列和数组。单值类型大致分为两种：数值类型和字符串类型，可以通过函数返回值直接返回。&lt;br /&gt;
*返回单值类型的c语言例子&lt;br /&gt;
 //返回整数&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) int WINAPI my_test1()&lt;br /&gt;
 {&lt;br /&gt;
 	return 1;&lt;br /&gt;
 }&lt;br /&gt;
 //返回浮点&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) float WINAPI my_test2()&lt;br /&gt;
 {&lt;br /&gt;
 	return 2.0f;&lt;br /&gt;
 }&lt;br /&gt;
 //返回字符串&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) LPCWSTR WINAPI my_test3()&lt;br /&gt;
 {&lt;br /&gt;
 	return L&amp;quot;TEST STRING&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 extern 'MyDll2.dll' int my_test1();&lt;br /&gt;
 extern 'MyDll2.dll' float my_test2();&lt;br /&gt;
 extern 'MyDll2.dll' LPCWSTR my_test3();&lt;br /&gt;
 k1: my_test1;&lt;br /&gt;
 k2: my_test2;&lt;br /&gt;
 comment(my_test3);&lt;br /&gt;
&lt;br /&gt;
若要返回序列或数组，则把需要返回的序列赋值目标当作参数传递给DLL，在DLL内部直接修改已达到赋值。&lt;br /&gt;
注意逐根运行模式下，每一根K线都会调用dll，所以通常每次调用只需要赋值比上一根K线新增加的类型，&lt;br /&gt;
例如计算收盘价均值时，每次在BarPos位置填入当根K线的均值即可。由此可见，这种应用下通常需要把&lt;br /&gt;
BarPos(当前是第几根K线)作为参数传入Dll中。&lt;br /&gt;
*返回序列和数组的例子&lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test4(float*pReturn, int nIndex)&lt;br /&gt;
 {&lt;br /&gt;
 	pReturn[nIndex-1] = 123;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 extern &amp;quot;C&amp;quot; __declspec(dllexport) void WINAPI my_test5(float*pReturn, int nLen)&lt;br /&gt;
 {&lt;br /&gt;
 	for(int i=0;i&amp;lt;nLen;i++)&lt;br /&gt;
 		pReturn[i] = 0;&lt;br /&gt;
 }&lt;br /&gt;
相应的公式调用例子&lt;br /&gt;
 #MAINCHART&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 variable:&lt;br /&gt;
   NumericSeries mySequence(0);&lt;br /&gt;
 array:&lt;br /&gt;
   myArray[100](1);&lt;br /&gt;
 &lt;br /&gt;
 extern 'MyDll2.dll' void my_test4(NumericSeries mySequence, int nIndex);&lt;br /&gt;
 extern 'MyDll2.dll' void my_test5(NumericArray myArray, int nLen);&lt;br /&gt;
 my_test4(mySequence, BarPos);&lt;br /&gt;
 my_test5(myArray, 100);&lt;br /&gt;
&lt;br /&gt;
=DLL的参数类型=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!    - !!   单值 !!   序列 !!   数组 !!   引用&lt;br /&gt;
|-&lt;br /&gt;
| 数值 || NumericSimple || NumericSeries || NumericArray || NumericRef&lt;br /&gt;
|-&lt;br /&gt;
| 字符串 || String || - || StringArray || StringRef&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
其中，公式中NumericSimpe，在DLL中对应float（64位版本对应double）&amp;lt;br&amp;gt;&lt;br /&gt;
公式中NumericSeries，NumericArray，NumericRef，在DLL中都对应float* (64位版本对应double*)，具体的区别只是数据长度的不同。NumericSeries是随K线增长自动增长的，NumericArray是定长数组，而NumericRef是单值。&lt;br /&gt;
&lt;br /&gt;
=无效数据表示=&lt;br /&gt;
公式系统使用std的无效浮点数表示无效值，浮点无效值的一个重要特征是 f != f 为真，可作为判断依据，&lt;br /&gt;
其它运算皆输出无效值，其它比较皆输出假。当序列作为指标输出时，开始和结束两段的无效值自动截除，不作为指标输出。&lt;br /&gt;
例如要输出5日均线，序列的前4个值可填充无效值（填充0时会使指标线变形）&lt;br /&gt;
 #include &amp;lt;limits&amp;gt;&lt;br /&gt;
 #define INVALID_NUMERIC std::numeric_limits&amp;lt;float&amp;gt;::quiet_NaN()&lt;br /&gt;
无效值在公式里可以用 Invalid 关键字指定，例如&lt;br /&gt;
 k1:Invalid;&lt;br /&gt;
则k1指标线不会输出&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=编写调用公式=&lt;br /&gt;
&lt;br /&gt;
=开发DLL的详细例子=&lt;br /&gt;
&lt;br /&gt;
=实例下载=&lt;br /&gt;
&lt;br /&gt;
[[Category:公式系统]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=调用Windows系统DLL=&lt;br /&gt;
调用win32提供的系统DLL，与调用自己编写的DLL是一样的。&lt;br /&gt;
&lt;br /&gt;
只要知道windows系统函数所属的DLL和函数名，参数等信息就可以直接使用，例如&lt;br /&gt;
&lt;br /&gt;
 extern 'kernel32.dll' int GetTickCount();&lt;br /&gt;
 tickcount:GetTickCount();&lt;br /&gt;
&lt;br /&gt;
=调用.Net DLL=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
跟一般DLL不同的是，.net DLL在声明时，除了函数名信息，还要提供命名空间、类名的信息，例如：&lt;br /&gt;
&lt;br /&gt;
  extern 'RzRq.dll' void RzRq.Grabber.GetFinance( LPCWSTR stockCode);&lt;br /&gt;
&lt;br /&gt;
这里的RzRq就是命名空间，而Grabber则是类的名称，GetFinance是函数名&lt;br /&gt;
&lt;br /&gt;
另外，在.net DLL中，除了可以用参数来传递数据，还可以使用GetVarData, SetVarData这两个函数在.net和公式引擎间交换数据。&lt;br /&gt;
&lt;br /&gt;
.net DLL开发过程如下：&amp;lt;br&amp;gt;&lt;br /&gt;
1. visual studio 新建一个类库 工程，用C#或者VB.net，Managed C++都可以，这里以C#为例&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:dotnet1.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2.添加 金魔方 .net　api dll 引用，位置位于金魔方安装目录下 DotNetBridge.dll&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet2.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet3.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
3.新建或者修改 从 Formula 继承 一个类，Formula 是金魔方.net api的类，从此类继承可以访问 GetVarData等接口函数，需要用 fox.api 命名空间&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:dotnet4.png]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E7%A8%8B%E5%BC%8F%E4%BA%A4%E6%98%93</id>
		<title>程式交易</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E7%A8%8B%E5%BC%8F%E4%BA%A4%E6%98%93"/>
				<updated>2014-05-06T01:56:31Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 同步模式 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==定义==&lt;br /&gt;
程式化交易，又称自动交易，是指通过运行公式指标自动进行的交易，具体策略编写请参考[[公式教程]]。&lt;br /&gt;
&lt;br /&gt;
特别是[[智能交易公式]]一节&lt;br /&gt;
&lt;br /&gt;
==启动自动交易==&lt;br /&gt;
只需将智能交易类指标（仅该类指标才能程式化交易），又称为“策略”，放在主图上，在登陆交易账号的状态下，打开交易开关，即可进行自动化交易。&lt;br /&gt;
[[Image:cshjy01.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==交易模式==&lt;br /&gt;
有两种交易模式。&lt;br /&gt;
&lt;br /&gt;
第一种是“虚盘实盘同步”式交易。&lt;br /&gt;
&lt;br /&gt;
第二种是“账户函数”交易。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==虚盘实盘同步交易==&lt;br /&gt;
我们知道，理想中的交易和实际交易总会有距离。&lt;br /&gt;
&lt;br /&gt;
实际交易能成交的价格，往往比出现理想信号的价格不利。甚至会发生无法成交的情形。&lt;br /&gt;
&lt;br /&gt;
所以，这里有一个所谓“虚盘”和“实盘”的概念。&lt;br /&gt;
&lt;br /&gt;
虚盘，就是指基于理想状态的测评下发生的所有的虚拟交易。以及在此基础之上，所有依赖于交易而存在的盈亏、仓位、资金变化等一整套数据。&lt;br /&gt;
&lt;br /&gt;
而实盘，就是指实际的，发送到交易所的交易，以及在此基础上，所有依赖交易而发生变化的整套数据。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
所谓的虚实盘同步交易，是让整个策略基于整套虚盘数据运行，所有的交易决定，都是基于虚盘计算而作出的。而实盘状况不影响虚盘，实盘只关心时刻紧跟虚盘的脚步。虚盘有什么仓位，实盘就尽可能做到跟虚盘一致。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这么做的好处，是做到了，评价策略的成功与否，只跟数据和算法有关。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
执行状况当然也会影响策略是否成功，但不会影响到对'''策略本身是否优异'''的评价；&lt;br /&gt;
&lt;br /&gt;
一个策略是否成功，被切割成了“策略是否优秀”+ “执行是否得力”两个清晰的层面。&lt;br /&gt;
&lt;br /&gt;
如果让执行因素影响策略的运行，那么虚盘和实盘信号一定会严重错位，错位之后，您还能对照虚盘和实盘的绩效吗？不能。于是也就无法评估“执行是否得力”。&lt;br /&gt;
&lt;br /&gt;
综上所述，虚实盘同步是比较理想的一种策略驱动模式。&lt;br /&gt;
&lt;br /&gt;
==账户函数交易==&lt;br /&gt;
有某些策略，更关心执行层面的因素，对策略本身的历史评测不是那么敏感。&lt;br /&gt;
&lt;br /&gt;
例如某些高频策略。&lt;br /&gt;
&lt;br /&gt;
对于这种策略，我们提供了直接操纵实盘的函数。无需等待虚盘信号，直接发出交易指令。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==策略设置==&lt;br /&gt;
&lt;br /&gt;
把策略放到图上时，会自动弹出策略设置对话框，让您决定策略的系列运行参数。&lt;br /&gt;
&lt;br /&gt;
这个工作还可以在策略放到图上之后随时进行，随时调整参数。方法是：在策略名上点击右键，然后选择“策略设置”。&lt;br /&gt;
&lt;br /&gt;
策略设置有三个页面，分别是&lt;br /&gt;
&lt;br /&gt;
===属性===&lt;br /&gt;
&lt;br /&gt;
[[image:set_strategy.jpg]]&lt;br /&gt;
&lt;br /&gt;
可以看到，这里的设置是针对虚盘的。&lt;br /&gt;
包括，虚盘的初始资金，手续费等，这些好理解。&lt;br /&gt;
&lt;br /&gt;
====滑价====&lt;br /&gt;
滑价，这个设置的用途是什么呢，是用来模拟不利的滑动。&lt;br /&gt;
&lt;br /&gt;
例如，开多，委托价格1000元，卖1也是1000。一般的模拟会以1000元成交，但是为了追求贴合实际情形，通过滑价这个设定，强行以一个不利的滑价成交。例如，假设滑价设置为1跳，该交易品种的MinDiff(最小变动价位)是5元，那么虚盘成交价会是1005元。&lt;br /&gt;
&lt;br /&gt;
====默认下单量====&lt;br /&gt;
'''固定口数'''，容易理解&amp;lt;br&amp;gt;&lt;br /&gt;
'''固定金额'''，容易理解&amp;lt;br&amp;gt;&lt;br /&gt;
'''权益百分比'''，需要提醒，权益是指持仓与现金的价值之和&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最后需要说明的是，此默认下单量，主要是方便测试，不应用于真实交易。&lt;br /&gt;
因为虚盘资金情况，很难跟实盘资金情况契合。&lt;br /&gt;
&lt;br /&gt;
例如，假设您选择按权益的百分比下单；虚盘以某个初始资金开始，到当前K线，已经赚了几个亿，而这时您显然不能按这个设置对实盘进行交易。&lt;br /&gt;
&lt;br /&gt;
建议实盘时，把下单量作为公式的参数，通过手工指定下单的单量。定期调整。&lt;br /&gt;
&lt;br /&gt;
而非虚实盘同步的策略，可以通过A_系列实盘账户函数取得账户真实权益，计算下单量。&lt;br /&gt;
&lt;br /&gt;
'''最小下单股数'''，例如股票是100股。&amp;lt;br&amp;gt;&lt;br /&gt;
'''舍去至___的倍数'''，跟最小下单股数的区别是，这是控制每次下多少份的倍数，不一定是最小下单股数倍数，也可能是两倍200股。&lt;br /&gt;
&lt;br /&gt;
====公式计算需引用之前最大周期数====&lt;br /&gt;
假设设置为n，那么前n根K线都不会发生交易，即使有信号。&lt;br /&gt;
&lt;br /&gt;
这个参数要跟据所用的公式具体需要引用多少数据而设定。&lt;br /&gt;
例如公式用到ma(c, 5)，由于均线需要5根k线相加，那么说明只需要引用5根。那就设为5。&lt;br /&gt;
假如公式用到ma( c, 200)，那么说明至少需要200根k线之后才应该有信号，那就设为200。&lt;br /&gt;
如果不是很确定，那一般就取默认的50，也没什么问题。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===自动交易===&lt;br /&gt;
&lt;br /&gt;
[[image:set_strategy1.jpg]]&lt;br /&gt;
&lt;br /&gt;
====实盘仓位与虚盘同步====&lt;br /&gt;
不勾选同步，策略依然会发出实盘委托单。但是如果委托没有成交，不会一直去下单。而勾选同步之后，只要一定时间内没成交就会立刻撤单继续追。&lt;br /&gt;
&lt;br /&gt;
====同步模式====&lt;br /&gt;
总是同步：虚盘有多少仓位，实盘就强行同步成多少仓位。假设打开软件时是10点，而虚盘9点发生了买入持仓1口到现在，那么实盘会立刻尝试买入1口。&lt;br /&gt;
&lt;br /&gt;
下次持仓方向改变时同步：上例中，9点的仓位在10点打开时，不会发生同步。直到9点的仓位被平掉，又新开仓位，才发生同步。&lt;br /&gt;
&lt;br /&gt;
下次持仓数量改变时同步：上例中，9点的仓位在10点打开时，不会发生同步。但如果10点15分又买入1口，那么实盘会在15分开2口。&lt;br /&gt;
&lt;br /&gt;
市场价优于虚盘开仓均价时同步：虚盘成交后，实盘只有在价格优于虚盘信号时才同步&lt;br /&gt;
&lt;br /&gt;
不同步信号也发送1次指令：若关闭了同步，This Bar 的 Buy/Sell/SellShort/BuyToCover 指令在虚盘开平仓成功时也会发送一次交易指令，&lt;br /&gt;
并且只发送1次，若不能成交则不会继续同步，这样是为了使实盘成交与虚盘接近，若错过了时间则不交易。若关闭此选项并且关闭同步，&lt;br /&gt;
那么虚盘的开平仓只作为标注，不参与实际交易。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===公式参数===&lt;br /&gt;
&lt;br /&gt;
[[image:set_strategy2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
跟指标的调整参数功能相同。&lt;br /&gt;
&lt;br /&gt;
==多策略组合==&lt;br /&gt;
　　多策略组合能够平滑资金曲线，降低交易风险。我们不但支持不同品种下运行不同策略，也支持同一品种运用多个策略。&lt;br /&gt;
&lt;br /&gt;
　　同一品种如何应用多个策略呢？只需将一个品种打开多个图形，再将策略拖放至各个图形上即可。&lt;br /&gt;
&lt;br /&gt;
[[Image:cshjy02.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==监控交易==&lt;br /&gt;
&lt;br /&gt;
策略放到图上之后，有一系列信息帮助监控当时的虚实盘状况。&lt;br /&gt;
&lt;br /&gt;
请看图示说明。&lt;br /&gt;
&lt;br /&gt;
[[image:tradeMonitor.jpg]]&lt;br /&gt;
&lt;br /&gt;
有持仓之后，默认会显示持仓信息和盈亏点数：&amp;lt;br&amp;gt;&lt;br /&gt;
1是持仓1口，-5是亏损5跳&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:postion.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
是否显示持仓信息可以设置：&amp;lt;br&amp;gt;&lt;br /&gt;
[[image:tradeSetting.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
去掉窗口底部的‘显示持仓线’勾选则不显示此信息块。&amp;lt;br&amp;gt;&lt;br /&gt;
勾选‘显示盈亏百分比’，则原显示盈亏跳数改为显示百分比&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==蜂鸣提示==&lt;br /&gt;
在登陆了交易之后，有几种情况会发出蜂鸣提示或警告。&amp;lt;br&amp;gt;&lt;br /&gt;
1.交易时段切换。从开市到休市，从休市到开市，都会发出“嘟嘟嘟”的响声。&amp;lt;br&amp;gt;&lt;br /&gt;
2.同步或追单失败。会发出稍高频的“滴滴”声。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
如果不想听到蜂鸣声，可以到菜单，交易&amp;gt;交易助手&amp;gt;普通设置，找到“开启PC喇叭报警”这个选项，把勾选去掉。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==图形锁定==&lt;br /&gt;
&lt;br /&gt;
在自动交易状态下，k线图上将锁定不能切换到其他品种和周期，也不允许切换复权状态。&amp;lt;br&amp;gt;&lt;br /&gt;
如果需要看其他，建议多打开一个窗口，如必须在原窗口下切换，需关闭交易开关才能操作。&lt;br /&gt;
&lt;br /&gt;
==手工仓转换为策略仓==&lt;br /&gt;
由于每个策略具有单独的ID号，其中手工仓位也属于一个单独的ID号，所以手工单需要平仓时，必须人工操作平仓。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
如果需要用策略平人工单怎么办呢？ 也是有办法的，只要告诉系统，想把手工仓位转换为策略仓位即可。&amp;lt;br&amp;gt;&lt;br /&gt;
操作步骤：&amp;lt;br&amp;gt;&lt;br /&gt;
第一步：在历史成交管理页面，根据策略号“人工”，找到相应的手工仓位。；平仓单号为-1的就是未平仓位。&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:x.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
第二步，假设希望转换为“boll通道策略”，那么先打开正确的品种，并且把&amp;quot;boll通道策略”放到图上。&amp;lt;br&amp;gt;&lt;br /&gt;
第三步，在持仓列表中点击想改变策略名的持仓，拖动它，放到策略所在图表中。&amp;lt;br&amp;gt;&lt;br /&gt;
第四步，重启软件。&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E9%80%89%E6%8B%A9%E6%9D%83%E8%A1%8C%E6%83%85%E6%8A%A5%E4%BB%B7</id>
		<title>选择权行情报价</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E9%80%89%E6%8B%A9%E6%9D%83%E8%A1%8C%E6%83%85%E6%8A%A5%E4%BB%B7"/>
				<updated>2014-02-20T08:40:16Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=期权窗口布局=&lt;br /&gt;
&lt;br /&gt;
期权窗口可以通过菜单 系统 工作区管理 新建窗口 期权分析窗口创建，创建后自动切换至期权工作区&lt;br /&gt;
&lt;br /&gt;
期权窗口分开上下两个区域，上方是报价列表，下方是走势图和分析图&lt;br /&gt;
&lt;br /&gt;
=报价表=&lt;br /&gt;
&lt;br /&gt;
如图所示，报价窗口顶端是工具栏，下方是列表&lt;br /&gt;
&lt;br /&gt;
[[Image:Optlist.png]]&lt;br /&gt;
&lt;br /&gt;
==功能说明==&lt;br /&gt;
&lt;br /&gt;
'''切换选择权品种''' 通过标的物来切换报价表。选择标的物后，可选的合约月份将会自动更新到 切换合约月份下拉框&lt;br /&gt;
&lt;br /&gt;
'''切换合约月份''' 通过品种和合约月份下拉框完成报价表合约筛选，表内合约都是同一品种和月份（到期日）&lt;br /&gt;
&lt;br /&gt;
'''标准差高亮''' 点击标准差高亮按钮激活该功能，以履约价最接近标的物现价为中心，通过不同的颜色表示履约价在1倍标准差，2倍标准差和3倍标准差的合约&lt;br /&gt;
&lt;br /&gt;
'''表头设置''' 自定义表头字段，可选字段将在下面详细说明。&lt;br /&gt;
&lt;br /&gt;
'''算法设置''' 设置定价模型的计算参数&lt;br /&gt;
&lt;br /&gt;
'''信息显示区域''' 显示合约的到期剩余天数，波动率和标的物的最新价。&lt;br /&gt;
&lt;br /&gt;
'''列表切换''' 由于字段较多，列表分成了3列，通过点击Tab切换；列表1，2，3都可以通过表头设置来定制&lt;br /&gt;
&lt;br /&gt;
'''列表区域''' 列表区域列出相同标的物和相同到期日的合约，以中间的履约价从大到小排序，履约价左边是 Call 合约，右边是 Put 合约。最接近标的物最新价的合约颜色加深显示。合约中无效字段留空。&lt;br /&gt;
&lt;br /&gt;
==字段说明==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!字段名称!!字段说明&lt;br /&gt;
|-&lt;br /&gt;
|涨幅||(最新价-昨收)/昨收&lt;br /&gt;
|-&lt;br /&gt;
|涨跌||最新价-昨收&lt;br /&gt;
|-&lt;br /&gt;
|总量||成交量 Volume&lt;br /&gt;
|-&lt;br /&gt;
|未平仓量||持仓量 Open Interest&lt;br /&gt;
|-&lt;br /&gt;
|成交价||最新价&lt;br /&gt;
|-&lt;br /&gt;
|买一价||盘口买一 Bid&lt;br /&gt;
|-&lt;br /&gt;
|卖一价||盘口卖一 Ask&lt;br /&gt;
|-&lt;br /&gt;
|今开||开盘价 Open&lt;br /&gt;
|-&lt;br /&gt;
|最高||最高价 High&lt;br /&gt;
|-&lt;br /&gt;
|最低||最低价 Low&lt;br /&gt;
|-&lt;br /&gt;
|内含价值||买权是 标的物最新价-履约价 卖权是 履约价-标的物最新价&lt;br /&gt;
|-&lt;br /&gt;
|时间价值||选权价格-内含价值&lt;br /&gt;
|-&lt;br /&gt;
|履约价||选权合约的履约价&lt;br /&gt;
|-&lt;br /&gt;
|理论价||选权合约根据定价模型计算出来的理论价值&lt;br /&gt;
|-&lt;br /&gt;
|隐含波||根据选权合约的最新价反推出来的标的物波动率&lt;br /&gt;
|-&lt;br /&gt;
|昨隐含波||根据选权合约的昨收价反推出来的标的物波动率&lt;br /&gt;
|-&lt;br /&gt;
|Theta||避险参数 Theta, 合约价相对时间的导数&lt;br /&gt;
|-&lt;br /&gt;
|Vega||避险参数 Vega, 合约价相对波动率的导数&lt;br /&gt;
|-&lt;br /&gt;
|Delta||避险参数 Delta, 合约价相对标的物价格的导数&lt;br /&gt;
|-&lt;br /&gt;
|Gamma||避险参数 Gamma, 衡量Delta的变化速度，合约价对标的物价格的二次导数&lt;br /&gt;
|-&lt;br /&gt;
|Rho||避险参数 Rho, 合约价相对于无风险利率的导数&lt;br /&gt;
|-&lt;br /&gt;
|间隔报酬率||买权 (上一个合约最新价-当前合约最新价)/当前合约最新价 卖权 (下一个合约最新价-当前合约最新价)/当前合约最新价&lt;br /&gt;
|-&lt;br /&gt;
|CRD|| 买权 C-P+K-S 卖权 P-C+S-K (C 买权，P卖权，S标的物，K履约价)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==表头设置==&lt;br /&gt;
&lt;br /&gt;
[[Image:Optheadersettings.png‎]]&lt;br /&gt;
&lt;br /&gt;
在表头设置中，每个列表至少必须有履约价字段，并置于末端&lt;br /&gt;
&lt;br /&gt;
表头设置暂不能保存为默认，下次启动暂不能记住上次的配置&lt;br /&gt;
&lt;br /&gt;
==算法设置==&lt;br /&gt;
&lt;br /&gt;
[[Image:Optcalcsettings.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Optalgo.png]]&lt;br /&gt;
&lt;br /&gt;
'''交易日总数''' 用于计算年化波动率&lt;br /&gt;
&lt;br /&gt;
'''波动率天数''' 用于计算标的物波动率的采样天数&lt;br /&gt;
&lt;br /&gt;
'''无风险利率''' 定价模型中的 r&lt;br /&gt;
&lt;br /&gt;
'''持有成本'''  定价模型中的 b&lt;br /&gt;
&lt;br /&gt;
'''利率计算天数''' 用于计算定价模型中的T&lt;br /&gt;
&lt;br /&gt;
=走势图=&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E9%80%89%E6%8B%A9%E6%9D%83%E8%A1%8C%E6%83%85%E6%8A%A5%E4%BB%B7</id>
		<title>选择权行情报价</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E9%80%89%E6%8B%A9%E6%9D%83%E8%A1%8C%E6%83%85%E6%8A%A5%E4%BB%B7"/>
				<updated>2014-02-20T08:39:43Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=期权窗口布局=&lt;br /&gt;
&lt;br /&gt;
期权窗口可以通过菜单 系统 工作区管理 新建窗口 期权分析窗口创建，创建后自动切换至期权工作区&lt;br /&gt;
&lt;br /&gt;
期权窗口分开上下两个区域，上方是报价列表，下方是走势图和分析图&lt;br /&gt;
&lt;br /&gt;
=报价表=&lt;br /&gt;
&lt;br /&gt;
如图所示，报价窗口顶端是工具栏，下方是列表&lt;br /&gt;
&lt;br /&gt;
[[Image:Optlist.png]]&lt;br /&gt;
&lt;br /&gt;
==功能说明==&lt;br /&gt;
&lt;br /&gt;
'''切换选择权品种''' 通过标的物来切换报价表。选择标的物后，可选的合约月份将会自动更新到 切换合约月份下拉框&lt;br /&gt;
&lt;br /&gt;
'''切换合约月份''' 通过品种和合约月份下拉框完成报价表合约筛选，表内合约都是同一品种和月份（到期日）&lt;br /&gt;
&lt;br /&gt;
'''标准差高亮''' 点击标准差高亮按钮激活该功能，以履约价最接近标的物现价为中心，通过不同的颜色表示履约价在1倍标准差，2倍标准差和3倍标准差的合约&lt;br /&gt;
&lt;br /&gt;
'''表头设置''' 自定义表头字段，可选字段将在下面详细说明。&lt;br /&gt;
&lt;br /&gt;
'''算法设置''' 设置定价模型的计算参数&lt;br /&gt;
&lt;br /&gt;
'''信息显示区域''' 显示合约的到期剩余天数，波动率和标的物的最新价。&lt;br /&gt;
&lt;br /&gt;
'''列表切换''' 由于字段较多，列表分成了3列，通过点击Tab切换；列表1，2，3都可以通过表头设置来定制&lt;br /&gt;
&lt;br /&gt;
'''列表区域''' 列表区域列出相同标的物和相同到期日的合约，以中间的履约价从大到小排序，履约价左边是 Call 合约，右边是 Put 合约。最接近标的物最新价的合约颜色加深显示。合约中无效字段留空。&lt;br /&gt;
&lt;br /&gt;
==字段说明==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!字段名称!!字段说明&lt;br /&gt;
|-&lt;br /&gt;
|涨幅||(最新价-昨收)/昨收&lt;br /&gt;
|-&lt;br /&gt;
|涨跌||最新价-昨收&lt;br /&gt;
|-&lt;br /&gt;
|总量||成交量 Volume&lt;br /&gt;
|-&lt;br /&gt;
|未平仓量||持仓量 Open Interest&lt;br /&gt;
|-&lt;br /&gt;
|成交价||最新价&lt;br /&gt;
|-&lt;br /&gt;
|买一价||盘口买一 Bid&lt;br /&gt;
|-&lt;br /&gt;
|卖一价||盘口卖一 Ask&lt;br /&gt;
|-&lt;br /&gt;
|今开||开盘价 Open&lt;br /&gt;
|-&lt;br /&gt;
|最高||最高价 High&lt;br /&gt;
|-&lt;br /&gt;
|最低||最低价 Low&lt;br /&gt;
|-&lt;br /&gt;
|内含价值||买权是 标的物最新价-履约价 卖权是 履约价-标的物最新价&lt;br /&gt;
|-&lt;br /&gt;
|时间价值||选权价格-内含价值&lt;br /&gt;
|-&lt;br /&gt;
|履约价||选权合约的履约价&lt;br /&gt;
|-&lt;br /&gt;
|理论价||选权合约根据定价模型计算出来的理论价值&lt;br /&gt;
|-&lt;br /&gt;
|隐含波||根据选权合约的最新价反推出来的标的物波动率&lt;br /&gt;
|-&lt;br /&gt;
|昨隐含波||根据选权合约的昨收价反推出来的标的物波动率&lt;br /&gt;
|-&lt;br /&gt;
|Theta||避险参数 Theta, 合约价相对时间的导数&lt;br /&gt;
|-&lt;br /&gt;
|Vega||避险参数 Vega, 合约价相对波动率的导数&lt;br /&gt;
|-&lt;br /&gt;
|Delta||避险参数 Delta, 合约价相对标的物价格的导数&lt;br /&gt;
|-&lt;br /&gt;
|Gamma||避险参数 Gamma, 衡量Delta的变化速度，合约价对标的物价格的二次导数&lt;br /&gt;
|-&lt;br /&gt;
|Rho||避险参数 Rho, 合约价相对于无风险利率的导数&lt;br /&gt;
|-&lt;br /&gt;
|间隔报酬率||买权 (上一个合约最新价-当前合约最新价)/当前合约最新价 卖权 (下一个合约最新价-当前合约最新价)/当前合约最新价&lt;br /&gt;
|-&lt;br /&gt;
|CRD|| 买权 C-P+K-S 卖权 P-C+S-K (C 买权，P卖权，S标的物，K履约价)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==表头设置==&lt;br /&gt;
&lt;br /&gt;
[[Image:Optheadersettings.png‎]]&lt;br /&gt;
&lt;br /&gt;
在表头设置中，每个列表至少必须有履约价字段，并置于末端&lt;br /&gt;
&lt;br /&gt;
表头设置暂不能保存为默认，下次启动暂不能记住上次的配置&lt;br /&gt;
&lt;br /&gt;
==算法设置==&lt;br /&gt;
&lt;br /&gt;
[[Image:Optcalcsettings.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Optalgo.png]]&lt;br /&gt;
&lt;br /&gt;
'''交易日总数''' 用于计算年化波动率&lt;br /&gt;
'''波动率天数''' 用于计算标的物波动率的采样天数&lt;br /&gt;
'''无风险利率''' 定价模型中的 r&lt;br /&gt;
'''持有成本'''  定价模型中的 b&lt;br /&gt;
'''利率计算天数''' 用于计算定价模型中的T&lt;br /&gt;
&lt;br /&gt;
=走势图=&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Optalgo.png</id>
		<title>文件:Optalgo.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Optalgo.png"/>
				<updated>2014-02-20T08:32:52Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Optcalcsettings.png</id>
		<title>文件:Optcalcsettings.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Optcalcsettings.png"/>
				<updated>2014-02-20T08:30:19Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Optheadersettings.png</id>
		<title>文件:Optheadersettings.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Optheadersettings.png"/>
				<updated>2014-02-20T08:22:19Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E9%80%89%E6%8B%A9%E6%9D%83%E8%A1%8C%E6%83%85%E6%8A%A5%E4%BB%B7</id>
		<title>选择权行情报价</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E9%80%89%E6%8B%A9%E6%9D%83%E8%A1%8C%E6%83%85%E6%8A%A5%E4%BB%B7"/>
				<updated>2014-02-20T08:16:29Z</updated>
		
		<summary type="html">&lt;p&gt;John: 以“=期权窗口布局=  期权窗口可以通过菜单 系统 工作区管理 新建窗口 期权分析窗口创建，创建后自动切换至期权工作区  期权...”为内容创建页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=期权窗口布局=&lt;br /&gt;
&lt;br /&gt;
期权窗口可以通过菜单 系统 工作区管理 新建窗口 期权分析窗口创建，创建后自动切换至期权工作区&lt;br /&gt;
&lt;br /&gt;
期权窗口分开上下两个区域，上方是报价列表，下方是走势图和分析图&lt;br /&gt;
&lt;br /&gt;
=报价表=&lt;br /&gt;
&lt;br /&gt;
如图所示，报价窗口顶端是工具栏，下方是列表&lt;br /&gt;
&lt;br /&gt;
[[Image:Optlist.png]]&lt;br /&gt;
&lt;br /&gt;
==功能说明==&lt;br /&gt;
&lt;br /&gt;
'''切换选择权品种''' 通过标的物来切换报价表。选择标的物后，可选的合约月份将会自动更新到 切换合约月份下拉框&lt;br /&gt;
&lt;br /&gt;
'''切换合约月份''' 通过品种和合约月份下拉框完成报价表合约筛选，表内合约都是同一品种和月份（到期日）&lt;br /&gt;
&lt;br /&gt;
'''标准差高亮''' 点击标准差高亮按钮激活该功能，以履约价最接近标的物现价为中心，通过不同的颜色表示履约价在1倍标准差，2倍标准差和3倍标准差的合约&lt;br /&gt;
&lt;br /&gt;
'''表头设置''' 自定义表头字段，可选字段将在下面详细说明。&lt;br /&gt;
&lt;br /&gt;
'''算法设置''' 设置定价模型的计算参数&lt;br /&gt;
&lt;br /&gt;
'''信息显示区域''' 显示合约的到期剩余天数，波动率和标的物的最新价。&lt;br /&gt;
&lt;br /&gt;
'''列表切换''' 由于字段较多，列表分成了3列，通过点击Tab切换；列表1，2，3都可以通过表头设置来定制&lt;br /&gt;
&lt;br /&gt;
'''列表区域''' 列表区域列出相同标的物和相同到期日的合约，以中间的履约价从大到小排序，履约价左边是 Call 合约，右边是 Put 合约。最接近标的物最新价的合约颜色加深显示。合约中无效字段留空。&lt;br /&gt;
&lt;br /&gt;
==字段说明==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!字段名称!!字段说明&lt;br /&gt;
|-&lt;br /&gt;
|涨幅||(最新价-昨收)/昨收&lt;br /&gt;
|-&lt;br /&gt;
|涨跌||最新价-昨收&lt;br /&gt;
|-&lt;br /&gt;
|总量||成交量 Volume&lt;br /&gt;
|-&lt;br /&gt;
|未平仓量||持仓量 Open Interest&lt;br /&gt;
|-&lt;br /&gt;
|成交价||最新价&lt;br /&gt;
|-&lt;br /&gt;
|买一价||盘口买一 Bid&lt;br /&gt;
|-&lt;br /&gt;
|卖一价||盘口卖一 Ask&lt;br /&gt;
|-&lt;br /&gt;
|今开||开盘价 Open&lt;br /&gt;
|-&lt;br /&gt;
|最高||最高价 High&lt;br /&gt;
|-&lt;br /&gt;
|最低||最低价 Low&lt;br /&gt;
|-&lt;br /&gt;
|内含价值||买权是 标的物最新价-履约价 卖权是 履约价-标的物最新价&lt;br /&gt;
|-&lt;br /&gt;
|时间价值||选权价格-内含价值&lt;br /&gt;
|-&lt;br /&gt;
|履约价||选权合约的履约价&lt;br /&gt;
|-&lt;br /&gt;
|理论价||选权合约根据定价模型计算出来的理论价值&lt;br /&gt;
|-&lt;br /&gt;
|隐含波||根据选权合约的最新价反推出来的标的物波动率&lt;br /&gt;
|-&lt;br /&gt;
|昨隐含波||根据选权合约的昨收价反推出来的标的物波动率&lt;br /&gt;
|-&lt;br /&gt;
|Theta||避险参数 Theta, 合约价相对时间的导数&lt;br /&gt;
|-&lt;br /&gt;
|Vega||避险参数 Vega, 合约价相对波动率的导数&lt;br /&gt;
|-&lt;br /&gt;
|Delta||避险参数 Delta, 合约价相对标的物价格的导数&lt;br /&gt;
|-&lt;br /&gt;
|Gamma||避险参数 Gamma, 衡量Delta的变化速度，合约价对标的物价格的二次导数&lt;br /&gt;
|-&lt;br /&gt;
|Rho||避险参数 Rho, 合约价相对于无风险利率的导数&lt;br /&gt;
|-&lt;br /&gt;
|间隔报酬率||买权 (上一个合约最新价-当前合约最新价)/当前合约最新价 卖权 (下一个合约最新价-当前合约最新价)/当前合约最新价&lt;br /&gt;
|-&lt;br /&gt;
|CRD|| 买权 C-P+K-S 卖权 P-C+S-K (C 买权，P卖权，S标的物，K履约价)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=走势图=&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Optlist.png</id>
		<title>文件:Optlist.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Optlist.png"/>
				<updated>2014-02-20T07:09:43Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T10:38:37Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 实盘函数 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时飘浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
实盘的信号使用实心三角表示，红色多仓，蓝色空仓。鼠标在上方时漂浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==交易指令==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
  &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
省略字, 交易语句中可以插入一些定词，冠词，方便理解。这些单词在编译时会被忽略&lt;br /&gt;
&lt;br /&gt;
 A An Is Than Was On Does At The Based By Place Share Shares&lt;br /&gt;
&lt;br /&gt;
交易语句例子&lt;br /&gt;
&lt;br /&gt;
 buy this bar Market; // 在当前K线市价买入&lt;br /&gt;
 sell next bar open;  // 在下一根K线的开盘价卖出&lt;br /&gt;
  &lt;br /&gt;
 // 在下一根的 2398.2 价格处限价买入2口, 把仓位标记为 myPos&lt;br /&gt;
 buy ('myPos') 2 shares next bar  at 2398.2 limit;&lt;br /&gt;
 // 在下一根的 2399.8 价格处追价卖出标记为'myPos'里面的2口&lt;br /&gt;
 sell ('comment') from entry('myPos') 2 shares next bar at 2399.8 stop;&lt;br /&gt;
&lt;br /&gt;
中文版本的交易语句&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
中文版本的省略字&lt;br /&gt;
&lt;br /&gt;
 在 的 股 口&lt;br /&gt;
&lt;br /&gt;
中文交易语句例子&lt;br /&gt;
&lt;br /&gt;
  本周期 市价 买入;&lt;br /&gt;
  次周期 开盘价 卖出;&lt;br /&gt;
  在 次周期 2398.2 限价 买入 1 口 标记为 'MyPos';&lt;br /&gt;
  在 次周期 2399.8 追价 从标记 'MyPos' 卖出 1 口 标记为 'comment';&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade3.png]]&lt;br /&gt;
&lt;br /&gt;
* 市价单 在当前价格处交易&lt;br /&gt;
* 限价单 买入时不高于指定价格，卖出时不低于指定价格&lt;br /&gt;
* 追价单 买入时不低于指定价格，卖出时不高于指定价格&lt;br /&gt;
&lt;br /&gt;
Buy(买入) 和 BuyToCover(买平) 都属于买入方向&lt;br /&gt;
&lt;br /&gt;
Sell(卖出) 和 SellShort(卖开) 都属于卖出方向&lt;br /&gt;
&lt;br /&gt;
多头止损属于 Sell Stop 类型，空头止损属于 BuyToCover Stop 类型&lt;br /&gt;
&lt;br /&gt;
==当根开仓，下一根开仓==&lt;br /&gt;
&lt;br /&gt;
ThisBar 当根开仓是指当前产生信时后立刻交易，不考虑信号闪烁问题。当根开仓只能用 OT_Market 市价单，最好使用 #Run_Every_Tick模式。ThisBar 不需要接受 OT_Limit/OT_Stop单，原因是当前价格已知:&lt;br /&gt;
Limit 单可以写成 if close &amp;lt; price then buy; （多头）&lt;br /&gt;
Stop 单可以写成 if  close &amp;gt; price then buy; (多头)&lt;br /&gt;
&lt;br /&gt;
NextBar 下根开仓是指当K线走完了，确认信号，在下一根交易。或者计算买入卖出的通道，在下一根K线应用追价或限价单。下根交易可以使用 #Run_Every_Bar 模式，每根K线运行一次即可。Run_Every_Bar指定公式每根K线只运行一次，然而对于追价限价，止盈止损的判断，仍然是每个tick进行的。&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;br /&gt;
&lt;br /&gt;
出场的指令，除了Sell(卖出)和BuyToCover(买平)，还可以有以下：&lt;br /&gt;
*SetStopLoss 止损&lt;br /&gt;
*SetProfitTarget 止盈&lt;br /&gt;
*SetDollarTrailing 跟踪止盈（按金额计算）&lt;br /&gt;
*SetPercentTrailing 跟踪止盈（按百分比计算）&lt;br /&gt;
*SetBreakEven 保本止损&lt;br /&gt;
*SetInactive 震荡止损 （多少个周期内没有达到一定幅度的盈利和亏损）&lt;br /&gt;
&lt;br /&gt;
止盈止损的计算都分为按总盈利计算和按平均没口盈利计算，默认按整个仓位的总盈利计算。&lt;br /&gt;
&lt;br /&gt;
计算方式使用以下函数指定：&lt;br /&gt;
&lt;br /&gt;
*SetStopContract 按平均没口赢利计算&lt;br /&gt;
*SetStopPosition 按整个仓位计算&lt;br /&gt;
&lt;br /&gt;
注意盈利的计算是考虑了单边手续费的，而止盈止损则考虑双边的手续费。&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;br /&gt;
&lt;br /&gt;
除了使用实盘虚盘同步的交易模式，策略还能直接操作真实帐号，进行开平仓，撤单等的操作。&lt;br /&gt;
&lt;br /&gt;
*A_SendOrder 以限价单的形式直接发送到交易通道&lt;br /&gt;
*A_CancelOrder 撤销委托单&lt;br /&gt;
*A_CancelAllOrders 撤销所有委托单&lt;br /&gt;
*A_GetOrderCount 返回当日共有多少张委托单&lt;br /&gt;
*A_GetOpenOrderCount 返回当日为成交（或部分成交）的委托单数量&lt;br /&gt;
*A_GetLastOrderIndex 返回最近一次委托单的序号&lt;br /&gt;
*A_GetLastOpenOrderIndex 返回最近一次为成交（或部分成交）的委托单数量&lt;br /&gt;
*A_OrderStatus 委托单的状态&lt;br /&gt;
*A_OpenOrderStatus 未成交（或部分成交）的委托单的状态&lt;br /&gt;
*A_OrderLot 委托单的委托开仓量&lt;br /&gt;
*A_OpenOrderLot 未成交（或部分成交）委托的未成交的口数&lt;br /&gt;
*A_OrderPrice 委托单的委托价格&lt;br /&gt;
*A_OpenOrderPrice 未成交（或部分成交）的委托价格&lt;br /&gt;
*A_OrderTime 委托单的委托时间&lt;br /&gt;
*A_OpenOrderTime 未成交（或部分成交）的委托单的委托时间&lt;br /&gt;
*A_OrderDate 委托单的委托日期&lt;br /&gt;
*A_OpenOrderDate 未成交（或部分成交）的委托单的委托日期&lt;br /&gt;
*A_OrderType 委托单的类型&lt;br /&gt;
*A_OpenOrderType 未成交（或部分成交）的委托单的类型&lt;br /&gt;
*A_OrderContractNo 委托单的合同编号&lt;br /&gt;
*A_OpenOrderContractNo 未成交（或部分成交）的委托单的合同编号&lt;br /&gt;
*A_OrderFilledLot 委托单的已成交口数&lt;br /&gt;
*A_OpenOrderFilledLot 未成交（或部分成交）的委托单的已成交口数&lt;br /&gt;
*A_OrderFilledPrice 委托单的成交价格&lt;br /&gt;
*A_OpenOrderFilledPrice 未成交（或部分成交）的委托单的已成交部分的成交价格&lt;br /&gt;
*A_OrderCancelledLot 委托单撤单已撤口数&lt;br /&gt;
*A_OpenOrderCancelledLot 未成交（或部分成交）的委托单的已撤口数&lt;br /&gt;
*A_OrderSymbol 委托单的委托品种&lt;br /&gt;
*A_OpenOrderSymbol 未成交（或部分成交）的委托单的委托品种&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T10:24:17Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时飘浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
实盘的信号使用实心三角表示，红色多仓，蓝色空仓。鼠标在上方时漂浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==交易指令==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
  &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
省略字, 交易语句中可以插入一些定词，冠词，方便理解。这些单词在编译时会被忽略&lt;br /&gt;
&lt;br /&gt;
 A An Is Than Was On Does At The Based By Place Share Shares&lt;br /&gt;
&lt;br /&gt;
交易语句例子&lt;br /&gt;
&lt;br /&gt;
 buy this bar Market; // 在当前K线市价买入&lt;br /&gt;
 sell next bar open;  // 在下一根K线的开盘价卖出&lt;br /&gt;
  &lt;br /&gt;
 // 在下一根的 2398.2 价格处限价买入2口, 把仓位标记为 myPos&lt;br /&gt;
 buy ('myPos') 2 shares next bar  at 2398.2 limit;&lt;br /&gt;
 // 在下一根的 2399.8 价格处追价卖出标记为'myPos'里面的2口&lt;br /&gt;
 sell ('comment') from entry('myPos') 2 shares next bar at 2399.8 stop;&lt;br /&gt;
&lt;br /&gt;
中文版本的交易语句&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
中文版本的省略字&lt;br /&gt;
&lt;br /&gt;
 在 的 股 口&lt;br /&gt;
&lt;br /&gt;
中文交易语句例子&lt;br /&gt;
&lt;br /&gt;
  本周期 市价 买入;&lt;br /&gt;
  次周期 开盘价 卖出;&lt;br /&gt;
  在 次周期 2398.2 限价 买入 1 口 标记为 'MyPos';&lt;br /&gt;
  在 次周期 2399.8 追价 从标记 'MyPos' 卖出 1 口 标记为 'comment';&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade3.png]]&lt;br /&gt;
&lt;br /&gt;
* 市价单 在当前价格处交易&lt;br /&gt;
* 限价单 买入时不高于指定价格，卖出时不低于指定价格&lt;br /&gt;
* 追价单 买入时不低于指定价格，卖出时不高于指定价格&lt;br /&gt;
&lt;br /&gt;
Buy(买入) 和 BuyToCover(买平) 都属于买入方向&lt;br /&gt;
&lt;br /&gt;
Sell(卖出) 和 SellShort(卖开) 都属于卖出方向&lt;br /&gt;
&lt;br /&gt;
多头止损属于 Sell Stop 类型，空头止损属于 BuyToCover Stop 类型&lt;br /&gt;
&lt;br /&gt;
==当根开仓，下一根开仓==&lt;br /&gt;
&lt;br /&gt;
ThisBar 当根开仓是指当前产生信时后立刻交易，不考虑信号闪烁问题。当根开仓只能用 OT_Market 市价单，最好使用 #Run_Every_Tick模式。ThisBar 不需要接受 OT_Limit/OT_Stop单，原因是当前价格已知:&lt;br /&gt;
Limit 单可以写成 if close &amp;lt; price then buy; （多头）&lt;br /&gt;
Stop 单可以写成 if  close &amp;gt; price then buy; (多头)&lt;br /&gt;
&lt;br /&gt;
NextBar 下根开仓是指当K线走完了，确认信号，在下一根交易。或者计算买入卖出的通道，在下一根K线应用追价或限价单。下根交易可以使用 #Run_Every_Bar 模式，每根K线运行一次即可。Run_Every_Bar指定公式每根K线只运行一次，然而对于追价限价，止盈止损的判断，仍然是每个tick进行的。&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;br /&gt;
&lt;br /&gt;
出场的指令，除了Sell(卖出)和BuyToCover(买平)，还可以有以下：&lt;br /&gt;
*SetStopLoss 止损&lt;br /&gt;
*SetProfitTarget 止盈&lt;br /&gt;
*SetDollarTrailing 跟踪止盈（按金额计算）&lt;br /&gt;
*SetPercentTrailing 跟踪止盈（按百分比计算）&lt;br /&gt;
*SetBreakEven 保本止损&lt;br /&gt;
*SetInactive 震荡止损 （多少个周期内没有达到一定幅度的盈利和亏损）&lt;br /&gt;
&lt;br /&gt;
止盈止损的计算都分为按总盈利计算和按平均没口盈利计算，默认按整个仓位的总盈利计算。&lt;br /&gt;
&lt;br /&gt;
计算方式使用以下函数指定：&lt;br /&gt;
&lt;br /&gt;
*SetStopContract 按平均没口赢利计算&lt;br /&gt;
*SetStopPosition 按整个仓位计算&lt;br /&gt;
&lt;br /&gt;
注意盈利的计算是考虑了单边手续费的，而止盈止损则考虑双边的手续费。&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T10:14:43Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 当根开仓，下一根开仓 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时飘浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
实盘的信号使用实心三角表示，红色多仓，蓝色空仓。鼠标在上方时漂浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==交易指令==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
  &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
省略字, 交易语句中可以插入一些定词，冠词，方便理解。这些单词在编译时会被忽略&lt;br /&gt;
&lt;br /&gt;
 A An Is Than Was On Does At The Based By Place Share Shares&lt;br /&gt;
&lt;br /&gt;
交易语句例子&lt;br /&gt;
&lt;br /&gt;
 buy this bar Market; // 在当前K线市价买入&lt;br /&gt;
 sell next bar open;  // 在下一根K线的开盘价卖出&lt;br /&gt;
  &lt;br /&gt;
 // 在下一根的 2398.2 价格处限价买入2口, 把仓位标记为 myPos&lt;br /&gt;
 buy ('myPos') 2 shares next bar  at 2398.2 limit;&lt;br /&gt;
 // 在下一根的 2399.8 价格处追价卖出标记为'myPos'里面的2口&lt;br /&gt;
 sell ('comment') from entry('myPos') 2 shares next bar at 2399.8 stop;&lt;br /&gt;
&lt;br /&gt;
中文版本的交易语句&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
中文版本的省略字&lt;br /&gt;
&lt;br /&gt;
 在 的 股 口&lt;br /&gt;
&lt;br /&gt;
中文交易语句例子&lt;br /&gt;
&lt;br /&gt;
  本周期 市价 买入;&lt;br /&gt;
  次周期 开盘价 卖出;&lt;br /&gt;
  在 次周期 2398.2 限价 买入 1 口 标记为 'MyPos';&lt;br /&gt;
  在 次周期 2399.8 追价 从标记 'MyPos' 卖出 1 口 标记为 'comment';&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade3.png]]&lt;br /&gt;
&lt;br /&gt;
* 市价单 在当前价格处交易&lt;br /&gt;
* 限价单 买入时不高于指定价格，卖出时不低于指定价格&lt;br /&gt;
* 追价单 买入时不低于指定价格，卖出时不高于指定价格&lt;br /&gt;
&lt;br /&gt;
Buy(买入) 和 BuyToCover(买平) 都属于买入方向&lt;br /&gt;
&lt;br /&gt;
Sell(卖出) 和 SellShort(卖开) 都属于卖出方向&lt;br /&gt;
&lt;br /&gt;
多头止损属于 Sell Stop 类型，空头止损属于 BuyToCover Stop 类型&lt;br /&gt;
&lt;br /&gt;
==当根开仓，下一根开仓==&lt;br /&gt;
&lt;br /&gt;
ThisBar 当根开仓是指当前产生信时后立刻交易，不考虑信号闪烁问题。当根开仓只能用 OT_Market 市价单，最好使用 #Run_Every_Tick模式。ThisBar 不需要接受 OT_Limit/OT_Stop单，原因是当前价格已知:&lt;br /&gt;
Limit 单可以写成 if close &amp;lt; price then buy; （多头）&lt;br /&gt;
Stop 单可以写成 if  close &amp;gt; price then buy; (多头)&lt;br /&gt;
&lt;br /&gt;
NextBar 下根开仓是指当K线走完了，确认信号，在下一根交易。或者计算买入卖出的通道，在下一根K线应用追价或限价单。下根交易可以使用 #Run_Every_Bar 模式，每根K线运行一次即可。Run_Every_Bar指定公式每根K线只运行一次，然而对于追价限价，止盈止损的判断，仍然是每个tick进行的。&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T10:06:29Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 限价，追价，市价单 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时飘浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
实盘的信号使用实心三角表示，红色多仓，蓝色空仓。鼠标在上方时漂浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==交易指令==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
  &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
省略字, 交易语句中可以插入一些定词，冠词，方便理解。这些单词在编译时会被忽略&lt;br /&gt;
&lt;br /&gt;
 A An Is Than Was On Does At The Based By Place Share Shares&lt;br /&gt;
&lt;br /&gt;
交易语句例子&lt;br /&gt;
&lt;br /&gt;
 buy this bar Market; // 在当前K线市价买入&lt;br /&gt;
 sell next bar open;  // 在下一根K线的开盘价卖出&lt;br /&gt;
  &lt;br /&gt;
 // 在下一根的 2398.2 价格处限价买入2口, 把仓位标记为 myPos&lt;br /&gt;
 buy ('myPos') 2 shares next bar  at 2398.2 limit;&lt;br /&gt;
 // 在下一根的 2399.8 价格处追价卖出标记为'myPos'里面的2口&lt;br /&gt;
 sell ('comment') from entry('myPos') 2 shares next bar at 2399.8 stop;&lt;br /&gt;
&lt;br /&gt;
中文版本的交易语句&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
中文版本的省略字&lt;br /&gt;
&lt;br /&gt;
 在 的 股 口&lt;br /&gt;
&lt;br /&gt;
中文交易语句例子&lt;br /&gt;
&lt;br /&gt;
  本周期 市价 买入;&lt;br /&gt;
  次周期 开盘价 卖出;&lt;br /&gt;
  在 次周期 2398.2 限价 买入 1 口 标记为 'MyPos';&lt;br /&gt;
  在 次周期 2399.8 追价 从标记 'MyPos' 卖出 1 口 标记为 'comment';&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade3.png]]&lt;br /&gt;
&lt;br /&gt;
* 市价单 在当前价格处交易&lt;br /&gt;
* 限价单 买入时不高于指定价格，卖出时不低于指定价格&lt;br /&gt;
* 追价单 买入时不低于指定价格，卖出时不高于指定价格&lt;br /&gt;
&lt;br /&gt;
Buy(买入) 和 BuyToCover(买平) 都属于买入方向&lt;br /&gt;
&lt;br /&gt;
Sell(卖出) 和 SellShort(卖开) 都属于卖出方向&lt;br /&gt;
&lt;br /&gt;
多头止损属于 Sell Stop 类型，空头止损属于 BuyToCover Stop 类型&lt;br /&gt;
&lt;br /&gt;
==当根开仓，下一根开仓==&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmltrade3.png</id>
		<title>文件:Fmltrade3.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmltrade3.png"/>
				<updated>2013-06-14T10:01:37Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T09:46:19Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 交易指令 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时飘浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
实盘的信号使用实心三角表示，红色多仓，蓝色空仓。鼠标在上方时漂浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==交易指令==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
  &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
省略字, 交易语句中可以插入一些定词，冠词，方便理解。这些单词在编译时会被忽略&lt;br /&gt;
&lt;br /&gt;
 A An Is Than Was On Does At The Based By Place Share Shares&lt;br /&gt;
&lt;br /&gt;
交易语句例子&lt;br /&gt;
&lt;br /&gt;
 buy this bar Market; // 在当前K线市价买入&lt;br /&gt;
 sell next bar open;  // 在下一根K线的开盘价卖出&lt;br /&gt;
  &lt;br /&gt;
 // 在下一根的 2398.2 价格处限价买入2口, 把仓位标记为 myPos&lt;br /&gt;
 buy ('myPos') 2 shares next bar  at 2398.2 limit;&lt;br /&gt;
 // 在下一根的 2399.8 价格处追价卖出标记为'myPos'里面的2口&lt;br /&gt;
 sell ('comment') from entry('myPos') 2 shares next bar at 2399.8 stop;&lt;br /&gt;
&lt;br /&gt;
中文版本的交易语句&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
中文版本的省略字&lt;br /&gt;
&lt;br /&gt;
 在 的 股 口&lt;br /&gt;
&lt;br /&gt;
中文交易语句例子&lt;br /&gt;
&lt;br /&gt;
  本周期 市价 买入;&lt;br /&gt;
  次周期 开盘价 卖出;&lt;br /&gt;
  在 次周期 2398.2 限价 买入 1 口 标记为 'MyPos';&lt;br /&gt;
  在 次周期 2399.8 追价 从标记 'MyPos' 卖出 1 口 标记为 'comment';&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
==当根开仓，下一根开仓==&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T08:32:35Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 交易指令 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时飘浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
实盘的信号使用实心三角表示，红色多仓，蓝色空仓。鼠标在上方时漂浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==交易指令==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
  &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
省略字, 交易语句中可以插入一些定词，冠词，方便理解。这些单词在编译时会被忽略&lt;br /&gt;
&lt;br /&gt;
 A An Is Than Was On Does At The Based By Place Share Shares&lt;br /&gt;
&lt;br /&gt;
交易语句例子&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
中文版本的交易语句&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
中文版本的省略字&lt;br /&gt;
&lt;br /&gt;
 在 的 股 口&lt;br /&gt;
&lt;br /&gt;
中文交易语句例子&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
==当根开仓，下一根开仓==&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T08:17:54Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 虚盘与实盘 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时飘浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
实盘的信号使用实心三角表示，红色多仓，蓝色空仓。鼠标在上方时漂浮详细交易信息。&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==交易指令==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
 &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
==当根开仓，下一根开仓==&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T08:11:46Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时会飘浮出交易提示。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==交易指令==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
 &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
==当根开仓，下一根开仓==&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T08:10:01Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时会飘浮出交易提示。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==交易语句==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
 &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
==当根开仓，下一根开仓==&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T08:08:45Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时会飘浮出交易提示。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==交易语句==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
 &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T08:04:30Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 虚盘与实盘 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
在交易策略里，一般的交易函数并不直接操作真实帐号。每个策略都虚拟出一个帐号，称之为虚盘。&lt;br /&gt;
&lt;br /&gt;
在这个帐号上开平仓都是瞬间完成的，没有网络延时，并且保证成功。&lt;br /&gt;
&lt;br /&gt;
这样做可以确保策略自身逻辑的完整性，就是说每当策略产生信号时，虚盘总是能根据信号发生交易，&lt;br /&gt;
&lt;br /&gt;
并不会像真实交易那样产生滑价，延时，部分成交，甚至不成交。&lt;br /&gt;
&lt;br /&gt;
实盘是指真实的交易帐号（也可以是模拟帐号），实盘是通过与虚盘的同步跟随去完成实际交易的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请看下面的例子：&lt;br /&gt;
 ma1:ma(close, 5);&lt;br /&gt;
 ma2:ma(close, 10);&lt;br /&gt;
 if cross(ma2, ma1) then sellshort;&lt;br /&gt;
该策略以5日均线和10日均线交叉作为开仓条件&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade1.png]]&lt;br /&gt;
&lt;br /&gt;
两条均线在图中所标注处发生了交叉，则虚盘在下一根K线的开盘价卖空1手。&lt;br /&gt;
&lt;br /&gt;
这个操作是不需要真实交易帐号的。虚盘的交易信号使用虚心三角形表示，鼠标在上方时会飘浮出交易提示。&lt;br /&gt;
&lt;br /&gt;
虚盘的仓位会标注在策略图标的右方，此时蓝色的[-1]表示虚盘持有1手空仓，多仓以红色正数表示。&lt;br /&gt;
&lt;br /&gt;
虚盘不允许双向持仓，开反向仓时自动平掉原方向的仓位。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
虚盘的信号通过仓位同步反应在真实交易中。接着上面的例子，如果此时登陆了交易帐号，并点击小脸打开交易&lt;br /&gt;
&lt;br /&gt;
（笑脸为交易开启，哭脸为交易关闭），并且把同步设置成“总是同步”，实盘将会在最新价处跟随虚盘开仓，&lt;br /&gt;
&lt;br /&gt;
使得实盘与虚盘的仓位一致：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmltrade2.png]]&lt;br /&gt;
&lt;br /&gt;
同步的选项有以下几种：&lt;br /&gt;
*'''总是同步''':任何时候都保证实盘与虚盘的持仓数量和方向一致&lt;br /&gt;
*'''下次持仓方向改变时同步''':持仓方向有持多仓，持空仓和无持仓三种，当下次持仓方向改变时才进行同步&lt;br /&gt;
*'''下次持仓数量改变时同步''':当虚盘持仓在数量上改变时同步。方向改变时持仓数量一定改变，但持仓数量改变时不一定持仓方向也改变&lt;br /&gt;
*'''市场价优于虚盘开仓均价时同步''':当虚盘有持仓，实盘等待最新价低于多头虚盘开仓价（或者高于空头开仓价时），进行同步&lt;br /&gt;
&lt;br /&gt;
==ThisBar 与 NextBar==&lt;br /&gt;
&lt;br /&gt;
==交易语句==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
 &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmltrade2.png</id>
		<title>文件:Fmltrade2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmltrade2.png"/>
				<updated>2013-06-14T07:57:27Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmltrade1.png</id>
		<title>文件:Fmltrade1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmltrade1.png"/>
				<updated>2013-06-14T07:42:09Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T07:09:56Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘==&lt;br /&gt;
&lt;br /&gt;
==ThisBar 与 NextBar==&lt;br /&gt;
&lt;br /&gt;
==交易语句==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
 &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F</id>
		<title>智能交易公式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%99%BA%E8%83%BD%E4%BA%A4%E6%98%93%E5%85%AC%E5%BC%8F"/>
				<updated>2013-06-14T07:06:30Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 交易语句 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能交易脚本是量化交易思路的表达形式&lt;br /&gt;
&lt;br /&gt;
==交易语句==&lt;br /&gt;
&lt;br /&gt;
基本的交易可以通过 Buy/Sell/SellShort/BuyToCover 函数或语句完成。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 指令 !! 中文 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| Buy || 买入 || 多头开仓&lt;br /&gt;
|-&lt;br /&gt;
| Sell || 卖出 || 多头平仓&lt;br /&gt;
|-&lt;br /&gt;
| SellShort || 卖开 || 空头开仓&lt;br /&gt;
|-&lt;br /&gt;
| BuyToCover || 买平 || 空头平仓&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''交易函数'''&lt;br /&gt;
&lt;br /&gt;
作为函数时，与一般的函数调用一样，目前只支持逐根运行的模式。&lt;br /&gt;
&lt;br /&gt;
 Buy('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 SellShort('symbol', Lots, Price=0, Slippage=0, OT=OT_Market, KT=KT_NextBar, Comment='')&lt;br /&gt;
 Sell('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
 BuyToCover('Symbol', lots, price, slippage, OT, KT, 'Comment') [From 'EntryName']&lt;br /&gt;
&lt;br /&gt;
Symbol: 下单品种&lt;br /&gt;
&lt;br /&gt;
Lots: 下单数量，填Default时下单数量由界面控制&lt;br /&gt;
&lt;br /&gt;
Price: 下单价格，市价单 OT_Market 时价格可以填 0&lt;br /&gt;
&lt;br /&gt;
Slippage: 下单滑价，滑价是在实盘成交时起作用的，不影响虚盘的成交价格，但会影响测评报告的绩效计算。滑价填0时由界面控制滑价。&lt;br /&gt;
&lt;br /&gt;
OT: Order Type 有以下的类型：&lt;br /&gt;
&lt;br /&gt;
*OT_OPEN 开盘竞价，暂不支持&lt;br /&gt;
*OT_CLOSE 收盘竞价，暂不支持&lt;br /&gt;
*OT_MARKET 市价单，以当前价格成交&lt;br /&gt;
*OT_LIMIT 限价单，当买方向价格低于下单价格时成交（或卖方向高于此价格）&lt;br /&gt;
*OT_STOP 追价单，当买方向价格高于下单价格时成交（或卖方向低于此价格）&lt;br /&gt;
&lt;br /&gt;
KT: K线类型有以下几种：&lt;br /&gt;
&lt;br /&gt;
*KT_ThisBar, 当前一根K线，只能配合 OT_Market&lt;br /&gt;
*KT_NextBar, 下一根K线，可以配合 OT_Market/OT_Stop/OT_Limit&lt;br /&gt;
&lt;br /&gt;
Comment: 下单注释，开仓时作为仓位标记&lt;br /&gt;
&lt;br /&gt;
EntryName: 平仓时可以指定只操作某个标记的仓位&lt;br /&gt;
&lt;br /&gt;
返回值：这4个交易函数都是操作虚盘的，操作能保证成功，所以函数没有返回值&lt;br /&gt;
&lt;br /&gt;
'''交易语句'''&lt;br /&gt;
&lt;br /&gt;
作为交易语句时，功能与交易函数一样，但写法更易于理解&lt;br /&gt;
&lt;br /&gt;
  ('SellShort' | 'Sell' 'Short') ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType&lt;br /&gt;
  'Buy' ['(' &amp;quot;EntryLabel&amp;quot; ')'] [TradeSize] EntryType &lt;br /&gt;
  'Sell'['(' &amp;quot;ExitLabel&amp;quot; ')'] [From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType&lt;br /&gt;
  ('BuyToCover' | 'Buy' 'To' 'Cover' ) [(&amp;quot;ExitLabel&amp;quot;)][From Entry(&amp;quot;EntryLabel&amp;quot;)] [TradeSize[Total]] ExitType &lt;br /&gt;
 &lt;br /&gt;
  EntryType: ( This Bar[On]Close | Next Bar[At]Open or Next Bar[At]Market | Next Bar[At]Price Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
  ExitType: ( This Bar[On]Close | Next Bar[At]Open  or Next Bar[At]Market | Next Bar[At]Price  Limit | Next Bar[At]Price  Stop )&lt;br /&gt;
&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ('买入'|'卖开') [数量] ['标记为' '开仓标记'];&lt;br /&gt;
  ('次周期'|'本周期') [价格] [类型] ['从标记' '开仓标记'] ('卖出'|'买平') [数量] ['标记为' '平仓标记'];&lt;br /&gt;
  &lt;br /&gt;
  类型: ('追价'|'限价'|'市价')&lt;br /&gt;
&lt;br /&gt;
==虚盘与实盘同步==&lt;br /&gt;
&lt;br /&gt;
==实盘函数==&lt;br /&gt;
&lt;br /&gt;
==限价，追价，市价单==&lt;br /&gt;
&lt;br /&gt;
==止盈，止损，跟踪止损，震荡止损，保本止损==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%B5%8B%E8%AF%84%E6%8A%A5%E5%91%8A%E4%B9%8B%E4%BA%8C</id>
		<title>测评报告之二</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%B5%8B%E8%AF%84%E6%8A%A5%E5%91%8A%E4%B9%8B%E4%BA%8C"/>
				<updated>2013-06-14T06:11:38Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Ceping7.jpg]]&lt;br /&gt;
&lt;br /&gt;
月绩效分析表&lt;br /&gt;
&lt;br /&gt;
测试期内所有相同月份交易绩效的统计。&lt;br /&gt;
&lt;br /&gt;
如上图，是2005-2012年的月绩效统计，3、7、9月份的绩效如此不堪，&lt;br /&gt;
&lt;br /&gt;
可考虑这几个月份减小投入资金或不做交易。4、10月份的绩效惊人，可考虑这几个月份加大投入。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
月度分析&lt;br /&gt;
&lt;br /&gt;
与【月绩效分析表】不同，该表是测试期内每个自然月的交易绩效的统计&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
年度分析&lt;br /&gt;
&lt;br /&gt;
测试期内每个自然年的交易绩效的统计&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
最大浮盈浮亏表&lt;br /&gt;
&lt;br /&gt;
【交易明细】表中有每笔交易曾达到的最大浮盈、最大浮亏，该表对此进行总体统计，&lt;br /&gt;
&lt;br /&gt;
包括最大值、发生日期、平均值、标准差等。&lt;br /&gt;
&lt;br /&gt;
[[Image:Ceping8.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
最大浮盈散点图&lt;br /&gt;
&lt;br /&gt;
横坐标是交易序号，每个点表示该笔交易的最大浮盈，水平线是最大浮盈的平均值&lt;br /&gt;
&lt;br /&gt;
[[Image:Ceping9.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
最大浮亏散点图&lt;br /&gt;
&lt;br /&gt;
横坐标是交易序号，每个点表示该笔交易的最大浮亏，水平线是最大浮亏的平均值。&lt;br /&gt;
&lt;br /&gt;
双击鼠标出现十字光标可查看各点数值。&lt;br /&gt;
&lt;br /&gt;
[[Image:Ceping10.jpg]]&lt;br /&gt;
&lt;br /&gt;
最大浮盈-平仓盈亏柱形图&lt;br /&gt;
&lt;br /&gt;
横坐标是交易序号，每个柱的高点都在0线之上，是该笔交易的最大浮盈，&lt;br /&gt;
&lt;br /&gt;
低点是该笔交易的平仓盈亏，柱形高度表示最大浮盈与平仓盈亏间的差距。&lt;br /&gt;
&lt;br /&gt;
红色表示该笔交易是盈利的，绿色表示该笔交易是亏损的。&lt;br /&gt;
&lt;br /&gt;
[[Image:Ceping11.jpg]]&lt;br /&gt;
&lt;br /&gt;
最大浮亏-平仓盈亏柱形图&lt;br /&gt;
&lt;br /&gt;
横坐标是交易序号，每个柱的低点都在0线之下，是该笔交易的最大浮亏，高点是该笔交易的平仓盈亏，&lt;br /&gt;
&lt;br /&gt;
柱形高度表示最大浮亏与平仓盈亏间的差距。红色表示该笔交易是盈利的，绿色表示该笔交易是亏损的。&lt;br /&gt;
&lt;br /&gt;
双击鼠标出现十字光标可查看各点数值。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Ceping12.jpg]]&lt;br /&gt;
&lt;br /&gt;
最大浮盈-平仓盈亏散点图&lt;br /&gt;
&lt;br /&gt;
该图描绘了每笔交易的盈亏与最大浮动盈利间的关系。&lt;br /&gt;
&lt;br /&gt;
纵坐标是平仓盈亏的绝对值。红色表示盈利交易，绿色表示亏损交易。&lt;br /&gt;
&lt;br /&gt;
[[Image:Ceping13.jpg]]&lt;br /&gt;
&lt;br /&gt;
最大浮亏-平仓盈亏散点图&lt;br /&gt;
&lt;br /&gt;
该图描绘了每笔交易的盈亏额与最大浮动亏损间的关系。&lt;br /&gt;
&lt;br /&gt;
纵坐标是平仓盈亏的绝对值。红色表示盈利交易，绿色表示亏损交易。&lt;br /&gt;
&lt;br /&gt;
双击鼠标出现十字光标可查看各点数值。&lt;br /&gt;
&lt;br /&gt;
[[Image:Ceping14.jpg]]&lt;br /&gt;
&lt;br /&gt;
与资产及水下（回撤曲线）图相似，但带有过夜占用保证金曲线&lt;br /&gt;
&lt;br /&gt;
[[Image:Ceping15.jpg]]&lt;br /&gt;
&lt;br /&gt;
累计成本 = 累计的手续费+滑价成本&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==时间仓位分析==&lt;br /&gt;
&lt;br /&gt;
'''总交易时间'''：第一笔交易到最后一笔交易之间的天数，包括周末&lt;br /&gt;
&lt;br /&gt;
'''持仓时间（天）'''：有持仓的天数&lt;br /&gt;
&lt;br /&gt;
'''持仓时间（%）'''：有持仓的天数占交易总时间的百分比&lt;br /&gt;
&lt;br /&gt;
'''最大空仓时间（天）'''：没有持仓持续的最大天数&lt;br /&gt;
&lt;br /&gt;
'''总交易月数'''：第一笔交易到最后一笔交易之间的月数&lt;br /&gt;
&lt;br /&gt;
'''盈利月数'''：盈利的月份总数&lt;br /&gt;
&lt;br /&gt;
'''资产增值天数'''：动态权益增长的总天数&lt;br /&gt;
&lt;br /&gt;
'''资产减值天数'''：动态权益减少的总天数&lt;br /&gt;
&lt;br /&gt;
'''获利日占比'''：（增值时间%）资产增值天数/总交易时间*100%&lt;br /&gt;
&lt;br /&gt;
'''最大浮盈日期'''：持仓浮动盈利最大的日期，检视是什么仓位和走势产生的&lt;br /&gt;
&lt;br /&gt;
'''最大浮亏日期'''：持仓浮动亏损最大的日期，检视是什么仓位和走势产生的&lt;br /&gt;
&lt;br /&gt;
'''持仓周期'''：持仓期间的K线数量&lt;br /&gt;
&lt;br /&gt;
'''平均持仓周期'''：每笔交易的持仓K线数量和/交易次数&lt;br /&gt;
&lt;br /&gt;
'''平均盈利周期'''：盈利交易平均持仓周期，K线数&lt;br /&gt;
&lt;br /&gt;
'''平均亏损周期'''：亏损交易平均持仓周期，K线数&lt;br /&gt;
&lt;br /&gt;
'''最大持仓数量'''：统计历史上曾经的最大的持仓合约数，按天结算的，不是盘中实时最大的。&lt;br /&gt;
&lt;br /&gt;
'''最大占用资金'''：统计历史上最大投入的资金额，开仓到最大仓位时投入的资金，按天结算。&lt;br /&gt;
&lt;br /&gt;
'''最小账户资金'''：最大资产回撤+占用的保证金&lt;br /&gt;
&lt;br /&gt;
'''平均仓位'''：对每根K线取样计算持仓占用的资金/资产的百分比平均值&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E7%BC%96%E8%AF%91%E9%A2%84%E5%A4%84%E7%90%86</id>
		<title>编译预处理</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E7%BC%96%E8%AF%91%E9%A2%84%E5%A4%84%E7%90%86"/>
				<updated>2013-06-09T08:18:55Z</updated>
		
		<summary type="html">&lt;p&gt;John: 以“编译预处理是指编译前对编译器的一些设定，不参与到公式的语法分析中  编译预处理有下面的种类：   #Mainchart  #Subchart  #NoDe...”为内容创建页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;编译预处理是指编译前对编译器的一些设定，不参与到公式的语法分析中&lt;br /&gt;
&lt;br /&gt;
编译预处理有下面的种类：&lt;br /&gt;
&lt;br /&gt;
 #Mainchart&lt;br /&gt;
 #Subchart&lt;br /&gt;
 #NoDefaultOutput&lt;br /&gt;
 #Trade&lt;br /&gt;
 #Opt&lt;br /&gt;
 #Note&lt;br /&gt;
 #Template&lt;br /&gt;
 #InvalidPeriod&lt;br /&gt;
 #DefaultPeriod&lt;br /&gt;
 #RunMode&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 #Run_By_Serie&lt;br /&gt;
 #Run_Every_Tick&lt;br /&gt;
 #Run_Every_Bar&lt;br /&gt;
 #NoTitle&lt;br /&gt;
 #Use&lt;br /&gt;
 #Define&lt;br /&gt;
 #RefLine&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E9%A6%96%E9%A1%B5</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E9%A6%96%E9%A1%B5"/>
				<updated>2013-06-09T08:13:28Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 公式教程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==简介==&lt;br /&gt;
北斗星是一款具有划时代意义的程式化交易平台软件。 [http://www.hs633.com/pro 北斗星下载] &lt;br /&gt;
*内置强大的金语言系统，支持中文编写策略； &lt;br /&gt;
*兼容国内主流证券软件，如飞狐交易师、大智慧、通达信等的指标语言&lt;br /&gt;
*很大程度上兼容技术分析和程式交易的工业标准语言 Easy Language/Power Language。&lt;br /&gt;
&lt;br /&gt;
[http://www.hs633.com/forum.php 用户论坛----资讯发布，用户反馈，心得交流，专人帮助]&lt;br /&gt;
&lt;br /&gt;
[http://www.hs633.com/forum.php?mod=viewthread&amp;amp;tid=2850&amp;amp;extra=page%3D1 教学视频]&lt;br /&gt;
&lt;br /&gt;
看一看 [http://www.hs633.com/pro/gl.php 这个]  对金语言有一个大致的了解。&lt;br /&gt;
&lt;br /&gt;
==主客户端的使用==&lt;br /&gt;
===关于北斗星===&lt;br /&gt;
#[[系统简介]]&lt;br /&gt;
&lt;br /&gt;
===关于联机帮助系统===&lt;br /&gt;
#[[关于联机帮助系统的使用]]&lt;br /&gt;
#[[常用术语]]&lt;br /&gt;
&lt;br /&gt;
===下载和安装===&lt;br /&gt;
#[[如何下载软件]]&lt;br /&gt;
#如何安装软件&lt;br /&gt;
##[[如何安装软件]]&lt;br /&gt;
##[[系统配置要求]]&lt;br /&gt;
#[[如何进入系统]]&lt;br /&gt;
&lt;br /&gt;
===功能详解===&lt;br /&gt;
====系统菜单简介====&lt;br /&gt;
#[[系统菜单]]&lt;br /&gt;
#[[量化交易菜单]]&lt;br /&gt;
#[[查看菜单]]&lt;br /&gt;
#[[画面菜单]]&lt;br /&gt;
#[[工具菜单]]&lt;br /&gt;
#[[窗口菜单]]&lt;br /&gt;
#[[帮助菜单]]&lt;br /&gt;
====行情观看====&lt;br /&gt;
=====行情机制=====&lt;br /&gt;
#[[行情数据类型]]&lt;br /&gt;
#[[全推和点播]]&lt;br /&gt;
&lt;br /&gt;
=====如何灵活使用工作区=====&lt;br /&gt;
#[[工作区有什么作用？]]&lt;br /&gt;
#[[如何新建工作区？]]&lt;br /&gt;
#[[如何关闭工作区？]]&lt;br /&gt;
#[[如何删除工作区？]]&lt;br /&gt;
#[[如何调整工作区位置？]]&lt;br /&gt;
=====报价窗口=====&lt;br /&gt;
#[[如何在报价表中打开分析窗口？]]&lt;br /&gt;
#[[如何添加与关闭报价板块？]]&lt;br /&gt;
#[[如何调整报价板块位置？]]&lt;br /&gt;
#[[如何调整显示栏目？]]&lt;br /&gt;
#[[如何调整列宽？]]&lt;br /&gt;
#[[如何选中多个证券？]]&lt;br /&gt;
#[[如何排序并取消？]]&lt;br /&gt;
#[[如何添加、取消特别标记？]]&lt;br /&gt;
#[[如何将证券加入到自选或自定义板块？]]&lt;br /&gt;
#[[如何复制表中数据？]]&lt;br /&gt;
#[[如何添加、删除常用板块？]]&lt;br /&gt;
#[[如何使用键盘加入证券到自选板块？]]&lt;br /&gt;
#[[如何调整自选或自定义板块中的证券显示位置？]]&lt;br /&gt;
=====键盘精灵和快捷键=====&lt;br /&gt;
#[[键盘精灵详解]]&lt;br /&gt;
#[[系统快捷键列表]]&lt;br /&gt;
&lt;br /&gt;
====技术分析====&lt;br /&gt;
#[[如何切换证券分析周期？]]&lt;br /&gt;
#[[如何查看除权、复权走势图？]]&lt;br /&gt;
#[[如何查看多日分时走势？]]&lt;br /&gt;
#[[如何切换主图类型？]]&lt;br /&gt;
#[[如何添加、删除、最大化附图？]]&lt;br /&gt;
#[[如何显示指标公式？]]&lt;br /&gt;
#[[如何移动分析画面？]]&lt;br /&gt;
#[[如何叠加、清除其他品种走势？]]&lt;br /&gt;
#[[如何同时查看多个品种走势图？]]&lt;br /&gt;
#[[如何在附图指标上叠加k线？]]&lt;br /&gt;
#[[如何查看历史某天分时走势？]]&lt;br /&gt;
#[[如何切换横、纵坐标类型？]]&lt;br /&gt;
#[[如何显示、隐藏常用指标栏？]]&lt;br /&gt;
#[[如何显示、隐藏最新价线？]]&lt;br /&gt;
#[[如何设置主图k线显示数量？]]&lt;br /&gt;
#[[如何显示、隐藏策略信息？]]&lt;br /&gt;
#[[分析窗口如何自动翻页？]]&lt;br /&gt;
#[[如何在k线图上显示波段高低点数值？]]&lt;br /&gt;
#[[如何反转走势图形？]]&lt;br /&gt;
#[[如何在分析窗口复制数据？]]&lt;br /&gt;
#[[如何快速找到所要的k线？]]&lt;br /&gt;
#[[如何锁定k线图显示时段？]]&lt;br /&gt;
#[[如何统计时段数据？]]&lt;br /&gt;
#[[历史回忆的意义与使用？]]&lt;br /&gt;
#[[如何打造自定义数据库？]]&lt;br /&gt;
#[[如何使用太阳风暴功能？]]&lt;br /&gt;
#[[如何利用训练模式自我提高？]]&lt;br /&gt;
#[[如何使用预警系统，打造自己的监控体系？]]&lt;br /&gt;
#[[如何进行条件选股？]]&lt;br /&gt;
&lt;br /&gt;
====画线工具介绍====&lt;br /&gt;
&lt;br /&gt;
====量化分析和交易====&lt;br /&gt;
=====智能评测=====&lt;br /&gt;
#[[如何将策略模拟信号显示在k线图上？]]&lt;br /&gt;
#[[如何快速查看测评报告？]]&lt;br /&gt;
#[[如何使用智能测评全面评估策略？]]&lt;br /&gt;
#[[如何设置测评？]]&lt;br /&gt;
#[[如何查看详细测评报告？]]&lt;br /&gt;
#[[如何查看策略分析？]]&lt;br /&gt;
#[[如何查看交易分析？]]&lt;br /&gt;
#[[如何查看时段分析？]]&lt;br /&gt;
#[[如何将自己的测评结果上传到花生网？]]&lt;br /&gt;
&lt;br /&gt;
=====测评报告详解=====&lt;br /&gt;
#[[测评报告之一]]&lt;br /&gt;
#[[测评报告之二]]&lt;br /&gt;
#[[历史回测]]&lt;br /&gt;
&lt;br /&gt;
=====手工下单及交易账户信息查询=====&lt;br /&gt;
#[[如何登入、注销交易账户？]]&lt;br /&gt;
#[[如何查看账户资金？]]&lt;br /&gt;
#[[如何查看委托状态？]]&lt;br /&gt;
#[[如何查看当前持仓？]]&lt;br /&gt;
#[[如何查看历史成交？]]&lt;br /&gt;
#[[如何查看、修改各合约配置？]]&lt;br /&gt;
#[[如何手工下单？]]&lt;br /&gt;
#[[如何将账户数据上传到花生网？]]&lt;br /&gt;
&lt;br /&gt;
=====闪电下单和图形下单=====&lt;br /&gt;
#[[如何闪电下单]]&lt;br /&gt;
#[[如何图形化下单]]&lt;br /&gt;
=====本地模拟=====&lt;br /&gt;
#[[如何本地模拟]]&lt;br /&gt;
=====程式交易=====&lt;br /&gt;
#[[如何程式化交易]]&lt;br /&gt;
=====后台交易=====&lt;br /&gt;
#[[后台交易详解]]&lt;br /&gt;
&lt;br /&gt;
====策略公式编辑器====&lt;br /&gt;
#[[策略公式编辑器]]&lt;br /&gt;
#[[打开新建指标]]&lt;br /&gt;
#[[编辑指标]]&lt;br /&gt;
#[[编译指标]]&lt;br /&gt;
#[[函数字典]]&lt;br /&gt;
#[[菜单]]&lt;br /&gt;
#[[工具条]]&lt;br /&gt;
#[[公式参数精灵面板]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==数据定义==&lt;br /&gt;
&lt;br /&gt;
===基本数据定义===&lt;br /&gt;
#[[报价表]]（Report）&lt;br /&gt;
#[[成交分笔]]（TICK）&lt;br /&gt;
#[[一分钟]]（MIN1）&lt;br /&gt;
#[[五分钟]]（MIN5）&lt;br /&gt;
#[[日线]]&lt;br /&gt;
&lt;br /&gt;
===多周期数据定义===&lt;br /&gt;
#[[K线切分方式计算标准]]&lt;br /&gt;
&lt;br /&gt;
===特殊复权===&lt;br /&gt;
#[[期货主连复权]]&lt;br /&gt;
#[[日间复权]]&lt;br /&gt;
&lt;br /&gt;
===主连换月规则===&lt;br /&gt;
&lt;br /&gt;
#[[主连换月规则]]&lt;br /&gt;
&lt;br /&gt;
==目录结构及文件用途==&lt;br /&gt;
#[[目录结构及文件]]&lt;br /&gt;
&lt;br /&gt;
==公式系统教程==&lt;br /&gt;
===公式教程===&lt;br /&gt;
#[[公式系统入门]]&lt;br /&gt;
#[[公式类型]]&lt;br /&gt;
#[[数据类型]]&lt;br /&gt;
#[[参数和变量]]&lt;br /&gt;
#[[执行模式]]&lt;br /&gt;
#[[保留字]]&lt;br /&gt;
#[[操作符]]&lt;br /&gt;
#[[表达式]]&lt;br /&gt;
#[[控制语句]]&lt;br /&gt;
#[[指标输出和线形描述]]&lt;br /&gt;
#[[注释，公式描述，参数精灵]]&lt;br /&gt;
#[[编译预处理]]&lt;br /&gt;
#[[智能交易公式]]&lt;br /&gt;
#[[数据引用与指标引用]]&lt;br /&gt;
#[[公共函数]]&lt;br /&gt;
#[[DLL扩展]]&lt;br /&gt;
#[[函数索引]]&lt;br /&gt;
&lt;br /&gt;
===经典分析指标详解===&lt;br /&gt;
#[[移动平均线MA]]&lt;br /&gt;
#[[布林通道BOLL]]&lt;br /&gt;
#[[指数平滑异同移动平均线MACD]]&lt;br /&gt;
#[[随机指标KDJ]]&lt;br /&gt;
#[[相对强弱指标RSI]]&lt;br /&gt;
&lt;br /&gt;
===交易脚本样例详解===&lt;br /&gt;
#[[交易指令基础]]&lt;br /&gt;
#[[交易指令进阶]]&lt;br /&gt;
#[[日内交易之开盘区间突破]]&lt;br /&gt;
#[[分批开平仓]]&lt;br /&gt;
#[[指标背离交易及风险控制策略]]&lt;br /&gt;
#[[自动趋势线交易策略]]&lt;br /&gt;
#[[网格交易和鞅加仓策略]]&lt;br /&gt;
#[[点数图突破交易策略]]&lt;br /&gt;
#[[均线与趋势线交叉加仓位管理]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==应用文库==&lt;br /&gt;
#F10扩展功能&lt;br /&gt;
&lt;br /&gt;
==相关链接==&lt;br /&gt;
Here are some helpful links: &lt;br /&gt;
*[http://www.hs633.com/pro/about.php &amp;quot;Beginner's Guide To 交易平台&amp;quot;]&lt;br /&gt;
*[http://www.hs633.com/pro/problem.php FAQ for frequent beginner questions]&lt;br /&gt;
*[http://www.hs633.com/download_Futures.php/ 下载北斗星]&lt;br /&gt;
&lt;br /&gt;
==WIKI 使用帮助==&lt;br /&gt;
[http://en.wikipedia.org/wiki/Wikipedia:Tutorial/Formatting WIKI使用帮助]&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Help:Table WIKI表格制作]&lt;br /&gt;
&lt;br /&gt;
[[SandBox|试验田]]&lt;br /&gt;
&lt;br /&gt;
[[category:在线帮助]]&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5</id>
		<title>注释，公式描述，参数精灵</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5"/>
				<updated>2013-06-09T08:10:04Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 全文本公式 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==公式注释==&lt;br /&gt;
&lt;br /&gt;
公式编写中，往往需要插入描述性文字，这些文字在编译时是忽略的。&lt;br /&gt;
&lt;br /&gt;
注释分为单行注释和整个段落注释，使用 // 注释单行，直至行末；使用{}注释整个段落&lt;br /&gt;
&lt;br /&gt;
例如下面的例子：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlgszs.png]]&lt;br /&gt;
&lt;br /&gt;
在公式编辑器里，注释呈现绿色&lt;br /&gt;
&lt;br /&gt;
==公式描述==&lt;br /&gt;
&lt;br /&gt;
为了方便用户理解，公式可以附带一些说明性的文字。在编辑器的参数面板里面可以&lt;br /&gt;
&lt;br /&gt;
点击 用法注释 按钮来添加公式描述：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlyfzs.png]]&lt;br /&gt;
&lt;br /&gt;
编译后，当用户运行公式时，只要鼠标移动到指标名称上，软件就会浮现用户添加的用法注释：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlyfzs2.png]]&lt;br /&gt;
&lt;br /&gt;
==参数精灵==&lt;br /&gt;
&lt;br /&gt;
参数精灵也是公式的一种说明描述，显示在调整公式参数面板上：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlcsjl.png]]&lt;br /&gt;
&lt;br /&gt;
参数精灵通过 Param#No 或 SParam#No 来对应参数的类型和第几个参数，Param是数值型，SParam是字符串类型。&lt;br /&gt;
&lt;br /&gt;
注意它们是大小写敏感的，No是数字，代表第几个参数，下面是例子：&lt;br /&gt;
&lt;br /&gt;
 这是第一个参数 #Param#1, 数值类型&lt;br /&gt;
 这是第二个参数 #SParam#2, 字符串类型&lt;br /&gt;
&lt;br /&gt;
==全文本公式==&lt;br /&gt;
&lt;br /&gt;
注释，公式描述和参数精灵，包括参数设置本身都可以内嵌到公式的文本里，完全无界面化。&lt;br /&gt;
&lt;br /&gt;
  #Note '公式描述&lt;br /&gt;
 换行 '&lt;br /&gt;
 &lt;br /&gt;
 #Template '参数精灵第一个参数 Param#1 &lt;br /&gt;
 第二个参数 SParam#2&lt;br /&gt;
 '&lt;br /&gt;
 &lt;br /&gt;
 input:&lt;br /&gt;
   aa(1.2),&lt;br /&gt;
   bb('test1');&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5</id>
		<title>注释，公式描述，参数精灵</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5"/>
				<updated>2013-06-09T08:09:42Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 全文本公式 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==公式注释==&lt;br /&gt;
&lt;br /&gt;
公式编写中，往往需要插入描述性文字，这些文字在编译时是忽略的。&lt;br /&gt;
&lt;br /&gt;
注释分为单行注释和整个段落注释，使用 // 注释单行，直至行末；使用{}注释整个段落&lt;br /&gt;
&lt;br /&gt;
例如下面的例子：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlgszs.png]]&lt;br /&gt;
&lt;br /&gt;
在公式编辑器里，注释呈现绿色&lt;br /&gt;
&lt;br /&gt;
==公式描述==&lt;br /&gt;
&lt;br /&gt;
为了方便用户理解，公式可以附带一些说明性的文字。在编辑器的参数面板里面可以&lt;br /&gt;
&lt;br /&gt;
点击 用法注释 按钮来添加公式描述：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlyfzs.png]]&lt;br /&gt;
&lt;br /&gt;
编译后，当用户运行公式时，只要鼠标移动到指标名称上，软件就会浮现用户添加的用法注释：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlyfzs2.png]]&lt;br /&gt;
&lt;br /&gt;
==参数精灵==&lt;br /&gt;
&lt;br /&gt;
参数精灵也是公式的一种说明描述，显示在调整公式参数面板上：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlcsjl.png]]&lt;br /&gt;
&lt;br /&gt;
参数精灵通过 Param#No 或 SParam#No 来对应参数的类型和第几个参数，Param是数值型，SParam是字符串类型。&lt;br /&gt;
&lt;br /&gt;
注意它们是大小写敏感的，No是数字，代表第几个参数，下面是例子：&lt;br /&gt;
&lt;br /&gt;
 这是第一个参数 #Param#1, 数值类型&lt;br /&gt;
 这是第二个参数 #SParam#2, 字符串类型&lt;br /&gt;
&lt;br /&gt;
==全文本公式==&lt;br /&gt;
&lt;br /&gt;
注释，公式描述和参数精灵，包括参数设置本身都可以内嵌到公式的文本里，完全无界面化。&lt;br /&gt;
&lt;br /&gt;
  #Note '公式描述&lt;br /&gt;
 换行 '&lt;br /&gt;
&lt;br /&gt;
 #Template '参数精灵第一个参数 Param#1 &lt;br /&gt;
 第二个参数 SParam#2&lt;br /&gt;
 '&lt;br /&gt;
 &lt;br /&gt;
 input:&lt;br /&gt;
   aa(1.2),&lt;br /&gt;
   bb('test1');&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%95%B0%E6%8D%AE%E5%BC%95%E7%94%A8%E4%B8%8E%E6%8C%87%E6%A0%87%E5%BC%95%E7%94%A8</id>
		<title>数据引用与指标引用</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%95%B0%E6%8D%AE%E5%BC%95%E7%94%A8%E4%B8%8E%E6%8C%87%E6%A0%87%E5%BC%95%E7%94%A8"/>
				<updated>2013-06-09T07:49:02Z</updated>
		
		<summary type="html">&lt;p&gt;John: 以“==数据引用== 数据引用与数据对齐 前1根和前1天 分支里面的数据回溯  ==指标引用==”为内容创建页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==数据引用==&lt;br /&gt;
数据引用与数据对齐&lt;br /&gt;
前1根和前1天&lt;br /&gt;
分支里面的数据回溯&lt;br /&gt;
&lt;br /&gt;
==指标引用==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E9%A6%96%E9%A1%B5</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E9%A6%96%E9%A1%B5"/>
				<updated>2013-06-09T07:48:34Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 公式教程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==简介==&lt;br /&gt;
北斗星是一款具有划时代意义的程式化交易平台软件。 [http://www.hs633.com/pro 北斗星下载] &lt;br /&gt;
*内置强大的金语言系统，支持中文编写策略； &lt;br /&gt;
*兼容国内主流证券软件，如飞狐交易师、大智慧、通达信等的指标语言&lt;br /&gt;
*很大程度上兼容技术分析和程式交易的工业标准语言 Easy Language/Power Language。&lt;br /&gt;
&lt;br /&gt;
[http://www.hs633.com/forum.php 用户论坛----资讯发布，用户反馈，心得交流，专人帮助]&lt;br /&gt;
&lt;br /&gt;
[http://www.hs633.com/forum.php?mod=viewthread&amp;amp;tid=2850&amp;amp;extra=page%3D1 教学视频]&lt;br /&gt;
&lt;br /&gt;
看一看 [http://www.hs633.com/pro/gl.php 这个]  对金语言有一个大致的了解。&lt;br /&gt;
&lt;br /&gt;
==主客户端的使用==&lt;br /&gt;
===关于北斗星===&lt;br /&gt;
#[[系统简介]]&lt;br /&gt;
&lt;br /&gt;
===关于联机帮助系统===&lt;br /&gt;
#[[关于联机帮助系统的使用]]&lt;br /&gt;
#[[常用术语]]&lt;br /&gt;
&lt;br /&gt;
===下载和安装===&lt;br /&gt;
#[[如何下载软件]]&lt;br /&gt;
#如何安装软件&lt;br /&gt;
##[[如何安装软件]]&lt;br /&gt;
##[[系统配置要求]]&lt;br /&gt;
#[[如何进入系统]]&lt;br /&gt;
&lt;br /&gt;
===功能详解===&lt;br /&gt;
====系统菜单简介====&lt;br /&gt;
#[[系统菜单]]&lt;br /&gt;
#[[量化交易菜单]]&lt;br /&gt;
#[[查看菜单]]&lt;br /&gt;
#[[画面菜单]]&lt;br /&gt;
#[[工具菜单]]&lt;br /&gt;
#[[窗口菜单]]&lt;br /&gt;
#[[帮助菜单]]&lt;br /&gt;
====行情观看====&lt;br /&gt;
=====行情机制=====&lt;br /&gt;
#[[行情数据类型]]&lt;br /&gt;
#[[全推和点播]]&lt;br /&gt;
&lt;br /&gt;
=====如何灵活使用工作区=====&lt;br /&gt;
#[[工作区有什么作用？]]&lt;br /&gt;
#[[如何新建工作区？]]&lt;br /&gt;
#[[如何关闭工作区？]]&lt;br /&gt;
#[[如何删除工作区？]]&lt;br /&gt;
#[[如何调整工作区位置？]]&lt;br /&gt;
=====报价窗口=====&lt;br /&gt;
#[[如何在报价表中打开分析窗口？]]&lt;br /&gt;
#[[如何添加与关闭报价板块？]]&lt;br /&gt;
#[[如何调整报价板块位置？]]&lt;br /&gt;
#[[如何调整显示栏目？]]&lt;br /&gt;
#[[如何调整列宽？]]&lt;br /&gt;
#[[如何选中多个证券？]]&lt;br /&gt;
#[[如何排序并取消？]]&lt;br /&gt;
#[[如何添加、取消特别标记？]]&lt;br /&gt;
#[[如何将证券加入到自选或自定义板块？]]&lt;br /&gt;
#[[如何复制表中数据？]]&lt;br /&gt;
#[[如何添加、删除常用板块？]]&lt;br /&gt;
#[[如何使用键盘加入证券到自选板块？]]&lt;br /&gt;
#[[如何调整自选或自定义板块中的证券显示位置？]]&lt;br /&gt;
=====键盘精灵和快捷键=====&lt;br /&gt;
#[[键盘精灵详解]]&lt;br /&gt;
#[[系统快捷键列表]]&lt;br /&gt;
&lt;br /&gt;
====技术分析====&lt;br /&gt;
#[[如何切换证券分析周期？]]&lt;br /&gt;
#[[如何查看除权、复权走势图？]]&lt;br /&gt;
#[[如何查看多日分时走势？]]&lt;br /&gt;
#[[如何切换主图类型？]]&lt;br /&gt;
#[[如何添加、删除、最大化附图？]]&lt;br /&gt;
#[[如何显示指标公式？]]&lt;br /&gt;
#[[如何移动分析画面？]]&lt;br /&gt;
#[[如何叠加、清除其他品种走势？]]&lt;br /&gt;
#[[如何同时查看多个品种走势图？]]&lt;br /&gt;
#[[如何在附图指标上叠加k线？]]&lt;br /&gt;
#[[如何查看历史某天分时走势？]]&lt;br /&gt;
#[[如何切换横、纵坐标类型？]]&lt;br /&gt;
#[[如何显示、隐藏常用指标栏？]]&lt;br /&gt;
#[[如何显示、隐藏最新价线？]]&lt;br /&gt;
#[[如何设置主图k线显示数量？]]&lt;br /&gt;
#[[如何显示、隐藏策略信息？]]&lt;br /&gt;
#[[分析窗口如何自动翻页？]]&lt;br /&gt;
#[[如何在k线图上显示波段高低点数值？]]&lt;br /&gt;
#[[如何反转走势图形？]]&lt;br /&gt;
#[[如何在分析窗口复制数据？]]&lt;br /&gt;
#[[如何快速找到所要的k线？]]&lt;br /&gt;
#[[如何锁定k线图显示时段？]]&lt;br /&gt;
#[[如何统计时段数据？]]&lt;br /&gt;
#[[历史回忆的意义与使用？]]&lt;br /&gt;
#[[如何打造自定义数据库？]]&lt;br /&gt;
#[[如何使用太阳风暴功能？]]&lt;br /&gt;
#[[如何利用训练模式自我提高？]]&lt;br /&gt;
#[[如何使用预警系统，打造自己的监控体系？]]&lt;br /&gt;
#[[如何进行条件选股？]]&lt;br /&gt;
&lt;br /&gt;
====画线工具介绍====&lt;br /&gt;
&lt;br /&gt;
====量化分析和交易====&lt;br /&gt;
=====智能评测=====&lt;br /&gt;
#[[如何将策略模拟信号显示在k线图上？]]&lt;br /&gt;
#[[如何快速查看测评报告？]]&lt;br /&gt;
#[[如何使用智能测评全面评估策略？]]&lt;br /&gt;
#[[如何设置测评？]]&lt;br /&gt;
#[[如何查看详细测评报告？]]&lt;br /&gt;
#[[如何查看策略分析？]]&lt;br /&gt;
#[[如何查看交易分析？]]&lt;br /&gt;
#[[如何查看时段分析？]]&lt;br /&gt;
#[[如何将自己的测评结果上传到花生网？]]&lt;br /&gt;
&lt;br /&gt;
=====测评报告详解=====&lt;br /&gt;
#[[测评报告之一]]&lt;br /&gt;
#[[测评报告之二]]&lt;br /&gt;
#[[历史回测]]&lt;br /&gt;
&lt;br /&gt;
=====手工下单及交易账户信息查询=====&lt;br /&gt;
#[[如何登入、注销交易账户？]]&lt;br /&gt;
#[[如何查看账户资金？]]&lt;br /&gt;
#[[如何查看委托状态？]]&lt;br /&gt;
#[[如何查看当前持仓？]]&lt;br /&gt;
#[[如何查看历史成交？]]&lt;br /&gt;
#[[如何查看、修改各合约配置？]]&lt;br /&gt;
#[[如何手工下单？]]&lt;br /&gt;
#[[如何将账户数据上传到花生网？]]&lt;br /&gt;
&lt;br /&gt;
=====闪电下单和图形下单=====&lt;br /&gt;
#[[如何闪电下单]]&lt;br /&gt;
#[[如何图形化下单]]&lt;br /&gt;
=====本地模拟=====&lt;br /&gt;
#[[如何本地模拟]]&lt;br /&gt;
=====程式交易=====&lt;br /&gt;
#[[如何程式化交易]]&lt;br /&gt;
=====后台交易=====&lt;br /&gt;
#[[后台交易详解]]&lt;br /&gt;
&lt;br /&gt;
====策略公式编辑器====&lt;br /&gt;
#[[策略公式编辑器]]&lt;br /&gt;
#[[打开新建指标]]&lt;br /&gt;
#[[编辑指标]]&lt;br /&gt;
#[[编译指标]]&lt;br /&gt;
#[[函数字典]]&lt;br /&gt;
#[[菜单]]&lt;br /&gt;
#[[工具条]]&lt;br /&gt;
#[[公式参数精灵面板]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==数据定义==&lt;br /&gt;
&lt;br /&gt;
===基本数据定义===&lt;br /&gt;
#[[报价表]]（Report）&lt;br /&gt;
#[[成交分笔]]（TICK）&lt;br /&gt;
#[[一分钟]]（MIN1）&lt;br /&gt;
#[[五分钟]]（MIN5）&lt;br /&gt;
#[[日线]]&lt;br /&gt;
&lt;br /&gt;
===多周期数据定义===&lt;br /&gt;
#[[K线切分方式计算标准]]&lt;br /&gt;
&lt;br /&gt;
===特殊复权===&lt;br /&gt;
#[[期货主连复权]]&lt;br /&gt;
#[[日间复权]]&lt;br /&gt;
&lt;br /&gt;
===主连换月规则===&lt;br /&gt;
&lt;br /&gt;
#[[主连换月规则]]&lt;br /&gt;
&lt;br /&gt;
==目录结构及文件用途==&lt;br /&gt;
#[[目录结构及文件]]&lt;br /&gt;
&lt;br /&gt;
==公式系统教程==&lt;br /&gt;
===公式教程===&lt;br /&gt;
#[[公式系统入门]]&lt;br /&gt;
#[[公式类型]]&lt;br /&gt;
#[[数据类型]]&lt;br /&gt;
#[[参数和变量]]&lt;br /&gt;
#[[执行模式]]&lt;br /&gt;
#[[保留字]]&lt;br /&gt;
#[[操作符]]&lt;br /&gt;
#[[表达式]]&lt;br /&gt;
#[[控制语句]]&lt;br /&gt;
#[[指标输出和线形描述]]&lt;br /&gt;
#[[注释，公式描述，参数精灵]]&lt;br /&gt;
#[[智能交易公式]]&lt;br /&gt;
#[[数据引用与指标引用]]&lt;br /&gt;
#[[公共函数]]&lt;br /&gt;
#[[DLL扩展]]&lt;br /&gt;
#[[函数索引]]&lt;br /&gt;
&lt;br /&gt;
===经典分析指标详解===&lt;br /&gt;
#[[移动平均线MA]]&lt;br /&gt;
#[[布林通道BOLL]]&lt;br /&gt;
#[[指数平滑异同移动平均线MACD]]&lt;br /&gt;
#[[随机指标KDJ]]&lt;br /&gt;
#[[相对强弱指标RSI]]&lt;br /&gt;
&lt;br /&gt;
===交易脚本样例详解===&lt;br /&gt;
#[[交易指令基础]]&lt;br /&gt;
#[[交易指令进阶]]&lt;br /&gt;
#[[日内交易之开盘区间突破]]&lt;br /&gt;
#[[分批开平仓]]&lt;br /&gt;
#[[指标背离交易及风险控制策略]]&lt;br /&gt;
#[[自动趋势线交易策略]]&lt;br /&gt;
#[[网格交易和鞅加仓策略]]&lt;br /&gt;
#[[点数图突破交易策略]]&lt;br /&gt;
#[[均线与趋势线交叉加仓位管理]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==应用文库==&lt;br /&gt;
#F10扩展功能&lt;br /&gt;
&lt;br /&gt;
==相关链接==&lt;br /&gt;
Here are some helpful links: &lt;br /&gt;
*[http://www.hs633.com/pro/about.php &amp;quot;Beginner's Guide To 交易平台&amp;quot;]&lt;br /&gt;
*[http://www.hs633.com/pro/problem.php FAQ for frequent beginner questions]&lt;br /&gt;
*[http://www.hs633.com/download_Futures.php/ 下载北斗星]&lt;br /&gt;
&lt;br /&gt;
==WIKI 使用帮助==&lt;br /&gt;
[http://en.wikipedia.org/wiki/Wikipedia:Tutorial/Formatting WIKI使用帮助]&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Help:Table WIKI表格制作]&lt;br /&gt;
&lt;br /&gt;
[[SandBox|试验田]]&lt;br /&gt;
&lt;br /&gt;
[[category:在线帮助]]&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5</id>
		<title>注释，公式描述，参数精灵</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5"/>
				<updated>2013-06-09T07:46:05Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 参数精灵 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==公式注释==&lt;br /&gt;
&lt;br /&gt;
公式编写中，往往需要插入描述性文字，这些文字在编译时是忽略的。&lt;br /&gt;
&lt;br /&gt;
注释分为单行注释和整个段落注释，使用 // 注释单行，直至行末；使用{}注释整个段落&lt;br /&gt;
&lt;br /&gt;
例如下面的例子：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlgszs.png]]&lt;br /&gt;
&lt;br /&gt;
在公式编辑器里，注释呈现绿色&lt;br /&gt;
&lt;br /&gt;
==公式描述==&lt;br /&gt;
&lt;br /&gt;
为了方便用户理解，公式可以附带一些说明性的文字。在编辑器的参数面板里面可以&lt;br /&gt;
&lt;br /&gt;
点击 用法注释 按钮来添加公式描述：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlyfzs.png]]&lt;br /&gt;
&lt;br /&gt;
编译后，当用户运行公式时，只要鼠标移动到指标名称上，软件就会浮现用户添加的用法注释：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlyfzs2.png]]&lt;br /&gt;
&lt;br /&gt;
==参数精灵==&lt;br /&gt;
&lt;br /&gt;
参数精灵也是公式的一种说明描述，显示在调整公式参数面板上：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlcsjl.png]]&lt;br /&gt;
&lt;br /&gt;
参数精灵通过 Param#No 或 SParam#No 来对应参数的类型和第几个参数，Param是数值型，SParam是字符串类型。&lt;br /&gt;
&lt;br /&gt;
注意它们是大小写敏感的，No是数字，代表第几个参数，下面是例子：&lt;br /&gt;
&lt;br /&gt;
 这是第一个参数 #Param#1, 数值类型&lt;br /&gt;
 这是第二个参数 #SParam#2, 字符串类型&lt;br /&gt;
&lt;br /&gt;
==全文本公式==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmlcsjl.png</id>
		<title>文件:Fmlcsjl.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmlcsjl.png"/>
				<updated>2013-06-09T07:20:32Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5</id>
		<title>注释，公式描述，参数精灵</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5"/>
				<updated>2013-06-09T07:14:54Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 公式描述 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==公式注释==&lt;br /&gt;
&lt;br /&gt;
公式编写中，往往需要插入描述性文字，这些文字在编译时是忽略的。&lt;br /&gt;
&lt;br /&gt;
注释分为单行注释和整个段落注释，使用 // 注释单行，直至行末；使用{}注释整个段落&lt;br /&gt;
&lt;br /&gt;
例如下面的例子：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlgszs.png]]&lt;br /&gt;
&lt;br /&gt;
在公式编辑器里，注释呈现绿色&lt;br /&gt;
&lt;br /&gt;
==公式描述==&lt;br /&gt;
&lt;br /&gt;
为了方便用户理解，公式可以附带一些说明性的文字。在编辑器的参数面板里面可以&lt;br /&gt;
&lt;br /&gt;
点击 用法注释 按钮来添加公式描述：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlyfzs.png]]&lt;br /&gt;
&lt;br /&gt;
编译后，当用户运行公式时，只要鼠标移动到指标名称上，软件就会浮现用户添加的用法注释：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlyfzs2.png]]&lt;br /&gt;
&lt;br /&gt;
==参数精灵==&lt;br /&gt;
&lt;br /&gt;
==全文本公式==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmlyfzs2.png</id>
		<title>文件:Fmlyfzs2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmlyfzs2.png"/>
				<updated>2013-06-09T07:14:40Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmlyfzs.png</id>
		<title>文件:Fmlyfzs.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmlyfzs.png"/>
				<updated>2013-06-09T07:13:21Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5</id>
		<title>注释，公式描述，参数精灵</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5"/>
				<updated>2013-06-09T07:08:16Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 公式注释 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==公式注释==&lt;br /&gt;
&lt;br /&gt;
公式编写中，往往需要插入描述性文字，这些文字在编译时是忽略的。&lt;br /&gt;
&lt;br /&gt;
注释分为单行注释和整个段落注释，使用 // 注释单行，直至行末；使用{}注释整个段落&lt;br /&gt;
&lt;br /&gt;
例如下面的例子：&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlgszs.png]]&lt;br /&gt;
&lt;br /&gt;
在公式编辑器里，注释呈现绿色&lt;br /&gt;
&lt;br /&gt;
==公式描述==&lt;br /&gt;
&lt;br /&gt;
==参数精灵==&lt;br /&gt;
&lt;br /&gt;
==全文本公式==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5</id>
		<title>注释，公式描述，参数精灵</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5"/>
				<updated>2013-06-09T07:07:37Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 公式注释 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==公式注释==&lt;br /&gt;
&lt;br /&gt;
公式编写中，往往需要插入描述性文字，这些文字在编译时是忽略的。&lt;br /&gt;
&lt;br /&gt;
注释分为单行注释和整个段落注释，使用 // 注释单行，直至行末；使用{}注释整个段落&lt;br /&gt;
&lt;br /&gt;
例如下面的例子：&lt;br /&gt;
&lt;br /&gt;
 // 这是注释&lt;br /&gt;
 k1:close,CrossDot&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
 整段的注释说明&lt;br /&gt;
   说明1&lt;br /&gt;
   说明2&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
在公式编辑器里，注释呈现绿色&lt;br /&gt;
&lt;br /&gt;
[[Image:Fmlgszs.png]]&lt;br /&gt;
&lt;br /&gt;
==公式描述==&lt;br /&gt;
&lt;br /&gt;
==参数精灵==&lt;br /&gt;
&lt;br /&gt;
==全文本公式==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmlgszs.png</id>
		<title>文件:Fmlgszs.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%96%87%E4%BB%B6:Fmlgszs.png"/>
				<updated>2013-06-09T07:06:30Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5</id>
		<title>注释，公式描述，参数精灵</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%AC%E5%BC%8F%E6%8F%8F%E8%BF%B0%EF%BC%8C%E5%8F%82%E6%95%B0%E7%B2%BE%E7%81%B5"/>
				<updated>2013-06-09T07:04:10Z</updated>
		
		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==公式注释==&lt;br /&gt;
&lt;br /&gt;
公式编写中，往往需要插入描述性文字，这些文字在编译时是忽略的。&lt;br /&gt;
&lt;br /&gt;
注释分为单行注释和整个段落注释，使用 // 注释单行，直至行末；使用{}注释整个段落&lt;br /&gt;
&lt;br /&gt;
例如下面的例子：&lt;br /&gt;
&lt;br /&gt;
 // 这是注释&lt;br /&gt;
 k1:close,CrossDot&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
 整段的注释说明&lt;br /&gt;
   说明1&lt;br /&gt;
   说明2&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==公式描述==&lt;br /&gt;
&lt;br /&gt;
==参数精灵==&lt;br /&gt;
&lt;br /&gt;
==全文本公式==&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%89%A7%E8%A1%8C%E6%A8%A1%E5%BC%8F</id>
		<title>执行模式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%89%A7%E8%A1%8C%E6%A8%A1%E5%BC%8F"/>
				<updated>2013-06-09T06:44:38Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 计算频率开关 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=逐根和逐行=&lt;br /&gt;
&lt;br /&gt;
星语言中，公式有两种执行模式，一种叫逐行模式，一种叫逐根模式。&lt;br /&gt;
&lt;br /&gt;
'''逐行运行''' 就是说根据代码，从上到下，第一行运行到最后一行：&lt;br /&gt;
&lt;br /&gt;
[[Image:RunBySeries.png]]&lt;br /&gt;
&lt;br /&gt;
'''逐根运行''' 就是说根据K线，从左边第一根K线，运行到右面最后一根K线：&lt;br /&gt;
&lt;br /&gt;
[[Image:RunByBar.png]]&lt;br /&gt;
&lt;br /&gt;
逐根运行在运行每一根K线时，也是把代码从第一行运行到最后一行的。逐根运行与逐行运行的区别是：&lt;br /&gt;
&lt;br /&gt;
每行代码只运行当前的一个值，而逐行模式是整条序列。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
例如如果代码是 Close+1，那么在逐行模式下，Close 代表图上所有的收盘价，加一后，得到所有收盘价+1的一条序列；&lt;br /&gt;
&lt;br /&gt;
而在逐根运行时，Close 只代表当前一根k线的收盘价，加一后，得到当前收盘价+1的一个单值，从第一根运行到最后一根，&lt;br /&gt;
&lt;br /&gt;
每一根都得到1个单值，等所有K线运行完毕后，才得到完整的序列。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
由此可见，逐根模式比逐行模式多运行了许多遍：如果图上有1000根K线，公式代码将会被执行1000遍，&lt;br /&gt;
&lt;br /&gt;
只不过每次运算只算1个值，而不像逐行模式那样每次运算一整条序列。总的来说逐根运行要比逐行耗时，&lt;br /&gt;
&lt;br /&gt;
但是逐根运算能表达逐行运算所不能完成的条件分支逻辑，这是交易脚本所必须的逻辑。&lt;br /&gt;
&lt;br /&gt;
另外，逐根模式在第一次运行完毕后，后续行情到来时，只需要运算最后一根的变化，这要比逐行的开销少多了。&lt;br /&gt;
&lt;br /&gt;
关于这两种模式的运行机制更多讨论：[[逐行和逐根]]。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
公式是怎样选择运行模式的呢？通过编译开关来控制：&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 #Run_By_Series&lt;br /&gt;
&lt;br /&gt;
其中，#Run_By_Bar表示使用逐根模式，#Run_By_Series表示使用逐行模式。&lt;br /&gt;
&lt;br /&gt;
这两个开关也可以不写，在不同的指标类型中，分别有不同的默认值。&lt;br /&gt;
&lt;br /&gt;
在“技术指标”、“条件选股”、“交易系统”、“五彩K线”这四种指标中，默认是逐行模式。&lt;br /&gt;
&lt;br /&gt;
在“智能策略”、“公共函数”、“优化评价”这三种指标中，默认是逐根模式（而且只能是逐根，指定逐行开关无效）。&lt;br /&gt;
&lt;br /&gt;
=计算频率开关=&lt;br /&gt;
&lt;br /&gt;
对于逐根模式，我们知道，每次都是只计算一根。&lt;br /&gt;
&lt;br /&gt;
现在问题来了，K线的最后一根，并非是一次成型的，是在一段时间内不断变化的。&lt;br /&gt;
&lt;br /&gt;
那么，是在每次变化时，都计算，还是最后成型时才计算呢？为此，准备了开关来控制这个行为。&lt;br /&gt;
&lt;br /&gt;
 #Run_Every_Tick&lt;br /&gt;
 #Run_Every_Bar&lt;br /&gt;
&lt;br /&gt;
*Run_Every_Tick 表示，最后一根K线每次变化的时候，都重新计算。&lt;br /&gt;
&lt;br /&gt;
*Run_Every_Bar，则在下一根K线产生的一瞬间，才计算当前的K线。&lt;br /&gt;
&lt;br /&gt;
[[Image:RunEveryTick.png]]&lt;br /&gt;
&lt;br /&gt;
在 Buy Next Bar Open 这种类型的公式里，为了避免信号抖动，需要在K线完全走完时才发出信号，在下根K线中成交。&lt;br /&gt;
&lt;br /&gt;
对于这种类型的公式，可以使用#Run_Every_Bar模式，减少不必要的运算。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在 Buy This Bar Market 这种类型的公式里，需要根据最新行情来计算是否交易。此时公式运行需要 #Run_Every_Tick模式&lt;br /&gt;
&lt;br /&gt;
=事件触发=&lt;br /&gt;
&lt;br /&gt;
在公式中，可以编写一小段代码，这段代码是在某些事件发生的时候才执行。&lt;br /&gt;
&lt;br /&gt;
这类事件包括'''初始化'''和'''执行完毕'''&lt;br /&gt;
&lt;br /&gt;
===初始化===&lt;br /&gt;
只要编写一个内置函数，并且命名为OnInit，那么它就会在初始化时执行。&lt;br /&gt;
&lt;br /&gt;
 fucntion OnInit&lt;br /&gt;
 Begin&lt;br /&gt;
   //做一些只需要做一次，没有必要每次行情来时都做的工作。例如，设置画线的颜色，设置账号。等等。&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
那么，OnInit究竟具体在什么时候会发生呢。 &lt;br /&gt;
包括并且不限于以下情况，例如：&lt;br /&gt;
&lt;br /&gt;
1.切换成其他品种；&lt;br /&gt;
&lt;br /&gt;
2.切换成其他周期；&lt;br /&gt;
&lt;br /&gt;
3.服务器推送来一些旧的历史数据（某种情况下，可能客户端会先请求最新一段数据，再请求旧的数据）&lt;br /&gt;
&lt;br /&gt;
初始化事件会让公式清除所有状态重新运行计算1次，后续行情到来不再计算。&lt;br /&gt;
&lt;br /&gt;
===执行完毕===&lt;br /&gt;
只要编写一个内置函数，并且命名为OnExit,那么它就会在公式执行到末尾时执行。&lt;br /&gt;
&lt;br /&gt;
  function OnExit&lt;br /&gt;
  Begin&lt;br /&gt;
    //做一些收尾工作&lt;br /&gt;
  End&lt;br /&gt;
&lt;br /&gt;
为什么需要OnExit呢，是因为目前公式引擎支持“中断”。所谓中断，就是如果某些公式计算一次时间特别长，有时公式运行到一半，还没计算完，用户切换到其他品种了，那之前的计算就没有必要继续下去，这时候，系统就会强行中断计算。&lt;br /&gt;
&lt;br /&gt;
但是，用户可能希望某些计算是必须要执行的，例如，这个公式可能是调用DLL的，DLL可能在开始分配了一些资源，而且必须在运算完毕后释放，这部分计算就可以写在OnExit中，正常情况下它们会在公式主体运行结束之后被执行。如果公式主体被中断，它们会在中断后执行。&lt;br /&gt;
&lt;br /&gt;
===公式主体===&lt;br /&gt;
公式的主体是名为OnStart的函数，象这样：&lt;br /&gt;
  &lt;br /&gt;
  Function OnStart&lt;br /&gt;
  Begin&lt;br /&gt;
    mm:ma(c, close );&lt;br /&gt;
  End&lt;br /&gt;
&lt;br /&gt;
但是，为了方便编写，上述的“Function OnStart”可以省略。&lt;br /&gt;
也就是可以只写&lt;br /&gt;
  mm: ma( c, Close );&lt;br /&gt;
&lt;br /&gt;
凡是没有包在其它函数体里面的代码都被认为是 OnStart 函数的内容。除非显式声明了 OnStart 函数。如果既声明了OnStart函数，又写了一段没有被任何函数包裹的代码，那么没有被包裹的代码被直接忽略，认为是空白。&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	<entry>
		<id>http://wiki.hs633.com:8080/index.php/%E6%89%A7%E8%A1%8C%E6%A8%A1%E5%BC%8F</id>
		<title>执行模式</title>
		<link rel="alternate" type="text/html" href="http://wiki.hs633.com:8080/index.php/%E6%89%A7%E8%A1%8C%E6%A8%A1%E5%BC%8F"/>
				<updated>2013-06-09T06:42:27Z</updated>
		
		<summary type="html">&lt;p&gt;John: /* 计算频率开关 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=逐根和逐行=&lt;br /&gt;
&lt;br /&gt;
星语言中，公式有两种执行模式，一种叫逐行模式，一种叫逐根模式。&lt;br /&gt;
&lt;br /&gt;
'''逐行运行''' 就是说根据代码，从上到下，第一行运行到最后一行：&lt;br /&gt;
&lt;br /&gt;
[[Image:RunBySeries.png]]&lt;br /&gt;
&lt;br /&gt;
'''逐根运行''' 就是说根据K线，从左边第一根K线，运行到右面最后一根K线：&lt;br /&gt;
&lt;br /&gt;
[[Image:RunByBar.png]]&lt;br /&gt;
&lt;br /&gt;
逐根运行在运行每一根K线时，也是把代码从第一行运行到最后一行的。逐根运行与逐行运行的区别是：&lt;br /&gt;
&lt;br /&gt;
每行代码只运行当前的一个值，而逐行模式是整条序列。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
例如如果代码是 Close+1，那么在逐行模式下，Close 代表图上所有的收盘价，加一后，得到所有收盘价+1的一条序列；&lt;br /&gt;
&lt;br /&gt;
而在逐根运行时，Close 只代表当前一根k线的收盘价，加一后，得到当前收盘价+1的一个单值，从第一根运行到最后一根，&lt;br /&gt;
&lt;br /&gt;
每一根都得到1个单值，等所有K线运行完毕后，才得到完整的序列。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
由此可见，逐根模式比逐行模式多运行了许多遍：如果图上有1000根K线，公式代码将会被执行1000遍，&lt;br /&gt;
&lt;br /&gt;
只不过每次运算只算1个值，而不像逐行模式那样每次运算一整条序列。总的来说逐根运行要比逐行耗时，&lt;br /&gt;
&lt;br /&gt;
但是逐根运算能表达逐行运算所不能完成的条件分支逻辑，这是交易脚本所必须的逻辑。&lt;br /&gt;
&lt;br /&gt;
另外，逐根模式在第一次运行完毕后，后续行情到来时，只需要运算最后一根的变化，这要比逐行的开销少多了。&lt;br /&gt;
&lt;br /&gt;
关于这两种模式的运行机制更多讨论：[[逐行和逐根]]。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
公式是怎样选择运行模式的呢？通过编译开关来控制：&lt;br /&gt;
 #Run_By_Bar&lt;br /&gt;
 #Run_By_Series&lt;br /&gt;
&lt;br /&gt;
其中，#Run_By_Bar表示使用逐根模式，#Run_By_Series表示使用逐行模式。&lt;br /&gt;
&lt;br /&gt;
这两个开关也可以不写，在不同的指标类型中，分别有不同的默认值。&lt;br /&gt;
&lt;br /&gt;
在“技术指标”、“条件选股”、“交易系统”、“五彩K线”这四种指标中，默认是逐行模式。&lt;br /&gt;
&lt;br /&gt;
在“智能策略”、“公共函数”、“优化评价”这三种指标中，默认是逐根模式（而且只能是逐根，指定逐行开关无效）。&lt;br /&gt;
&lt;br /&gt;
=计算频率开关=&lt;br /&gt;
&lt;br /&gt;
对于逐根模式，我们知道，每次都是只计算一根。&lt;br /&gt;
&lt;br /&gt;
现在问题来了，K线的最后一根，并非是一次成型的，是在一段时间内不断变化的。&lt;br /&gt;
&lt;br /&gt;
那么，是在每次变化时，都计算，还是最后成型时才计算呢？为此，准备了开关来控制这个行为。&lt;br /&gt;
&lt;br /&gt;
 #Run_Every_Tick&lt;br /&gt;
 #Run_Every_Bar&lt;br /&gt;
&lt;br /&gt;
#Run_Every_Tick 表示，最后一根K线每次变化的时候，都重新计算。&lt;br /&gt;
&lt;br /&gt;
而#Run_Every_Bar，则在下一根K线产生的一瞬间，才计算当前的K线。&lt;br /&gt;
&lt;br /&gt;
[[Image:RunEveryTick.png]]&lt;br /&gt;
&lt;br /&gt;
在 Buy Next Bar Open 这种类型的公式里，为了避免信号抖动，需要在K线完全走完时才发出信号，在下根K线中成交。&lt;br /&gt;
&lt;br /&gt;
对于这种类型的公式，可以使用#Run_Every_Bar模式，减少不必要的运算。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在 Buy This Bar Market 这种类型的公式里，需要根据最新行情来计算是否交易。此时公式运行需要 #Run_Every_Tick模式&lt;br /&gt;
&lt;br /&gt;
=事件触发=&lt;br /&gt;
&lt;br /&gt;
在公式中，可以编写一小段代码，这段代码是在某些事件发生的时候才执行。&lt;br /&gt;
&lt;br /&gt;
这类事件包括'''初始化'''和'''执行完毕'''&lt;br /&gt;
&lt;br /&gt;
===初始化===&lt;br /&gt;
只要编写一个内置函数，并且命名为OnInit，那么它就会在初始化时执行。&lt;br /&gt;
&lt;br /&gt;
 fucntion OnInit&lt;br /&gt;
 Begin&lt;br /&gt;
   //做一些只需要做一次，没有必要每次行情来时都做的工作。例如，设置画线的颜色，设置账号。等等。&lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
那么，OnInit究竟具体在什么时候会发生呢。 &lt;br /&gt;
包括并且不限于以下情况，例如：&lt;br /&gt;
&lt;br /&gt;
1.切换成其他品种；&lt;br /&gt;
&lt;br /&gt;
2.切换成其他周期；&lt;br /&gt;
&lt;br /&gt;
3.服务器推送来一些旧的历史数据（某种情况下，可能客户端会先请求最新一段数据，再请求旧的数据）&lt;br /&gt;
&lt;br /&gt;
初始化事件会让公式清除所有状态重新运行计算1次，后续行情到来不再计算。&lt;br /&gt;
&lt;br /&gt;
===执行完毕===&lt;br /&gt;
只要编写一个内置函数，并且命名为OnExit,那么它就会在公式执行到末尾时执行。&lt;br /&gt;
&lt;br /&gt;
  function OnExit&lt;br /&gt;
  Begin&lt;br /&gt;
    //做一些收尾工作&lt;br /&gt;
  End&lt;br /&gt;
&lt;br /&gt;
为什么需要OnExit呢，是因为目前公式引擎支持“中断”。所谓中断，就是如果某些公式计算一次时间特别长，有时公式运行到一半，还没计算完，用户切换到其他品种了，那之前的计算就没有必要继续下去，这时候，系统就会强行中断计算。&lt;br /&gt;
&lt;br /&gt;
但是，用户可能希望某些计算是必须要执行的，例如，这个公式可能是调用DLL的，DLL可能在开始分配了一些资源，而且必须在运算完毕后释放，这部分计算就可以写在OnExit中，正常情况下它们会在公式主体运行结束之后被执行。如果公式主体被中断，它们会在中断后执行。&lt;br /&gt;
&lt;br /&gt;
===公式主体===&lt;br /&gt;
公式的主体是名为OnStart的函数，象这样：&lt;br /&gt;
  &lt;br /&gt;
  Function OnStart&lt;br /&gt;
  Begin&lt;br /&gt;
    mm:ma(c, close );&lt;br /&gt;
  End&lt;br /&gt;
&lt;br /&gt;
但是，为了方便编写，上述的“Function OnStart”可以省略。&lt;br /&gt;
也就是可以只写&lt;br /&gt;
  mm: ma( c, Close );&lt;br /&gt;
&lt;br /&gt;
凡是没有包在其它函数体里面的代码都被认为是 OnStart 函数的内容。除非显式声明了 OnStart 函数。如果既声明了OnStart函数，又写了一段没有被任何函数包裹的代码，那么没有被包裹的代码被直接忽略，认为是空白。&lt;/div&gt;</summary>
		<author><name>John</name></author>	</entry>

	</feed>