Por favor, guíenme con respecto a la propagación - página 2

 
GumRai:

Yo pensaría que se podría codificar esto por 20 o 30 $.

Bien... gracias... déjame ver si primero puedo encontrar algo gratis, si no encuentro nada, publicaré un trabajo.
 
GumRai:

Yo pensaría que usted podría conseguir esto codificado por 20 o 30 $

En realidad, como ahora usted ha CONFIRMADO que el cierre de la orden ya tiene en cuenta la propagación, creo que la secuencia de comandos anterior debe trabajar para mí .. gracias .. Todo lo que tengo que establecer en que es 10 pips .. y se auto cerrar como usted dice mediante el uso de valor ASK si es un corto y el uso de un valor BID si es un largo .. y suma total de que como beneficio total de la cuenta y cierra todas las órdenes abiertas .. no toca la orden pendiente por lo que todo bien .. gracias a las cargas .. también, ¿podría explicarme .. en el programa anterior dice deslizamiento = 5 .. lo que significa para esta secuencia de comandos? ¿cómo va a jugar en cuando la secuencia de comandos se cierra una orden? ah y también, es un guión o EA? o cómo diferenciar entre los dos? [COMO ES QUE USTEDES APRENDEN TANTO DE LAS COSAS >.<]
 
tatyawinchu:

Gracias un montón.. muy claro y muy útil .. Me pregunto cuánto costaría publicar un trabajo así? ¿Qué tan difícil sería ese código? El código que obtuve de la web que he publicado anteriormente parece ENORME ... Quiero decir que realmente no puedo desembolsar miles de dólares ...


Hola de nuevo,

¡No hay que preocuparse, El código para lo que quieres no debería ser tan complicado y, para que sepas si alguna vez necesitas publicar un trabajo, tú eres el que tiene el control, ofreces lo que puedes pagar y crees que vale la pena !

Por otro lado, si eres como yo, yo probaría primero la opción gratuita. No pierdes nada, tal vez ganes algunos amigos y aprendas algo en el proceso.

Saludos

 
tatyawinchu:

En realidad, como ahora has CONFIRMADO que el cierre de la orden ya considera el spread, creo que el script de arriba debería funcionar para mí .. gracias .. Todo lo que tengo que establecer en eso es 10 pips .. y se cerrará automáticamente como usted dice mediante el uso de valor ASK si es un corto y el uso de un valor BID si es un largo .. y la suma total de que como beneficio total de la cuenta y cierra todas las órdenes abiertas .. no toca la orden pendiente por lo que todo bien .. gracias a las cargas .. también, ¿podría explicarme .. en el programa anterior dice deslizamiento = 5 .. lo que significa para esta secuencia de comandos? ¿cómo va a jugar en cuando la secuencia de comandos se cierra una orden? ah y también, es un guión o EA? o cómo diferenciar entre los dos? [ COMO ES QUE USTEDES APRENDEN TANTO DE LAS COSAS >.< ]


Hola de nuevo,

Como siempre, hay una buena y una mala noticia. ¿Quieres las malas noticias primero o las buenas?

Aquí está y si no lo explico lo suficientemente bien por favor hágamelo saber: Para que un EA pueda salir de las operaciones basado en el beneficio de la cuenta, necesita saber cuál era el capital de la cuenta antes de que se colocara la operación, para tener un punto de partida. ¿Tiene algún sentido?

Si no tiene un punto de partida para comparar o si no hay comparación, el EA nunca cerrará la operación mientras el beneficio de la cuenta sea negativo o cerrará todas las operaciones inmediatamente si el beneficio de la cuenta es positivo y está por encima de 100 o lo que sea el límite.

¿Tiene esto algún sentido?

El deslizamiento es la cantidad máxima de desviación del precio que le permite al corredor colocar o cerrar la orden sin volver a cotizar si usted abre o cierra a precio de mercado.Como la oferta y la demanda cambian continuamente, en el momento en que su orden llega al servidor si el valor del precio (oferta o demanda) está dentro de los límites de deslizamiento, la orden será procesada, de lo contrario se volverá a cotizar.

Sí, su código es un EA. Un script normalmente se ejecuta sólo una vez, se obtiene un nuevo tick, se ejecuta el código y se sale. Un EA se ejecuta continuamente mientras lo dejes correr.

