¿Cómo codificar? - página 111

 
MrPip:
Tenga cuidado al utilizar OrderComment() para identificar las operaciones. A veces el broker añade caracteres al comentario.

Lo mejor es utilizar

if (StringFind(OrderComment(), UserComment, 0) > 0)

{

// orden identificada por UserComment encontrada en OrderComment

}

en lugar de

if (OrderComment() == UserComment)

{

// la orden puede ser identificada por UserComment

// si OrderComment no fue modificado por el corredor

}

Robert

Exactamente ... Y además, a veces el comentario original codificado en el EA es demasiado largo y será troncado por la plataforma (no sé si el resto del comentario está en la "memoria" pero no se muestra en la columna de comentarios).

FerruFx

 

necesito ayuda con mi EA

Hola,

estoy trabajando en un EA que abre posiciones largas y cortas simultáneamente y me encuentro con este problema...cuando ambos tipos de posiciones están abiertas, digamos que la primera es corta y la segunda es larga...el EA no cerrará la posición larga si la corta sigue abierta, esperará a que se cierre la corta y luego cerrará la larga cuando se cumplan las condiciones y viceversa. aquí está la parte del EA donde debería cerrar las posiciones abiertas:

//---- Cerrar posiciones abiertas

for(int cnt=0; cnt<total; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS);

{

//-- Cerrar posiciones largas

if(OrderSymbol() == Symbol() && OrderType()==OP_BUY && rsi1>75 && rsi<75)

{

OrderClose(OrderTicket(),OrderLots(),Bid,5,Green);

LoteL=Lote;

}

//-- Cerrar el corto

if(OrderSymbol() == Symbol() && OrderType()==OP_SELL && rsi125)

{

OrderClose(OrderTicket(),OrderLots(),Ask,5,Red);

LoteS=Lote;

}

}

}

*donde rsi1 es el rsi anterior y rsi es la lectura actual

*LotL & LotS es un multiplicador del Lote original, lo he configurado para que abra un máximo de 3 posiciones en cada lado, por lo que al cerrar un tipo de posiciones abiertas, LotL & LotS se restablecerán al tamaño original

el EA funciona como se pretende cuando se abren posiciones, pero el problema es con el cierre de las posiciones abiertas, creo que el EA en la parte del bucle no está leyendo todas las posiciones abiertas, sino sólo la primera... ¡cualquier ayuda para arreglar esto es realmente apreciada!

¡Saludos!

pete

 

Estoy intentando añadir la función "Pips to activate Trailing stop". Lo que he cambiado está en rojo. ¿Qué más hay que añadir?

extern string Remark1 = "== Main Settings ==";

extern int MagicNumber = 54321;

extern bool SignalMail = False;

extern bool EachTickMode = true;

extern double Lots = 4;

extern int Slippage = 2;

extern bool UseStopLoss = false;

extern int StopLoss = 100;

extern bool UseTakeProfit = false;

extern int TakeProfit = 15;

extern bool UseTrailingStop = true;

extern int TrailingStop = 45;

extern double Pips_Activate_TS = 5;

extern bool MoveStopOnce = False;

extern int MoveStopWhenPrice = 50;

extern int MoveStopTo = 1;

extern int MaxConcurrentTrades = 2;

//Version 2.01

int BarCount;

int Current;

bool TickCheck = False;

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

//| expert initialization function |

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

int init() {

BarCount = Bars;

if (EachTickMode) Current = 0; else Current = 1;

return(0);

}

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

//| expert deinitialization function |

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

int deinit() {

return(0);

}

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

//| expert start function |

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

int start()

