//+------------------------------------------------------------------+ //| N&P 1DailyUpTrendExec.mq4 | //| Copyright Nick Lou & Pete Arh 2009 | //| 20090523 | //| | //+------------------------------------------------------------------+ extern double Lots=0.01; extern double TakeProfit=20; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(Bars<75) { Print("Bars less than 100"); return(0); } //Declaration double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3; ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0); ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0); ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0); e1under2= ema1< ema2; e2under3= ema2< ema3; e1over2= ema1> ema2; e2over3= ema2> ema3; if(OrdersTotal()==0) // one order at the time { // Short Entry static int ticket; if( e1under2 && e2under3) // short function { ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red); if( ticket>0) { if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice()); } if(OrdersTotal()==0) // one order at the time if( e1over2 && e2over3) //this may be messy cos old version had ==1 for all variables { if( e1over2 && e2over3) //buy function ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green); //What's 12345 for? I ADDED ASk-30*Point for stop loss if( ticket>0) { if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } return(0); } return(0); } }这就是代码,伙计们!
哇!对于一个 "新手 "来说,编码工作做得相当好。你的代码比我写得更简明。
我注意到,你在 "买入 "部分有两个相同的条件-if行,而 "卖出 "部分只有一个。
第二个相同的条件-if语句对于BUY功能 来说可能是无害的,但它有必要吗?
if(OrdersTotal()==0) //一次一个订单
if(e1over2 && e2over3) //这可能会很混乱,因为旧版本中所有变量都==1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 这里是第一个
{
if(e1over2 && e2over3) //购买功能 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 这是第二个
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); //12345是什么?我添加了ASk-30*Point作为止损
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY order opened : " ,OrderOpenPrice());
}
else Print("Error opening BUY order :",GetLastError());
return(0);
}
另外,看来你的卖出和买入函数都包含在同一个条件-if中:
if(OrdersTotal()==0) //一次一个订单
{
//空头入场
static int ticket;
if(e1under2 && e2under3) //空头函数
{ //这个的匹配括号远远低于SELL和BUY函数<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 见下文
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point, "Short Order" ,0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("SHORT order opened : " ,OrderOpenPrice());
}
if(OrdersTotal()==0) //一次一个订单
if(e1over2 && e2over3) //这可能会很乱,因为旧版本对所有变量都是==1
{
if(e1over2 && e2over3) //买入功能
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point," ,0,0,Green); //12345是干什么的?我添加了ASk-30*Point作为止损
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY order opened : " ,OrderOpenPrice());
}
else Print("Error opening BUY order :",GetLastError());
return(0);
}
return(0);
} //这是与上面显示的括号相匹配的<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 见上文
return(0);
}
}
买入订单受制于卖出标准,你有注意到的条件-if的安排方式。
这就是代码,伙计们!
之所以没有做多单,是因为你没有用大括号关闭执行空单的代码块。这意味着从本质上讲,只有在(e1under2 && e2under3)和(e1over2 && e2over3) 的情况下你才会执行多头订单, 我想这是不会发生的。
你说你希望打开一个订单,即使在另一个方向上已经有一个订单打开。由此我推测,你想把每个方向的订单数量 限制在最多一个。通过检查OrdersTotal()是否等于0,这就有效地限制了你的订单总数,而不是每个方向上的一个。你需要做的是使用循环和计数器检查现有订单的数量和类型(本网站有大量的例子),然后使用结果来决定是否应该下单。
我注意到在你的另一个帖子中,你提到你想学习写MQL,所以我不打算为你写这个。这个例子正是简单的代码和逻辑,在学习过程中是必不可少的。
请你自己做这个,并让我知道你的进展情况。
嘿,伙计们,你们都是传奇人物!!!。
谢谢你们的意见,FXTrader2008和cloudbreaker。我没有注意到买入有一个重复的条件,我把它删掉了,关于括号不关闭的问题,这很有意义。不给我编码的答案是个好主意,因为我确实想自己学习代码。我在网上查了一下循环/计数器。
哦,代码之所以这么好,这么紧凑,是因为我的一个朋友帮我把它放在一起(他是一个程序员)。
我将继续进行我这边的工作,如果我被卡住了,我会让你知道!
你们是独立进行实盘交易还是为metaquotes工作?
我没有深入研究你的代码,但有一点建议。
试着把你的代码结构写得更清楚一些--我们这样做不是为了好玩,而是为了更好地阅读和理解它对代码的 "意义 "或含义没有影响......
让我们来看看,你的代码应该是什么样子的(只有基本部分)。
if(OrdersTotal()==0) // one order at the time
{
// Short Entry
static int ticket;
if( e1under2 && e2under3) // short function
{
ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);
if( ticket>0)
{
if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
}
if(OrdersTotal()==0) // one order at the time
if( e1over2 && e2over3) //this may be messy cos old version had ==1 for all variables
{
if( e1over2 && e2over3) //buy function
ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green); //What's 12345 for? I ADDED ASk-30*Point for stop loss
if( ticket>0)
{
if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
return(0);
}
return(0);
}
正如你现在所看到的。你只测试你的 "短 "条件
// Short Entry
static int ticket;
if( e1under2 && e2under3) // short function
而在这里面你测试 "长 "的条件,两次--为了安全; ) - 这是不可能的。
if( e1over2 && e2over3) //this may be messy cos old version had ==1 for all variables
{
if( e1over2 && e2over3) //buy function
更好。(但离完美还很远)
if(OrdersTotal()==0) // one order at the time
{
// Short Entry
static int ticket;
if ( e1under2 && e2under3) // short function
{
ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);
if ( ticket>0)
{
if (OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
} }
if( e1over2 && e2over3) //buy function {
ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green); //What's 12345 for? I ADDED ASk-30*Point for stop loss
if ( ticket>0)
{
if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
}
return(0);
}
现在它应该可以用于短线和长线交易。
我强烈建议阅读这本关于MQL4的书--特别是创建一个正常程序 的部分--它写得非常好,你可以很容易地实现你的策略。我也是这样开始的...
如果你下载了那里的文件,对注释有问题(因为它们是西里尔文),打开 "word",把每个文件的源代码从互联网页面(因为那里的注释是英文)复制和粘贴到word,最后从word复制和粘贴到Metaeditor。从现在开始,你可以用英语学习这些程序。
我希望我可以帮助你...
(顺便说一下。我对MQL4也很陌生,但我是一名程序员,所以语法和结构对我来说不是问题......)
问候TuRRiCAN
你们是独立进行实盘交易还是为metaquotes工作?
回答你的问题,我通常作为直升机飞行员工作。然而,鉴于经济形势,我工作的公司目前不想飞。所以,在这期间,我一直在为我最好的朋友拥有的公司开发EA。我们正在代表一些相当知名的基金进行现场交易。
我很高兴你正在努力学习编码,只要我有能力,就会帮助你。发现有人加入论坛并想学习自给自足,我感到很新鲜。
嘿,伙计们,谢谢你们对我的代码的帮助,现在是伦敦的凌晨2点11分,我一直试图解开这个mql之谜,已经有一段时间了。顺便说一下,CodesGuru感谢你的教程,它们比提供的标准东西更清晰,不错的努力
我是一个寻求编码策略的新手,在这方面总是需要专家的帮助。
以下是我编写的代码,但由于某些原因,它只执行短线交易。
我被卡住了,不知道为什么。此外,我还需要把这个加进去。 1.代码必须同时执行多头和空头交易,无论是否已经有一个相反方向的交易(例如:如果有一个多头交易正在进行,如果条件得到满足,代码仍然应该进入一个空头头寸)。我想我需要玩一玩'OrdersTotal()==0;函数,但我不知道该怎么做。
请帮助。代码在附件中。(我试着把它附在上面,但由于某些原因,它不能附在上面,知道发生了什么吗?)
我保证,谁能帮助我把这段代码变成现实,我就给谁一瓶上好的香槟酒:-)
ps:我在MT4模拟器/策略测试器中测试了这个。
期待着你们的帮助!
Nick