Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1599

 
Nerd Trader:
¿Por qué isCrossing() no devuelve 2? La propia isCrossing () tiene una segunda entrada if, pero entonces no hay ninguna entrada if en OnTick() cuando isCrossing() == 2. Qué tontería...

Ambas condiciones encajan... por lo que se obtiene el primer resultado

 
MakarFX:

Ambas condiciones encajan... por lo que se obtiene el primer resultado

Sólo encaja cuando Bid == ma. Corregido <= a < (también para >=), pero nada cambia.
 
Nerd Trader:
¿Por qué isCrossing() no devuelve 2? La propia isCrossing () tiene una segunda entrada if, pero entonces no hay ninguna entrada if en OnTick() cuando isCrossing() == 2. Qué tontería...

Por alguna razón creo que tampoco devuelve el 1.

Esta condición

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

Indica que se ha abierto un nuevo bar. En el primer tic de la barra apertura == alta == baja == cierre y == Oferta - de ahí la condición

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

o

 && low < ma && Bid >= ma)
no se puede cumplir...

Hoy había una pregunta sobre la condición if(i != i) Estas condiciones son aproximadamente las mismas.

 
OnTick() como está ahora en mi editor:
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();
    }

   
  }
Si se comenta el primer bloque, se ejecuta el segundo. No sé dónde está el error.

P.D.
con la función isCrossing() dejó todo como está.
 
Alexey Viktorov:

Por alguna razón creo que tampoco devuelve el 1.

Esta condición

cuenta la apertura de un nuevo bar. En el primer tic de la barra apertura == alta == baja == cierre y == Oferta - por lo tanto, la condición

o

no se puede cumplir...

Hoy había una pregunta sobre la condición if(i != i) Estas condiciones son más o menos las mismas.

"1" devuelve, hizo la depuración de código en MetaEditor.

Además, aunque todo sea igual, sólo es en el primer tic.

 
Nerd Trader:

"1" devuelve, hizo la depuración de código en MetaEditor.

Además, aunque todo sea igual, sólo es en el primer tic.

Pues sí, me equivoqué. La nueva barra será sólo después de que se cumpla toda la condición.

Intenta reemplazar "alto" y "bajo" por "abierto". Quizá no afecte demasiado a la estrategia.

 
Nerd Trader:

"1" devuelve, hizo la depuración de código en MetaEditor.

Además, aunque todo sea igual, sólo lo es en el primer tic.

Funciona así

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

Funciona así.


Hice esto y todo funciona, sólo los mensajes de isCrossing() están duplicados, porque f-i es llamado dos veces para un tick.

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


Así que lo dejé como estaba, sólo que ahora todo lo de isCrossing() se devuelve a la variable. Nada está duplicado y todo funciona. Gracias a todos :)

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)'
He visto que ahora has añadido un registro. Aquí también hay mensajes duplicados :)
 

¿puede explicar la diferencia entre las funciones?

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

{

if(OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))

и

int i=Total de Pedidos();

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

{

if(OrderSelect(pos, SELECT_BY_POS,MODE_HISTORY))