¿Cómo se diferencian? A veces es difícil ya que funcionan de manera similar. Cuando se crea un nuevo script, se ve así:

//+------------------------------------------------------------------+
//|                                                   TestScript.mq4 |
//|                             Copyright 2014, 3D@tm Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, 3D@tm Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   
  }
//+------------------------------------------------------------------+

Puedes ver que sólo tiene la función OnStart y dice : Función de inicio del programa de script.

Volviendo a tu problema, si ejecutas un EA que compruebe en la cuenta el patrimonio de la cuenta cuando no hay órdenes y lo tome como punto de referencia, podrá cerrar todas las órdenes cuando se alcance el beneficio deseado por cuenta.

El valor de un pip (dinero por pip) no es el mismo para todas las divisas. Un pip en el par AUDUSD no tiene el mismo valor que en el par GBPJPY.

¿Está buscando símbolos específicos para este EA o no importa qué símbolo, sólo para cerrar todas las órdenes cuando el beneficio por cuenta se alcanza?

Además, ¿el stop loss debería estar relacionado con la equidad de la cuenta o con la orden/pareja?

Sé que suena complicado pero no lo es tanto. Nuestros ordenadores son tan tontos que a menos que especifiques exactamente lo que quieres, se pierden.

¿Te ha servido de algo? Espero que sí.

Saludos

 

Thrdel

Estoy bastante seguro de que AccountProfit() devuelve el beneficio total de las operaciones abiertas actuales. Aunque no es obvio en la documentación.

 
GumRai:

Thrdel

Estoy bastante seguro de que AccountProfit() devuelve el beneficio total de las operaciones abiertas actuales. Aunque no es obvio en la documentación.


Hmm ...

 AccountProfit() 

En su lugar, utilizo ...

double AccProfits=AccProfits+OrderProfit();

Depende de lo que quieras conseguir.

 
GumRai:

Thrdel

Estoy bastante seguro de que AccountProfit() devuelve el beneficio total de las operaciones abiertas actuales. Aunque no es obvio en la documentación.


Hola GumRai,

Tienes razón, no es muy obvio en la documentación pero lo he probado y de nuevo, tienes razón, es la suma de las ganancias/pérdidas de todas las órdenes abiertas.

Buena captura. Gracias.

Todavía no puedo usar Account Profit si sólo quiero gestionar órdenes abiertas manualmente y necesito seleccionar entre otras órdenes que puedan ser colocadas por otros EA's.

Supongo que seleccionar por número mágico = 0 debería servir. Y luego sumar los beneficios como sugirió deysmacro .

Supongo que lo veo así. ¿Qué pensáis vosotros?

//+------------------------------------------------------------------+
//|                                       CloseOrdersOnProfit_v1.mq4 |
//|                             Copyright 2014, 3D@tm Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, 3D@tm Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//---
#include <stdlib.mqh>
//---
#define  RETRYCOUNT    10
#define  RETRYDELAY    500
#define  LONG          1
#define  SHORT         -1
#define  ALL           0
//---
extern int     Slippage=3;
input  double  ProfitTarget=100.0;
input  double  StopLossLimit=50.0;
input  bool    WriteScreenshots=true;
//---
double StartEquity=0;
int    myOrders;
//===================================================================
/*
This EA will manage manually placed orders and skip the orders that
have a magic number different from zero.
If the Profit target - the sum of profit/loss on all orders (except
orders placed by other EA's ) is reached, all those orders are
closed.
If the maximum amount of money allowed for a loss is reached, EA
will close all those orders and an alert will pop up.
*/
//===================================================================
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(Digits==3 || Digits==5) Slippage*=10;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- count orders manually placed (no magic number)
   CountMyOrders();
//--- reset account equity / take a reference point
   if(myOrders<1)
     {
      StartEquity=AccountEquity();
      //--- no orders detected, wait for orders to be placed
      return;
     }
//--- calculate profit
   double myProfit=CalculateProfit();
//--- if profit target reached, exit all
   if(myProfit>=ProfitTarget)
     {
      ExitAll(ALL);
      Alert("Orders closed due to profit target reached");
     }
