ktdev 发表于 2014-1-19 12:07:50

金魔方新特性-嵌入C#脚本

金魔方新特性-嵌入C#脚本 使用说明
金魔方支持公式里直接嵌入C#脚本了,感谢 fantasynew 朋友的建议。
1.如何嵌入 C# 脚本
嵌入C#脚本和嵌入 VBScript 脚本类似.
嵌入 VBScript  使用<% %>
嵌入 C#多加一个# 就是 <%# %>


以下是一个改自飞狐 VBScript 的例子 改成 C#如下
#MAINCHART
涨停价:C;
<%#
float[] ztj = (float[])GetVarData("涨停价");
for (int i = 0; i < ztj.Length; i++)
        ztj = ztj * (float)1.1;
SetVarData("涨停价", ztj);
%>

2.嵌入C#脚本的三种模式
最简单的模式就是以上例子里写的,直接写C#语句,这种模式的优点是简单,不需要关心类,对象是什么,缺点是不能定义函数。
完整的模式则需要理解C#的类,命名空间等,也就是需要写一个完整的C# 类,优点是可以定义自己的函数来调用,可以用类成员变量来保存状态等。
以下是把例1里的脚本改成完整模式
#MAINCHART
涨停价:C;
<%#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using fox.api;
namespace N{
    //  从 fox.api.Formula 继承 这样才能用 GetVarData, SetVarData
        //  完整模式,需要定义命名空间,类,还必须定义个  Execute 函数作为入口点
    public class Class1 : Formula{
   public void Execute(){
      float[] ztj = (float[])GetVarData("涨停价");
      for (int i = 0; i < ztj.Length; i++)
         ztj = CalcZTJ(ztj) ;
      SetVarData("涨停价", ztj);
   }
   public float CalcZTJ(float fPrice){
         return fPrice*(float)1.1;
   }  
    }
}
%>以上是完整模式的例子之一,需要从Formua继承,并实现 Execute 方法,你也可以定义别函数,并且调用,就像上面的例子里的 定义了一个 CalcZTJ 计算涨停价的函数,并调用。


另外一种完整模式的用法是:在脚本里定义函数,然后在公式里显式调用,就像调用dll里的函数一样
看以下例子,定义了一个 算 MA的函数,并在公式里调用。
// 新dll接口调用规范只能在逐根模式下运行,因此要RUN_BY_BAR
// 此公式适用于日线
#MainChart
#RUN_BY_BAR
#NoDefaultOutPut
// 这个函数声明表示 嵌入脚本里面 命名空间N中类名为Class1的成员函数my_ma
extern void  N.Class1.my_ma(NumericSeries resultArray, NumericSeries array1, int n, int barpos);
//C#脚本实现函数my_ma                                                               
<%#
namespace N
{
public class Class1
    {
        public void my_ma(ref float[] resultArray,  float[] array, int n, int barpos)
        {
                        int nK = barpos - 1;
                        if (barpos >= n)
                        {
                                float sum = 0;
                                for (int i = 0; i < n; i++)
                                        sum += array;
                                resultArray = sum / n;
                        }
                        else
                                resultArray = float.NaN;
        }

    }
}
%>
ma1:0;
my_ma(ma1, close, 5, barpos);//注意调用my_ma必须放在脚本后面调用

3.如何在C#脚本调用 COM 组件
Winddows下,很多第三方库都是以 COM 组件 dll形式存在的。比如 AutoItX3 ,很人多用来做股票自动下单。
在金魔方嵌入的C#脚本里,可以使用using 和 import 来 很容易调用这样的dll.
以下是调用AutoItX3  来自动控制打开记事本并输入文字的例子
#MainChart
Variable : 记事本状态栏上的文字('');
<%#
using AutoItX3Lib;
import AutoItX3.dll;

AutoItX3Lib.AutoItX3Class autoit = new AutoItX3Lib.AutoItX3Class();
autoit.Run("notepad.exe", "", 1);
autoit.WinWaitActive("无标题 -", "", 1);
autoit.Send(" Hello{!}", 0);
string text = autoit.StatusbarGetText("无标题 -", "", 2);
SetVarData("记事本状态栏上的文字", text);
%>
Comment('已经打开 记事本 并输入了 Hello\n记事本 状态栏上的文字是:'+记事本状态栏上的文字);import 后面的dll可以全路径,也可以直接写dll名字,如果只写dll名字,首先会在公式所在路径找,然后在fmldll找,最后还会在 金魔方根目录下找,你可以把dll放在以上任意地方。
using 后面需要写命名空间,一般来说,如果 import 的是 XXX.dll, using  后面的命名空间 就是 XXXLib


4.C#脚本如何调试和除错
默认情况下,编译错误都是能定位到行号的。
如果是运行类错误或者异常,默认情况是定位不到行号的,需要在 "工具“ 菜单里,选择 ”C#脚本调试",勾选了这个后,如果有异常可以定位到哪一行的代码问题。
另外  勾选了 ”C#脚本调试" 后,在 C# 代码里 的 Console.WriteLine 函数输出的信息会在 "公式日志" 窗口里显示,可以用这个来输出信息帮助调试。






bluechina 发表于 2014-1-19 14:34:46

收藏,学习!

古月908 发表于 2014-1-19 15:57:53

au3好玩,谢谢老大!

xipies 发表于 2014-1-19 19:50:36

望C#兴叹!

justtemp 发表于 2014-1-19 21:13:40

不错~越来越有搞头了~

fantasynew 发表于 2014-1-19 22:57:47

感谢开发团队,这么快就把这功能做出来了
扩展性更强

nttz 发表于 2014-1-26 09:52:35

什么时侯支持单步调试

msedu 发表于 2014-1-30 20:46:27

直接内嵌C++也挺不错嘛!

18012355268 发表于 2014-1-31 11:24:06

有罗搞头,我又不会C++

bjdyh 发表于 2014-2-19 13:05:10

{:1_1:}{:1_1:}
页: [1] 2 3
查看完整版本: 金魔方新特性-嵌入C#脚本