¿Cómo codificar? - página 287

 

...

Echa un vistazo a este post : https://www.mql5.com/en/forum/174385/page12

Se trata de un problema similar y se puede utilizar ese mismo countOpenedOnACurrentBar

para limitar la apertura de una sola operación por crossover

dipu:
Hola amigos, soy un novato. Tengo una estrategia simple. Yo sólo scalping cuando EMA crossover. Sólo tomo un comercio en cada cruce. Necesito un código que puede tomar el comercio sólo un comercio en cada cruce de EMA. Por favor......
 

Simplemente el código de cruce de EMA necesita........

Muchas gracias, MLADEN...

Acabo de comprobar su función. Se ve bien. También necesito algo de ayuda. Tengo necesidad de añadir RSI(50) valor con EMA crossover....¿Cómo puedo...?

Pares: GBP/USD & EUR/USD

Marco de tiempo: 15min,1 hora y superior;

-------------------------------

COMPRA: EMA 5 Cruzar EMA 12 al alza, RSI mayor de 50

VENDER: EMA 5 Cruzar EMA 12 a la baja, RSI menor de 50

(sólo una operación en cada cruce de EMA)

Espero respuesta. Por favor .......

 

Puedes hacerlo de dos maneras.

Una forma (directamente en el EA) podría ser algo así :

double macdc = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,0)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,0);

double macdp = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,1)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,1);

double rsi = iRSI(NULL,0,RsiPeriod,RsiPrice,0);

if (macdc*macdp<0) // change of sign, signal for a new order

{

if (macdc>0 && rsi>50) ... code for buy

if (macdc<0 && rsi<50) ... code for sell

}

[/PHP]

The good thing about it is that it is small (the code) and does not take any significant process time. The bad thing when using conditions like that in an EA is that you have to imagine (and test, test, test ...) what is it going to perform like. I prefer making a "binary" indicator with which the it is very easy to visually inspect if the condition has any logic in it and if it is going to be profitable or not and then call that indicator (using iCustom()) from the EA.

Here is how would the indicator with the above conditions look like in "binary" form :

Usted tiene toda la información necesaria : la línea gris es la "tendencia". Las líneas verdes y rojas pueden usarse como puntos de entrada y reentrada. Puedes "optimizarlo" visualmente en un instante, y luego usar esos parámetros en el EA (una "optimización" mucho más rápida visualmente que el doloroso "cambiar parámetros, ejecutarlo, ver lo que tienes y luego lo mismo una y otra vez". Y es bastante fácil llamarlo desde el EA. Sería así :

[PHP] double trendc = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

si (trendc!=trendp)

{

if (trendc== 1) ... señal de compra

si (trendc==-1) ... señal de venta

}

Así que en definitiva, siempre recomiendo utilizar un indicador de uso de un Ea. Incluso puedes cambiar la lógica del Ea sin tocarlo simplemente alterando y refinando el código de tus indicadores, en cuyo caso el EA es "sólo" un marco para las órdenes y la gestión del dinero (ya que las señales vienen del indicador), lo que en mi opinión es una forma más eficiente de utilizar los EAs. Adjuntando también el indicador, para que usted decida qué forma (la directa o la "por indicador") quiere utilizar en su Ea

PD: en los ejemplos anteriores, las pruebas se realizan en la barra actual (aún abierta). Si desea probar la barra cerrada, sustituya el 0 y el 1 por el 1 y el to en las llamadas a iCustom(),iMa() e iRSI()

dipu:
Muchas gracias, MLADEN...

Acabo de comprobar su función. Se ve bien. También necesito algo de ayuda. Necesito añadir el valor de RSI(50) con el cruce de EMA....¿Cómo puedo...?

Pares: GBP/USD & EUR/USD

Marco de tiempo: 15min,1 hora y superior;

-------------------------------

COMPRA: EMA 5 Cruzar EMA 12 al alza, RSI mayor de 50

VENDER: EMA 5 Cruzar EMA 12 a la baja, RSI menor de 50

(sólo una operación en cada cruce de EMA)

Estoy esperando la respuesta. Por favor, .......
Archivos adjuntos:
 

¿Saldo del día 1 del mes?

Gidday He estado sentado aquí tratando de averiguar si hay una manera de extraer el saldo inicial para el 1 de mes para una visualización en pantalla.

Lo que estoy tratando de hacer es obtener la diferencia porcentual entre el saldo del día 1 y el saldo actual.

Tengo la diferencia porcentual total.

(Saldo - Depósito)/Depósito*100

Me gustaría añadir una diferencia mensual.

(Saldo - 1º)/1º*100

Cualquier consejo o código real sería genial.

Saludos

Beno

 

Gracias de nuevo, MALADEN...

Gracias por tu indicador y tus consejos. Acabo de tratar de seguir su instrucción. Pero como soy inexperto en mq4, no pude hacerlo................

AQUÍ ESTÁ MI..............

------------------------------------

-----------------------------------

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_color1 LimeGreen

#propiedad indicator_color2 PaleVioletRed

#propiedad indicator_color3 DarkGray

#propiedad indicator_width1 2

#propiedad indicator_width2 2

#propiedad indicador_mínimo -1.1

#property indicador_máximo +1.1

extern int EmaFast = 5;

extern int EmaSlow = 12;

extern int EmaPrice = PRICE_CLOSE;

extern int RsiPeriod = 14;

extern int RsiPrice = PRICE_CLOSE;

double signup[];

double signdn[];

double trend[];

extern double TakeProfit=15,0;

extern double Lots=0.1;

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

//

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

int init()

{

return(0);

}

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

//

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

int inicio()

{

int count,counted_bars=IndicatorCounted();

if(counted_bars < 0) return(-1);

if(barras_contadas>0) barras_contadas--;

int límite = MathMin(Bares-barras contadas,Bares-1);

int cnt, ticket, total;

double trendc = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

si (trendc!=trendp)

total = OrdersTotal();

if(total < 1)

{

if (trendc== 1) //... señal de compra

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "My EA",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de COMPRA abierta : ",OrderOpenPrice());

}

else Print("Error al abrir la orden de COMPRA : ",GetLastError());

return(0);

}

if (trendc==-1) //... señal de venta

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de venta abierta : ",OrderOpenPrice());

}

else Print("Error al abrir la orden de VENTA : ",GetLastError());

return(0);

}

}

return(0);

}

---------------------------------------

---------------------------------------

Necesito tu ayuda....

Me disculpé a u si me aspecto más a u como usted cayó perturbar. Pero yo realmente impotente ...

Estoy esperando la respuesta. Por favor, .......

 

...

Intente usar algo como esto :

double balanceAtStartOfMonth(int forMonth)

{

double current = AccountBalance();

datetime startTime = iTime(NULL,PERIOD_MN1,forMonth);

//

//

//

//

//

for (int k=OrdersHistoryTotal()-1; k>=0; k--)

{

if (!OrderSelect(k,SELECT_BY_POS,MODE_HISTORY)) break;

if (OrderCloseTime()<startTime) continue;

current -= (OrderProfit()+OrderSwap());

}

return(current);

}

forMonth es el mes hacia atrás para el que desea ver el saldo 0 siendo el mes actual. A continuación, calcula cuál era el saldo en el primer día del mes requerido. La función tendrá en cuenta los depósitos y retiros también (OrderType() == 6) por lo que debería funcionar bien.

Beno:
Gidday He estado sentado aquí tratando de averiguar si hay una manera de extraer el saldo inicial para el 1 de mes para una visualización en pantalla.

Lo que estoy tratando de hacer es obtener la diferencia porcentual entre el saldo del día 1 y el saldo actual.

Tengo la diferencia porcentual total.

(Saldo - Depósito)/Depósito*100

Me gustaría añadir una diferencia mensual.

(Saldo - 1º)/1º*100

Cualquier consejo o código real sería genial.

Saludos

Beno
 

...

No se pueden gestionar órdenes desde el indicador. Usted puede manejar las órdenes sólo de las secuencias de comandos o EAs (que es el caso que usted está buscando). El código de tu post es un indicador.

Los ejemplos que he publicado son para ser utilizado desde un EA (por lo que he entendido que ya tiene un EA en el que desea limitar el número de órdenes y desea probar las condiciones ema y rsi para las entradas).

dipu:
Gracias de nuevo, MALADEN...