//--- exit if stop limit reached
   if(StartEquity-AccountEquity()>=StopLossLimit)
     {
      ExitAll(ALL);
      Alert("Orders closed due to stop loss limit reached");
     }

   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CountMyOrders()
  {
   myOrders=0;
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false)
         Print("Failed to select order, error : "+ErrorDescription(GetLastError()));
      //skip orders placed by other EA's
      if(OrderMagicNumber()>0)continue;
      if(OrderType()==OP_BUY || OrderType()==OP_SELL)
        {
         myOrders++;
        }
     }
   return(myOrders);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CalculateProfit()
  {
   double Profit=0;
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false)
         Print("Failed to select order, error : "+ErrorDescription(GetLastError()));
      //skip orders placed by other EA's
      if(OrderMagicNumber()>0)continue;
      if(OrderType()==OP_BUY || OrderType()==OP_SELL)
        {
         Profit=Profit+OrderProfit();
        }
     }
   return(Profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ExitAll(int direction)
  {

   string total=IntegerToString(OrdersTotal(),0,0);

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      Comment(StringConcatenate("Closing trade #",(i+1)));
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
         Print("Failed to select order, error : "+ErrorDescription(GetLastError()));
      //skip orders placed by other EA's
      if(OrderMagicNumber()>0)continue;
      //---
      if(OrderType()==OP_BUY &&(direction==LONG ||  direction==ALL)) { Exit(OrderSymbol(),OrderTicket(),LONG,OrderLots(),Blue); }
      if(OrderType()==OP_SELL &&(direction==SHORT|| direction==ALL)) { Exit(OrderSymbol(),OrderTicket(),SHORT,OrderLots(),Red); }
     }
   Comment(StringConcatenate(total," trades closed."));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Exit(string symb ,int ticket,int dir,double volume,color clr,int t=0)
  {
   int i=0,j=0,cmd=0;
   double prc=0,sl=0,tp=0,lots=0;
   string cmt;
   double bid=MarketInfo(symb,MODE_BID);
   double ask=MarketInfo(symb,MODE_ASK);
   bool closed;

   Print("Exit("+IntegerToString(dir,0,0)+","+DoubleToStr(volume,3)+","+IntegerToString(t,0,0)+")");

   for(i=0; i<RETRYCOUNT; i++) 
     {
      for(j=0;(j<50) && IsTradeContextBusy(); j++)
         Sleep(100);
      RefreshRates();

      if(dir==LONG) 
        {
         prc=bid;
        }
      if(dir==SHORT) 
        {
         prc=ask;
        }
      Print("Exit: prc="+DoubleToStr(prc,Digits));

      closed=OrderClose(ticket,volume,prc,Slippage,clr);
      if(closed)
        {
         Print("Trade closed");
         Screenshot("Exit");

         return (true);
        }

      Print("Exit: error \'"+ErrorDescription(GetLastError())+"\' when exiting with "+DoubleToStr(volume,3)+" @"+DoubleToStr(prc,Digits));
      Sleep(RETRYDELAY);
     }

   Print("Exit: can\'t enter after "+IntegerToString(RETRYCOUNT,0,0)+" retries");
   return (false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Screenshot(string moment_name)
  {
   if(WriteScreenshots)
      WindowScreenShot(WindowExpertName()+"_"+Symbol()+"_M"+IntegerToString(Period(),0,0)+"_"+
                       IntegerToString(Year(),0,0)+"-"+two_digits(Month())+"-"+two_digits(Day())+"_"+
                       two_digits(Hour())+"-"+two_digits(Minute())+"-"+two_digits(Seconds())+"_"+
                       moment_name+".gif",1024,768);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string two_digits(int i)
  {
   if(i<10)
      return ("0"+IntegerToString(i,0,0));
   else
      return (""+IntegerToString(i,0,0));
  }
//+------------------------------------------------------------------+
 
thrdel:


Hola GumRai,

Tienes razón, no es muy obvio en la documentación pero lo he probado y de nuevo, tienes razón, es la suma de los beneficios/pérdidas de todas las órdenes abiertas.

Buena captura. Gracias.

Todavía no puedo usar Account Profit si sólo quiero gestionar órdenes abiertas manualmente y necesito seleccionar entre otras órdenes que puedan ser colocadas por otros EA's.

Supongo que seleccionar por número mágico = 0 debería servir. Y luego sumar los beneficios como sugirió deysmacro .

Supongo que lo veo así. ¿Qué pensáis vosotros?


esto falla .....

para muchas operaciones prc no es el precio adecuado

tampoco lo hagas

  if(Digits==3 || Digits==5) Slippage*=10;

si cambias varias veces tu timeframe ......

 
deVries:


esto falla .....

para muchos oficios prc no es el precio correcto

tampoco lo hagas

si cambia varias veces su marco de tiempo ......


Si deVries

todo falla y no debería hacerlo si tú lo dices, pero como realmente no veo mucha ayuda en tu respuesta .....

Entiendes que el código no es un EA comercial destinado a la venta a un cliente quisquilloso, cierto Estamos intentando solucionar algo y si no quieres ayudar, al menos deberías dejarlo estar.

¿De verdad crees que si cambio el plazo varias veces..... qué? El deslizamiento será 3000000 ? No en mi MT4 aparentemente. Y si no me crees, haz una prueba tú mismo.

Mi prueba dice que cuando cambias los marcos de tiempo, el EA pasa por el ciclo deinit/init y como el código mencionado está en el OnInit, el Slippage estará justo en el punto 30 cada vez.

Como cualquiera puede ver, cambiar los marcos de tiempo no llevará el Slippage a un millón, si eso es lo que estás sugiriendo.

Y no, no es una imagen falsa, es real, puedes comprobar el tiempo de cambio de cada time frame.

Espero que te sirva de ayuda.

 
thrdel:


Hola de nuevo,

Como siempre, hay una buena y una mala noticia. ¿Quieres las malas noticias primero o las buenas?

Aquí está y si no lo explico lo suficientemente bien por favor hágamelo saber: Para que un EA pueda salir de las operaciones basado en el beneficio de la cuenta, necesita saber cuál era el capital de la cuenta antes de que se colocara la operación, para tener un punto de partida. ¿Tiene algún sentido?

Si no tiene un punto de partida para comparar o si no hay comparación, el EA nunca cerrará la operación mientras el beneficio de la cuenta sea negativo o cerrará todas las operaciones inmediatamente si el beneficio de la cuenta es positivo y está por encima de 100 o lo que sea el límite.

¿Tiene esto algún sentido?

El deslizamiento es la cantidad máxima de desviación del precio que le permite al corredor colocar o cerrar la orden sin volver a cotizar si usted abre o cierra a precio de mercado.Como la oferta y la demanda cambian continuamente, en el momento en que su orden llega al servidor si el valor del precio (oferta o demanda) está dentro de los límites de deslizamiento, la orden será procesada, de lo contrario se volverá a cotizar.

Sí, su código es un EA. Un script normalmente se ejecuta sólo una vez, se obtiene un nuevo tick, se ejecuta el código y se sale. Un EA se ejecuta continuamente mientras lo dejes correr.

¿Cómo se diferencian? A veces es difícil ya que funcionan de manera similar. Cuando se crea un nuevo script, se ve así:

Puedes ver que sólo tiene la función OnStart y dice : Función de inicio del programa de script.

Volviendo a tu problema, si ejecutas un EA que compruebe en la cuenta el patrimonio de la cuenta cuando no hay órdenes y lo tome como punto de referencia, podrá cerrar todas las órdenes cuando se alcance el beneficio deseado por cuenta.

El valor de un pip (dinero por pip) no es el mismo para todas las divisas. Un pip en el par AUDUSD no tiene el mismo valor que en el par GBPJPY.

¿Está buscando símbolos específicos para este EA o no importa qué símbolo, sólo para cerrar todas las órdenes cuando el beneficio por cuenta se alcanza?

Además, ¿el stop loss debería estar relacionado con la equidad de la cuenta o con la orden/pareja?

Sé que suena complicado pero no lo es tanto. Nuestros ordenadores son tan tontos que a menos que especifiques exactamente lo que quieres, se pierden.

¿Te ha servido de algo? Espero que sí.

Saludos


thrdel:


Hola de nuevo,

Como siempre, hay una buena y una mala noticia. ¿Quieres las malas noticias primero o las buenas?

Aquí está y si no lo explico lo suficientemente bien por favor hágamelo saber: Para que un EA pueda salir de las operaciones basado en el beneficio de la cuenta, necesita saber cuál era el capital de la cuenta antes de que se colocara la operación, para tener un punto de partida. ¿Tiene algún sentido?

Si no tiene un punto de partida para comparar o si no hay comparación, el EA nunca cerrará la operación mientras el beneficio de la cuenta sea negativo o cerrará todas las operaciones inmediatamente si el beneficio de la cuenta es positivo y está por encima de 100 o lo que sea el límite.

¿Tiene esto algún sentido?

El deslizamiento es la cantidad máxima de desviación del precio que le permite al corredor colocar o cerrar la orden sin volver a cotizar si usted abre o cierra a precio de mercado.Como la oferta y la demanda cambian continuamente, en el momento en que su orden llega al servidor si el valor del precio (oferta o demanda) está dentro de los límites de deslizamiento, la orden será procesada, de lo contrario se volverá a cotizar.

Sí, su código es un EA. Un script normalmente se ejecuta sólo una vez, se obtiene un nuevo tick, se ejecuta el código y se sale. Un EA se ejecuta continuamente mientras lo dejes correr.

¿Cómo se diferencian? A veces es difícil ya que funcionan de manera similar. Cuando se crea un nuevo script, se ve así:

Puedes ver que sólo tiene la función OnStart y dice : Función de inicio del programa de script.

Volviendo a tu problema, si ejecutas un EA que compruebe en la cuenta el patrimonio de la cuenta cuando no hay órdenes y lo tome como punto de referencia, podrá cerrar todas las órdenes cuando se alcance el beneficio deseado por cuenta.

El valor de un pip (dinero por pip) no es el mismo para todas las divisas. Un pip en el par AUDUSD no tiene el mismo valor que en el par GBPJPY.

¿Está buscando símbolos específicos para este EA o no importa qué símbolo, sólo para cerrar todas las órdenes cuando el beneficio por cuenta se alcanza?

Además, ¿el stop loss debería estar relacionado con la equidad de la cuenta o con la orden/pareja?

Sé que suena complicado pero no lo es tanto. Nuestros ordenadores son tan tontos que a menos que especifiques exactamente lo que quieres, se pierden.

¿Te ha servido de algo? Espero que sí.

Saludos

Hola de nuevo

Gracias por una respuesta muy clara.. y gracias por ser de gran ayuda .Ahora entiendo mucho lo que enseñaste..

"¿Buscas símbolos específicos para este EA o no importa qué símbolo, sólo para cerrar todas las órdenes cuando el beneficio por cuenta se alcanza?" = la segunda mitad con algunas condiciones es el requisito

"sólo para cerrar todas las órdenes cuando el beneficio por cuenta se alcanza"

El sistema de gestión de riesgos es un sistema de gestión de riesgos que se basa en el análisis de los riesgos de los sistemas de gestión de riesgos y de los sistemas de gestión de riesgos.

Estoy buscando un EA que haga las siguientes cosas:

1) No haga NADA si no hay ninguna orden o sólo una orden

2) Que cierre en X beneficios SOLO si hay DOS órdenes en marcha, sino pasa a 1)

3) Mientras cierra X, debería considerar el spread a pagar y considerar X como beneficio NETO [esto ya se ha explicado anteriormente que AccountProfit() niega directamente el spread que tienes que pagar y te muestra el beneficio neto y no el bruto... corregir si está mal ]

