Problemas de comprobación del comercio abierto

 

Hola, he añadido esto a mi código para comprobar si ya hay una operación abierta. El problema es que el código ejecuta una operación y ya está. ¿Puede alguien ver un problema con este código. No soy un super experto en programación


// Comprobar si hay operaciones abiertas

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{

if(OrderSymbol()==Symbol())
{
tradeopen=true;
}
else
{
tradeopen=false;
}

}

}

 
Su código recogerá las operaciones pendientes y abiertas, aparte de eso me parece bien.
 

Gracias Raptor por tu pronta respuesta


Si no te importa adjuntaré todo el código, tal vez hay algo que me he perdido en otra parte. Me he dado contra la pared con esto en este momento.

Archivos adjuntos:
daz.mq4  3 kb
 
dazamate:
¿Alguien puede ver un problema con este código?

  1. No hay número mágico significa que es incompatible con cualquier otro EA y el comercio manual y sí en el mismo par / diferentes marcos de tiempo.
  2. Si la primera orden abierta no fue la del EA entonces la bandera es falsa, incluso si tiene operaciones abiertas.
    int TotalOrderCount(){
        int count=0;
        for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if (
            OrderSelect(pos, SELECT_BY_POS)                 // Only my orders w/
        &&  OrderMagicNumber()  == magic.number             // my magic number
        &&  OrderSymbol()       == Symbol() ){              // and my pair.
            count++;
        }
        return(count);
    }

 
dazamate:

Gracias Raptor por tu pronta respuesta


Si no te importa adjuntaré todo el código, tal vez hay algo que me he perdido en otra parte. Me he dado contra la pared con esto en este momento.

Algunos comentarios...

Declaras que yo...

int i;

. . . pero no lo pones en ningún sitio, ¿qué es i?

Se establece...

static bool tradeopen = false;

... luego lo comprueba para ver si puede colocar una operación ... siempre será falso en este punto ... luego tiene código más tarde que puede establecerlo como verdadero

if(OrderSymbol()==Symbol())
    {
    tradeopen=true;
    }  

barcount se establece en 0

static int barcount = 0;

por lo que siempre será verdadero si tiene al menos 1 barra en su gráfico...

if(Bars != barcount)

Necesitas revisar tu código línea por línea... cualquier cosa que no entiendas búscala y lee sobre ella... es la única manera de aprender.

 

Raptor, gracias por repasarlo. Como dije no soy un super experto. He estado leyendo la forma en que otras personas codifican las cosas y tratar de implementar en la mía. He leído mucho sobre las funciones. Solo se vuelve frustrante cuando no funciona y no sabes como diagnosticar tu propio desastre.

En respuesta a tus comentarios

int i;

Se ha ido, yo estaba usando eso para otra cosa accidentalmente dejó que allí


Voy a explicar lo que está pasando en mi cabeza en lo que respecta a la barcounter . Todavía no estoy seguro de por qué esta parte del código no es buena.

static int barcount = 0;  // <- First time program is run bar counter is set to 0

     if(Bars != barcount) // <-  This will be true so the if statement is allowed to run
    
       {      
         if(iBarHour == iOpenHour)
                {
                //If statement
    
                }
         barcount=Bars ; // <- At the end of the if statement, the bar counter is set to Bars so that this if statement will not be true
                         //    again until another bar opens
       }

En cuanto a la comprobación para ver si hay operaciones abiertas en el par...

static bool tradeopen = false;                // First time program is run tradeopen is set to false. I use the static in front 
// because if I don't the programming will keep setting this to false because an ea or   // a program is just a giant loop is it not. However I should set this to true because // the ea should assume there is a trade open until it does it checks that would // probably be the more smarter approach.       for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)         {           if(OrderSelect(cnt,SELECT_BY_POS)) // <- So it scans each open and pending trade             {                           if(OrderSymbol()==Symbol()) // <- Checks to see if any of them trades are the same as the pair the ea is using                {                 tradeopen=true; // If so then set tradeopen to true                }                        else                {                 tradeopen=false; // If not set trade open to false                }                          }                         }

