¿Cómo codificar? - página 6

 

Código de error: 4109

Hola a todos:

Escribí un script para cerrar todas las operaciones incluyendo las órdenes pendientes, pero me decepcionó después de probarlo. Las funciones: OrderClose, y Orderdelete fallan en el cierre de las operaciones. Al llamar a la función GetLastError obtengo el código de error 4109 que se define en el archivo de cabecera de error como TRADE_NOT_ALLOWED.

Incluso he intentado ejecutar los scripts que vienen con la plataforma pero sin éxito.

Espero que alguien pueda resolver el problema.

Gracias,

Archivos adjuntos:
closeall2.mq4  2 kb
 

Bien, prueba esto. Creo que las variables Lots y Price deberían ser dobles y no enteras. Espero que esto ayude

//+------------------------------------------------------------------+

//| CloseAll.mq4 |

//| FX5 |

//| |

//+------------------------------------------------------------------+

#property copyright "FX5"

#property link " "

//+------------------------------------------------------------------+

//| script program start function |

//+------------------------------------------------------------------+

int start()

{

//----

int Ticket,Lots,Price,Type,Result;

int Error=0;

int Total=OrdersTotal();

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==0)

{

Alert("Can''t select the order indexed: ",i);

Alert("Error code is ", GetLastError());

Error++;

}

else

{

/* Lots=OrderLots();

Ticket=OrderTicket();

Type=OrderType();*/

Result=0;

/* if(Type==OP_BUY)

Price=Bid;

if(Type==OP_SELL)

Price=Ask;*/

// if(Type==OP_BUY || Type==OP_SELL)

if(OrderType()<=OP_SELL)

{

Alert(OP_BUY," ",OP_SELL," ",Type);

// Result=OrderClose(Ticket,Lots,Price,5,Blue);

if(OrderType()==OP_BUY) Result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Blue);

if(OrderType()==OP_SELL) Result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue);

}

else

{

Result=OrderDelete(OrderTicket());

}

if(Result==0)

{

Alert("Can''t close the Order number: ",i," with Ticket: ",Ticket);

Alert("Error Code: ",GetLastError());

Error++;

}

}

}

if(Error!=0)

Alert(Error," Errors have occured");

else

Alert("Close all Orders Succeeded with no Errors");

//----

return(0);

}

//+------------------------------------------------------------------+
 

pruebe esto

FX5:
Hola a todos:

Escribí un script para cerrar todas las operaciones incluyendo las órdenes pendientes, pero me decepcionó después de probarlo. Las funciones OrderClose, y Orderdelete fallan en el cierre de las operaciones. Al llamar a la función GetLastError obtengo el código de error 4109 que se define en el archivo de cabecera de error como TRADE_NOT_ALLOWED.

Incluso he intentado ejecutar los scripts que vienen con la plataforma pero sin éxito.

Espero que alguien pueda resolver el problema.

Gracias,

En metatrader, vaya a herramientas -> opciones, haga clic en la pestaña de asesor experto y seleccione permitir el comercio en vivo, y haga clic en el permitir las importaciones dll, y desmarque confirmar llamadas. Escribí unos cuantos scripts y tenía el mismo problema.

 
firedave:
Bien, prueba esto. Creo que las variables Lotes y Precio deben ser dobles y no enteras. Espero que esto ayude
//+------------------------------------------------------------------+

//| CloseAll.mq4 |

//| FX5 |

//| |

//+------------------------------------------------------------------+

#property copyright "FX5"

#property link " "

//+------------------------------------------------------------------+

//| script program start function |

//+------------------------------------------------------------------+

int start()

{

//----

int Ticket,Lots,Price,Type,Result;

int Error=0;

int Total=OrdersTotal();

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==0)

{

Alert("Can''t select the order indexed: ",i);

Alert("Error code is ", GetLastError());

Error++;

}

else

{

/* Lots=OrderLots();

Ticket=OrderTicket();

Type=OrderType();*/

Result=0;

/* if(Type==OP_BUY)

Price=Bid;

if(Type==OP_SELL)

Price=Ask;*/

// if(Type==OP_BUY || Type==OP_SELL)

if(OrderType()<=OP_SELL)

{

Alert(OP_BUY," ",OP_SELL," ",Type);

// Result=OrderClose(Ticket,Lots,Price,5,Blue);

if(OrderType()==OP_BUY) Result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Blue);

if(OrderType()==OP_SELL) Result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue);

}

else

{

Result=OrderDelete(OrderTicket());

}

if(Result==0)

{

Alert("Can''t close the Order number: ",i," with Ticket: ",Ticket);

Alert("Error Code: ",GetLastError());

Error++;

}

}

}

if(Error!=0)

Alert(Error," Errors have occured");

else

Alert("Close all Orders Succeeded with no Errors");

//----

return(0);

}

//+------------------------------------------------------------------+

Esto puede ser erróneo: para borrar varios pedidos, hay que empezar por el último ya que sus índices se van decrementando tras el proceso de borrado.

