新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1599

 
Nerd Trader:
为什么isCrossing()不返回2 呢?isCrossing() 本身有第二个if 条目,但是当isCrossing()==2 时,OnTick( ) 中没有if 条目。真是一派胡言......。

两个条件都符合......所以你得到第一个结果

 
MakarFX:

两个条件都符合......所以你得到第一个结果

只有在Bid == ma时才适合。将<= 固定为<(也用于>=),但没有任何变化。
 
Nerd Trader:
为什么isCrossing()不返回2 呢?isCrossing() 本身有第二个if 条目,但是当isCrossing()==2 时,OnTick( ) 中没有if 条目。真是一派胡言......。

由于某些原因,我认为它也不会返回1。

这种情况

if(g_barTime < iTime(NULL,g_timeFrame,0)// и дальше

告诉人们一个新的酒吧已经被打开。在条形图的第一个刻度上,开盘==高点==低点==收盘和==出价--因此,条件是

 && high > ma && Bid <= ma)

 && low < ma && Bid >= ma)
无法实现...

今天有一个关于条件if(i != i)的问题,这些条件大致相同。

 
在我的编辑器中,OnTick()现在是这样的:
void OnTick()
  {
/*     if(isCrossing() == 1){          
      Print("enter to '1. if (isCrossing)'");
        if(shouldBars(1))         
          Print("angulation is ", shouldAngulation(1));            
    } */

    if(isCrossing() == 2){
      Print("enter to '2. if (isCrossing)'");
      if(shouldBars(2))
        Print("angulation is ", shouldAngulation(2));
        //if(shouldAngulation(2))
          //OpenSell();
    }

   
  }
如果第一个块被注释掉,第二个块就会被执行。我不知道错误在哪里。

P.S.
,用isCrossing() 函数把所有东西都保持原样。
 
Alexey Viktorov:

由于某些原因,我认为它也不会返回1。

这种情况

讲述了一个新酒吧的开业。在条形图的第一个刻度上,开盘==高点==低点==收盘和==出价--因此,条件是

无法实现...

今天有一个关于条件if(i != i)的问题,这些条件是差不多的。

"1 "返回,在MetaEditor中做了代码调试。

此外,即使所有的东西都是平等的,它也只是在第一个刻度上。

 
Nerd Trader:

"1 "返回,在MetaEditor中做了代码调试。

此外,即使所有的东西都是平等的,它也只是在第一个刻度上。

嗯,是的,我错了。只有在整个条件得到满足后,才会有新酒吧

尝试用开放来代替高和低。也许这不会对战略产生太大影响。

 
Nerd Trader:

"1 "返回,在MetaEditor中做了代码调试。

此外,即使一切平等,也只是在第一个刻度上。

它的工作原理是这样的

//--- input parameters
input int                  g_maPeriod  = 14;
input int                  g_maShift   = 1;
input ENUM_APPLIED_PRICE   g_maPrice   = PRICE_CLOSE;  //Applied price
input ENUM_MA_METHOD       g_maMethod  = MODE_SMA;    //Method Ma
input ENUM_TIMEFRAMES      g_timeFrame = PERIOD_CURRENT;   //Timeframe for calculate
datetime g_barTime=0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(g_barTime != iTime(NULL,g_timeFrame,0))
     {
      if(isCrossing()==1)
        {
         Print("enter to '1. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
        }
      if(isCrossing()==2)
        {
         Print("enter to '2. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
        }
     }
  }
//+------------------------------------------------------------------+
int isCrossing()
  {  
   int res=0;
   double low = iLow(Symbol(), g_timeFrame, 1);
   double high = iHigh(Symbol(), g_timeFrame, 1);
   double ma = iMA(_Symbol, g_timeFrame, g_maPeriod, g_maShift, g_maMethod, g_maPrice, 0);

   if(high > ma && Bid <= ma) res=1;
  
   if(low < ma && Bid >= ma) res=2;
   return (res);
  }
//+------------------------------------------------------------------+
2021.08.25 09:24:56.629 2021.08.20 23:50:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.624 2021.08.20 23:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.592 2021.08.20 21:35:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.582 2021.08.20 21:05:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.566 2021.08.20 20:20:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.554 2021.08.20 18:50:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:40:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
 
MakarFX:

它的工作原理是这样的。


我这样做了,一切正常,只有来自isCrossing()的信息是重复的,因为一个tick的f-e被调用两次。

void OnTick()
  {
   if(BarTime != iTime(NULL,0,0)){

     if(isCrossing == 1){
       ...
     }

     if(isCrossing == 2){
       ...
     }
     BarTime = iTime(NULL,0,0); 
  }

int isCrossing()
  {  
    ...

    if(high > ma && Bid <= ma){
      Print("Crossing down");
      return 1;
    } 
  
    if(low < ma && Bid >= ma){
      Print("Crossing up");
      return 2;
    }
   return 0;
  }


所以我把它保持原样,只是现在isCrossing()的所有内容都返回到变量。没有任何东西是重复的,所有东西都能正常工作。谢谢大家 :)

void OnTick()
  {
    int iCrossing = isCrossing();

    if(iCrossing == 1){
       ...
    }

    if(iCrossing == 2){
       ...
    }   
  }
 
MakarFX:
2021.08.25 09:24:56.629 2021.08.20 23:50:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.624 2021.08.20 23:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.592 2021.08.20 21:35:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.582 2021.08.20 21:05:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.566 2021.08.20 20:20:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.554 2021.08.20 18:50:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:40:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
现在看到你已经添加了一个日志。这里你也有重复的信息 :)
 

你能解释一下这些功能之间的区别吗?

for (int j = OrdersHistoryTotal()-1; j >= 0; j--)

{

如果(OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))

и

int i=OrdersHistoryTotal()。

for(int pos=0; pos<i; pos++)

{

如果(OrderSelect(pos, SELECT_BY_POS,MODE_HISTORY))