Así que al final de la ea hace esta comprobación para ver si hay un comercio abierto en el par actual o no. Establece tradeopen como verdadero o falso. ¿Es un problema que este bit de código se utiliza al final de la EA?

También otro problema que no puedo entender...

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);
¿Por qué iBarHour siempre devuelve 1? Quiero que devuelva la hora actual :(


WHRoeder


¿Importa si el EA utiliza un número mágico o no? ¿No puede simplemente comprobar todas las operaciones abiertas y pendientes y si alguna de ellas es el par actual?


Una vez más chicos sé que soy un novato, pero toda su entrada es apreciada Sé que estoy probablemente va a ser arrancado en otra vez acerca de mi codificación dodgy :P


Gracias

 
dazamate:

Voy a explicar lo que me pasa por la cabeza con respecto al contador de barras. Todavía no estoy seguro de por qué esta parte del código no es buena.

Lo siento, probablemente estoy mostrando mi ignorancia sobre el uso de variables estáticas . . . Yo uso variables globales en su lugar y todo lo que quiero establecer en la inicialización del código lo pongo en la función init. https://docs.mql4.com/basis/functions/special

Si estás ejecutando esta parte del código durante el fin de semana no cambiará, utiliza la hora del servidor y eso se actualiza con cada tick.

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);

Asumiendo que este código funciona entonces dDayOpenPrice solo se establecerá mientras iBarHour = 6, cuando iBarHour = 7 dDayOpenPrice ya no se establecerá en el valor correcto. Si haces que dDayOpenPrice sea global entonces su valor se guardará mientras el código se esté ejecutando (hacerlo estático probablemente también funcione). Sin embargo, si el código se reinicia, no ocurrirá nada hasta el día siguiente... no hasta la barra de las 6 de la mañana.

WHRoeder

¿Importa si el EA utiliza un número mágico o no? ¿No puede simplemente comprobar todas las operaciones abiertas y pendientes y si alguna de ellas es el par actual?

Si usted tiene un EA en un gráfico sólo con el comercio manual ... entonces usted probablemente puede conseguir lejos sin usar un número mágico, es una buena práctica para usarlo, sin embargo, obtener su código de trabajo en primer lugar, a continuación, aplicar un número mágico, que le ayudará a aprender.

 

RaptorUK gracias una vez más.


Yo backtest el ea para ver si el código está trabajando y Print() la variable para ver whats pasando en ellos para ayudar a depurar el código. El código ibarhour parece estar funcionando correctamente sólo que no estaba mostrando correctamente en el backtest porque lo he configurado para imprimir constantemente el valor de ibarhour que no puede mostrar lo suficientemente rápido como el código escupe a cabo por lo que el backtester se atasca. ¿Hay alguna manera de poner un retraso en el código de impresión?



También quiero que almacene el valor de la apertura de la barra de las 06:00 :)


He vuelto a organizar el código, y estoy orgulloso de mí mismo, he conseguido que sea capaz de comprobar si el EA ha abierto alguna operación en el par actual. Usé elejemplodeWHRoeder y lo convertí en una función separada :) y conseguí que la función devolviera true o false. Si.



Dado que usted es obviamente una élite en el campo de la codificación de EA. ¿Cuántas historias de éxito has escuchado de personas que hacen sus propios EAs? Sólo he oído / visto malas historias.











 
dazamate:

Ya que obviamente eres una élite en el campo de la codificación de EAs. ¿Cuántas historias de éxito has escuchado de gente que hace sus propios EAs? Solo he escuchado/visto malas historias.











