¿Cómo codificar? - página 250

 
mladen:

Hola Mladen, gracias por tu ayuda, he aplicado tus cambios pero realmente no funciona, tal vez sería más simple si el EA simplemente ignora cualquier operación abierta existente, es decir, sólo las deja abiertas, y luego abre y cierra su propia nueva operación individual

En este momento abre y cierra su propia operación, pero también cierra cualquier operación abierta adicional.

 

aumentar

De un código parcial esto es lo que podría sugerir. Si se crea un parámetro booleano NoCloses,y si ese parámetro se pone en true, no debería cerrar las órdenes si se aplica como el snippet (si CBy CSno son iguales a 1 ese código no cerrará las órdenes)

saludos

Mladen

increase:
Hola Mladen, gracias por tu ayuda, he aplicado tus cambios pero realmente no funciona, tal vez sería más simple si el EA sólo ignora cualquier operación abierta existente, es decir, sólo las deja abiertas, y luego abre y cierra su propia nueva operación individual Por el momento abre y cierra su propia operación, pero también cierra cualquier operación abierta adicional existente
 
mladen:
aumentar

De un código parcial esto es lo que podría sugerir. Si se crea un parámetro booleano NoCloses,y si ese parámetro se pone en true, no debería cerrar las órdenes si se aplica como el snippet (si CBy CSno son iguales a 1 ese código no cerrará las órdenes)

saludos

Mladen

Eso es cierto, pero a no ser que lo haya entendido mal, ¿eso significa que la operación abierta por el EA tampoco se cerrará nunca, por lo que sólo cambiará entre compra y venta?

 

Sí, eso es correcto.

Por lo que entendí, esa era tu idea: dejar que el EA abriera las órdenes y luego tú gestionarías las órdenes (cerrándolas) manualmente. Con ese parámetro puedes incluso cambiarlo a false y entonces el EA volverá a cerrar las órdenes - así que es "controlable desde fuera", más o menos

increase:
Eso es cierto, pero a no ser que lo haya entendido mal, eso significa que la operación abierta por el EA tampoco se cerrará nunca, por lo que sólo cambia entre compra y venta?
 
mladen:
Si, eso es correcto. Por lo que entendí esa era tu idea: dejar que el EA abra órdenes y luego tú gestiones las órdenes (cerrándolas) manualmente. Con ese parámetro puedes incluso cambiarlo a false y entonces el EA volverá a cerrar las órdenes - así que es "controlable desde fuera", más o menos

Ah lo siento fui ambiguo, quiero que el EA abra y cierre su orden e ignore cualquier orden existente, así por ejemplo

1. Tengo 5 órdenes de venta abiertas

2. Aplico el EA y abre 1 orden de compra

3. Ahora tengo 5 de venta y 1 de compra

4. El EA ahora desencadena una venta por lo que cierra su compra

5. Ahora tengo 6 órdenes de venta (5 existentes, 1 de venta del EA)

6. El EA ahora desencadena una compra por lo que cierra su venta

7. Ahora tengo 5 órdenes de venta y 1 de compra, etc.

Voy a cerrar las ventas existentes, el EA ignora cualquier otra operación aparte de la suya propia, como en el caso anterior.

 

aumentar

Ya lo hace si estableces el parámetro Magic a un valor distinto de 0 (es una parte del código que comprueba si debe cerrar una orden de compra justo antes de la orden de cierre)

if(OrderType()==OP_BUY&&OrderSymbol()==Symbol()&&( (OrderMagicNumber()==Magic)||Magic==0))

Así que si el "Magic" no es igual a 0 y siempre que el valor de Magic sea único, sólo cerrará las órdenes abiertas por él mismo

increase:
Ah, lo siento, fui ambiguo, quiero que el EA abra y cierre su orden e ignore cualquier orden existente, así que por ejemplo

1. Tengo 5 órdenes de venta abiertas

2. Aplico el EA que abre 1 orden de compra

3. Ahora tengo 5 de venta y 1 de compra

4. El EA ahora desencadena una venta por lo que cierra su compra

5. Ahora tengo 6 órdenes de venta (5 existentes, 1 de venta del EA)

6. El EA ahora desencadena una compra por lo que cierra su venta

7. Ahora tengo 5 órdenes de venta y 1 de compra, etc.

Voy a cerrar las ventas existentes, el EA ignora cualquier otra operación aparte de la suya propia, como en el caso anterior
 

Operar una vez por barra para un marco de tiempo específico

¡Hola, queridos fEllA's!

Tengo EA (yeeaa, que no) que funciona bien en tester, toma múltiples operaciones por 4H Bar, como se indica. Ahora, al probarlo en Demo (Alpari UK) con 11 pares, el EA sólo toma 1 operación, cuando debería tomar más (3 como máximo, según las instrucciones). Sólo cada barra 4H, si se cumplen las condiciones.

Tengo la función 'Semaphor' con GlobalVariable codificada, y este trozo de código, para evitar la apertura de múltiples órdenes dentro de 1 TimeFrame predefinido (4H en este caso):

//Compra

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))

{

si (SignalsOnly)

{

// ------ La alerta debe ser sólo una vez por señal O una vez cada 15 o 30 minutos

if (CheckAlertTime == iTime (NULL, 5, 0)) return(0);

else CheckAlertTime = iTime (NULL, 5, 0);

if (Alerts) Alert (Symbol() + " " + DoubleToStr (Ask, Digits) + " BUY Signal");

if (PlaySounds) PlaySound (WhichSound);

}

if (!IsTrade && !SignalsOnly)

{

if (CheckAlertTime == iTime (NULL, OncePerBarTF, 0)) return (0);

else CheckAlertTime = iTime (NULL, OncePerBarTF, 0);

//Comprobar el margen libre

if (AccountFreeMargin() < (1000 * Lots))

{

Print ("No tenemos dinero. Margen libre = ", AccountFreeMargin());

return(0);

}

if (UseTakeProfit && CloseLotsPercent == 100) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

{

if (MoneyManagement) Lots = NormalizeDouble ((AccountFreeMargin() * Risk / 100 / ((Ask - BuySL) / Point / TickValue)), 2);

si no Lots = Lots;

}

if (TradeIsBusy() && IsTradingAllowed() < 0)

return (-1);

RefreshRates();

Ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "7Qi BUY " + MagicNo, MagicNo, 0, DodgerBlue);

if (Ticket > 0)

{

if (OrderSelect (Ticket, SELECT_BY_TICKET, MODE_TRADES))

{

Print ("7Qi BUY opened: ", OrderOpenPrice());

if (Alerts) Alert (Symbol() + " " + DoubleToStr (Ask, Digits) + " BUY opened");

if (PlaySounds) PlaySound (WhichSound);

}

else

{

Print ("Error al abrir BUY: ", Err);

}

}

// TradedThisBar = Bars;

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

TradeIsNotBusy();

return (0);

}

}

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

¿Es posible que este código:

if (CheckAlertTime == iTime (NULL, OncePerBarTF, 0)) return (0);

else CheckAlertTime = iTime (NULL, OncePerBarTF, 0);

¿Impedir que el EA opere a mitad de la hora? ¿Comprueba sólo al principio de la barra?

Si uso la función "TradedThisBar = Bars" tendría que dejar al EA en 1 TimeFrame solamente, ¿correcto?

La función "Semaphor" está codificada en TrailingStops también, PartialCloseLots también.

Gracias a todos por su ayuda,

Que se diviertan,

Simon

Eslovenia

 

Iiiiiik - He encontrado el problema

¡Hola!

He encontrado el problema - es muy probablemente la combinación de:

if (TradeIsBusy() /*&& IsTradingAllowed()*/ < 0)

