Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1599

 
Nerd Trader:
Warum gibt isCrossing() nicht 2 zurück? Die Funktion isCrossing() selbst hat einen zweiten if-Eintrag, aber dann gibt es keinen if-Eintrag in OnTick(), wenn isCrossing() == 2 ist. Was für ein Blödsinn...

Beide Bedingungen treffen zu... so erhalten Sie das erste Ergebnis

 
MakarFX:

Beide Bedingungen treffen zu... so erhalten Sie das erste Ergebnis

Passt nur, wenn Bid == ma. Ich habe <= in < geändert (auch für >=), aber es ändert sich nichts.
 
Nerd Trader:
Warum gibt isCrossing() nicht 2 zurück? Die Funktion isCrossing() selbst hat einen zweiten if-Eintrag, aber dann gibt es keinen if-Eintrag in OnTick(), wenn isCrossing() == 2 ist. Was für ein Blödsinn...

Aus irgendeinem Grund glaube ich auch nicht, dass es 1 zurückgibt.

Diese Bedingung

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

Zeigt an, dass eine neue Bar eröffnet wurde. Beim ersten Tick des Balkens ist Open == High == Low == Close und == Bid - daher die Bedingung

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

oder

 && low < ma && Bid >= ma)
nicht erfüllt werden kann...

Heute wurde eine Frage zur Bedingung if(i != i) gestellt. Diese Bedingungen sind ungefähr gleich.

 
OnTick() wie es jetzt in meinem Editor steht:
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();
    }

   
  }
Wenn der erste Block auskommentiert wird, wird der zweite Block ausgeführt. Ich weiß nicht, wo der Fehler liegt.

P.S.
mit der Funktion isCrossing() hat alles so gelassen, wie es ist.
 
Alexey Viktorov:

Aus irgendeinem Grund glaube ich auch nicht, dass es 1 zurückgibt.

Diese Bedingung

erzählt von der Eröffnung einer neuen Bar. Am ersten Tick des Balkens ist Open == High == Low == Close und == Bid - daher die Bedingung

oder

nicht erfüllt werden kann...

Heute wurde eine Frage zur Bedingung if(i != i) gestellt. Diese Bedingungen sind in etwa gleich.

"1" zurückgibt, hat Code-Debugging in MetaEditor durchgeführt.

Und selbst wenn alles gleich ist, gilt dies nur für den ersten Tick.

 
Nerd Trader:

"1" zurückgibt, hat Code-Debugging in MetaEditor durchgeführt.

Und selbst wenn alles gleich ist, gilt dies nur für den ersten Tick.

Nun, ja, ich habe mich geirrt. Der neue Balken wird erst dann angezeigt, wenn die gesamte Bedingung erfüllt ist.

Versuchen Sie, hoch und niedrig durch offen zu ersetzen. Vielleicht wird es die Strategie nicht allzu sehr beeinträchtigen.

 
Nerd Trader:

"1" zurückgibt, hat Code-Debugging in MetaEditor durchgeführt.

Und selbst wenn alles gleich ist, gilt dies nur für den ersten Tick.

Das funktioniert folgendermaßen

//--- 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:

Es funktioniert folgendermaßen.


Ich habe dies getan und es hat funktioniert, nur die Meldungen von isCrossing() werden dupliziert, weil die Funktion zweimal beim gleichen Tick aufgerufen wird.

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;
  }


Also habe ich es so gelassen, wie es war, nur dass jetzt alles von isCrossing() an die Variable zurückgegeben wird. Nichts wird dupliziert und alles funktioniert. Vielen Dank an alle :)

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)'
Ich sehe jetzt, dass Sie ein Protokoll hinzugefügt haben. Auch hier haben Sie doppelte Nachrichten :)
 

Können Sie bitte den Unterschied zwischen den Funktionen erklären?

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

{

if(OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))

и

int i=AuftragshistorieGesamt();

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

{

if(OrderSelect(pos, SELECT_BY_POS,MODE_HISTORY))

Grund der Beschwerde: