如何编码? - 页 297

 

...

特伦斯

你想在一个闭合的柱子上测试一个十字星。移位1意味着第一个闭合的柱子,移位2意味着在此之前的第一个柱子。如果你想测试一个闭合条上的十字星,你必须测试这些条。

至于(diff1*diff2)<0): 这其实很简单

diff1是第1条上两条平均线之间的差值

diff2是第2条上两条平均线的差值。

任何都可以是正数或负数。我们感兴趣的是,当一个是正数,另一个是负数时,因为这意味着平均线已经交叉了。如果有交叉,将它们相乘就可以得到一个快速的答案(如果符号不同,那么结果就小于0,如果符号相等,那么乘法的结果就大于0)。

希望这能说明这段代码是做什么的

tkuan77:
嗨,Mladen,我试了一下你告诉我的方法,效果很好。但是,我不太理解这些代码背后的逻辑。为什么你要把iMA的位移设置为1和2,为什么你要这样编码。(diff1*diff2)<0)也是如此?对不起,我目前还在学习阶段。

谢谢你,问候你

Terrance
 

如何添加箭头

附上在过去几篇文章中讨论过的MA交叉交易EA的简略版本。

当一个交叉点发生在收盘的蜡烛上时,这个版本会在日志文件中打印一条信息。

是否有可能用代码取代打印逻辑,在图表上显示上下箭头?

谢谢你的帮助。

附加的文件:
 

...

试试这个方法...

它将画出箭头,并在图表的右下角 显示一个注释--像这样(在图表上添加了平均数,只是为了使它的作用更明显)。

michaelB:
附上在过去几个帖子中讨论的MA交叉EA的简略版本。

当在收盘的蜡烛上发生交叉时,这个版本会在日志文件中打印一条信息。

是否可以用代码取代打印逻辑,在图表上显示上/下箭头?

谢谢你的帮助。
附加的文件:
 

MA 箭头

2MAcrossover with comments "效果非常好。

只有一个问题--一旦箭头出现,当新的蜡烛打开时它就会消失,这是故意的吗?

我喜欢图表 右下角的评论。

再次感谢。

 
mladen:
特伦斯

你想在一个封闭的柱子上测试一个十字星。移位1意味着第一个闭合的柱子,移位2意味着在此之前的第一个柱子。如果你想测试一个闭合条上的十字星,你必须测试这些条。

至于(diff1*diff2)<0): 这实际上是很简单的

diff1是第1条上两条平均线的差值

diff2是第2条上两条平均线的差值

任何一个都可以是正数或负数。我们感兴趣的是,当一个是正数,另一个是负数时,因为这意味着平均数已经交叉了。如果有交叉,将它们相乘就可以得到一个快速的答案(如果符号不同,则结果小于0,如果符号相等,则该乘法的结果大于0)。

希望这能阐明该代码的作用

谢谢Mladen的帮助!但当我加入这段代码后,我的EA似乎有点乱了。偶尔它会自动SL或TP,甚至在实际的SL或TP达到之前,就像我截图中显示的那样。为什么会这样?

谢谢你,问候你

Terrance

//---输入参数

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

//+------------------------------------------------------------------+

//| 专家初始化函数 |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//|专家的去初始化功能|

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int mainlast_direction = 0;

静态int maincurrent_dirction = 0。

如果(mainline1>mainline2)maincurrent_dirction = 1; //main up

if(mainline1<mainline2)maincurrent_dirction = 2; //main down

if(maincurrent_dirction != mainlast_direction) //main changed

{

mainlast_direction = maincurrent_dirction;

返回(mainlast_direction)。

}

否则

{

返回(0)。

}

}

//+------------------------------------------------------------------+

//|专家启动功能|

//+------------------------------------------------------------------+

int start()

{

//----

int cnt, ticket, total;

双重shortEma, longEma, mainshortEma, mainlongEma。

如果(Bars<100)

{

Print("小于100的条数")。

return(0);

}

如果(TakeProfit<10)

{

Print("TakeProfit小于10")。

return(0); // 检查TakeProfit

}

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0)。

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0)。

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

如果((diff1*diff2)<0)

{

如果(shortEma1>longEma1)

isCrossed = 1。

否则isCrossed = 2。

}

total = OrdersTotal();

如果(total < 1)

