ONLY CANDLE / BAR - 如何对Candle进行分类或隔离?- 请纠正我! - 页 2

 
Wodzuuu:

对于那些 仍然不 理解我的 EA 的人 一个 故事。D 嘿嘿


该事件 蜡烛-- 具有 各种 买卖 或关闭选项

我看你的代码比看你写的东西更明白......;-)
 

与其把看电视节目作为你的第二个功能,你应该考虑阅读和理解这本书。)

你想实现的目标是直截了当的,在许多策略中都有使用,但你的代码--和你的故事--是混乱的,部分是错误的--至少代码....,不知道故事是什么。

//Pseudo code

if(NewBar) ResetSignals();                //Set all SignalxExecuted to false
if(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
  SignalBuy1Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}

if(SignalBuy2&&!SignalBuy2Executed&&OpenOrders()==2){
//do open buy position
  SignalBuy2Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}

SignalBuy1=CheckForOpenBull42();          //Check for Signal1 condition is true
SignalBuy2=CheckForOpenBull62();	  //Check for Signal2 condition is true	

if(OpenOrders()>0)CheckForClose();        //Check any order needs to be closed


//and so on.....

你为什么不尝试暂时只实现一个信号,而专注于所需功能的编码?如果你对一个信号有很好的编码,那么实现其他信号可能就很容易了,而且很多功能已经存在了。

以后你可以使用Arrays和其他函数来简化它,但简化你上面的代码不应该是你目前最大的问题。

 

Kronin 是的! 你明白我的意思 :), 一个 EA 里有 很多策略
我必须 150个 策略, 它们 必须 同时同一个图形上 行走,并 同时运行 所有的策略 。 当我 同时运行150个EA时 ,我的 电脑 爆炸 -- 我想是这样

之后就 没有意义了 ,因为你 只能有一个 策略 EA ,而 里面已经有 很多 策略了。

当然, 策略 不能 相互干扰 ,当运行一个策略时,第二个策略也可以运行,我可以同时运行策略1、3和5,以及策略(1、3、5)。

我不会 任何 故事:)


我的 代码是 错误的-- 这是众所周知的,我试图 两个策略 放在一个单一的 EA 代码运行 良好 ,但 整体 运行 畅。

你的代码非常 有趣, 我会 研究 ,请 给我 一些时间

 

,朋友们, 经过长时间的 代码 工作 通过 Kronin 信息代码结构和 操作
代码 一个EA 提出了 两个策略


1.对于小 蜡烛购买 情况蓝色箭头 标记 两个选项为 买入
2.对于平均 蜡烛 ,购买情况蜡烛红色箭头 标记 三个选项为买入


有一个 情况 ,1 = 1点 ,很方便 解决 这个问题是 为了以后)。
使用 选项 if (NewBar) ResetSignals () 因为我认为 它们不是 错误原因

如果你删除了 start() 中的 函数 PART2蓝色一个策略 就会工作,而且 工作正常
如果你运行代码 PART1 PART2 包含 两个 启动 策略, 但他们会 重叠。 这是错误的

你能不能一下 克罗尼

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#define MAGICMA  20050610

//+------------------------------------------------------------------+
//| Check NEW BAR     WORK AT BARS  M15                                 |
//+------------------------------------------------------------------+
/*

bool New_Bar = false;

bool Fun_New_Bar()                

   {                                
   static datetime New_Time=0;      
   New_Bar=false;                   
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      New_Bar=true;                    
      }
   }
*/

//+------------------------------------------------------------------+
//| Calculate open positions    HOW MEANY OF THIS                    |
//+------------------------------------------------------------------+

int OpenOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
//---- return orders volume
   return(buys);
  }

//+------------------------------------------------------------------+
//| Calculate candle      These is condidion                         |
//+------------------------------------------------------------------+

// scenario 1 / EA 1  /  startegy 1 / blue

bool BULL4()
   {
   if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
   return(true);
   } 

// scenario 2 / EA 2  /  startegy 2 / red

bool BULL6()
   {
   if(Close[1]-Open[1]>=6*Point && Close[1]-Open[1]<=7*Point)
   return(true);
   }
      
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+

// Check for open for scenario 1 / EA 1  /  startegy 1 
 
bool OpenBULL41()
  {
   int    res;
   if(Bid==Close[1]+3*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return (true);
     }
   return (false);  
  }
  
//----------------------------------- 
bool OpenBULL42()
  {
   int    res;
   if(Ask>OrderOpenPrice()+4*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return;
     }
  }  
  
// Check for open for scenario 2 / EA 2  /  startegy 2
  