4) Como puedes ver, el SL y el TP no son una preocupación, yo no los uso así que no son necesarios en el EA

Ahora, estoy totalmente de acuerdo contigo en lo que respecta a las cosas gratuitas, además, aunque no sé codificar, creo que más de la mitad de lo que necesito ya está allí en el EA anterior ... Sólo tengo que encontrar algo para cambiar lo que hace sólo cuando dos órdenes están abiertas ... Creo que tiene que ver con ese bucle FOR allí .. o algo así .. =D [Ok, ahora estoy celoso de que ustedes puedan leer el código y yo no! .. ahora me siento como un tipo tonto del siglo 20 ! ahahha en el siglo 21 todo el mundo debe saber codificación >.< ]

Hice un diagrama de flujo mental rápido de mis necesidades

EA comienza ---> No hace nada hasta que hay 0 o 1 orden ----> Hace un 'sonido de llamada abierta' cuando la segunda orden se activa ----> Cierra ambas órdenes en X cantidad de beneficio puro [después de considerar la propagación] y hace un 'sonido de llamada cerrada' ]

por supuesto, los archivos de sonido de call open y call close pueden ser cualquier archivo de onda pequeña.. fácilmente disponible en el propio mt4. ... Creo que estas cosas se pueden lograr en la EA anterior que había publicado cambiando algunas cosas! jejeje ayudarme plz =D