Gracias por tu indicador y consejos. Yo sólo trato de seguir su instrucción. Pero como soy inexperto en mq4, no pude hacerlo................

AQUÍ ESTÁ MI..............

------------------------------------

-----------------------------------

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_color1 LimeGreen

#propiedad indicator_color2 PaleVioletRed

#propiedad indicator_color3 DarkGray

#propiedad indicator_width1 2

#propiedad indicator_width2 2

#propiedad indicador_mínimo -1.1

#property indicador_máximo +1.1

extern int EmaFast = 5;

extern int EmaSlow = 12;

extern int EmaPrice = PRICE_CLOSE;

extern int RsiPeriod = 14;

extern int RsiPrice = PRICE_CLOSE;

double signup[];

double signdn[];

double trend[];

extern double TakeProfit=15,0;

extern double Lots=0.1;

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

//

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

int init()

{

return(0);

}

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

//

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

int inicio()

{

int count,counted_bars=IndicatorCounted();

if(counted_bars < 0) return(-1);

if(barras_contadas>0) barras_contadas--;

int límite = MathMin(Bares-barras contadas,Bares-1);

int cnt, ticket, total;

double trendc = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

si (trendc!=trendp)

total = OrdersTotal();

if(total < 1)

{

if (trendc== 1) //... señal de compra

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "My EA",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de COMPRA abierta : ",OrderOpenPrice());

}

else Print("Error al abrir la orden de COMPRA : ",GetLastError());

return(0);

}

if (trendc==-1) //... señal de venta

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de venta abierta : ",OrderOpenPrice());

}

else Print("Error al abrir la orden de VENTA : ",GetLastError());

return(0);

}

}

return(0);

}

---------------------------------------

---------------------------------------

Necesito tu ayuda....

Me disculpé a u si me aspecto más a u como usted cayó perturbar. Pero yo realmente impotente ...

Estoy esperando la respuesta. Por favor, .......
 

Gracias por la respuesta, MLADEN,

Lo siento, creo que me dijiste que pusiera ese código en un nuevo EA.

Sólo me falta entender su respuesta....

SÍ. Tienes razón....

Tengo EA y quería modificar. Con alguna condición nueva.......

mi condición es :

------------------------------------------------------

COMPRA: EMA 5 Cross EMA 12 al alza, RSI mayor de 50

VENTA: EMA 5 Cross EMA 12 a la baja, RSI menor de 50

Salida: con un pequeño Take-Profit

(sólo una operación en cada cruce de EMA)

aquí mi EA.....

---------------------

---------------------

extern double Lots=0.1;

extern int TakeProfit=5;

extern int StopLoss=5;

extern int RSIPos=50

extern int RSINeg=50;

extern int deslizamiento=2;

extern int abandono=101;

datetime bartime=0;

int bartick=0;

double p;

int cnt=0;

int OrdersPerSymbol=0;

double bullMA3=0;

double bearMA7=0;

double RSI=0;

bool RSIPOS=0;

bool RSINEG=0;

double TP

double SL;

int init()

{

if (Symbol()=="AUDUSD") {TakeProfit= 60; StopLoss= 23; abandon=103;}

if (Symbol()=="EURAUD") {TakeProfit= 95; StopLoss=141; abandon=33;}

if (Symbol()=="EURCHF") {TakeProfit= 81; StopLoss= 77; abandon=97;}

if (Symbol()=="EURGBP") {TakeProfit= 11; StopLoss= 77; abandon=108;}

if (Symbol()=="EURJPY") {TakeProfit= 38; StopLoss= 75; abandon=183;}

if (Symbol()=="EURUSD") {TakeProfit=35; StopLoss= 35; abandon=5;}

if (Symbol()=="GBPCHF") {TakeProfit= 79; StopLoss= 98; abandon=113;}

if (Symbol()=="GBPJPY") {TakeProfit= 13; StopLoss= 98; abandon=117;}

if (Symbol()=="GBPUSD") {TakeProfit= 55; StopLoss=100; abandon=69;}

if (Symbol()=="USDCAD") {TakeProfit= 66; StopLoss= 76; abandon=106;}

if (Symbol()=="USDCHF") {TakeProfit=117; StopLoss= 78; abandon=111;}

if (Symbol()=="USDJPY") {TakeProfit= 53; StopLoss= 74; abandon=110;}

}

int deinit()

{

}

int inicio()

{

p=Punto;

// Comprobación de errores y recuento de barras

if(AccountFreeMargin()<(200*Lots)) {Print("-----NO MONEY"); return(0);}

if(Bars<100) {Print("-----NO BARS "); return(0);}

if(bartime!=Time[0]) {bartime=Time[0]; bartick++;}

bullMA3=iMA(Symbol(),0,3,0,MODE_EMA,PRICE_CLOSE,1);

bearMA7=iMA(Symbol(),0,7,0,MODE_EMA,PRICE_CLOSE,1);

RSI=iRSI(Símbolo(),0,2,PRECIO_CIERRE,2);

if(RSI>RSIPos) {RSIPOS=true; RSINEG=false;}

if(RSI<RSINeg) {RSIPOS=false; RSINEG=true;}

OrdersPerSymbol=0;

for(cnt=TotalOrdenes();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol()==Symbol() )

{

OrdersPerSymbol++;

}

}

if(OrdersPerSymbol==0)

{

if(bullMA3>(bearMA7+p) && RSINEG)

{

SL=Ask-(StopLoss*p);

TP=Ask+(TakeProfit*p);

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, "BUY "+CurTime(),0,0,White);

bartick=0;

}

if(bullMA3<(bearMA7-p) && RSIPOS)

{

SL=Bid+(StopLoss*p);

TP=Bid-(TakeProfit*p);

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP, "SELL "+CurTime(),0,0,Red);

bartick=0;

}

}

if(OrdersPerSymbol==1 && bartick==abandon)

{

if(OrderType()==OP_BUY)

{

OrderClose(OrderTicket(),Lots,Bid,Slippage,White);

SL=Bid+(StopLoss*p);

TP=Bid-(TakeProfit*p);

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP, "SELL "+CurTime(),0,0,Red);

bartick++;

}

if(OrderType()==OP_SELL)

{

OrderClose(OrderTicket(),Lots,Ask,Slippage,Red);

SL=Ask-(StopLoss*p);

TP=Ask+(TakeProfit*p);

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, "BUY "+CurTime(),0,0,White);

bartick++;

}

}

for(cnt=0;cnt<OrdersTotal();cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol()==Symbol() )

{

if(OrderType()==OP_BUY)

{

if (OrderMagicNumber()==0)

{

if( Bid-OrderOpenPrice() > 3*Punto )

{

OrderClose(OrderTicket(),Lots,Bid,0,White);

return(0);

}

}

}

if(OrderType()==OP_SELL)

{

if (OrderMagicNumber()==0)

{

if( OrderOpenPrice()-Ask > (3*Point) )

{

OrderClose(OrderTicket(),Lots,Ask,0,Red);

return(0);

}

}

}

}

}

return(0);

}

-------------------

---------------------

¿Cómo puedo modificarlo....? Esperando respuesta. Por favor.......

 

dipu

En cuanto a las entradas, esta funciona bien

Ahora ten cuidado con las salidas ya que de la forma en que lo escribiste estás cerrando las órdenes demasiado pronto También el broker de 5 dígitos está cuidado ahora también, y las entradas están trabajando como deberían. El periodo por defecto para el rsi está fijado en 14 (no sé cuál quieres usar, en el código usas el periodo 2 pero probablemente sea demasiado corto). Los periodos Ema son por defecto 5 y 12. También, está probando una barra cerrada ahora (espera hasta que la barra se cierre y si entonces la señal de compra o venta existe, entra la orden)

Archivos adjuntos:
dipu.mq4  5 kb
 

Gracias por la respuesta, MLADEN,

lo siento, no es una información clara.......

COMPRA: EMA 5 Cross EMA 12 al alza, RSI[14] mayor de 50

VENTA: EMA 5 Cross EMA 12 a la baja, RSI[14] menor de 50

Salida: con un pequeño TP/Sl....(5pip)

(solo una operación en cada cruce de EMA)

Acabo de probarlo y os informaré del resultado ....

Puede que también se modifique.. o no..

Gracias de nuevo por su ayuda.....

Razón de la queja: