花生網
標題: 金魔方新特性-嵌入C#腳本 [打印本頁]
作者: ktdev 時間: 2014-1-19 12:07 標題: 金魔方新特性-嵌入C#腳本
金魔方新特性-嵌入C#腳本 使用說明
金魔方支持公式里直接嵌入C#腳本了,感謝 fantasynew 朋友的建議。
CSharp腳本例子.rar
(176.68 KB, 下載次數: 170)
1.如何嵌入 C# 腳本
嵌入C#腳本和嵌入 VBScript 腳本類似.
嵌入 VBScript 使用<% %>
嵌入 C#多加一個# 就是 <%# %>
以下是一個改自飛狐 VBScript 的例子 改成 C#如下
- #MAINCHART
- 漲停價:C;
- <%#
- float[] ztj = (float[])GetVarData("漲停價");
- for (int i = 0; i < ztj.Length; i++)
- ztj[i] = ztj[i] * (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[i] = CalcZTJ(ztj[i]) ;
- 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[nK - i];
- resultArray[nK] = sum / n;
- }
- else
- resultArray[nK] = 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 函數輸出的信息會在 "公式日志" 窗口里顯示,可以用這個來輸出信息幫助調試。
|