devolver (-1);

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

int IsTradingAllowed (int MaxWaitingSec = 30)

{

if (!IsTradeAllowed())

{

int StartWaitingTime = GetTickCount();

Imprima ("¡El contexto comercial está ocupado! Espere hasta que se libere...");

if (Alerts) Alert (Symbol() + " ¡No se permite la negociación de EA! Esperando...");

while (true)

{

if (IsStopped())

{

Imprime ("¡El EA fue terminado!");

return(-1);

}

if (GetTickCount() - StartWaitingTime > MaxWaitingSec * 1000 )

{

Print( "¡Límite de espera excedido (" + MaxWaitingSec + " seg)!" );

return(-2);

}

if (IsTradeAllowed())

{

Imprime ("¡El contexto comercial está ahora libre!");

return(0);

}

Sleep (100);

}

}

si no

{

Imprimir ("¡El contexto comercial está libre!");

return(1);

}

}

*/

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

int TradeIsBusy (int MaxWaitingSec = 30)

{

if (IsTesting()) return(1);

int Err = 0, StartWaitingTime = GetTickCount();

while (true)

{

if (IsStopped())

{

Imprime ("¡El EA fue terminado!");

return(-1);

}

if (GetTickCount() - StartWaitingTime > MaxWaitingSec * 1000)

{

Print ("¡Tiempo de espera (" + MaxWaitingSec + " seg) excedido!");

if (Alerts) Alert (Symbol() + " ¡Tiempo de espera del EA excedido!");

return(-2);

}

if (GlobalVariableCheck ("TradeIsBusy"))

romper;

si no

{

Err = GetLastError();

if (Err != 0)

{

Print ("TradeIsBusy - GlobalVariableCheck - Error # ", Err);

Dormir (100);

continuar;

}

}

if (GlobalVariableSet ("TradeIsBusy", 1.0) > 0) return(1);

si no

{

Err = GetLastError();

if (Err != 0)

{

Print ("TradeIsBusy - GlobalVariableSet - Error # ", Err);

Sleep(100);

continuar;

}

}

}

while (true)

{

si (IsStopped())

{

Imprime ("¡El EA fue terminado!");

return(-1);

}

if (GetTickCount() - StartWaitingTime > MaxWaitingSec * 1000)

{

Print ("¡Tiempo de espera (" + MaxWaitingSec + " seg) excedido!");

if (Alerts) Alert (Symbol() + " ¡tiempo de espera excedido!");

return (-2);

}

if (GlobalVariableSetOnCondition ("TradeIsBusy", 1.0, 0.0 )) return (1);

si no

{

Err = GetLastError();

if (Err != 0)

{

Print ("TradeIsBusy - GlobalVariableSetOnCondition - Error # ", Err);

continuar;

}

}

if (Alerts) Alert (Symbol() + " - esperando que otro EA termine de operar...");

Sleep (1000);

}

}

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

void TradeIsNotBusy()

{

int Err;

if (IsTesting())

{

return(0);

}

while (true)

{

if (IsStopped())

{

Imprime (Symbol() + " ¡El EA fue terminado!" );

return(-1);

}

if (GlobalVariableSet ("TradeIsBusy", 0.0) > 0) return(1);

si no

{

Err = GetLastError();

if (Err != 0)

Print ("TradeIsNotBusy - GlobalVariableSet - Error # ", Err);

}

Sleep (100);

}

}

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

Probaré sin la función IsTradeAllowed.

Gracias de todos modos,

Que te diviertas,

Simon

 

código de error 130

----- borrado ----- ya no es necesario......

 

Tutorial descargable de mq4

Hola chicos,

no encuentro un tutorial o libro de referencia ( ¡no online! ) sobre el código mq4.

¿pueden ayudarme?

Saludos cordiales

RESUELTO, tuve que descomprimir el archivo con una utilidad.

Razón de la queja: