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中运行更多的策略....。