{

如果(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"My EA",12345,0,Green)。

如果(ticket>0)

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

否则 Print("打开BUY订单错误。",GetLastError())。

return(0);

}

如果(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red)。

如果(ticket>0)

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Sell order opened : ",OrderOpenPrice());

}

否则 Print("打开卖出订单错误。",GetLastError())。

return(0);

}

return(0);

}

return(0);

}

//+------------------------------------------------------------------+

附加的文件:
ps.jpg  16 kb
 

特伦斯

这段代码与SL或TP没有关系。它只是测试了2条交叉平均线(请看michaelB如何在他的2MACrosses中使用相同的代码,因为那也是nan EA)。你的其他代码需要针对这些SL和TP错误进行修改。

tkuan77:
谢谢Mladen的帮助!但当我加入这段代码后,我的EA似乎有点乱了。偶尔它会自动SL或TP,甚至在实际的SL或TP达到之前,就像我截图中显示的那样。为什么会这样?

谢谢你,问候你

Terrance

//---输入参数

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

//+------------------------------------------------------------------+

//| 专家初始化函数 |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//|专家的去初始化功能|

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int mainlast_direction = 0;

静态int maincurrent_dirction = 0。

如果(mainline1>mainline2)maincurrent_dirction = 1; //main up

if(mainline1<mainline2)maincurrent_dirction = 2; //main down

if(maincurrent_dirction != mainlast_direction) //main changed

{

mainlast_direction = maincurrent_dirction;

返回(mainlast_direction)。

}

否则

{

返回(0)。

}

}

//+------------------------------------------------------------------+

//|专家启动功能|

//+------------------------------------------------------------------+

int start()

{

//----

int cnt, ticket, total;

双重shortEma, longEma, mainshortEma, mainlongEma。

如果(Bars<100)

{

Print("小于100的条数")。

return(0);

}

如果(TakeProfit<10)

{

Print("TakeProfit小于10")。

return(0); // 检查TakeProfit

}

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0)。

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0)。

int mainisCrossed = mainCrossed(mainshortEma,mainlongEma)。

如果((diff1*diff2)<0)

{

如果(shortEma1>longEma1)

isCrossed = 1。

否则isCrossed = 2。

}

total = OrdersTotal();

如果(total < 1)

{

如果(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point, Ask+TakeProfit*Point,

"My EA",12345,0,Green)。

如果(ticket>0)

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

否则 Print("打开BUY订单错误。",GetLastError())。

return(0);

}

如果(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red)。

如果(ticket>0)

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Sell order opened : ",OrderOpenPrice());

}

否则 Print("打开卖出订单错误。",GetLastError())。

return(0);

}

return(0);

}

return(0);

}

//+------------------------------------------------------------------+
 

...

是的,它是故意的

因为你做的是EA而不是指标,所以增加的内容是只显示最后一个活跃的十字星,当没有活跃的十字星时,不显示箭头。为了使其能够显示多个箭头,需要先将其转换为指标,然后将整个事情重新编写,但我认为已经有很多指标在图表上显示平均数的交叉点了。

michaelB:
2MAcrossover with comments "效果非常好。

只有一个问题,一旦箭头出现,当新的蜡烛打开时,它就会消失,这是故意的吗?

我喜欢图表右下角的评论。

再次感谢。
 
mladen:
Terrance 那段代码与SL或TP无关。它只是测试了2条交叉平均线(请看michaelB如何在他的2MACrosses中使用相同的代码,因为那也是nan EA)。你的其他代码需要针对这些SL和TP错误进行修改。

嗨,Mladen,

你的意思是说我设置TP和SL的方式是错误的还是?

谢谢

特伦斯

 

...

特伦斯

你有没有看到TSD的这个部分:课程

我认为很多问题已经在那里得到了回答,而且你可以在那里找到非常好的一般EA写作的例子。至于你的问题:我没有测试你的EA,所以我不知道。测试别人的EA的问题是,你必须知道它的想法和逻辑,而很多时候,根本不可能从代码本身 "读 "出这些。我们正在讨论的代码片段是关于如何在一个封闭的条形图上检测2个均线交叉,该代码只是在做这个,除此之外没有别的。这就是为什么我说 "它与SL或TP无关"

问候

姆拉登

tkuan77:
嗨,Mladen,

你的意思是我设置的止损点和止盈点的方式是错误的还是?

请注意

特伦斯
 

MQL课程主题

mladen--谢谢你的链接!!