Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 901

 
.roman.:

Se han eliminado los cálculos innecesarios (irrelevantes para el problema). Las impresoras se añadieron al código específicamente para mostrar el problema. A pesar de la comparación del símbolo de la orden con el símbolo en el que el EA está abierto, puede mostrar lo siguiente (desde el gráfico Ozi tomar los datos de la orden en euros, por ejemplo, como en este caso):

                        if(Ask>openPrice)
                           {
                              Print("OrderSymbol ",OrderSymbol()," OrderTicket ",OrderTicket()," OrderOpenPrice ",OrderOpenPrice());
                           }
                     

Esto no puede ser así, es imposible que el Ask del canguro sea mayor que cualquier precio abierto del eurodólar en 2015....

Y todas las comprobaciones de la orden seleccionada es mejor hacerlas después de la selección, con una cláusula if() separada.

 
evillive:

No puede ser, es imposible que el Ask del Canguro sea superior a cualquier precio de apertura del Eurodólar en 2015....

Y todas las comprobaciones de la orden seleccionada deben hacerse después de la selección, con una cláusula if() separada.

Así es, no pudo. Por eso dio órdenes Bid<openPrice en eu a 1,11262.

En otras palabras, ¿sugieres comprobar la presencia de una orden utilizando el if(OrderSelect()), y luego en el embedded si ya comparamos el símbolo del gráfico con el símbolo de la orden, el precio de apertura, etc.?

 
.roman.:

Así es, no pudo. Por eso ha emitido una orden Bid<openPrice en eu a 1,11262.

En otras palabras, ¿sugiere comprobar si hay una orden utilizando el if(OrderSelect()), y luego comparar el símbolo del gráfico con el símbolo de la orden, el precio de apertura, etc., en el if incrustado?

Sí, exactamente, primero OrderSelect(), y luego la siguiente comprobación del resto de los parámetros.
 

Bailar por ahí no servirá de nada.

No hay diferencia para escribir la selección de orden y la comprobación del símbolo y el mago en una línea o dividirlos en 3 líneas diferentes. De acuerdo con los cambios en las nuevas construcciones, las condiciones de comprobación se comprueban por etapas, es decir, si la primera condición no se cumple, las siguientes no se comprobarán. Es lo mismo que las 3 líneas. Se cumple la primera condición y se comprueba la segunda. Y sólo si la segunda condición también se cumple procedemos a comprobar la tercera.

El problema es probablemente que hay una llamada de una función de usuario en la parte eliminada del código donde se selecciona otro pedido.

 

Si hubiera habido alguna mención a trabajar con órdenes, eso habría sido lo primero en lo que me fijé. Pero sólo hay cálculos, no se utiliza ninguna función de usuario. No está claro qué es exactamente lo que hace que se seleccione una orden de otro par. Por eso estoy tan desconcertado por el "entorno de software" que se menciona en la documentación y ya he rehecho el código como sugirió evillive y estoy dispuesto a bailar con panderetas. La siguiente perversión será una comparación forzada con el bid\ask del par requerido a través de marketinfo.


UPD: Problema resuelto. En realidad se ha encontrado una función anidada que utiliza su propio OrderSelect. Gracias por la idea, AlexeyVik.

 
Hola a todos, Me pueden decir cómo resolver un problema, encuentro el número de barra que quiero en el bucle, pero también necesito el número de barra pasado en el bucle, ¿cómo implementar esto sucintamente? Gracias.
for(i=limit; i>=0; i--)
{
yesterday_weekday = TimeDayOfWeek(iTime(Symbol(),0,i-1))-TimeDayOfWeek(iTime(Symbol(),0,i));
if (yesterday_weekday ==1)
yesterday_time=iTime(Symbol(),0,i);
yesterday_shift=iBarShift(Symbol(),0,yesterday_time0);//последний бар 

}
 

He creado un EA (no para el trabajo, sólo para practicar)

Si establezco ambos parámetros en la función IF, si los establezco uno por uno, todo funcionará bien, aquí está el código (Además, ¿cómo me aseguro de que si ya tengo una orden de compra abierta la siguiente orden de compra no se abrirá, incluso si todas las condiciones coinciden)?