{

int Order = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

if (EachTickMode && Bars != BarCount) TickCheck = False;

Total = OrdersTotal();

Order = SIGNAL_NONE;

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

//| Variable Begin |

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

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

//| Variable End |

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

//Check position

bool IsTrade = False;

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

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {

IsTrade = True;

if(OrderType() == OP_BUY) {

//Close

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

//| Signal Begin(Exit Buy) |

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

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

//| Signal End(Exit Buy) |

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

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

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//MoveOnce

if(MoveStopOnce && MoveStopWhenPrice > 0) {

if(Bid - OrderOpenPrice() >= Point * MoveStopWhenPrice) {

if(OrderStopLoss() < OrderOpenPrice() + Point * MoveStopTo) {

OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() + Point * MoveStopTo, OrderTakeProfit(), 0, Red);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

//Trailing stop

if(UseTrailingStop && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

} else {

//Close

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

//| Signal End(Exit Sell) |

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

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

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//MoveOnce

if(MoveStopOnce && MoveStopWhenPrice > 0) {

if(OrderOpenPrice() - Ask >= Point * MoveStopWhenPrice) {

if(OrderStopLoss() > OrderOpenPrice() - Point * MoveStopTo) {

OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() - Point * MoveStopTo, OrderTakeProfit(), 0, Red);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

//Trailing stop

if(UseTrailingStop && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

}

}

}

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

//| Signal Begin(Entry) |

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

if(Open[0] > Open[0+1] &&

Open[0+1] >= Open[0+2] &&

Open[0+2]>= Open[0+3] &&

Open[0+3] >= Open[0+4] &&

Open[0+4] >= Open[0+5] &&

Open[0+5] >= Open[0+6]) Order = SIGNAL_SELL;

if(Open[0] < Open[0+1] &&

Open[0+1] <= Open[0+2] &&

Open[0+2]<= Open[0+3] &&

Open[0+3] <= Open[0+4] &&

Open[0+4] <= Open[0+5] &&

Open[0+5] <= Open[0+6]) Order = SIGNAL_BUY;

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

//| Signal End |

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

//Buy

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

if(DecideToOpenTrade(OP_BUY) && TradeSlotsAvailable()) {

//Check free margin

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

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;

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

Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("BUY order opened : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");

} else {

Print("Error opening BUY order : ", GetLastError());

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Sell

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

if(DecideToOpenTrade(OP_SELL) && TradeSlotsAvailable()) {

//Check free margin

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

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if(Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("SELL order opened : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");

} else {

Print("Error opening SELL order : ", GetLastError());

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

 
 
mifiglo:
Hola compañeros comerciantes,

Tengo este pequeño problema desarrollando un Asesor Experto a partir de un indicador Custom , he probado la función "iCustom" pero mi indicador siempre devuelve el mismo valor.

Devuelve algo como 21473..., así

Quiero que el EA sea capaz de reconocer cuando se generan las señales de flecha de venta y de compra y que realice la acción comercial correspondiente (es decir, comprar cuando el indicador dice arriba y vender cuando dice abajo)

Aquí está el código del indicador, agradecería mucho si alguien puede llegar a una solución lo antes posible.

Por favor, publique también las líneas de código con su función iCustom()

FerruFx

 

Lo siento, esto es todo lo que tengo...

 
 

Rsi Ea

Este es mi primer EA. Utiliza 2 rsi's que se cruzan en 3 marcos de tiempo. Tengo un problema con el ea tomando operaciones contra los cruces. El problema es que el EA realiza operaciones contra los cruces. Alguien podría ver el código y decirme en qué me he equivocado. No he sido capaz de ver nada malo.

He adjuntado el ea y una foto del problema.

Archivos adjuntos:
 

¡Necesito ayuda para el código de EA!

Hola a todos,

Como usted sabe el mercado de divisas es de 24 horas, no me siento cómodo para el comercio durante la noche sin sentarse delante de la PC. Así que estoy pensando en la mejor manera es el programa para proteger el comercio si el precio se mueve hacia mi dirección favorita. Por ejemplo, si abrí 5 lotes en total, cuando el beneficio está por encima de 50 pips, se mueve automáticamente el stop loss hasta el punto de equilibrio. Cuando el beneficio está por encima de 100 pips, se mueve para proteger 30 pips.Cuando el beneficio está por encima de 200 pips, se mueve para proteger 50 pips. y así sucesivamente.

Traté de codificar yo mismo. Pero no funciona cuando lo arrastro a mi gráfico y lo pongo a operar en vivo. ¿Alguien podría ayudarme a echar un vistazo a mi código y arreglarlo? Muchas gracias.

#property copyright "x li"

#property link ""

#property show_confirm

//---- parámetros de entrada

extern int objetivo1 =50;

extern int objetivo2 =100

extern int objetivo3 =150;

extern int objetivo4 =200

extern int target5 =300;

extern int protect1 =0;

extern int protect2 =5;

extern int protect3 =50

extern int protect4 =100;

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

//| script "mover stoploss a protect(50->0;100->5;150->50;200->50;300->100)" |

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

int inicio()

{

bool resultado;

double stop_loss,point,EntryPrice,profit;

int cmd,total,error,i;

//----

total=Total de órdenes();

punto=MarketInfo(Symbol(),MODE_POINT);

//----

for(i=0; i<total; i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

cmd=Tipo de orden();

EntryPrice=OrderOpenPrice();

//---- se consideran las órdenes de compra

if(cmd==OP_BUY)

{

profit=Precio de Entrada;

if(profit>objetivo1*punto && profit<objetivo2*punto)

{

stop_loss=PrecioDeEntrada+protección1*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(beneficio>objetivo2*punto && beneficio<objetivo3*punto)

{

stop_loss=Precio de entrada+protección2*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target3*point && profit<target4*point)

{

stop_loss=Precio de entrada+protección3*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target4*point && profit<target5*point)

{

stop_loss=Precio de entrada+protección3*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target5*point)

{

stop_loss=Precio de entrada+protección4*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

}

//---- se consideran las órdenes de venta

if(cmd==OP_SELL)

{

profit=Precio de entrada-precio;

if(profit>objetivo1*punto && profit<objetivo2*punto)

{

stop_loss=Precio de entrada-protección1*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(beneficio>objetivo2*punto && beneficio<objetivo3*punto)

{

stop_loss=Precio de entrada-protección2*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target3*point && profit<target4*point)

{

stop_loss=Precio de entrada-protección3*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target4*point && profit<target5*point)

{

stop_loss=Precio de entrada-protección3*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

si(beneficio>objetivo5*punto)

{

stop_loss=Precio de entrada-protección4*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

}

}

else { Print( "Error al seleccionar la orden ", GetLastError()); break; }

}

//----

return(0);

}

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

 

Rsi Ea

No veo por qué usas la misma variable para abrir y cerrar operaciones, pero puede funcionar.

Este puede ser el problema:

"Orden" es una variable global. Así que al final de cada ejecución a través de la función de inicio se establecerá en el último valor que se le asignó, y utilizar ese valor para el inicio de la próxima ejecución a través. Si la haces local (la mueves dentro de Start) se puede arreglar. De lo contrario, tendrá que restablecerlo después de su último uso.

Buena caza,

Big Be

Razón de la queja: