2008-8-11 16:57
hedgehog
请教nopain等各位高手,自动筛选主力合约的设想
现在已知在叠加商品的时候可以访问Data0-Data49个数据源的Bar数据,那么有没有办法来实现叠加这些品种的成交量或者持仓量呢?如果可以这样的话,是不是就可以自动筛选出不同时期的主力合约了?
在nopain的鼎力支持下,顺利实现
唉,感慨啊,大学应该多修一个计算机学位就好了……
下面是效果图,准备还要继续加入一些修饰,以方便找出何时换的月,方便测试时的数据截取工作:)
完整指标如下:
[code]
Vars
Numeric Major(0);
Numeric CON0;
Numeric CON1;
Numeric CON2;
Numeric CON3;
Numeric CON4;
Numeric CON5;
Numeric CON6;
Numeric CON7;
Numeric CON8;
Numeric CON9;
Numeric CON10;
Numeric MyOpen;
Numeric MyHigh;
Numeric MyLow;
Numeric MyClose;
Begin
CON0=AverageFC(DATA0.OPENINT(),5);
CON1=AVERAGEFC(DATA1.OPENINT(),5);
CON2=AVERAGEFC(DATA2.OPENINT(),5);
CON3=AVERAGEFC(DATA3.OPENINT(),5);
CON4=AVERAGEFC(DATA4.OPENINT(),5);
CON5=AVERAGEFC(DATA5.OPENINT(),5);
CON6=AVERAGEFC(DATA6.OPENINT(),5);
CON7=AVERAGEFC(DATA7.OPENINT(),5);
CON8=AVERAGEFC(DATA8.OPENINT(),5);
CON9=AVERAGEFC(DATA9.OPENINT(),5);
CON10=AVERAGEFC(DATA10.OPENINT(),5);
If(Con0 > Major)
{
Major = Con0;
MyOpen = Data0.Open;
MyHigh = Data0.High;
MyLow = Data0.Low;
MyClose = Data0.Close;
}
If(Con1 > Major)
{
Major = Con1;
MyOpen = Data1.Open;
MyHigh = Data1.High;
MyLow = Data1.Low;
MyClose = Data1.Close;
}
If(Con2 > Major)
{
Major = Con2;
MyOpen = Data2.Open;
MyHigh = Data2.High;
MyLow = Data2.Low;
MyClose = Data2.Close;
}
If(Con3 > Major)
{
Major = Con3;
MyOpen = Data3.Open;
MyHigh = Data3.High;
MyLow = Data3.Low;
MyClose = Data3.Close;
}
If(Con4 > Major)
{
Major = Con4;
MyOpen = Data4.Open;
MyHigh = Data4.High;
MyLow = Data4.Low;
MyClose = Data4.Close;
}
If(Con5 > Major)
{
Major = Con5;
MyOpen = Data5.Open;
MyHigh = Data5.High;
MyLow = Data5.Low;
MyClose = Data5.Close;
}
If(Con6 > Major)
{
Major = Con6;
MyOpen = Data6.Open;
MyHigh = Data6.High;
MyLow = Data6.Low;
MyClose = Data6.Close;
}
If(Con7 > Major)
{
Major = Con7;
MyOpen = Data7.Open;
MyHigh = Data7.High;
MyLow = Data7.Low;
MyClose = Data7.Close;
}
If(Con8 > Major)
{
Major = Con8;
MyOpen = Data8.Open;
MyHigh = Data8.High;
MyLow = Data8.Low;
MyClose = Data8.Close;
}
If(Con9 > Major)
{
Major = Con9;
MyOpen = Data9.Open;
MyHigh = Data9.High;
MyLow = Data9.Low;
MyClose = Data9.Close;
}
If(Con10 > Major)
{
Major = Con10;
MyOpen = Data10.Open;
MyHigh = Data10.High;
MyLow = Data10.Low;
MyClose = Data10.Close;
}
PlotNumeric("High",MyHigh);
PlotNumeric("Open",MyOpen);
PlotNumeric("Low",MyLow);
PlotNumeric("Close",MyClose);
End
[/code]
[[i] 本帖最后由 hedgehog 于 2008-8-22 15:10 编辑 [/i]]
2008-8-21 17:03
hedgehog
[quote]原帖由 [i]nopain[/i] 于 2008-8-20 15:55 发表 [url=http://www.tradeblazer.net/forum/redirect.php?goto=findpost&pid=16449&ptid=2740][img]http://www.tradeblazer.net/forum/images/common/back.gif[/img][/url]
仔细看了您的需求,看来用一个指标来实现是可行的。
指标比较各个合约的成交量和持仓量,选取当时的主力合约的高开低收等数据输出。 [/quote]
试了一下,没有头绪,请问nopain具体该如何写?
我的初步设想是比较持仓量的5天平均,最大的那个作为主力合约
下面是准备用在RU上的面的指标:但是没有编译通过:(
[code]
Vars
Numeric MAJOR(0);
Numeric N(0);
NumericSeries CON0;
NumericSeries CON1;
NumericSeries CON2;
NumericSeries CON3;
NumericSeries CON4;
NumericSeries CON5;
NumericSeries CON6;
NumericSeries CON7;
NumericSeries CON8;
NumericSeries CON9;
NumericSeries CON10;
BEGIN
CON0=AverageFC(DATA0.OPENINT(),5);
CON1=AVERAGEFC(DATA1.OPENINT(),5);
CON2=AVERAGEFC(DATA2.OPENINT(),5);
CON3=AVERAGEFC(DATA3.OPENINT(),5);
CON4=AVERAGEFC(DATA4.OPENINT(),5);
CON5=AVERAGEFC(DATA5.OPENINT(),5);
CON6=AVERAGEFC(DATA6.OPENINT(),5);
CON7=AVERAGEFC(DATA7.OPENINT(),5);
CON8=AVERAGEFC(DATA8.OPENINT(),5);
CON9=AVERAGEFC(DATA9.OPENINT(),5);
CON10=AVERAGEFC(DATA10.OPENINT(),5);
FOR N=0 TO 10 -1;
MAJOR=MAX("CON"+"N","CON"+"N+1");
RETURN;
IF (MAJOR==CON0)
{
PLOTNUMERIC("High",DATA0.High());
PlotNumeric("Open",DATA0.Open());
PlotNumeric("Low",DATA0.Low());
PlotNumeric("Close",DATA0.Close());
}ELSE IF (MAJOR==CON1)
{ PLOTNUMERIC("High",DATA1.High());
PlotNumeric("Open",DATA1.Open());
PlotNumeric("Low",DATA1.Low());
PlotNumeric("Close",DATA1.Close());
}
ELSE IF (MAJOR==CON2)
{ PLOTNUMERIC("High",DATA2.High());
PlotNumeric("Open",DATA2.Open());
PlotNumeric("Low",DATA2.Low());
PlotNumeric("Close",DATA2.Close());
}
ELSE IF (MAJOR==CON3)
{ PLOTNUMERIC("High",DATA3.High());
PlotNumeric("Open",DATA3.Open());
PlotNumeric("Low",DATA3.Low());
PlotNumeric("Close",DATA3.Close());
}
ELSE IF (MAJOR==CON4)
{ PLOTNUMERIC("High",DATA4.High());
PlotNumeric("Open",DATA4.Open());
PlotNumeric("Low",DATA4.Low());
PlotNumeric("Close",DATA4.Close());
}
ELSE IF (MAJOR==CON5)
{ PLOTNUMERIC("High",DATA5.High());
PlotNumeric("Open",DATA5.Open());
PlotNumeric("Low",DATA5.Low());
PlotNumeric("Close",DATA5.Close());
}
ELSE IF (MAJOR==CON6)
{ PLOTNUMERIC("High",DATA6.High());
PlotNumeric("Open",DATA6.Open());
PlotNumeric("Low",DATA6.Low());
PlotNumeric("Close",DATA6.Close());
}
ELSE IF (MAJOR==CON7)
{ PLOTNUMERIC("High",DATA7.High());
PlotNumeric("Open",DATA7.Open());
PlotNumeric("Low",DATA7.Low());
PlotNumeric("Close",DATA7.Close());
}
ELSE IF (MAJOR==CON8)
{ PLOTNUMERIC("High",DATA8.High());
PlotNumeric("Open",DATA8.Open());
PlotNumeric("Low",DATA8.Low());
PlotNumeric("Close",DATA8.Close());
}
ELSE IF (MAJOR==CON9)
{ PLOTNUMERIC("High",DATA9.High());
PlotNumeric("Open",DATA9.Open());
PlotNumeric("Low",DATA9.Low());
PlotNumeric("Close",DATA9.Close());
}
ELSE IF (MAJOR==CON10)
{ PLOTNUMERIC("High",DATA10.High());
PlotNumeric("Open",DATA10.Open());
PlotNumeric("Low",DATA10.Low());
PlotNumeric("Close",DATA10.Close());
}
END
[/code]
主要是这里不大清楚怎么处理……
[code]
FOR N=0 TO 10 -1;
MAJOR=MAX("CON"+"N","CON"+"N+1");
RETURN;
[/code]
2008-8-21 17:38
nopain
修改了一下,大致代码如下
[code]
Vars
Numeric Major(0);
NumericSeries CON0;
NumericSeries CON1;
NumericSeries CON2;
NumericSeries CON3;
NumericSeries CON4;
NumericSeries CON5;
NumericSeries CON6;
NumericSeries CON7;
NumericSeries CON8;
NumericSeries CON9;
NumericSeries CON10;
Numeric MyOpen;
Numeric MyHigh;
Numeric MyLow;
Numeric MyClose;
Begin
CON0=AverageFC(DATA0.OPENINT(),5);
CON1=AVERAGEFC(DATA1.OPENINT(),5);
CON2=AVERAGEFC(DATA2.OPENINT(),5);
CON3=AVERAGEFC(DATA3.OPENINT(),5);
CON4=AVERAGEFC(DATA4.OPENINT(),5);
CON5=AVERAGEFC(DATA5.OPENINT(),5);
CON6=AVERAGEFC(DATA6.OPENINT(),5);
CON7=AVERAGEFC(DATA7.OPENINT(),5);
CON8=AVERAGEFC(DATA8.OPENINT(),5);
CON9=AVERAGEFC(DATA9.OPENINT(),5);
CON10=AVERAGEFC(DATA10.OPENINT(),5);
If(Con0 > Major)
{
Major = Con0;
MyOpen = Data0.Open;
MyHigh = Data0.High;
MyLow = Data0.Low;
MyClose = Data0.Close;
}
If(Con1 > Major)
{
Major = Con1;
MyOpen = Data1.Open;
MyHigh = Data1.High;
MyLow = Data1.Low;
MyClose = Data1.Close;
}
// 以下类似
....
PlotNumeric("High",MyHigh);
PlotNumeric("Open",MyOpen);
PlotNumeric("Low",MyLow);
PlotNumeric("Close",MyClose);
End
[/code]