aventuras de un novato - página 3

 
niko:

Gracias, rompe nubes. Esto empieza a ser un poco más divertido, no sabía que se puede llamar a una función dentro de un retorno (aunque probablemente esté en el libro de mql, como todo lo teórico). ¡Bonito helicóptero EC 155! ¿Por qué 'afortunadamente', no quieres tu propio helicóptero?

Pregunta Aero HC2:


Hasta ahora tengo 3 scripts para mi estrategia. 2 son uni-direccionales, 1 es bidireccional (que es el que estamos trabajando aquí).

Según tu experiencia con MT4, ¿debería esperar problemas serios si adjunto diferentes scripts a 5 o más pares en la pantalla (1 script por par). ¿Será más fácil para mí que programar o cambiar 1 script grande y hacer que ese escoja el par que quiero (ya que eso requeriría cambios diarios en el código)?

 
niko:

Pregunta Aero HC2:


Hasta ahora tengo 3 scripts para mi estrategia. 2 son uni-direccionales, 1 es bidireccional (que es el que estamos trabajando aquí).

Según tu experiencia con MT4, ¿debería esperar problemas serios si adjunto diferentes scripts a 5 o más pares en la pantalla (1 script por par). ¿Será más fácil para mí que programar o cambiar 1 script grande y hacer que ese escoja el par que quiero (ya que eso requeriría cambios diarios en el código)?

Asumiendo aquí que estamos hablando de una sola estrategia de negociación a través de pares de divisas:-

Yo prefiero que mis EAs sean agnósticos en cuanto a los pares, es decir, que el mismo EX4 se pueda aplicar a cualquier par.

-De esta manera sólo tenemos que mantener un código base.

-La lógica es lo más simple posible.

 
cloudbreaker:

Asumiendo aquí que estamos hablando de una sola estrategia de negociación a través de pares de divisas:-

Yo prefiero hacer mis EAs par-agnóstico - es decir, el mismo EX4 se puede adjuntar a cualquier par.

-De esta manera sólo tenemos una base de código que mantener.

-La lógica es lo más simple posible.

Sip, eso sería lo ideal, pero yo establezco un filtro manual para cada divisa cada día, no basado en indicadores, además resultan ser 3 estrategias aunque la idea es la misma. Esto haría que el código fuera realmente grande a mi entender y engorroso de ajustar a diario si lo pusiéramos todo junto. Para un futuro próximo programaré el filtro para reducir mi tiempo de trabajo, pero siempre hay cosas que no se pueden programar (el 90% hay que programarlo, el resto es para lo que está el cerebro creo. Aunque yo perseguí el 'santo grial' antes de intentar programar todo y dar con el modelo perfecto jaja, mirando en la dirección equivocada).


Este lunes lanzaré las 2 estrategias en directo ya que el código de las mismas está hecho. Han sido ejecutadas manualmente por mi suegro y yo mismo un poco, la codificación debe traer mayores resultados. Para la estrategia Combinada puedo lanzar 2 EA's supongo en el mismo gráfico (uno para largo uno para corto), pero todavía quiero aprender, así que retomaré el proceso de codificación. ¡Así que esperen un montón de preguntas que vendrán muy pronto!


¿En qué país se encuentra? Estoy en Londres, Reino Unido.

 

¡Hey cloudbreaker y otros gurús de mt4 aquí!


Pregunta: Tengo 2 scripts (uno es para comprar otro es para acortar). Quería utilizar ambos hoy en 3 pares. Ahora, debido a que sólo 1 EA se puede adjuntar a un gráfico, abrí 6 gráficos (2 por par), y adjunté los scripts a ellos. Sin embargo, sólo se ejecutó 1 script. No tengo ni idea de por qué. ¿Alguna ayuda, por favor?


Así que para resumir: 2 EAs, uno sólo hace la compra de otro sólo hace cortocircuito, reglas muy básicas (cruz de oro en emas y eso es todo), el beneficio tomar 20 pips, sin pérdida de la parada. ¿Por qué sólo se ejecuta 1? He comprobado que los Expert Advisors estaban activados, y todos los scripts tenían caras sonrientes al lado en los gráficos.

 
niko:

¡Hey cloudbreaker y otros gurús de mt4 aquí!


Pregunta: Tengo 2 scripts (uno es para comprar otro es para acortar). Quería utilizar ambos hoy en 3 pares. Ahora, debido a que sólo 1 EA se puede adjuntar a un gráfico, abrí 6 gráficos (2 por par), y adjunté los scripts a ellos. Sin embargo, sólo se ejecutó 1 script. No tengo ni idea de por qué. ¿Alguna ayuda, por favor?


