如何找到移动平均线交叉的条形图的时间?(里面的代码)

 

大家好!

我希望在我的代码上得到一些帮助--目前卡在这个该死的部分!


以下是我试图写进代码的过程。

1)如果所有的移动平均线都是 "扇形 "的,并且交叉在一起,这样价格就在所有的移动平均线之上,并且它们表明有做多的潜力。

2)然后我想知道在移动平均线交叉时,移动平均线被 "扇开 "的确切条形(使用时间)。

3) 如果1和2是真实的,我就等待任何一个条形回落(在多头头寸的情况下)并触及21 EMA。

4) 从第一个条形图(MA交叉和扇形)到现在触及21 EMA的条形图--我想要一个挂单 或在市场交易中置于这个范围(1和3)的高点之上。

5) 如果在触发订单之前,价格在任何时候收于60 EMA之下 - 那么订单将被取消。

这显然不是所有的代码,但这是让我头疼的主要部分。请用"<<<<<<<<<<<<<"检查代码。这些是我感到困惑的地方。

我真的需要别人的帮助--这将是非常感激的

请先谢谢我。

datetime          triggerBarTime;   <<<<< Global settings.
datetime          triggerBarTime1;  <<<<< Global settings.	



void CheckForMaTrade()
{

//+-----------------------------------------------------------------------------------------------------------------------+ 
    //Small and Big Fish on the H1 Time Frame.                                                                           |
//+-----------------------------------------------------------------------------------------------------------------------+              

   {
   double PreviousSmallFish1  =  iMA(NULL,60,3,0,1,0,2); 
   double CurrentSmallFish1   =  iMA(NULL,60,3,0,1,0,1);
   double PreviousSmallFish2  =  iMA(NULL,60,5,0,1,0,2);
   double CurrentSmallFish2   =  iMA(NULL,60,5,0,1,0,1);
   double PreviousSmallFish3  =  iMA(NULL,60,8,0,1,0,2);
   double CurrentSmallFish3   =  iMA(NULL,60,8,0,1,0,1);
   double PreviousSmallFish4  =  iMA(NULL,60,10,0,1,0,2);
   double CurrentSmallFish4   =  iMA(NULL,60,10,0,1,0,1);  
   double PreviousSmallFish5  =  iMA(NULL,60,12,0,1,0,2);
   double CurrentSmallFish5   =  iMA(NULL,60,12,0,1,0,1);
   double PreviousSmallFish6  =  iMA(NULL,60,15,0,1,0,2);
   double CurrentSmallFish6   =  iMA(NULL,60,15,0,1,0,1);  
   
      double PreviousBigFish1  =  iMA(NULL,60,30,0,1,0,2); 
      double CurrentBigFish1   =  iMA(NULL,60,30,0,1,0,1);
      double PreviousBigFish2  =  iMA(NULL,60,35,0,1,0,2);
      double CurrentBigFish2   =  iMA(NULL,60,35,0,1,0,1);
      double PreviousBigFish3  =  iMA(NULL,60,40,0,1,0,2);
      double CurrentBigFish3   =  iMA(NULL,60,40,0,1,0,1);
      double PreviousBigFish4  =  iMA(NULL,60,45,0,1,0,2);
      double CurrentBigFish4   =  iMA(NULL,60,45,0,1,0,1);
      double PreviousBigFish5  =  iMA(NULL,60,50,0,1,0,2);
      double CurrentBigFish5   =  iMA(NULL,60,50,0,1,0,1);
      double PreviousBigFish6  =  iMA(NULL,60,60,0,1,0,2);
      double CurrentBigFish6   =  iMA(NULL,60,60,0,1,0,1); 
      
            if(PreviousBigFish1<CurrentBigFish2 && CurrentBigFish1>PreviousBigFish2)
               if(PreviousBigFish2<CurrentBigFish3 && CurrentBigFish2>PreviousBigFish3)
                  if(PreviousBigFish3<CurrentBigFish4 && CurrentBigFish3>PreviousBigFish4)
                     if(PreviousBigFish4<CurrentBigFish5 && CurrentBigFish4>PreviousBigFish5)
                        if(PreviousBigFish5<CurrentBigFish6 && CurrentBigFish5>PreviousBigFish6)  
                           
                           if(PreviousSmallFish1<CurrentSmallFish2 && CurrentSmallFish1>PreviousSmallFish2)
                        if(PreviousSmallFish2<CurrentSmallFish3 && CurrentSmallFish2>PreviousSmallFish3)
                     if(PreviousSmallFish3<CurrentSmallFish4 && CurrentSmallFish3>PreviousSmallFish4)
                  if(PreviousSmallFish4<CurrentSmallFish5 && CurrentSmallFish4>PreviousSmallFish5)
                if(PreviousSmallFish5<CurrentSmallFish6 && CurrentSmallFish5>PreviousSmallFish6)triggerBarTime = Time[1];  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      
      
      double ema21 = iMA(NULL,60,21,0,1,0,1); 
       
        
         if (Low[1]<ema21)
         {
         
           OrderEntry(0); // BUY 
            }     
      
      
                
     if(PreviousBigFish1>CurrentBigFish2 && CurrentBigFish1<PreviousBigFish2)
      if(PreviousBigFish2>CurrentBigFish3 && CurrentBigFish2<PreviousBigFish3)
         if(PreviousBigFish3>CurrentBigFish4 && CurrentBigFish3<PreviousBigFish4)
            if(PreviousBigFish4>CurrentBigFish5 && CurrentBigFish4<PreviousBigFish5)
               if(PreviousBigFish5>CurrentBigFish6 && CurrentBigFish5<PreviousBigFish6)
               
               if(PreviousSmallFish1>CurrentSmallFish2 && CurrentSmallFish1<PreviousSmallFish2)
            if(PreviousSmallFish2>CurrentSmallFish3 && CurrentSmallFish2<PreviousSmallFish3)
         if(PreviousSmallFish3>CurrentSmallFish4 && CurrentSmallFish3<PreviousSmallFish4)
       if(PreviousSmallFish4>CurrentSmallFish5 && CurrentSmallFish4<PreviousSmallFish5)
     if(PreviousSmallFish5>CurrentSmallFish6 && CurrentSmallFish5<PreviousSmallFish6)triggerBarTime = Time[1]; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
    double ema21_2 = iMA(NULL,60,21,0,1,0,1); 
  
            if(High[1]>ema21_2)
            {
             
              OrderEntry(1); // SELL
             }  
   
       }

}


//+------------------------------------------------------------------+  
//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry (int direction)
{    
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent*0.01;
   int buyStopCandle = iLowest(NULL,0,1,CandlesBack,1); 
   int sellStopCandle = iHighest(NULL,0,2,CandlesBack,1);
   
   double buyPrice = iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
   double sellPrice = iLowest(Symbol(), 0, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
   double buy_stop_price = iMA(NULL,60,60,0,1,0,1)-PadAmount*pips; 
   double pips_to_bsl = Ask-buy_stop_price;         //double pips_to_bsl = Ask-buy_stop_price;   --- Old code
   double buy_takeprofit_price = Ask+pips_to_bsl*RewardRatio;   
   double sell_stop_price = iMA(NULL,60,60,0,1,0,1)+PadAmount*pips; //- Greyed out, this is an old code line.
   double pips_to_ssl = sell_stop_price-Bid;     ////double pips_to_ssl = sell_stop_price-Bid;   --- Old code
   double sell_takeprofit_price = Bid-pips_to_ssl*RewardRatio;   
   
  
   if (direction==0)//<< "0" pushes out a Buy direction
   {
      //double buyPrice = iHighest(Symbol(), 60, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);//-PadAmount*pips; // new line
      int Buy_Price = buyPrice;
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      //LotSize = (100/(0.00500/0.00010))/10
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10;
      if(OpenOrdersThisPair(Symbol())==0) //--- This means that it will not open a new order if there is one already open!If greyed out, it will take everything.
      int buyticket = OrderSend(Symbol(),Buy_Price,LotSize,Ask,3,0,0,NULL,MagicNumber,0,Green); //ask
      if(buyticket>0)OrderModify(buyticket,OrderOpenPrice(),bsl,btp,0,CLR_NONE);
   }
            
   if (direction==1) //<< "1" pushes out a Sell direction
   {
      
      //double sellPrice = iLowest(Symbol(), 60, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);//+PadAmount*pips;   // new line.
      int Sell_Price = sellPrice;
      
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price; 
      //LotSize = (100/(0.00500/0.00010))/10;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)  //--- This means that it will not open a new order if there is one already open! If greyed out, it will take everything.
      int sellticket = OrderSend(Symbol(),Sell_Price,LotSize,Bid,3,ssl,stp,NULL,MagicNumber,0,Red); //bid
      if(sellticket>0)OrderModify(sellticket,OrderOpenPrice(),ssl,stp,0,CLR_NONE);
   }
   
}

return(0);

 
DomGilberto:

大家好!

这显然不是所有的代码,但这是我正在揪心的主要部分。请检查代码中的"<<<<<<<<<<<<<"。这些是我感到困惑的地方。

请阅读你所使用的函数的文档 ......iHighest() 并不返回价格 ......它返回一个int"返回最大值在特定时期的转移,取决于类型。"
 

谢谢RaptorUK--以最友好的方式,这并不能向我解释什么?用通俗的语言?

在这个论坛上,除了重复功能 的定义(我已经从 "帮助 "部分阅读了100多次......)之外,是否有人能够真正帮助我?

毕竟,我不觉得我所问的问题(与这里的一些主题相比!)足以让人对他们的时间收费......?

 

翻译成通俗易懂的术语会帮助你......一次,今天,在这个特定的问题上......并为解释者花费一定的时间。

如果你说出你不理解的定义,也许下一次你可以解决你自己的问题,一段时间后,你可以成为解决其他人问题的人之一。

如果你尝试自己调查问题,你也会学到更多。例如,试试这个。

Alert(iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0));

你会看到函数 返回的是什么值...(就像Raptor说的,这不是一个价格)......而且你可能会更容易理解这个函数的定义。

像这样的事情对你的帮助比希望董事会的人有时间测试你的代码并做同样的故障排除要大得多,你应该自己学习如何做。

 

嗯?我很困惑--我要求的帮助是不是太多?

毕竟,我已经从头开始建立了我的整个EA(这是我自学的......),只是想从比我有更多知识的人那里得到一些指导......:s

 

"像这样的事情对你的帮助比希望董事会的某个人有时间测试你的代码并做同样的故障排除更多,你应该自己学习如何做。"

什么是地狱...我没有想到任何人会这么说!?

你的帖子让我们对情况有了更多的了解--感谢你。

这个论坛真的很有趣...我并不打算从任何人那里免费获得信息!我只是想弄清楚我如何正确识别与EMA交叉的柱子......。

Jeez....

 

当我读到Raptor的答案时,它告诉你你所做的确切问题。

价格被存储为 变量,例如1.12345。

iHighest函数 返回一个整数(int),例如1或2或-100 ....,显然不是一个价格。

我不知道你想达到什么目的,但iHighest函数可能不是你想使用的。

如果在元编辑器中,你点击代码中的iHighest,然后按F1键,你会发现它返回的是一个整数(Raptor也告诉你了),你就会自己发现这一点了

我不知道你的困惑的来源。如果你不知道int变量和double变量的区别,你就缺少一些重要的基本知识,也就是说,你是想在走之前跑,而你想让别人来背你 :/

EDIT:你没有想到,在问别人之前,你必须自己做故障排除吗!?

 

多条移动平均线不会 在同一时间交叉

你为什么要重复发帖?你的问题之前 已经回答 过了。

找出最早的那条,它们都是按正确顺序排列的。

int DIR = 0;
for(int iBar = 0; iBar < Bar; iBar++){
   double MA20 = ... iBar), 
           MA5 = ... iBar);
          :
   if(     MA20 > MA5 && MA5 > ...) DIR = -1;
   else if(MA20 < MA5 && MA5 < ...) DIR = +1; // All fanning up.
   else if (DIR != 0){ iBar--; break; }       // Last one was cross.
}
 

我明白int和double的区别......

在If语句为真后,我想找到在MAs间隔的点上交叉的那根棒。我想如果我使用

"triggerBarTime = Time[1];" - 在 "If "语句之后,那么 triggerBarTime 可以与 iBarShift 一起使用,以锁定我感兴趣的范围内的第一条杠?

然后,使用iHighest,我就可以把这个信息转换成一个int,并在我的订单函数 中使用它? (Buy_Price)?

 

你可能明白int和double的区别,但你不明白bar number(int)和price(double)的区别。

iHighest允许你将日期时间转换为条数(int),但OrderSend只接受价格(双数),所以在9点开单是没有意义的。

 

啊,找到了。

非常感谢你 :)我真的很感激!

谢谢你对我的耐心--我并不是想以一种期望别人为我做什么的方式出现;只是给我一些帮助的说明(按F1键的一切对我来说并不总是那么清楚。