Así, en lugar de " for(int i=0;i=0;i--) "

 

Gracias firedave por la modificación del código. Era un pequeño error al que no había prestado atención.

Crepuscular, muchas gracias por la pista. Podría haber pasado un siglo antes de averiguar la solución. Por fin tengo un código que funciona.

 

Michel, ha sido una nota muy inteligente, muchas gracias.

 

obtener la función de reducción máxima

Me gustaría escribir una función que obtenga el máximo drawdown de las operaciones que se han cerrado. he llegado a dos soluciones.

1. Calcular el drawdown mientras la operación sigue activa. Guardar el número en una variable global y escribir los datos en un archivo según el número de ticket. MT4 tendría que estar siempre en línea.

2. obtener el drawdown obteniendo el máximo o mínimo del gráfico de 1 minuto. el problema aquí es que tenemos que tener el historial de 1 minuto para la operación. (usaría este método si pudiera obtener las barras de 1 minuto necesarias si no estuvieran ya descargadas)

Me gustaría encontrar una forma más agradable de obtener el máximo drawdown.

Se agradece cualquier aportación.

 
harriss:
Me gustaría escribir una función que obtenga el drawdown máximo de las operaciones que se han cerrado.

1. calcular el drawdown mientras la operación sigue activa. guardar el número en una variable global y escribir los datos en el archivo según el número de ticket. MT4 tendría que estar siempre en línea.

2. obtener el drawdown obteniendo el máximo o mínimo del gráfico de 1 minuto. el problema aquí es que tenemos que tener el historial de 1 minuto para la operación. (usaría este método si pudiera obtener las barras de 1 minuto necesarias si no estuvieran ya descargadas)

Me gustaría encontrar una forma más agradable de conseguir el máximo drawdown.

Se agradece cualquier aportación.

Salam harriss,

¿Qué quieres decir con "drawdown"?

¿Te refieres a la pérdida máxima que ha tenido una de las operaciones cerradas?

 

drawdown

Lo que quiero decir con drawdown es, cuál es el punto más bajo de la operación. Por ejemplo, si la operación alcanza el stoploss, entonces el stoploss sería el drawdown. Ahora bien, si la operación terminó en el lado positivo y fue -15 pips en un punto, entonces el drawdown sería 15. Por último, si la operación cerrara con -15 pips pero estuviera en -30 en un momento dado, el drawdown sería de 30.

 

¿Cómo codificar las alertas/alarmas para los indicadores?

Hola me gustaría aprender más sobre cómo codificar las alertas.

No soy un programador, pero tengo la cabeza sobre los hombros y, en general, soy capaz de juguetear con algo, desarmarlo y volver a armarlo más cerca de la forma en que lo quiero.

He revisado algunos de los indicadores con alertas y he copiado las funciones generales de alerta que he visto a otros indicadores que he querido tener alertas. He tenido resultados mixtos.

Me he dado cuenta de que las principales funciones que se llaman para las alertas son la función Alert(), la función Comment() y la función Playsound(). Hasta ahora estoy más familiarizado con la función Alert(). ¿Hay alguna diferencia significativa entre Alert() y Playsound(), por ejemplo?

El problema general que tengo es que no sé cómo codificar las alertas lo suficiente como para que ambas sean perceptibles por un lado pero que no distraigan ridículamente por otro. Por ejemplo, si se utiliza la función Alert() para algunos cruces y el indicador no ha impreso con finalidad en la barra actual, la alerta puede repetirse una y otra vez y tengo problemas para desactivar la alerta. Normalmente tengo que cambiar el marco temporal del gráfico.

En primer lugar, ¿hay una forma sencilla de desactivar la alerta sólo para la barra actual?

En segundo lugar, ¿hay alguna manera de codificar una alerta para que no sea una molestia interminable introduciendo un código que restrinja el número de iteraciones o que dé a la alerta una duración fija? ¿Cómo lo codificarías?

Una solución que veo es retrasar la alerta hasta la siguiente barra para que no esté cambiando constantemente pero eso tiene la desventaja de no ser oportuno.

Para evitar la molestia de las alarmas berserk en los indicadores, he utilizado las alertas de precio predeterminadas que uno puede establecer usando la ventana de la terminal y ayuda pero no es lo ideal.

También soy consciente de que se pueden crear Asesores Expertos para dar alertas y que hay un botón que puede activar y desactivar sus alertas fácilmente. El problema que tengo con los EAs, sin embargo, es que me doy cuenta de que otro programa importante que ejecuto simultáneamente con MetaTrader parece experimentar la interferencia cuando los Asesores Expertos se activan y se ejecuta con lentitud.

¿Hay alguna otra solución a este problema?

Si hay algún indicador por ahí que tenga un código de alerta que evite los escollos que he enumerado y que pueda servir como un buen ejemplo de cómo codificar y alertar ¿podríais remitirme a él y/o publicarlo?

Muchas gracias.