Así que para resumir: 2 EAs, uno sólo hace la compra de otro sólo hace cortocircuito, reglas muy básicas (cruz de oro en emas y eso es todo), el beneficio tomar 20 pips, sin pérdida de la parada. ¿Por qué sólo se ejecuta 1? He comprobado que los Expert Advisors estaban activados, y todos los scripts tenían caritas sonrientes al lado en los gráficos.



¿Qué dicen los archivos de registro, es decir, el del directorio de registros y el del directorio de expertos?

¿Recibe algún mensaje de "Contexto comercial ocupado"? Si es así, entonces recomendaría añadir alguna lógica haciendo uso de la función IsTradeAllowed().

Si no es así, entonces recomendaría llenar sus EAs con declaraciones Print().

 
cloudbreaker wrote >>

¿Qué dicen los archivos de registro, es decir, el del directorio de registros y el del directorio de expertos?

¿Recibe algún mensaje de "Contexto comercial ocupado"? Si es así, entonces yo recomendaría añadir alguna lógica haciendo uso de la función IsTradeAllowed().

Si no es así, entonces recomendaría llenar tus EAs con declaraciones Print().

¡Gracias por venir al rescate!

1. ¿Qué quieres decir con el directorio de registro? ¿Cómo llego a los dos? (He intentado abrirlo a través de C>Archivos de programa>MT4>Expertos>Logs pero la carpeta aparece vacía).

 
niko wrote >>

¡hey cloudbreaker! ¡gracias por venir al rescate!

1. ¿A qué te refieres con el directorio de registro? ¿Cómo puedo llegar a los dos? (He intentado abrirlo a través de C>Archivos de programa>MT4>Expertos>Logs pero la carpeta aparece vacía).

¡Hola Rompenubes!

Ya he repasado muchas veces tus comentarios sobre la codificación (los tengo todos colgados en mi muro), intentando entender y remendar todo, pero sigo completamente perdido. Hasta donde llegué fue a copiar la función MyOrderCount de otro EA, pero aún no tengo idea de cómo integrar eso en el código. Estoy completamente fuera de mi alcance, pero eso no significa que no podamos avanzar. Si pudieras ayudarme a construir el código poco a poco (y dirigirme hacia cosas quizás más específicas que podría construir yo mismo también) entonces conseguiremos hacer el código y aprenderé mucho más rápido.

Adjunté el código hasta donde llegué con él, y también el Mapa de Diseño del Programa de la manera que yo lo veo. No te preocupes por las cosas menores como los paréntesis en el código, los revisaré con notepad++ a medida que avancemos.

La prioridad principal es que me ayudes a integrar paso a paso el código de MyOrderCount en el resto, y que me expliques todo poco a poco a medida que avanzamos. O también puedes enviarme a partes específicas del libro o algo así si lo consideras oportuno. Así avanzaremos mucho más rápido.

Gracias.

ps: hazme saber si el mapa del programa no se adjuntó

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
if(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }
  //-------------------Declaring All Variables and Conditions

double ema1,ema2,ema3,closeup, e1over2, e2over3,e1under2,e2under3;

ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
e1under2=ema1<ema2;
e2under3=ema2<ema3;
e1over2=ema1>ema2;
e2over3=ema2>ema3;
//--------------------declaration end

