Funciones útiles de KimIV - página 49

 
KimIV писал (а) >>

Ejemplos de cómo utilizar la función ExistOrders().

5. Compruebe cualquier pedido con un tiempo de ajuste de 2 horas o más

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);

Buenas noches, estoy un poco confundido por este comentario. ¡Estoy aquí sentada averiguando! No sé cómo formular mi condición correctamente: "no antes de 5 minutos" o "no después de 5 minutos". (¡Lo tenía claro antes de empezar a pensar en ello!)

Necesito eliminar una orden pendiente si no se ha activado en un tiempo determinado. ¡Por ejemplo, en los 5 minutos siguientes a la configuración de !

Lo he hecho:

if (ExistOrders(NULL, OP_BUYSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР BUYSTOP > 5 min 
                 DeleteOrders(NULL, OP_BUYSTOP, Magic);
if (ExistOrders(NULL, OP_SELLSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР SELLSTOP > 5 min  
                 DeleteOrders(NULL, OP_SELLSTOP, Magic);

¿Es esto correcto? Pero no funciona en el probador. Los pedidos se hacen y se borran inmediatamente.

Por favor, aconséjeme cómo escribir correctamente la función ExistOrders().

 
rid писал (а) >>
Estoy un poco confundido...

Parece que yo también estoy confundido. Vamos a juntarnos... :-)

Se ha introducido el parámetro ot (tiempo de colocación del pedido) en la función ExistOrders para tratar correctamente los errores 128, 142 y 143. El objetivo del tratamiento de errores es excluir las configuraciones dobles (en casos prácticos, incluso triples) del mismo orden. Para ello, se memoriza la hora de envío de la orden y se pausan los intentos de negociación. Tras la pausa, se comprueba la presencia de la orden con la hora fijada después de la memorizada. Si hay una orden, se concluye que se ha alcanzado el objetivo (se ha fijado la orden) y se terminan los intentos de negociación. En otras palabras, el tiempo después del cual se comprueba el ajuste de la orden se pasa al parámetro ot. Más tarde = no antes.

rid escribió (a) >>
Necesito eliminar una orden pendiente si no se ha activado en un tiempo determinado. ¡Por ejemplo, a los 5 minutos de poner !

El parámetro ot de la función ExistOrders no es útil aquí. Funciona en sentido contrario. Trabaja en la dirección de acercarse al presente. Lo que hay que hacer es trabajar hacia atrás. El parámetro de expiración de la función OrderSend (o el parámetro ex de la función SetOrder) es ideal para esto.

 

La función ClosePosBySelect() para el probador.

Ejecuta el cierre de una posición preseleccionada. Esta es una versión ligera de la función del mismo nombre, publicada anteriormente en la página 13. Nada extra. No hay características adicionales. En mi práctica, nunca he tenido una posición que no estuviera cerrada en el probador. Por eso no hay controles en esta función. Son innecesarios en el probador.

//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;

  if (OrderType()==OP_BUY) {
    pp=MarketInfo(OrderSymbol(), MODE_BID);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=MarketInfo(OrderSymbol(), MODE_ASK);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}

SZY. Ejemplo de uso de la función ClosePosBySelect() que daré más adelante, junto con la función OpenPosition() para el probador.

 

Hola a todos. Para no tener que rebuscar en las páginas cada vez, tuve que hacer el contenido rama por rama.

He consolidado las funciones de temas similares. Contenido de 1 a 40 páginas.

Aquellos que lo deseen pueden continuar y añadir otras páginas y ponerlas aquí.

Archivos adjuntos:
 

Hola Igor, necesito tu ayuda. He decidido implementar la función de cierre en e-CloseByProfit EA similar a e-CloseByPercentProfit.

Todo funciona bien, el asesor experto funciona correctamente y el terminal se cierra. Pero cuando vuelvo a abrir el terminal, lo cierra enseguida.

Por favor, ayúdenme a cambiar el código para corregir este problema.

//+----------------------------------------------------------------------------+
//| e-CloseByProfit.mq4 ||
//| Kim Igor V. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| 22.10.2006 El Asesor Experto cierra todas las posiciones tan pronto como el | especificado
//| nivel de beneficio.
//| 20.06.2008 Corregido error en el cálculo del beneficio en puntos. ||
//+----------------------------------------------------------------------------+
#property copyright "Kim Igor V. aka KimIV"
#enlace de la propiedad "http://www.kimiv.ru"
#define MAGIC 20061022

//------- Parámetros externos del Asesor Experto ------------------------------------------
cadena externa _P_Experto = "---------- parámetros EA";
extern bool CurSymbolOnly = false; // Sólo el símbolo actual
extern intProfit = 100; // TakeProfit
extern bool CloseTerminal = False; // Cerrar terminal
extern bool ShowComment = True; // Mostrar comentario
extern int NumberAccount = 0; // Número de cuenta de trading
extern bool UseSound = True; // Utilizar la señal de sonido
extern string NameFileSound = "manycoin.wav"; // Nombre del archivo de sonido
extern int Desplazamiento = 3; // Desplazamiento del precio
extern inttern NumberOfTry = 5; // Número de intentos

//------- Variables globales del Asesor Experto --------------------------------------
color clCloseBuy = Azul; // color clCloseSell = Rojo; // color del símbolo de cierre de compra
color clCloseSell = Rojo; // color de la bandera de cierre de venta
int CurProfit;

//------- Conexión de módulos externos -------------------------------------------
#include <stdlib.mqh>.
#include <WinUser32.mqh>

//+----------------------------------------------------------------------------+
//| función de inicialización de expertos |
//+----------------------------------------------------------------------------+
void init() { if (!IsTesting()) Comment(""); }

//+----------------------------------------------------------------------------+
//| función de desinicialización experta |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comment("); }

//+----------------------------------------------------------------------------+
//| función de inicio experto |
//+----------------------------------------------------------------------------+
void start() {
if (!IsTesting()) {
if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
Message("La negociación en la cuenta está PROHIBIDA" +Número de cuenta());
volver;
} si no Comentario(");
}

CloseByProfit();
if (ShowComment) {
Comentario(IIFs(CurSymbolOnly, "CurSymbolOnly ","),
"Beneficio actual=",CurProfit," p."
"Cerrar Beneficio=",TakeProfit," p."
);
}
}


//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versión: 19.02.2008
//| Descripción : Cierre de una posición preseleccionada |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
bool fc;
clCerrar;
doble ll, pa, pb, pp;
int err, it;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped()) break;
while (!IsTradeAllowed()) Dormir(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType()==OP_BUY) {
pp=pb; clCerrar=cerrarCompra;
} si no {
pp=pa; clCerrar=cerrarVender;
}
ll=Lotes de pedido();
fc=CierreDePedido(OrderTicket(), ll, pp, Slippage, clClose);
si (fc) {
if (UseSound) PlaySound(NameFileSound); break;
} si no {
err=GetLastError();
if (err==146) while (IsTradeContextBusy()) Dormir(1000*11);
Print("Error(",err,") Cerrar ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Dormir(1000*5);
}
}
} else Print("Operación comercial no válida. Close ",GetNameOP(OrderType());
}

//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versión: 19.02.2008
//| Descripción : Cierre de posiciones a precio de mercado primero rentable |
//+----------------------------------------------------------------------------+
//| Parámetros: |
//| sy - nombre del instrumento (" - cualquier símbolo, |
//| NULL - símbolo actual) |
| //| op - operación (-1 - cualquier posición) |
//| mn - MagicNumber (-1 - cualquier magik) |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=Total de Pedidos();
if (sy=="0") sy=Símbolo();

// Primero cerrar las posiciones rentables
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
si ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
si (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// luego todo lo demás
k=Total de pedidos();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
si ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}

//+----------------------------------------------------------------------------+
//| Cierre de todas las posiciones con beneficios. ||
//+----------------------------------------------------------------------------+
void CloseByProfit() {
doble pa, pb, pp;
int, k=Total de pedidos(), pr=0;

for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (!CurSymbolOnly || OrderSymbol()==Symbol()) {
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
pp=MarketInfo(OrderSymbol(), MODE_POINT);
if (pp==0) if (StringFind(OrderSymbol(), "JPY")<0) pp=0.0001; else pp=0.01;
if (OrderType()==OP_BUY) {
pr+=NormalizarDoble((pb-PrecioAbierto())/pp, 0);
}
if (OrderType()==OP_SELL) {
pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp, 0);
}
}
}
}
CurProfit=pr;
si (CurProfit>=TakeProfit) ClosePosFirstProfit();
if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
//+----------------------------------------------------------------------------+
//| Cerrar el terminal de comercio. ||
//+----------------------------------------------------------------------------+
void CloseTerminal() {
Print("CloseTerminal() se ha disparado;)
int hwnd=WindowHandle(Symbol(), Period());
int hwnd_parent=0;

while(!IsStopped()) {
hwnd=GetParent(hwnd);
si (hwnd==0) break;
hwnd_parent=hwnd;
}
if (hwnd_parent!=0) PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);
}