LOL . . su comentario debe ser dirigido aWHRoederno yo, él es un codificador mucho, mucho más competente que yo, echa un vistazo a través de algunos de sus mensajes recientes en el código que ha compartido, se puede aprender mucho de la comprensión de su código , sé que tengo, gracias WHRoeder :-).

Yo paso por aquí porque me gusta intentar ayudar a la gente a ayudarse a sí misma... y consigo aprender cosas en el proceso.

Para tener un EA exitoso primero se necesita un método exitoso... ¿cuántos de esos hay? muchas cosas funcionan por un corto período de tiempo, unas pocas cosas funcionarán por un mes o dos, muy pocas funcionan consistentemente. Incluso si alguien tiene un buen método (no sé cómo podría saber esto sin las pruebas adecuadas) por lo general no tienen el conocimiento o la capacidad de convertirlo en un EA viable. Cualquiera que tenga un EA viable es poco probable que anuncie el hecho, lo estará usando y ganando dinero....

Me alegra saber que estás progresando... con respecto a tu problema de impresión, podrías usar Comment(iBarHour); en lugar de eso, obtiene la salida a la pantalla en la esquina superior izquierda.

 
  1. De nada. "Para aprender algo, practica. Para dominarlo, enseña".
  2. Bars no es fiable (una vez que se alcanza el máximo de barras en el gráfico no cambiará y el código se rompe). Volume[0]==1 no es fiable, si se pierde un tick el código se rompe. Siempre use el tiempo.
    int start(){
       static datetime Time0;
       if (Time0 == Time[0]) return; Time0 = Time[0];
       // A new bar has started.

  3. probablemente mostrando mi ignorancia sobre el uso de variables estáticas . . . Yo uso variables globales en su lugar y cualquier cosa que quiera establecer en la inicialización del códigoSi
    la variable necesita ser inicializada entonces debe ser global. Si la variable se comparte entre dos o más funciones, entonces debe ser global. En caso contrario, defínela localmente en la función, estática si es necesario.
  4. Importa si el EA utiliza un número mágico o no.
    Probablemente tendrás todo funcionando, luego abrirás otro gráfico para probar allí y de repente todo falla. Hazlo bien desde el principio. En mi código, compruebo tanto el número mágico como el par por si acaso lo pongo en otro gráfico pero no cambio el número mágico.
 

Su derecho Raptor ... Lo siento WHRoeder que fue grosero no gracias están bien. Bueno, este es el comienzo de un gran proyecto para mí, así que espero que no les importe que los moleste.


int start(){
   static datetime Time0;
   if (Time0 == Time[0]) return; Time0 = Time[0];
   // A new bar has started.

WHRoeder, este código parece tan simple pero no puedo entender cómo funciona, ¿no será la declaración if siempre verdadera si hace que time0 sea igual a time[0] cada vez que time0 sea igual a time[0]? No digo que no funcione pero no entiendo como funciona estructurado así.


2 preguntas más.

¿Cómo puedo hacer un contador en el que si una orden pendiente se coloca y no se activa en x cantidad de barras, entonces es para ser cancelado? Todo lo que se me ocurre es poner un contador que cuente cada vez que se forme una nueva barra y si la cantidad de barras contadas == las barras permitidas especificadas antes de que se cancelen las órdenes pendientes. El contador de barras se reinicia cada vez que se abre una nueva orden pendiente? ¿Qué te parece?

Siguiente pregunta.

No tengo ni idea de cómo hacerlo.

Quiero hacer una función que escanee eurusd, usdchf, gbpusd, usdjpy en 1hr tf. Se remonta a la última vela de las 06:00 gmt y registra la apertura, se remonta otras 24 barras a la vela anterior de las 06:00 gmt y registra el rango de 6gmt -6gmt para cada par. Luego compara el rango 6gmt - 6gmt de todos los pares y devuelve el que es más alto. ¿Es posible que un ea haga eso estando unido a 1 gráfico de tiempo?


Gracias de nuevo por sus conocimientos chicos y sus pacientes