void OpenBULL61()
  {
   int    res;
   if(Bid==Close[1]+4*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
//-----------------------------------  
 
void OpenBULL62()
  {
   int    res;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.62,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
  
//----------------------------------- 
void OpenBULL63()
  {
   int    res;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.63,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+

void CheckForClose()
{
   RefreshRates();
   if(OrderOpenPrice()+4*Point< Ask)
   for (int i = OrdersTotal()-1; i >= 0;i--)       // I Have do -1 in "OrdersTotal()-1"
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);

      }
   }
} 
/*
void CheckForClose2()
{
   RefreshRates();
   if(OrderOpenPrice()+6*Point< Ask)
   for (int i = OrdersTotal(); i >= 0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);

      }
   }
} 
*/
                                       
//+------------------------------------------------------------------+
//| Start function                                 |
//+------------------------------------------------------------------+
void start()
  {
      
//------------------                                                          PART1      
           bool SignalBULL41Executed=false;
            if(BULL4() && !SignalBULL41Executed && OpenOrders(Symbol())==0)
               {
               OpenBULL41();//do open buy position
               SignalBULL41Executed=true;
               }
               
            bool SignalBULL42Executed=false;
            if(!SignalBULL42Executed && OpenOrders(Symbol())==1)
               {
               OpenBULL42();//do open buy position
               SignalBULL42Executed=true;
               }  
               
            if(OpenOrders(Symbol())>0)CheckForClose();  
            
//------------------                                                          PART 2
            
            bool SignalBULL61Executed=false;
            if(BULL6() && !SignalBULL61Executed && OpenOrders(Symbol())==0)
               {
               OpenBULL61();//do open buy position
               SignalBULL61Executed=true;
               }
               
            bool SignalBULL62Executed=false;
            if(!SignalBULL62Executed && OpenOrders(Symbol())==1)
               {
               OpenBULL62();//do open buy position
               SignalBULL62Executed=true;
               }  
               
           bool SignalBULL63Executed=false;
            if(!SignalBULL63Executed && OpenOrders(Symbol())==2)
               {
               OpenBULL63();//do open buy position
               SignalBULL63Executed=true;
               }                
               
//            if(SignalBULL61Executed && OpenOrders(Symbol())>0)CheckForClose2();                    
            
  }
//+------------------------------------------------------------------+
 
Wodzuuu:

不要 使用 选项 if (NewBar) ResetSignals () ,因为我认为 它们不是 导致 错误原因

函数 Fun_NewBar()的编码方式不允许你这样做 . . . 你需要这样做,以便它是bool 类型,并返回一个bool 值 . . .

bool Fun_New_Bar()                
   {                                
   static datetime New_Time=0;      
                     
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      return(true);       // <---- we have a new bar so the function returns true
      }

   return(false);
   }
 

是的, 你是对的返回的bool ,还有 int(已经修复我以前没有看到。谢谢你
这个函数 不使用,它作为一个 文本

我不认为 适用 我的两个 重叠的 战略 分开功能 我没有看到 这种关系。 或者是 我错了

//Pseudo code

if(NewBar) ResetSignals();                //Set all SignalxExecuted to false
if(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
  SignalBuy1Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}
 

很高兴看到你取得了一些进展,但仍有很长的路要走 :-)

你需要解决RaptorUK上面所说的问题。重置信号很重要,否则EA很快就会停止新的交易。
你的实现是错误的。如果你每次都 重置SignalExecuted,那就没有意义了。也许它不会打开更多的交易,因为你也过滤了OpenOrders。但是,由于你的策略允许有多个订单打开,我可以想象你也想要一个算法来关闭订单,所以你需要在一个新的条形图上重置SignalExecuted标志(在你的实现中,它是无用的,你不需要它)。

如果我理解正确的话,如果BULL6也是真的,你就不会执行BULL4。或者换句话说,只有蓝色策略,如果红色策略无效,或者只有小蜡烛,如果平均蜡烛无效。

if(BULL4()&&!BULL6(){             // <--- only strategy BULL4 is valid, we are looking at a 'small' bar.
  if(!SignalBULL41Executed && OpenOrders(Symbol())==0){
    OpenBULL41();//do open buy position
    SignalBULL41Executed=true;
  }
  if(!SignalBULL42Executed && OpenOrders(Symbol())==1){
    OpenBULL42();//do open buy position
    SignalBULL42Executed=true;
}
 

接下来的步骤。

// Check for open for scenario 1 / EA 1  /  startegy 1 
 
bool OpenBULL41()
  {
   int    res;
   if(Bid==Close[1]+3*Point)  					                       // <--- equal makes no sense here and you should not compare doubles for equality. 
                                                                                                  Read (again): https://www.mql5.com/en/forum/136997 
     {
      res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue); // <--- what is your plan with res? You are aware, it does include the ticket 
                                                                                                  number or -1, aren't you?

      return (true);                                                                   // <--- Even if OrderSend() fails you return true.
     }
   return (false);  
  }
  
//----------------------------------- 
bool OpenBULL42()
  {
   int    res;
   if(Ask>OrderOpenPrice()+4*Point) 							// <--- OrderOpenPrice() from a somewhere selected order may or may not work here 
                                                                                                  (may because only one order is open), but it is not nice coded. 
     {
      res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return;
     }
  }  

CheckForClose()函数也有同样的问题,而且没有魔法数字的过滤器。 另外,从买入数的订单中选择OrderOpenPrice()可能会导致关闭错误的订单(我不确定它是否真的有效)。
请再次阅读Raptor在本主题第一页写的内容。

从你的帖子和代码中的评论,我感觉你想知道哪个订单属于哪个策略。为了达到这个目的,你可以为第二个策略定义一个神奇的数字,这样就可以更容易地根据开仓的策略来关闭订单。

 
kronin:

接下来的步骤。

从你的帖子和代码中的评论,我感觉你想知道哪个订单属于哪个策略。为了达到这个目的,你可以为第二个策略定义一个神奇的数字,这样就可以根据订单打开的策略更容易地关闭订单。

在两个独立的EA中运行两个不同的策略,每个都在它自己的图表上,这不是更简单吗?
 
RaptorUK:
在两个独立的EA中运行两个不同的策略,每个都在它自己的图表上,这不是更简单吗?

是的,对于2、3、4、5...同意。但是,根据这些故事和这个故事:"我必须 150个 策略, 它们 必须 同时 在同一个图表上 运行,并 同时运行 所有的策略 。当我 同时运行150个EA时 ,我的 电脑 爆炸 -- 我想 是的"
我认为他计划在一个EA中运行更多的策略....。