如何编码? - 页 297 1...290291292293294295296297298299300301302303304...347 新评论 Mladen Rakic 2012.06.14 16:10 #2961 ... 特伦斯 你想在一个闭合的柱子上测试一个十字星。移位1意味着第一个闭合的柱子,移位2意味着在此之前的第一个柱子。如果你想测试一个闭合条上的十字星,你必须测试这些条。 至于(diff1*diff2)<0): 这其实很简单 diff1是第1条上两条平均线之间的差值diff2是第2条上两条平均线的差值。 任何都可以是正数或负数。我们感兴趣的是,当一个是正数,另一个是负数时,因为这意味着平均线已经交叉了。如果有交叉,将它们相乘就可以得到一个快速的答案(如果符号不同,那么结果就小于0,如果符号相等,那么乘法的结果就大于0)。 希望这能说明这段代码是做什么的 tkuan77: 嗨,Mladen,我试了一下你告诉我的方法,效果很好。但是,我不太理解这些代码背后的逻辑。为什么你要把iMA的位移设置为1和2,为什么你要这样编码。(diff1*diff2)<0)也是如此?对不起,我目前还在学习阶段。谢谢你,问候你 Terrance michaelB 2012.06.15 04:02 #2962 如何添加箭头 附上在过去几篇文章中讨论过的MA交叉交易EA的简略版本。 当一个交叉点发生在收盘的蜡烛上时,这个版本会在日志文件中打印一条信息。 是否有可能用代码取代打印逻辑,在图表上显示上下箭头? 谢谢你的帮助。 附加的文件: 2macrossover.mq4 3 kb Mladen Rakic 2012.06.15 09:18 #2963 ... 试试这个方法... 它将画出箭头,并在图表的右下角 显示一个注释--像这样(在图表上添加了平均数,只是为了使它的作用更明显)。 michaelB: 附上在过去几个帖子中讨论的MA交叉EA的简略版本。当在收盘的蜡烛上发生交叉时,这个版本会在日志文件中打印一条信息。 是否可以用代码取代打印逻辑,在图表上显示上/下箭头? 谢谢你的帮助。 附加的文件: 2mas_cross.gif 26 kb 2macrossover_with_comments.mq4 4 kb michaelB 2012.06.15 18:57 #2964 MA 箭头 2MAcrossover with comments "效果非常好。 只有一个问题--一旦箭头出现,当新的蜡烛打开时它就会消失,这是故意的吗? 我喜欢图表 右下角的评论。 再次感谢。 tkuan77 2012.06.16 03:17 #2965 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 How to code? Please help me with Please fix this indicator Mladen Rakic 2012.06.16 06:05 #2966 特伦斯 这段代码与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); } //+------------------------------------------------------------------+ Mladen Rakic 2012.06.16 06:10 #2967 ... 是的,它是故意的 因为你做的是EA而不是指标,所以增加的内容是只显示最后一个活跃的十字星,当没有活跃的十字星时,不显示箭头。为了使其能够显示多个箭头,需要先将其转换为指标,然后将整个事情重新编写,但我认为已经有很多指标在图表上显示平均数的交叉点了。 michaelB: 2MAcrossover with comments "效果非常好。只有一个问题,一旦箭头出现,当新的蜡烛打开时,它就会消失,这是故意的吗? 我喜欢图表右下角的评论。 再次感谢。 tkuan77 2012.06.16 06:56 #2968 mladen: Terrance 那段代码与SL或TP无关。它只是测试了2条交叉平均线(请看michaelB如何在他的2MACrosses中使用相同的代码,因为那也是nan EA)。你的其他代码需要针对这些SL和TP错误进行修改。 嗨,Mladen, 你的意思是说我设置TP和SL的方式是错误的还是? 谢谢 特伦斯 Mladen Rakic 2012.06.16 08:42 #2969 ... 特伦斯 你有没有看到TSD的这个部分:课程? 我认为很多问题已经在那里得到了回答,而且你可以在那里找到非常好的一般EA写作的例子。至于你的问题:我没有测试你的EA,所以我不知道。测试别人的EA的问题是,你必须知道它的想法和逻辑,而很多时候,根本不可能从代码本身 "读 "出这些。我们正在讨论的代码片段是关于如何在一个封闭的条形图上检测2个均线交叉,该代码只是在做这个,除此之外没有别的。这就是为什么我说 "它与SL或TP无关" 问候 姆拉登 tkuan77: 嗨,Mladen,你的意思是我设置的止损点和止盈点的方式是错误的还是? 请注意 特伦斯 michaelB 2012.06.16 16:45 #2970 MQL课程主题 mladen--谢谢你的链接!! 1...290291292293294295296297298299300301302303304...347 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
...
特伦斯
你想在一个闭合的柱子上测试一个十字星。移位1意味着第一个闭合的柱子,移位2意味着在此之前的第一个柱子。如果你想测试一个闭合条上的十字星,你必须测试这些条。
至于(diff1*diff2)<0): 这其实很简单
任何都可以是正数或负数。我们感兴趣的是,当一个是正数,另一个是负数时,因为这意味着平均线已经交叉了。如果有交叉,将它们相乘就可以得到一个快速的答案(如果符号不同,那么结果就小于0,如果符号相等,那么乘法的结果就大于0)。
希望这能说明这段代码是做什么的
嗨,Mladen,我试了一下你告诉我的方法,效果很好。但是,我不太理解这些代码背后的逻辑。为什么你要把iMA的位移设置为1和2,为什么你要这样编码。(diff1*diff2)<0)也是如此?对不起,我目前还在学习阶段。
谢谢你,问候你
Terrance如何添加箭头
附上在过去几篇文章中讨论过的MA交叉交易EA的简略版本。
当一个交叉点发生在收盘的蜡烛上时,这个版本会在日志文件中打印一条信息。
是否有可能用代码取代打印逻辑,在图表上显示上下箭头?
谢谢你的帮助。
...
试试这个方法...
它将画出箭头,并在图表的右下角 显示一个注释--像这样(在图表上添加了平均数,只是为了使它的作用更明显)。
附上在过去几个帖子中讨论的MA交叉EA的简略版本。
当在收盘的蜡烛上发生交叉时,这个版本会在日志文件中打印一条信息。
是否可以用代码取代打印逻辑,在图表上显示上/下箭头?
谢谢你的帮助。MA 箭头
2MAcrossover with comments "效果非常好。
只有一个问题--一旦箭头出现,当新的蜡烛打开时它就会消失,这是故意的吗?
我喜欢图表 右下角的评论。
再次感谢。
特伦斯
你想在一个封闭的柱子上测试一个十字星。移位1意味着第一个闭合的柱子,移位2意味着在此之前的第一个柱子。如果你想测试一个闭合条上的十字星,你必须测试这些条。
至于(diff1*diff2)<0): 这实际上是很简单的
任何一个都可以是正数或负数。我们感兴趣的是,当一个是正数,另一个是负数时,因为这意味着平均数已经交叉了。如果有交叉,将它们相乘就可以得到一个快速的答案(如果符号不同,则结果小于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);
}
//+------------------------------------------------------------------+
特伦斯
这段代码与SL或TP没有关系。它只是测试了2条交叉平均线(请看michaelB如何在他的2MACrosses中使用相同的代码,因为那也是nan EA)。你的其他代码需要针对这些SL和TP错误进行修改。
谢谢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而不是指标,所以增加的内容是只显示最后一个活跃的十字星,当没有活跃的十字星时,不显示箭头。为了使其能够显示多个箭头,需要先将其转换为指标,然后将整个事情重新编写,但我认为已经有很多指标在图表上显示平均数的交叉点了。
2MAcrossover with comments "效果非常好。
只有一个问题,一旦箭头出现,当新的蜡烛打开时,它就会消失,这是故意的吗?
我喜欢图表右下角的评论。
再次感谢。Terrance 那段代码与SL或TP无关。它只是测试了2条交叉平均线(请看michaelB如何在他的2MACrosses中使用相同的代码,因为那也是nan EA)。你的其他代码需要针对这些SL和TP错误进行修改。
嗨,Mladen,
你的意思是说我设置TP和SL的方式是错误的还是?
谢谢
特伦斯
...
特伦斯
你有没有看到TSD的这个部分:课程?
我认为很多问题已经在那里得到了回答,而且你可以在那里找到非常好的一般EA写作的例子。至于你的问题:我没有测试你的EA,所以我不知道。测试别人的EA的问题是,你必须知道它的想法和逻辑,而很多时候,根本不可能从代码本身 "读 "出这些。我们正在讨论的代码片段是关于如何在一个封闭的条形图上检测2个均线交叉,该代码只是在做这个,除此之外没有别的。这就是为什么我说 "它与SL或TP无关"
问候
姆拉登
嗨,Mladen,
你的意思是我设置的止损点和止盈点的方式是错误的还是?
请注意
特伦斯MQL课程主题
mladen--谢谢你的链接!!