ptLibert 发表于 2013-8-16 19:01:45

公式转换器

本帖最后由 ptLibert 于 2013-9-23 22:32 编辑

附件是一个转换工具。用这个工具可以直接把其他多种语言翻译成金魔方语言。
用法:
1.先把其他语言的源码存成文本文件。

2.运行fmlConverter.exe,也就是公式转换器。(需要 .net 4.0,windows8应该自带,windows7和xp需要安装 http://www.microsoft.com/zh-cn/download/details.aspx?id=17718)

3.在下拉菜单选择原来的公式类型。(目前仅支持开拓者和Mc两种,以后会增加文华和金字塔,大智慧,通达信等)
4.如果原来的公式类型,是开拓者或mc的function,也就是函数,那么勾选左上角的“转换函数”。
5.点击转换器左上角的打开按钮,打开原文本文件。
6.转换后的源码显示在右侧,复制到金魔方使用。
7.如果之前没有安装过.net4.0,并且是win8之前的系统,那么需要下载安装.net4.0
http://www.microsoft.com/zh-cn/download/details.aspx?id=17718)


必须指出的是,本转换器并非100%智能,而且有些其他语言的函数与金魔方暂时无法找到替代。所以它能节省工作时间,但并非转完就一定能直接用。还是需要人工仔细检查和核对的。
2013-08-18更新
1.支持飞狐转换,注意金魔方几乎完全兼容飞狐公式语言,除了序列下标,因此只有在使用了数组下标访问序列数据才需要转换。如果公式根本没有使用数组下标访问序列数据,直接复制到金魔方即可,无需转换。
2.修正MC cross above 等语句在某些情况下转换不正确bug
3.增加一些TB的函数对照表




ktdev 发表于 2013-8-16 21:18:46

转几个例子看看
原TB策略
// 简称:
// 名称:
// 类别: 公式应用
// 类型: 用户应用
// 输出: 穿堂风
//------------------------------------------------------------------------

Params
Numeric maLen1(10);
Numeric maLen2(50);
Numeric lots(1);
Numeric offset(0);
Vars
Numeric ma1;
Numeric ma2;
Numeric i_offset;

Begin

ma1 = Average(Open,maLen1);
ma2 = Average(Open,maLen2);

PlotNumeric("ma1",ma1);
PlotNumeric("ma2",ma2);

i_offset = offset*MinMove*PriceScale;
If(CurrentBar > maLen2)
{
        If(MarketPosition == 0)
        {
                If(Open>ma1 and ma1>ma2)
                {
                        Buy(lots,Open+i_offset);
                        Return;
                }

                If(Open < ma1 and ma1<ma2)
                {
                        SellShort(lots,Open-i_offset);
                        Return;
                }
        }

        If(MarketPosition == 1)
        {
                If(Open < ma1)
                {
                        Sell(lots,Open-i_offset);
                        Return;
                }
        }

        If(MarketPosition == -1)
        {
                If(Open > ma1)
                {
                        BuyToCover(lots,Open+i_offset);
                        Return;
                }
        }
}
End用转换器转换后直接复制到金魔方就可以编译成功并运行了,不用做任何修改
以下是转换后的公式// 简称
// 名称:
// 类别: 公式应用
// 类型: 用户应用
// 输出: 穿堂风
//------------------------------------------------------------------------

INPUT:
maLen1(10),
maLen2(50),
lots(1),
offset(0);
VARIABLE:
ma1,
ma2,
i_offset;

Begin

ma1 :=  MA (Open,maLen1);
ma2 :=  MA (Open,maLen2);

Plot(ma1,'ma1');
Plot(ma2,'ma2');

i_offset := offset* MinMove * PriceScale ;
If( BarPos  > maLen2) then
begin
        If( MarketPosition  == 0) then
         begin
                If(Open>ma1 and ma1>ma2) then
                 begin
                        Buy('',lots,Open+i_offset,0,OT_Market, OB_ThisBar);
                        Return;
                 end

                If(Open < ma1 and ma1<ma2) then
                 begin
                        SellShort('',lots,Open-i_offset,0,OT_Market, OB_ThisBar);
                        Return;
                 end
         end

        If( MarketPosition  == 1) then
         begin
                If(Open < ma1) then
                 begin
                        Sell('',lots,Open-i_offset,0,OT_Market, OB_ThisBar);
                        Return;
                 end
         end

        If( MarketPosition  == -1) then
         begin
                If(Open > ma1) then
                 begin
                        BuyToCover('',lots,Open+i_offset,0,OT_Market, OB_ThisBar);
                        Return;
                 end
         end
end
End以下是金魔方运行结果

ktdev 发表于 2013-8-16 21:34:45

你还可以通过编辑转换对照文件来提高转换的结果。TB的转换对应文件位于 Language\KL.csv比如如下策略,转换过来复制到金魔方编译通不过,提示 Min1没有定义,这是因为转换对应文件没有
Min这个函数的对应关系,你可以用文本文件打开 Language\KL.csv
并加上这一行
Min#min
保存文件,再重新打开公式转换器转换,就可以了

// 简称dual_thrust
// 名称:
// 类别: 公式应用
// 类型: 用户应用
// 输出: 穿堂风
//------------------------------------------------------------------------


Params
Numeric K1(0.5);
Numeric K2(0.5);
Numeric Mday(1);
Numeric Nday(1);
Numeric lots(1);
Numeric offset(0);

Vars
Numeric BuyRange(0);
Numeric SellRange(0);
Numeric BuyTrig(0);
Numeric SellTrig(0);
Numeric HH;
Numeric LL;
Numeric HC;
Numeric LC;
Numeric i_offset;
Numeric BuyPosition;
Numeric SellPosition;

Begin
If(CurrentBar > 44*Max(Mday,Nday))//使用的是5分钟周期,其它的周期自己做相应修改
{
        i_offset = offset*MinMove*PriceScale;
        HH = Highest(HighD(1),Mday);
        HC = Highest(CloseD(1),Mday);
        LL = Lowest(LowD(1),Mday);
        LC = Lowest(CloseD(1),Mday);

        If((HH - LC) >= (HC - LL))
        {
                SellRange = HH - LC;
        }
        Else
        {
                SellRange = HC - LL;
        }

        HH = Highest(HighD(1),Nday);
        HC = Highest(CloseD(1),Nday);
        LL = Lowest(LowD(1),Nday);
        LC = Lowest(CloseD(1),Nday);

        If((HH - LC) >= (HC - LL))
        {
                BuyRange = HH - LC;
        }
        Else
        {
                BuyRange = HC - LL;
        }

        BuyTrig = K1*BuyRange;
        SellTrig = K2*SellRange;
        
        BuyPosition = OpenD(0)+BuyTrig;
        SellPosition = OpenD(0)-SellTrig;
        
        PlotNumeric("BuyPosition",BuyPosition);
        PlotNumeric("SellPosition",SellPosition);

        If(MarketPosition == 0)
        {
                If(High>=BuyPosition)
                {
                        Buy(lots,Max(Open,BuyPosition)+i_offset);
                        Return;
                }
               
                If(Low<=SellPosition)
                {
                        SellShort(lots,Min(Open,SellPosition)-i_offset);
                        Return;
                }
        }

        If(MarketPosition == -1)
        {
                If(High>=BuyPosition)
                {
                        Buy(lots,Max(Open,BuyPosition)+i_offset);
                        Return;
                }
        }

        If(MarketPosition == 1)
        {
                If(Low<=SellPosition)
                {
                        SellShort(lots,Min(Open,SellPosition)-i_offset);
                        Return;
                }
        }
}
End

//------------------------------------------------------------------------
// 编译版本        GS2010.12.08
// 用户版本        2011/07/24 02:14
// 版权所有        穿堂风
// 更改声明        TradeBlazer Software保留对TradeBlazer平台
//                        每一版本的TrabeBlazer公式修改和重写的权利
//------------------------------------------------------------------------

转换后的公式
// 简称dual_thrust
// 名称:
// 类别: 公式应用
// 类型: 用户应用
// 输出: 穿堂风
//------------------------------------------------------------------------


INPUT:
K1(0.5),
K2(0.5),
Mday(1),
Nday(1),
lots(1),
offset(0);

VARIABLE:
BuyRange(0),
SellRange(0),
BuyTrig(0),
SellTrig(0),
HH,
LL,
HC,
LC,
i_offset,
BuyPosition,
SellPosition;

Begin
If( BarPos  > 44* Max (Mday,Nday)) then //使用的是5分钟周期,其它的周期自己做相应修改
begin
        i_offset := offset* MinMove * PriceScale ;
        HH :=  HHV ( HighD (1),Mday);
        HC :=  HHV ( CloseD (1),Mday);
        LL :=  LLV ( LowD (1),Mday);
        LC :=  LLV ( CloseD (1),Mday);

        If((HH - LC) >= (HC - LL)) then
         begin
                SellRange := HH - LC;
         end
        Else
         begin
                SellRange := HC - LL;
         end

        HH :=  HHV ( HighD (1),Nday);
        HC :=  HHV ( CloseD (1),Nday);
        LL :=  LLV ( LowD (1),Nday);
        LC :=  LLV ( CloseD (1),Nday);

        If((HH - LC) >= (HC - LL)) then
         begin
                BuyRange := HH - LC;
         end
        Else
         begin
                BuyRange := HC - LL;
         end

        BuyTrig := K1*BuyRange;
        SellTrig := K2*SellRange;
        
        BuyPosition :=  OpenD (0)+BuyTrig;
        SellPosition :=  OpenD (0)-SellTrig;
        
        Plot(BuyPosition,'BuyPosition');
        Plot(SellPosition,'SellPosition');

        If( MarketPosition  == 0) then
         begin
                If( High >=BuyPosition) then
                 begin
                        Buy('',lots, Max (Open,BuyPosition)+i_offset,0,OT_Market, OB_ThisBar);
                        Return;
                 end
               
                If( Low <=SellPosition) then
                 begin
                        SellShort('',lots, min (Open,SellPosition)-i_offset,0,OT_Market, OB_ThisBar);
                        Return;
                 end
         end

        If( MarketPosition  == -1) then
         begin
                If( High >=BuyPosition) then
                 begin
                        Buy('',lots, Max (Open,BuyPosition)+i_offset,0,OT_Market, OB_ThisBar);
                        Return;
                 end
         end

        If( MarketPosition  == 1) then
         begin
                If( Low <=SellPosition) then
                 begin
                        SellShort('',lots, min (Open,SellPosition)-i_offset,0,OT_Market, OB_ThisBar);
                        Return;
                 end
         end
end
End


运行结果

gz12345678gz 发表于 2013-8-16 21:52:25

不错,貌似很强大啊

luky 发表于 2013-8-17 08:43:18

目前仅支持开拓者和Mc两种,以后会增加文华和金字塔,大智慧等,通达信等{:4_124:}

woaihs 发表于 2013-8-17 11:07:47

谢谢分享 希望能有飞狐公式的转换!

nttz 发表于 2013-8-17 18:45:15

ktdev 发表于 2013-8-16 21:34 static/image/common/back.gif
你还可以通过编辑转换对照文件来提高转换的结果。TB的转换对应文件位于 Language\KL.csv比如如下策略,转换 ...

能解析所有格式文法么

zhou1388 发表于 2013-8-17 22:11:08

谢谢分享,希望能解决该公司自己的飞狐软件公式能在金魔方中正常使用~~~

ktdev 发表于 2013-8-18 20:07:54

zhou1388 发表于 2013-8-17 22:11 static/image/common/back.gif
谢谢分享,希望能解决该公司自己的飞狐软件公式能在金魔方中正常使用~~~

已经增加支持飞狐转换,请回一楼重新下载
http://hs633.com/forum.php?mod=viewthread&tid=10237&fromuid=789


注意金魔方几乎完全兼容飞狐公式语言,除了序列下标,因此只有在使用了数组下标访问序列数据才需要转换。如果公式根本没有使用数组下标访问序列数据,直接复制到金魔方即可,无需转换。

nttz 发表于 2013-8-19 15:20:52

CC:=IF(ISNULL(NEW),PRE,NEW);
TT:=BARSCOUNT(CC);
均线:=SUM(SUBSAMEDAY(&VOL)*CC,0)/VOL;
上均:=均线 + AVEDEV(CC,TT)*2;
时长:=IF(FORMATTIME(1)>60,1,0);
涨幅:=(CC>PRE)>1.02;
跌幅:=(CC/PRE)<0.98;
横盘:=((HHV(CC,TT)-LLV(CC,TT))/CC)<0.05;
yy:=SMA(VOL,30,1);
放量:=(yy-LLV(LLV(yy,1),30))/(HHV(HHV(yy,1),30)-LLV(LLV(yy,1),30))>0.95;
涨跌幅:=涨幅 OR 跌幅;
横涨:=涨跌幅=0 AND 横盘 AND 时长 AND 放量 AND CROSS(CC,上均);
DRAWICON(FILTER(横涨,100),CC,"buy");
这个同花顺可以转换么
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 公式转换器