如何编码? - 页 298 1...291292293294295296297298299300301302303304305...347 新评论 tkuan77 2012.06.17 09:10 #2971 mladen: 特伦斯你有没有看到TSD的这个部分:课程? 我认为很多问题已经在那里得到了回答,而且你可以在那里找到非常好的一般EA写作的例子。至于您的问题:我没有测试您的EA,所以我不知道。测试别人的EA的问题是,你必须知道它的想法和逻辑,而很多时候,根本不可能从代码本身 "读 "出这些。我们正在讨论的代码片段是关于如何在一个封闭的条形图上检测2个均线交叉,该代码只是在做这个,除此之外没有别的。这就是为什么我说 "它与SL或TP无关" 问候 姆拉登 嗨,Mladen,很抱歉再次打扰你。我查看了我的代码,我注意到不仅是我的TP和SL,有时连我的买入和卖出指令都不对。我看了你给我的课上的链接,是由codersgurus提供的,它与我的教程相同,也是我的代码的基础。我似乎无法在代码中找到错误的原因。 MA的交叉点与多头和空头订单一起工作,然而有时进场和出场似乎不正常,甚至当我做了一个基本的ASK功能来测试它。请给我一些启示。 谢谢你,谢谢你 特伦斯 Mladen Rakic 2012.06.17 09:38 #2972 ... 特伦斯 首先:你的经纪人是ECN/STP吗?如果是,那么你不能在开单的同时设置止损和止盈,但你必须先开一个设置为0的订单,然后使用OrderModify()来设置止损和/或已开订单的止盈。 第二:另外,经常检查你在终端窗口的专家标签中是否有任何东西被写出来(检查是否有一些错误被写在那里:你可能会发现发生了什么和为什么。 第三:在每一个订单管理功能之后,放一行这样的字可能是个好主意。 int err=GetLastError(); Print(err); 在每个订单管理功能之后。错误描述你可以在experts/include/stderror.mqh文件中找到(有很多错误可能发生(只要看到可能的错误代码和描述的列表),你必须监控每一个可能的错误)有了已知的错误代码(上面的代码行),你可以集中精力纠正具体的错误,而不是猜测发生了什么。 tkuan77: 嗨,Mladen,很抱歉再次打扰你。我查看了我的代码,我注意到不仅是我的TP和SL,有时连我的买入和卖出指令都不对。我看了你给我的codersgurus的课程链接,它和我的教程是一样的,也是我的代码的基础。我似乎无法在代码中找到错误的原因。 MA的交叉点与多头和空头订单一起工作是应该的,但是有时进场和出场似乎不正常,甚至当我做了一个基本的ASK功能来测试它。请给我一些启示。谢谢你 特伦斯 附加的文件: terminal_1.gif 62 kb tkuan77 2012.06.17 15:06 #2973 mladen: 特伦斯首先:你的经纪人是ECN/STP吗?如果是,那么你不能在开单的同时设置止损和止盈,但你必须先开一个设置为0的订单,然后用OrderModify()来设置已经开好的订单的止损和/或止盈。 第二:另外,经常检查你在终端窗口的专家标签中是否有任何东西被写出来(检查是否有一些错误被写在那里:你可能会发现发生了什么和为什么。 第三:最好能放一行这样的文字。 int err=GetLastError(); Print(err); 在每个订单管理功能之后。你可以在experts/include/stderror.mqh文件中找到错误描述(有很多错误可能发生(只见可能的错误代码和描述列表),你必须监控每一个可能的错误)有了已知的错误代码(上面的代码行),你可以集中精力纠正具体的错误,而不是猜测发生了什么。 嗨,Mladen。 谢谢你指出ECN/STP这个东西。我不知道这些,直到你提到它。我已经按照你的建议做了修改,但是现在对我来说,情况变得更糟。不仅入市和出市问题持续存在,我的SL现在也不见了。这比我想象的要难。 //---输入参数 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,0,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,0,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); } for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)。 如果(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { 如果(OrderType()==OP_BUY)// 多头头寸被打开 { OrderClose(OrderTicket(),OrderLots(), Ask-StopLoss*Point,3,Violet)。 //关闭头寸 return(0); // 退出 } 否则 // 转入空头头寸 { OrderClose(OrderTicket(),OrderLots(),Bid+StopLoss*Point,3,Violet) 。 //关闭头寸 return(0); // 退出 } } } return(0); } //+------------------------------------------------------------------+ How to code? 原始想法 Please help me with tkuan77 2012.06.18 11:54 #2974 mladen: Terrance首先:你的经纪人是ECN/STP吗?如果是,那么你不能在开单的同时设置止损和止盈,但你必须先开一个设置为0的订单,然后用OrderModify()来设置已经开好的订单的止损和/或止盈。 第二:另外,经常检查你在终端窗口的专家标签中是否有任何东西被写出来(检查是否有一些错误被写在那里:你可能会发现发生了什么和为什么。 第三:最好能放一行这样的文字。 int err=GetLastError(); Print(err); 在每个订单管理功能之后。你可以在experts/include/stderror.mqh文件中找到错误描述(有很多错误可能发生(只见可能的错误代码和描述列表),你必须监控每一个可能的错误)有了已知的错误代码(上面的代码行),你可以集中精力纠正具体的错误,而不是猜测发生了什么。 嘿,Mladen,我想感谢你这几天的帮助。我设法找到了 我的代码中导致进入和退出错误的错误。 问候 Terrance tkuan77 2012.07.03 05:22 #2975 开设超过1笔交易 大家好,我一直试图让我的EA能够开启多笔交易,但到目前为止,我只能让它限制在1笔交易。 我的目标很简单。 当LWMA 10在LWMA 20下方交叉时,系统将做空,条件是LWMA 10和20在SMA 50下方交叉,反之则做多。 我想将我的EA限制在不超过2笔交易,然而,当我改变代码时,它变成了一次开2笔交易,而不是每个标准开1笔交易。 我是否需要建立一个反击系统或任何东西,或者我如何设置我的反击系统,以便在我的交易中的一个已经有了TP或SL时做出反应? 谁能告诉我,我的代码出了什么问题。 非常感谢,并致以敬意 Terrance //---输入参数 extern double TakeProfit=500.0; extern double Lots=0.1; extern double StopLoss=500.0; //+------------------------------------------------------------------+ //| 专家初始化函数 | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //|专家的去初始化功能| //+------------------------------------------------------------------+ int deinit() { //---- //---- return(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 } shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。 longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0)。 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,50,0,MODE_SMA,PRICE_CLOSE,0)。 如果((diff1*diff2)<0) { 如果(shortEma1>longEma1) isCrossed = 1。 否则isCrossed = 2。 } total = OrdersTotal(); 如果(total < 1) { 如果(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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); } 如果(total == 1) { if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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); } //+------------------------------------------------------------------+ How to code? 原始想法 Ema Cross! premalmunshaw 2012.07.03 10:39 #2976 问题 Mladen, 我试图在你给我看的链接下寻找课程,但它们是一般的课程,我在寻找专门用于亨德森指标的信息...... 另外,我已经浏览了所发布的主题,之后我想找到以下东西。 -用简单易懂的语言,我想问的是,大约经过多少个柱子,颜色就会改变。 换句话说,在线的颜色从蓝色变成粉红色之前,最多需要多少个柱子?不幸的是,我不懂花哨的术语,我希望得到非常简单的答复,以便我能够继续前进并开始实施策略。premalmunshaw@yahoo.com 是我的电子邮件地址。 我正试图支付39美元来激活这个包。 期待您的积极答复。 谢谢。 普雷马尔-芒肖 mladen: 坦白地说,我不明白你在问什么。如果你问的是什么时候会改变颜色,那么答案是:当斜率改变时。 如果你问的是它是如何编码变色的,那么你应该在本节中寻找答案。课程。 Mladen Rakic 2012.07.03 11:03 #2977 ... 不幸的是,我不明白你的问题,所以我将做的是重新表述我自己(计算长度是指亨德森过滤器的计算长度)。 如果你的计算长度是5,那么最后两根柱子可以改变。如果你的计算长度是7,那么最后3条可以改变 如果你的计算长度是9,那么最后4个小节可以改变。 比这更简单的答案是不可能的。没有比这更简单的解释了,亨德森滤波器是如何计算的:就像我试图用 "1+1=2 "来解释傅里叶变换一样。请检查你所提供的链接 至于其他的:你得到了过滤器背后的数学链接,你得到了关于多少个柱子被重新计算的信息,你甚至得到了来自精英部分新闻线的例子。至于使用该过滤器的策略:我在1000多个帖子中说过,重新计算指标(SSA、亨德森过滤器、中心化TMA、傅里叶变换、回归分析......)不应该在 "信号模式 "中使用,而应该在 "估计模式 "中使用。如果你想从亨德森滤波中获得信号,那么你就完全走错了路,如果这是你考虑订阅精英版的唯一原因,那么你最好不要订阅。 PS:把你的电子邮件公开是一种不好的做法。这样一来,你的邮箱里就会有大量的垃圾邮件。 ______________________________________ 祝你在寻求交易系统的过程中一切顺利 问候 姆拉登 premalmunshaw: Mladen,我试图在你给我看的链接下寻找课程,但它们是通用课程,我正在寻找专门针对亨德森指标的信息...... 另外,我已经看了发布的主题,之后我想找到以下东西。 -用简单易懂的语言,我想问的是,大约经过多少个柱子,颜色就会改变。 换句话说,在线的颜色从蓝色变成粉红色之前,最多需要多少个柱子?不幸的是,我不懂花哨的术语,我希望得到非常简单的答复,以便我能够继续前进并开始实施策略。premalmunshaw@yahoo.com 是我的电子邮件地址。 我正试图支付39美元来激活这个包。 期待您的积极答复。 请注意。 Premal Munshaw tkuan77 2012.07.03 12:13 #2978 Mladen, 是否有办法让我为我的交易设置一个计数器,以便当我的交易有TP或SL时,我能够触发计数器的跳转? 请注意 特伦斯 tkuan77: 大家好,我一直想让我的EA能够开启多笔交易,但到目前为止,我只能让它限制在1笔交易。 我的目标很简单。 当LWMA10在LWMA20下方交叉时,只要LWMA10和20在SMA50下方交叉,系统就会做空,反之则做多。 我想限制我的EA不超过2笔交易,但是,当我改变代码时,它变成了一次开2笔交易,而不是每个标准开1笔交易。 我是否需要建立一个反击系统或任何东西,或者我如何设置我的反击系统,以便在我的交易中的一个已经有了TP或SL时做出反应? 谁能告诉我,我的代码出了什么问题。 非常感谢,并致以敬意 Terrance //---输入参数 extern double TakeProfit=500.0; extern double Lots=0.1; extern double StopLoss=500.0; //+------------------------------------------------------------------+ //| 专家初始化函数 | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //|专家的去初始化功能| //+------------------------------------------------------------------+ int deinit() { //---- //---- return(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 } shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。 longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0)。 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,50,0,MODE_SMA,PRICE_CLOSE,0)。 如果((diff1*diff2)<0) { 如果(shortEma1>longEma1) isCrossed = 1。 否则isCrossed = 2。 } total = OrdersTotal(); 如果(total < 1) { 如果(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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); } 如果(total == 1) { if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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.07.04 11:30 #2979 ... 试试这个功能。 int countOpenedOrders(int type) { int openedOrders = 0; for(int i=0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break; if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() != MagicNumber) continue; if(OrderType() == type) openedOrders++; } return(openedOrders); } [/PHP] To count opened buy orders, call it like this : int openedBuys = countOpened(OP_BUY); to count opened sell orders, call it like this : [PHP]int openedSells = countOpened(OP_SELL); 然后你可以检查:if openedBuys==0 open buy ifopenedSells==0 open selltkuan77: Mladen,是否有办法让我为我的交易设置一个计数器,以便当我的交易有TP或SL时,我能够触发计数器的跳跃? 谢谢 Terrance 编码帮助 EA不会在多对上运行,需要帮助 被错误困扰的是没有交易业务 tkuan77 2012.07.05 14:07 #2980 你好,Mladen。 我想出了另一个使用 "Bars "函数的方法。当一个交易被触发时,我将用bar函数 设置一个整数的计数(例如,一个买入的交易是在第122条触发的,因此计数将是122),当我的标准再次被触发时,我将再次调用bar函数并与计数进行比较,只有当新的计数高于先前的计数,即本例中的122,交易才会触发。 然而,我仍然是同时触发2个交易,而不是每个条件触发1个。为什么会这样呢? 请帮助我。 谢谢您 Terrance //---输入参数 extern double TakeProfit=530.0; extern double Lots=0.1; extern double StopLoss=520.0; //+------------------------------------------------------------------+ //| 专家初始化函数 | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //|专家的去初始化功能| //+------------------------------------------------------------------+ int deinit() { //---- //---- return(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 } shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。 longEma = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,0)。 int isCrossed = 0; double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1); double longEma1 = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,1); double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2); double longEma2 = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,2); double diff1 = shortEma1-longEma1; double diff2 = shortEma2-longEma2; mainshortEma = iMA(NULL,0,113,0,MODE_EMA,PRICE_CLOSE,0)。 如果((diff1*diff2)<0) { 如果(shortEma1>longEma1) isCrossed = 1。 否则isCrossed = 2。 } int BarCounter, BarCounter2; total = OrdersTotal(); if(total < 1) { if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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()); BarCounter = Bars; } 否则 Print("错误打开BUY订单。",GetLastError())。 return(0); } 如果(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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()); BarCounter = Bars; } 否则 Print("打开卖出订单错误 :",GetLastError())。 return(0); } return(0); } 如果(total == 1) { BarCounter2 = Bars; 如果(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma && BarCounter2 > BarCounter) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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()); BarCounter = BarCounter2; } 否则 Print("错误打开BUY订单。",GetLastError())。 return(0); } 如果(isCrossed == 2 && shortEma < mainshortEma && longEma BarCounter) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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()); BarCounter = BarCounter2; } 否则 Print("打开卖出订单错误 :",GetLastError())。 return(0); } return(0); } return(0); } mladen: 试试这个函数 :int countOpenedOrders(int type) { int openedOrders = 0; for(int i=0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break; if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() != MagicNumber) continue; if(OrderType() == type) openedOrders++; } return(openedOrders); } [/PHP] To count opened buy orders, call it like this : int openedBuys = countOpened(OP_BUY); to count opened sell orders, call it like this : [PHP]int openedSells = countOpened(OP_SELL); 然后你可以检查:if openedBuys==0 open buy ifopenedSells==0 open sell How to code? 原始想法 Help with Entry Criteria 1...291292293294295296297298299300301302303304305...347 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
特伦斯
你有没有看到TSD的这个部分:课程?
我认为很多问题已经在那里得到了回答,而且你可以在那里找到非常好的一般EA写作的例子。至于您的问题:我没有测试您的EA,所以我不知道。测试别人的EA的问题是,你必须知道它的想法和逻辑,而很多时候,根本不可能从代码本身 "读 "出这些。我们正在讨论的代码片段是关于如何在一个封闭的条形图上检测2个均线交叉,该代码只是在做这个,除此之外没有别的。这就是为什么我说 "它与SL或TP无关"
问候
姆拉登嗨,Mladen,很抱歉再次打扰你。我查看了我的代码,我注意到不仅是我的TP和SL,有时连我的买入和卖出指令都不对。我看了你给我的课上的链接,是由codersgurus提供的,它与我的教程相同,也是我的代码的基础。我似乎无法在代码中找到错误的原因。
MA的交叉点与多头和空头订单一起工作,然而有时进场和出场似乎不正常,甚至当我做了一个基本的ASK功能来测试它。请给我一些启示。
谢谢你,谢谢你
特伦斯
...
特伦斯
首先:你的经纪人是ECN/STP吗?如果是,那么你不能在开单的同时设置止损和止盈,但你必须先开一个设置为0的订单,然后使用OrderModify()来设置止损和/或已开订单的止盈。
第二:另外,经常检查你在终端窗口的专家标签中是否有任何东西被写出来(检查是否有一些错误被写在那里:你可能会发现发生了什么和为什么。
第三:在每一个订单管理功能之后,放一行这样的字可能是个好主意。
在每个订单管理功能之后。错误描述你可以在experts/include/stderror.mqh文件中找到(有很多错误可能发生(只要看到可能的错误代码和描述的列表),你必须监控每一个可能的错误)有了已知的错误代码(上面的代码行),你可以集中精力纠正具体的错误,而不是猜测发生了什么。
嗨,Mladen,很抱歉再次打扰你。我查看了我的代码,我注意到不仅是我的TP和SL,有时连我的买入和卖出指令都不对。我看了你给我的codersgurus的课程链接,它和我的教程是一样的,也是我的代码的基础。我似乎无法在代码中找到错误的原因。
MA的交叉点与多头和空头订单一起工作是应该的,但是有时进场和出场似乎不正常,甚至当我做了一个基本的ASK功能来测试它。请给我一些启示。
谢谢你
特伦斯特伦斯
首先:你的经纪人是ECN/STP吗?如果是,那么你不能在开单的同时设置止损和止盈,但你必须先开一个设置为0的订单,然后用OrderModify()来设置已经开好的订单的止损和/或止盈。
第二:另外,经常检查你在终端窗口的专家标签中是否有任何东西被写出来(检查是否有一些错误被写在那里:你可能会发现发生了什么和为什么。
第三:最好能放一行这样的文字。
嗨,Mladen。
谢谢你指出ECN/STP这个东西。我不知道这些,直到你提到它。我已经按照你的建议做了修改,但是现在对我来说,情况变得更糟。不仅入市和出市问题持续存在,我的SL现在也不见了。这比我想象的要难。
//---输入参数
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,0,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,0,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);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)。
如果(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
{
如果(OrderType()==OP_BUY)// 多头头寸被打开
{
OrderClose(OrderTicket(),OrderLots(), Ask-StopLoss*Point,3,Violet)。
//关闭头寸
return(0); // 退出
}
否则 // 转入空头头寸
{
OrderClose(OrderTicket(),OrderLots(),Bid+StopLoss*Point,3,Violet) 。
//关闭头寸
return(0); // 退出
}
}
}
return(0);
}
//+------------------------------------------------------------------+
Terrance
首先:你的经纪人是ECN/STP吗?如果是,那么你不能在开单的同时设置止损和止盈,但你必须先开一个设置为0的订单,然后用OrderModify()来设置已经开好的订单的止损和/或止盈。
第二:另外,经常检查你在终端窗口的专家标签中是否有任何东西被写出来(检查是否有一些错误被写在那里:你可能会发现发生了什么和为什么。
第三:最好能放一行这样的文字。
嘿,Mladen,我想感谢你这几天的帮助。我设法找到了 我的代码中导致进入和退出错误的错误。
问候
Terrance
开设超过1笔交易
大家好,我一直试图让我的EA能够开启多笔交易,但到目前为止,我只能让它限制在1笔交易。
我的目标很简单。
当LWMA 10在LWMA 20下方交叉时,系统将做空,条件是LWMA 10和20在SMA 50下方交叉,反之则做多。
我想将我的EA限制在不超过2笔交易,然而,当我改变代码时,它变成了一次开2笔交易,而不是每个标准开1笔交易。
我是否需要建立一个反击系统或任何东西,或者我如何设置我的反击系统,以便在我的交易中的一个已经有了TP或SL时做出反应?
谁能告诉我,我的代码出了什么问题。
非常感谢,并致以敬意
Terrance
//---输入参数
extern double TakeProfit=500.0;
extern double Lots=0.1;
extern double StopLoss=500.0;
//+------------------------------------------------------------------+
//| 专家初始化函数 |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//|专家的去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(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
}
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。
longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0)。
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,50,0,MODE_SMA,PRICE_CLOSE,0)。
如果((diff1*diff2)<0)
{
如果(shortEma1>longEma1)
isCrossed = 1。
否则isCrossed = 2。
}
total = OrdersTotal();
如果(total < 1)
{
如果(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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);
}
如果(total == 1)
{
if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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,
我试图在你给我看的链接下寻找课程,但它们是一般的课程,我在寻找专门用于亨德森指标的信息......
另外,我已经浏览了所发布的主题,之后我想找到以下东西。
-用简单易懂的语言,我想问的是,大约经过多少个柱子,颜色就会改变。
换句话说,在线的颜色从蓝色变成粉红色之前,最多需要多少个柱子?不幸的是,我不懂花哨的术语,我希望得到非常简单的答复,以便我能够继续前进并开始实施策略。premalmunshaw@yahoo.com 是我的电子邮件地址。
我正试图支付39美元来激活这个包。
期待您的积极答复。
谢谢。
普雷马尔-芒肖
坦白地说,我不明白你在问什么。
如果你问的是什么时候会改变颜色,那么答案是:当斜率改变时。
如果你问的是它是如何编码变色的,那么你应该在本节中寻找答案。课程。...
不幸的是,我不明白你的问题,所以我将做的是重新表述我自己(计算长度是指亨德森过滤器的计算长度)。
比这更简单的答案是不可能的。没有比这更简单的解释了,亨德森滤波器是如何计算的:就像我试图用 "1+1=2 "来解释傅里叶变换一样。请检查你所提供的链接
至于其他的:你得到了过滤器背后的数学链接,你得到了关于多少个柱子被重新计算的信息,你甚至得到了来自精英部分新闻线的例子。至于使用该过滤器的策略:我在1000多个帖子中说过,重新计算指标(SSA、亨德森过滤器、中心化TMA、傅里叶变换、回归分析......)不应该在 "信号模式 "中使用,而应该在 "估计模式 "中使用。如果你想从亨德森滤波中获得信号,那么你就完全走错了路,如果这是你考虑订阅精英版的唯一原因,那么你最好不要订阅。
PS:把你的电子邮件公开是一种不好的做法。这样一来,你的邮箱里就会有大量的垃圾邮件。
______________________________________
祝你在寻求交易系统的过程中一切顺利
问候
姆拉登
Mladen,
我试图在你给我看的链接下寻找课程,但它们是通用课程,我正在寻找专门针对亨德森指标的信息......
另外,我已经看了发布的主题,之后我想找到以下东西。
-用简单易懂的语言,我想问的是,大约经过多少个柱子,颜色就会改变。
换句话说,在线的颜色从蓝色变成粉红色之前,最多需要多少个柱子?不幸的是,我不懂花哨的术语,我希望得到非常简单的答复,以便我能够继续前进并开始实施策略。premalmunshaw@yahoo.com 是我的电子邮件地址。
我正试图支付39美元来激活这个包。
期待您的积极答复。
请注意。
Premal MunshawMladen,
是否有办法让我为我的交易设置一个计数器,以便当我的交易有TP或SL时,我能够触发计数器的跳转?
请注意
特伦斯
大家好,我一直想让我的EA能够开启多笔交易,但到目前为止,我只能让它限制在1笔交易。
我的目标很简单。
当LWMA10在LWMA20下方交叉时,只要LWMA10和20在SMA50下方交叉,系统就会做空,反之则做多。
我想限制我的EA不超过2笔交易,但是,当我改变代码时,它变成了一次开2笔交易,而不是每个标准开1笔交易。
我是否需要建立一个反击系统或任何东西,或者我如何设置我的反击系统,以便在我的交易中的一个已经有了TP或SL时做出反应?
谁能告诉我,我的代码出了什么问题。
非常感谢,并致以敬意
Terrance
//---输入参数
extern double TakeProfit=500.0;
extern double Lots=0.1;
extern double StopLoss=500.0;
//+------------------------------------------------------------------+
//| 专家初始化函数 |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//|专家的去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(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
}
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。
longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0)。
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,50,0,MODE_SMA,PRICE_CLOSE,0)。
如果((diff1*diff2)<0)
{
如果(shortEma1>longEma1)
isCrossed = 1。
否则isCrossed = 2。
}
total = OrdersTotal();
如果(total < 1)
{
如果(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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);
}
如果(total == 1)
{
if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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);
}
//+------------------------------------------------------------------+...
试试这个功能。
{
int openedOrders = 0;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderType() == type) openedOrders++;
}
return(openedOrders);
}
[/PHP]
To count opened buy orders, call it like this :
to count opened sell orders, call it like this :
[PHP]int openedSells = countOpened(OP_SELL);Mladen,
是否有办法让我为我的交易设置一个计数器,以便当我的交易有TP或SL时,我能够触发计数器的跳跃?
谢谢
Terrance你好,Mladen。
我想出了另一个使用 "Bars "函数的方法。当一个交易被触发时,我将用bar函数 设置一个整数的计数(例如,一个买入的交易是在第122条触发的,因此计数将是122),当我的标准再次被触发时,我将再次调用bar函数并与计数进行比较,只有当新的计数高于先前的计数,即本例中的122,交易才会触发。
然而,我仍然是同时触发2个交易,而不是每个条件触发1个。为什么会这样呢?
请帮助我。
谢谢您
Terrance
//---输入参数
extern double TakeProfit=530.0;
extern double Lots=0.1;
extern double StopLoss=520.0;
//+------------------------------------------------------------------+
//| 专家初始化函数 |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//|专家的去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(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
}
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。
longEma = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,0)。
int isCrossed = 0;
double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);
double longEma1 = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,1);
double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);
double longEma2 = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,2);
double diff1 = shortEma1-longEma1;
double diff2 = shortEma2-longEma2;
mainshortEma = iMA(NULL,0,113,0,MODE_EMA,PRICE_CLOSE,0)。
如果((diff1*diff2)<0)
{
如果(shortEma1>longEma1)
isCrossed = 1。
否则isCrossed = 2。
}
int BarCounter, BarCounter2;
total = OrdersTotal();
if(total < 1)
{
if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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());
BarCounter = Bars;
}
否则 Print("错误打开BUY订单。",GetLastError())。
return(0);
}
如果(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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());
BarCounter = Bars;
}
否则 Print("打开卖出订单错误 :",GetLastError())。
return(0);
}
return(0);
}
如果(total == 1)
{
BarCounter2 = Bars;
如果(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma && BarCounter2 > BarCounter)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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());
BarCounter = BarCounter2;
}
否则 Print("错误打开BUY订单。",GetLastError())。
return(0);
}
如果(isCrossed == 2 && shortEma < mainshortEma && longEma BarCounter)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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());
BarCounter = BarCounter2;
}
否则 Print("打开卖出订单错误 :",GetLastError())。
return(0);
}
return(0);
}
return(0);
}
试试这个函数 :
{
int openedOrders = 0;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderType() == type) openedOrders++;
}
return(openedOrders);
}
[/PHP]
To count opened buy orders, call it like this :
to count opened sell orders, call it like this :
[PHP]int openedSells = countOpened(OP_SELL);