//+------------------------------------------------------------------+
//|                                                        новый.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()

  {
  
double PC = iClose ("EURUSD", PERIOD_H1, 0);  

double MA = NormalizeDouble (iMA ("EURUSD", PERIOD_H1, 12, 0, MODE_LWMA, PRICE_MEDIAN, 0), 4); 


if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point);

   
return (0);





   
  }
//+------------------------------------------------------------------+
 
inuboh:

He creado un EA (no para el trabajo, sólo para practicar)

Si establezco las dos, una por una, funciona bien, es decir, el código (y si ya tengo una orden de compra abierta, ¿cómo hago para que la orden de compra no abra la siguiente, aunque todas las condiciones sean correctas?)

No es que sea la fuente de todos los problemas, sino puramente por interés académico: ¿por qué simultáneamente OnInit(), OnDeinit() y de repente start()?

Y en cuanto a la pregunta, es muy poco recomendable que tal comparación Pregunte == MA, muy rara vez se hace realidad en la historia. Entonces, ¿qué significa la expresión PC-->MA?

En cuanto al permiso para una compra, hacemos un bucle a través de todas las posiciones del mercado y las comparamos con los criterios especificados - símbolo, tipo, número mágico, y aumentamos el contador en uno si se encuentra el buscado. A continuación, si es necesario, se comprueba este contador.

Así es:

   _ExpertOrdersB=0;
   _ExpertOrdersS=0;

   for(int z=OrdersTotal()-1; z>=0; z --)
     {
      if(!OrderSelect(z,SELECT_BY_POS))
        {
         Print(". OrderSelect("+IntegerToString(z)+", SELECT_BY_POS ) FAIL!. Error #"+IntegerToString(GetLastError()));
        }
      if((OrderMagicNumber()==magic) && OrderSymbol()==_Symbol)
        {
          switch(OrderType())
           {
            default: break;
            case 0:
               _ExpertOrdersB++;
               break;
            case 1:
               _ExpertOrdersS++;
               break;
           }
        }
     }


if (_ExpertOrdersB < 1) //если нет покупок, то пытаемся купить, при условии, что:
if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point); 
 
evillive:

No es que sea la fuente de todos los problemas, sino puramente por interés académico: ¿por qué simultáneamente OnInit(), OnDeinit() y de repente start()?

Y en cuanto a la pregunta, es muy poco recomendable que tal comparación Pregunte == MA, muy rara vez se hace realidad en la historia. Entonces, ¿qué significa la expresión PC-->MA?

En cuanto al permiso para una compra, hacemos un bucle a través de todas las posiciones del mercado y las comparamos con los criterios especificados - símbolo, tipo, número mágico, y aumentamos el contador en uno si se encuentra el buscado. Luego miramos el contador donde sea necesario.

He arreglado start() por "costumbre" )

¿Por qué el precio de compra == MA es un evento raro? ¿El precio de compra actual rara vez toca la línea de la media móvil?

El PC-->MA es en mi caso si el precio de cierre anterior es mayor que la línea de la Media Móvil (no he descubierto otra forma).

Así, cuando habilito la función IF una por una con Ask == MA y luego PC-->MA funciona bien, pero cuando las combino, ¡no funciona!

 
evillive:

No es que sea la fuente de todos los problemas, sino puramente por interés académico: ¿por qué simultáneamente OnInit(), OnDeinit() y de repente start()?

Y en cuanto a la pregunta, es muy poco recomendable que tal comparación Pregunte == MA, muy rara vez se hace realidad en la historia. Entonces, ¿qué significa la expresión PC-->MA?

En cuanto al permiso para una compra, hacemos un bucle a través de todas las posiciones del mercado y las comparamos con los criterios especificados - símbolo, tipo, número mágico, y aumentamos el contador en uno si se encuentra el buscado. A continuación, si es necesario, se comprueba este contador.

Así es:

Tengo entendido que PC-- > MA es lo mismo que PC-1 > MA.

Razón de la queja: