int Crossed() { double EmaLongPrevious=iMA(NULL,0,LongEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar+1); double EmaLongCurrent=iMA(NULL,0,LongEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar); double EmaShortPrevious=iMA(NULL,0,ShortEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar+1); double EmaShortCurrent=iMA(NULL,0,ShortEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar); //---- if (EmaShortPrevious<EmaLongPrevious && EmaShortCurrent>EmaLongCurrent) return(1); //up trend if (EmaShortPrevious>EmaLongPrevious && EmaShortCurrent<EmaLongCurrent) return(2); //down trend //---- return(0); //elsewhere }
应该是对的。但是遍历5根K线的意义何在?当前时间出现的信号和过五分钟后的信号是一回事吧。
第二个问题可能和仿真器的输入参数有关。
另外,下次粘贴代码前,点击Aa左边的那个按钮。好像这个论坛的网管特别在意这个事情,不这样粘贴,没有大佬给答复。
感谢楼上的指点!
我在测试的时候,发现如下问题:
1、使用PRINT打印显示iMA()的数值,和MT4电脑上鼠标提示的数值,完全不同。
2、测试不同的时间周期,发现有的金叉可以正确显示,有的死叉也显示成金叉。有的超过了5根K线还是显示金叉。
3、因为这个数值不同,造成回测的时候开单不正常。
十分郁闷,不知道咋回事,请大神们指点指点。
似乎问题较复杂。
先把FOR循环拿掉,把PRICE_OPEN改成PRICE_CLOSE,再验证一下数值的不同和金叉死叉的问题。
另外,PRICE_CLOSE在shift==0时等同于当前的即时价格。
void OnTick()
{
Print("金叉:"+金叉());
Print("死叉:"+死叉());
}
bool 金叉()//5根K线范围内出现是否出现金叉
{
double ma10,ma20,ma101,ma201;
for(int i=0;i<5;i++)
{
ma10=iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,i);
ma20=iMA(NULL,0,20,0,MODE_EMA,PRICE_OPEN,i);
ma101=iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,i+1);
ma201=iMA(NULL,0,20,0,MODE_EMA,PRICE_OPEN,i+1);
Print(i);
Print("ma10:"+ma10);
if(ma10>ma20 && ma101<ma201)return(true);
}
return(false);
}
bool 死叉()
{
double ma10,ma20,ma101,ma201;
for(int i=0;i<5;i++)
{
ma10=iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,i);
ma20=iMA(NULL,0,20,0,MODE_EMA,PRICE_OPEN,i);
ma101=iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,i+1);
ma201=iMA(NULL,0,20,0,MODE_EMA,PRICE_OPEN,i+1);
Print(i);
Print("ma10:"+ma10);
if(ma10<ma20 && ma101>ma201)return(true);
}
return(false);
}
这是完整的代码,计算5根K线内,是否出现金叉或者死叉。
也参照了网上同样的均线代码,思考代码并没有错误,但是实际测试的时候,发现 金叉 、死叉 并不正确,不知道具体原因,请大侠指点指点。。。
已经找到原因。
思路:判断当前K线0开始,至前5根K线,范围内,是否出现 短期均线 上穿 长期均线。 这个写法是否正确?
另外:iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,0); 获得的当前MA数值,为何和MT4软件均线(方法、均线设置相同,鼠标放均线上的提示数值)上的不同呢?