//-------------order counting code
int CalculateNumberOfOrders(string Symbol)
{
int long=0,short=0;
for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
      if(OrderType()==OP_BUY)long++;
      if(OrderType()==OP_SELL)sell++;
     {
  //---return orders Volume
  if(long>0)return(long);
  if(short>0)return(short);
{
//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//------------------EURUSD Block-------------------------
//check order type, if it doesn't equal to buy already then buy
if(OrderType()
     {
    static int ticket;
      // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
       {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"Short
Order ",0,0,Red);
        if(ticket>0)
              {
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SHORT order opened : ",OrderOpenPrice());
              }
              //return(0);
       }

      //  -------------------------------------------------------------------------------------------

      {
      static int ticket1;
            // deleted if(OrdersTotal()==0)
        if(e1over2 && e2over3) //buy function
        {
         ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green);
//What's 12345 for? I ADDED ASk-30*Point for stop loss
         if(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
           }
           //return(0);   //the problem is with this return not being
in the right place i think
        }
      }
return(0);
}
}

ps: por favor, ignora los comentarios // aleatorios en el código, es de notas antiguas

 
niko wrote >>

¡Hola Rompenubes!

Ya he repasado muchas veces tus comentarios sobre la codificación (los tengo todos colgados en mi muro), tratando de entender y remendar todo, pero sigo completamente perdido. Hasta donde llegué fue a copiar la función MyOrderCount de otro EA, pero aún no tengo idea de cómo integrar eso en el código. Estoy completamente fuera de mi alcance, pero eso no significa que no podamos avanzar. Si pudieras ayudarme a construir el código poco a poco (y dirigirme hacia cosas quizás más específicas que podría construir yo mismo también) entonces conseguiremos hacer el código y aprenderé mucho más rápido.

Adjunté el código hasta donde llegué con él, y también el Mapa de Diseño del Programa de la manera que yo lo veo. No te preocupes por las cosas menores como los paréntesis en el código, los revisaré con notepad++ a medida que avancemos.

La prioridad principal es que me ayudes a integrar paso a paso el código de MyOrderCount en el resto, y que me expliques todo poco a poco a medida que avanzamos. O también puedes enviarme a partes específicas del libro o algo así si lo consideras oportuno. Así avanzaremos mucho más rápido.

Gracias.

ps: hazme saber si el mapa del programa no se adjuntó

ps: por favor, ignora los comentarios al azar // en el código, es de las viejas notas

Hola Niko

Me permito añadir mi granito de arena a esta discusión,

Como un viejo, prácticamente antiguo :), programador con un poco de experiencia en la enseñanza y la formación, me he encontrado con un montón de código malo en mi tiempo. Un error común que conduce a un código mal escrito es la falta de planificación. Puede que sea una obviedad, pero hay que especificar lo que se quiere hacer antes de empezar a codificar. Esto puede parecer un trabajo extra, pero a la larga te ahorrará mucho tiempo y producirá un código más fiable, más comprensible y más fácil de mantener.

Una técnica muy útil para especificar el código informático se conoce como Pseudocódigo. Básicamente, se trata de un conjunto lógico de instrucciones informáticas escritas en inglés. No se requiere un formato particular, pero se puede utilizar la jerga típica de los programas informáticos que se encuentra de una forma u otra en casi todos los lenguajes de programación.

Aquí hay un ejemplo de un Pseudo Código para cocinar queso y macarrones. Lo tomé de un artículo "Intro to Programming by Patrick Nouvion" en el sitio de IBFX. Probablemente vale la pena leer el artículo completo. http://www.ibfx.com/ibfxu/catalog/programming/pro1010.aspx

COMENZAR
Encuentre la leche y la mantequilla y la caja de Kraft
Si los encuentra, continúa
si no, enviar al niño a la tienda

Encuentre la olla en el tablero de la taza

Si la encuentra, continúe o pida a su esposa que le ayude a encontrarla

Encontrar la estufa
Si la encuentra, continúe
Si no, pedir una pizza

Comprobar si hay un quemador disponible
Si está disponible, continúe
Si no, hacer que esté disponible

Encienda la estufa a nivel alto
Buscar agua
Si la encuentra, continúe
Si no, pedir pizza

Ponga agua en la olla
Asegúrese de que la estufa esté caliente
si está caliente continuar
si no, compruebe que está enchufada
Si no, llame al técnico y pida una pizza

Ponga la olla en el quemador
si tiene sal añada una pizca de sal
si no tiene, continúe
si tiene pimienta añada una pizca de pimienta
si no tiene, continúe
mientras el agua no esté hirviendo espere
abra la caja de Kraft
añada los macarrones de la caja a la olla
espere 8 minutos
mientras espera, si la olla hierve en exceso, baje el fuego y sople
Buscar un escurridor
Escurrir los macarrones en el colador
volver a ponerlos en la olla
añadir el contenido del paquete de queso
añada la mantequilla
añada 1 cucharada de leche
remover para combinar
si está demasiado espeso, añadir 1 cucharada de leche; si no, comer
FINALIZAR

Si yo mismo escribiera este pseudocódigo, lo refinaría un poco más dividiéndolo en bloques funcionales y utilizando un poco de sangría para que "se vea bonito". Por ejemplo

BLOQUE DE INICIO - Preparar el agua para hervir

Poner agua en la olla

Poner la olla en el quemador
si tiene sal añada una pizca de sal
si no tiene, continúe
si tiene pimienta añada una pizca de pimienta
si no tiene pimienta, añada una pizca de pimienta
mientras el agua no esté hirviendo espere

BLOQUE FINAL - Preparar agua hirviendo

y así sucesivamente ....

Niko, te felicito por querer aprender a escribir tu propio código. En mi experiencia, la forma más rápida y fácil de aprender es hacer lo que estás haciendo y simplemente probar. Lo que sugeriría es que dieras un breve paso atrás y escribieras lo que quieres conseguir en pseudocódigo. Esto te ayudará a tener claro qué es exactamente lo que quieres conseguir.

Una vez que lo hayas hecho, puedes publicarlo aquí para que yo u otra persona le eche un vistazo. Una vez que tengas el pseudocódigo correcto, entonces puedes empezar a convertirlo en código MT4. Tratar de hacerlo todo de una sola vez es un salto demasiado grande, especialmente cuando eres un principiante.

Por cierto, mi pseudocódigo nunca se desperdicia. La mayor parte termina como comentarios en mi código terminado.

Buena suerte.

Tim Wilson

 
niko:

¡Hola Rompenubes!

He revisado tus comentarios sobre la codificación muchas veces ya (los tengo todos publicados en mi muro), tratando de entender y parchear todo, pero aún estoy completamente perdido. Hasta donde llegué fue a copiar la función MyOrderCount de otro EA, pero aún no tengo idea de cómo integrar eso en el código. Estoy completamente fuera de mi alcance, pero eso no significa que no podamos avanzar. Si pudieras ayudarme a construir el código poco a poco (y dirigirme hacia cosas quizás más específicas que podría construir yo mismo también) entonces conseguiremos hacer el código y aprenderé mucho más rápido.

Adjunté el código hasta donde llegué con él, y también el Mapa de Diseño del Programa de la manera que yo lo veo. No te preocupes por las cosas menores como los paréntesis en el código, los revisaré con notepad++ a medida que avancemos.

La prioridad principal es que me ayudes a integrar paso a paso el código de MyOrderCount en el resto, y que me expliques todo poco a poco a medida que avanzamos. O también puedes enviarme a partes específicas del libro o algo así si lo consideras oportuno. Así avanzaremos mucho más rápido.

Gracias.

ps: hazme saber si el mapa del programa no se adjuntó

ps: por favor, ignora los comentarios al azar // en el código, es de las viejas notas

Un vistazo rápido me dice que estás cometiendo un error fundamental.

Parece que estás intentando declarar la función MyOrderCount() dentro del bloque de código de la función start().

Piensa en tu código como una serie de funciones init(), start(), tufunción1(), tufunción2() ... tufunciónN().

Las funciones init() y start() son funciones especiales. La función init() se ejecuta una vez cuando se inicializa el EA por primera vez. La función start() se ejecuta cada vez que llega un tick.

Por lo tanto, la función start() constituye la raíz desde la que se llamará a toda su lógica una vez que el AE esté en funcionamiento.

Como ejemplo, cada vez que llegue un tick, su función start() se ejecutará y hará lo siguiente

- comprobar algunas condiciones

- si se cumplen las condiciones, ejecuta una orden

Una de las condiciones que necesita es asegurarse de que no tiene ya una orden del tipo (digamos de compra) antes de realizar una orden de compra.

Así que desde la función start(), tendrá que averiguar qué órdenes de compra existen mediante una LLAMADA a su función de recuento de órdenes de compra (cuyo bloque de código se encuentra FUERA de la función start()).

Su función de recuento de órdenes devolverá el número de órdenes de compra y usted reanudará la ejecución de la función start() en la línea posterior a su llamada a la función de recuento de órdenes de compra.

A continuación, utilizará el valor devuelto por la función de recuento de órdenes de compra para determinar si se ejecuta o no la orden de compra.

La ejecución real de la orden de compra puede ser una llamada a OTRA función que usted cree (de nuevo, declarada fuera de la función start()).

Espero que esto tenga sentido. Usted puede estructurar completamente diferente, pero sólo estoy tratando de conseguir su cabeza alrededor del concepto de funciones y llamadas.


CB

 

¡Hola TSWilson y CB!

¡Sois geniales! Muchas gracias.

Totalmente acertado lo del pseudocódigo. Lo hice cuando hice una programación muy básica en lenguaje pro**realtime, pero allí era tan simple, sin declaraciones, sin bloques, etc (todo el código era sólo 'if...then' jaja). Empecé el pseudocódigo esta mañana (llegué al trabajo una hora antes sólo para hacerlo) y escribí un diagrama visual sobre cómo y qué bloques tener. Terminaré esto más tarde hoy y lo publicaré aquí.

Una vez que este hecho, el resto de los bloques y los detalles del código que puede averiguar con su ayuda chicos. ¡Así que de vuelta a la mesa de dibujo por ahora!

Estoy feliz de trabajar durante la noche hoy y mañana para terminar el código lo antes posible, ya que me voy de vacaciones la próxima semana y quiero tener todo listo antes de irme.

Así que seguid atentos a este hilo hoy, ¡publicaré el pseudocódigo y el diagrama!

Y como siempre, ¡gracias al Universo por gente como tú!