新手的冒险

 

嘿,伙计们,谢谢你们对我的代码的帮助,现在是伦敦的凌晨2点11分,我一直试图解开这个mql之谜,已经有一段时间了。顺便说一下,CodesGuru感谢你的教程,它们比提供的标准东西更清晰,不错的努力


我是一个寻求编码策略的新手,在这方面总是需要专家的帮助。


以下是我编写的代码,但由于某些原因,它只执行短线交易。


我被卡住了,不知道为什么。此外,我还需要把这个加进去。 1.代码必须同时执行多头和空头交易,无论是否已经有一个相反方向的交易(例如:如果有一个多头交易正在进行,如果条件得到满足,代码仍然应该进入一个空头头寸)。我想我需要玩一玩'OrdersTotal()==0;函数,但我不知道该怎么做。


请帮助。代码在附件中。(我试着把它附在上面,但由于某些原因,它不能附在上面,知道发生了什么吗?)


我保证,谁能帮助我把这段代码变成现实,我就给谁一瓶上好的香槟酒:-)


ps:我在MT4模拟器/策略测试器中测试了这个。


期待着你们的帮助!

Nick

 
//+------------------------------------------------------------------+
//|                                     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的安排方式。









 
niko:
这就是代码,伙计们!

之所以没有做多单,是因为你没有用大括号关闭执行空单的代码块。这意味着从本质上讲,只有在(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

 
哎呀,在我需要回答的时间里,其他人已经快了......。
 
TuRRiCAN wrote>>
哎呀,在我需要回答的时间里,其他人已经快了......

嘿,Tourrican,这是非常有帮助的,谢谢你!西里尔文没问题,我是俄罗斯人,实际上来自西伯利亚。

是的,我学习了mql书,但它仍然在实际学习之外,学习它然后尝试自己写一个程序是完全不同的事情(因为他们没有在书的每一部分用实际生活中的例子清楚地解释为什么和如何使用这些东西,你知道。

但是,我会做到的,我内心深处想让它发挥作用的强烈愿望比任何障碍都大。

 
niko:

你们是独立进行实盘交易还是为metaquotes工作?

回答你的问题,我通常作为直升机飞行员工作。然而,鉴于经济形势,我工作的公司目前不想飞。所以,在这期间,我一直在为我最好的朋友拥有的公司开发EA。我们正在代表一些相当知名的基金进行现场交易。

我很高兴你正在努力学习编码,只要我有能力,就会帮助你。发现有人加入论坛并想学习自给自足,我感到很新鲜。