//+----------------------------------------------------------------------------+
//| Devuelve la bandera de existencia |
//| Parámetros: |
//| sy - nombre del instrumento (" - cualquier símbolo, |
//| NULL - símbolo actual) |
| //| op - operación (-1 - cualquier posición) |
//| mn - MagicNumber (-1 - cualquier magik) |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1) {
int i, k=Total de Pedidos();

if (StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy==") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) return(True);
}
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versión: 01.09.2005
//| Descripción : Devuelve el nombre de la operación comercial |
//+----------------------------------------------------------------------------+
//| Parámetros: ||
//| op - identificador de la operación comercial |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
switch (op) {
case OP_BUY : return("Comprar");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("BuyLimit");
case OP_SELLLIMIT : return("SellLimit");
case OP_BUYSTOP : return("BuyStop");
case OP_SELLSTOP : return("SellStop");
por defecto : return("Operación desconocida");
}
}

//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versión : 01.02.2008 |
//| Descripción : Devuelve uno de dos valores dependiendo de la condición. ||
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
si (condición) return(ifTrue); si no return(ifFalse);
}

//+----------------------------------------------------------------------------+
//| Mensaje de salida para comentar y registrar
//+----------------------------------------------------------------------------+
void Mensaje(cadena m) {
Comentario(m);
if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+

 
Vkorch писал (а) >>
Hola Igor, necesito tu ayuda. He decidido escribir la función de cierre de la terminal en e-CloseByProfit EA similar a e-CloseByPercentProfit.

Todo funciona bien, el EA funciona, el terminal se cierra. Pero cuando vuelvo a abrir el terminal, el Asesor Experto lo cierra inmediatamente.
Ayudar a cambiar un código de manera, que para eliminar esta falta.

Hazlo así:

CurProfit=pr;
if (CurProfit>=TakeProfit) {
  ClosePosFirstProfit();
  if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
 
KimIV писал(а) >>

Hazlo así:

Gracias, Igor. Lo he arreglado. Pero al compilar, tengo un error

'(' - definición de la función inesperada C:\N-Archivos de Programa\N-MetaTrader - Alpari\Nexperts\N-CloseByProfit.mq4 (180, 19)

¿Qué debo hacer?

 

Igor, ¿podrías hacer una biblioteca de funciones para trabajar con órdenes y posiciones? La biblioteca ha sido desarrollada y probada durante más de 2 años, adjunto los archivos, tal vez algunas ideas sean útiles.

En cuanto a

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

Quizás sería mejor llamar a OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44);

а

double pa=MarketInfo("USDCAD", MODE_ASK);
double pb=MarketInfo("USDCAD", MODE_BID);
double po=MarketInfo(
"USDCAD", MODE_POINT);
y this insert 
  
 
double
lot_min
=MarketInfo(Symbol(),MODE_MINLOT)
; 
if(Lots<lot_min) return;

calcular dentro de la función, es decir, pasar el valor de sl a y tp, y calcular y normalizar todo correctamente dentro de la función.


	          
Archivos adjuntos:
 

¡Hola Igor!

Si tengo una posición de 0,3 lotes abierta, necesito:

1.Cerrar parte de una posición de 0,1 lotes.

Modificar (mover el stop loss a otro nivel)

2,1 Más cerrar parte de la posición 0,1 lote.

Modificar (poner el stop loss en otro nivel).

3.Cerrar posición.

¿Una pregunta más? Cuando la posición parcial está cerrada.

OrderClose(OrderTicket(),NormalizeDouble(OrderLots()/3,2),Ask,3,Violet);

Me aparece el error 131 (volumen incorrecto). ¿Cómo puedo corregirlo?

Respuesta por favor para un principiante. puede ser en palabras.

.

 
Prival писал (а) >>
Igor, ¿sería posible hacer que las funciones trabajen con órdenes y posiciones como una biblioteca?

No, no es... En principio, ya está arreglado como debe ser... No lo publico porque aún no se han publicado todas las funciones de esta biblioteca... Quedan un par o tres que han aparecido desde el inicio de este hilo.

Y voy a pensar en el resto...