Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 306

 
Alexey Viktorov:

Y no podía haber otra. Ningún ordenador conoce un año menos que 1970. Empiece por el año que aparece en las cotizaciones del corredor.

Ya veo) Gracias.
 
Aleksey Vyazmikin:

Código en MT5

Resultado:


SZY: He cambiado el código - no era de ese ME.

No entendí inmediatamente la idea. No lo he hecho en mql5, tendré que averiguarlo. Pero puedes hacerlo en mql4 de la siguiente manera:

Crea dos topes adicionales.

Establezca un desplazamiento para N barras y llene estas N barras con el último valor de los buffers principales.

Y, por supuesto, el índice N+1 de estos búferes adicionales se llenará con un valor vacío.

 
Alexey Viktorov:

No entendí inmediatamente la idea. No lo he hecho en mql5, tendré que averiguarlo. Pero en mql4 se puede hacer de la siguiente manera:

Crea dos topes adicionales.

Establece un desplazamiento para ellos de N barras y rellena estas N barras con el último valor de los buffers principales.

Y, por supuesto, el índice N+1 de estos búferes adicionales se llena con un valor vacío.


Gracias por la idea - originalmente lo hice en MT5, luego lo optimicé.

De todas formas, me fui a la cama a las 4 de la mañana (el código público no está completo, por supuesto), pero hice lo que quería con dos buffers.

El problema era que en MT5 el relleno es de izquierda a derecha, y en MT4 es viceversa. La funciónArraySetAsSeries no ayudó - de hecho reescribí toda la lógica.

 

¡Buenas tardes, Artem!

Me gustaría pedir ayuda con mi reelaboración de TrExp_Nik ver. Quiero añadir la posibilidad de cambiarlo al punto de equilibrio. Sin embargo, mis limitados conocimientos de programación no me permiten hacerlo. Me decidí a utilizar e-MovingInWL cuyo código estoy tratando de integrar en mi EA, pero no puedo combinar las variables correctamente o no entiendo correctamente el código del segundo Asesor Experto de Breakeven. Tal vez, esta no sea la variante óptima. Me gustaría pediros consejo sobre cómo hacerlo mejor o más fácil.

Archivos adjuntos:
 
niktach:

¡Buenas tardes, Artem!

Me gustaría pedir ayuda con mi reelaboración de TrExp_Nik ver. Quiero añadir la posibilidad de cambiarlo al punto de equilibrio. Sin embargo, mis limitados conocimientos de programación no me permiten hacerlo. Me decidí a utilizar e-MovingInWL cuyo código estoy tratando de integrar en mi EA, pero no puedo combinar las variables correctamente o no entiendo correctamente el código del segundo Asesor Experto de Breakeven. Tal vez, esta no sea la variante óptima. Me gustaría pediros consejo sobre cómo mejorarla o simplificarla.

Buen día. ¿Qué ha intentado hacer exactamente? Sólo veo dos códigos adjuntos. Si necesitas que alguien lo haga todo por ti, para eso está el trabajo autónomo.

Y si intentas hacerlo tú mismo, entonces muéstrame exactamente lo que estás haciendo y dónde no lo entiendes.

 

Hola,

¿Existe alguna forma de acceder mediante programación a las propiedades del objeto gráfico "triángulo" colocado en el gráfico? Me refiero a las coordenadas de tiempo y precio de los vértices, que se muestran en la pestaña "Parámetros" cuando se abre interactivamente el formulario de propiedades. He intentado utilizar las funcionesObjectGetInteger y ObjectGetDouble, pero sólo pueden obtener datos de un vértice.

Gracias.

 
oddball:

Hola,

¿Existe alguna forma de acceder mediante programación a las propiedades del objeto gráfico "triángulo" colocado en el gráfico? Me refiero a las coordenadas de tiempo y precio de los vértices, que se muestran en la pestaña "Parámetros" cuando se abre interactivamente el formulario de propiedades. He intentado utilizar las funciones ObjectGetInteger y ObjectGetDouble, pero sólo pueden obtener datos de un vértice.

Gracias.

Sí, puedes hacerlo. Y la dirección del pensamiento es correcta. ¿Puedes mostrarme cómo has intentado obtener los parámetros?

 
Artyom Trishkin:

Cuando la orden se selecciona por ticket, no es necesario especificar pool - MODE_TRADES es redundante aquí - este parámetro se ignora cuando se selecciona por ticket y la orden se selecciona de una de las dos listas - de la lista de cerradas o de la lista de posiciones de mercado - depende de si la posición está cerrada o no todavía.

Después de la selección exitosa de una orden basada en el ticket, para entender de cuál de las dos listas se selecciona la orden, es necesario comprobar la hora de cierre de la posición - si es mayor que cero, entonces la orden ya ha sido cerrada y fue seleccionada de la lista de órdenes históricas, de lo contrario - la orden todavía está en el mercado.

Pero para entender dónde tienes un error, necesitas adjuntar el código - dar más información, porque en principio no hay ningún error en esta línea (excepto que no compruebas el resultado de retorno de la función, utilizas un modificador que se ignora en este caso y no hay ";" después del corchete de cierre).


Muchas gracias por la respuesta.

Aquí está la función completa, el punto es que abre una orden y luego añade valores constantes de stop loss y take profit a través de la modificación.

La orden se abre pero el stop loss y el take profit no se establecen (la función de cálculo en rojo, en la queOrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) da un error ((() )

//Función de orden abierta, variables: símbolo, tipo de orden, lote, precio abierto, método de cálculo de TP y SL (0 - fijado en el precio, 1 - fijado en puntos que deben ser calculados desde el precio abierto), stop loss, take profit)

/Símbolo/pareja, tipo de orden abierta - pendiente, precio abierto, interruptor = 1, SL B TP - ¡Los valores de Stop Loss y Take Profit son constantes!

bool SendOrder(string Symb,int Type, double OP,int Mode) {
color CL;
double Pp = MarketInfo(Symb, MODE_POINT);
if (Type==0) CL=Blue;
if (Type==1) CL=Red;
si (Tipo==2 || Tipo==4) CL=TurquesaOscuro;
si (Tipo==3 | Tipo==5) CL=Naranja;
//Volumen de visión
si(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2; si no, DG=1;
si (Lot<MarketInfo(Symb,MODE_MINLOT)) Lot=MarketInfo(Symb,MODE_MINLOT);
if (Lot>MarketInfo(Symb,MODE_MAXLOT)) Lot=MarketInfo(Symb,MODE_MAXLOT);
if (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("No hay suficiente dinero para abrir la operación",Type," ",DoubleToStr(Lot,DG)),0);
return;
}
// comprobar órdenes pendientes
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
if (Type>1) {
if (Type==2 && MarketInfo(Symb,MODE_ASK)-OP<Slv) OP=MarketInfo(Symb,MODE_ASK)-Slv;
if (Type==3 && OP-MarketInfo(Symb,MODE_BID)<Slv) OP=MarketInfo(Symb,MODE_BID)+Slv;
if (Type==4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv;
if (Type==5 && MarketInfo(Symb,MODE_BID)-OP<Slv) OP=MarketInfo(Symb,MODE_BID)-Slv;
}
*/
RefreshRates();
int Min_Dist = MarketInfo(Symb,MODE_STOPLEVEL); //Límite del nivel de stop loss/stake profit en puntos. Distancia mínima
double Tek_Ask = MarketInfo(Symb,MODE_ASK); //El último precio de venta recibido. Se almacena en la variable predefinida Ask para el símbolo actual
double Tek_Bid = MarketInfo(Symb,MODE_BID); //El último precio de oferta recibido. Se almacena en la variable predefinida Bid para el símbolo actual
double Tek_Point = MarketInfo(Symb,MODE_POINT); //Tamaño del punto en la moneda de cotización. Se almacena en la variable predefinida Punto para el símbolo actual
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);//El número de dígitos después del punto decimal en el precio del símbolo. Se almacena en la variable predefinida Dígitos

double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
if (Type>1) {
if (Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
if (Type==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
if (Type==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv
¡if (Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// comprobar paradas
if (SL!=0 || TP!=0) {
if (Mode==0) {
if (MathAbs(OP-SL)<Slv && SL!¡=0) {
si (Tipo==0 || Tipo==2 | Tipo==4) SL=OP-Slv; si no SL=OP+Slv;
}
si (MathAbs(OP-TP)<Slv && TP!=0) {
si (Tipo==0 || Tipo==2 | Tipo==4) TP=OP+Slv; si no TP=OP-Slv;
¡}
}else{
if (SL*Pp<Slv && SL!¡=0) SL=Slv/Pp;
si (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
// octubre
for(int k=0;k<=TryToTrade;k++) {
if (Type==0) OP=MarketInfo(Symb,MODE_ASK);
if (Type==1) OP=MarketInfo(Symb,MODE_BID);
PnC(StringConcatenate("Intentando abrir una orden, tipo: ",Tipo," volumen: ",Lote," precio: ",OP),0);
si (IsTradeAllowed()) {
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL);
}else{ PnC(StringConcatenate("Cannot open order ",k),0;) Sleep(3000); continue; }
if (Ticket >= 0) { PnC(StringConcatenate("Order opened ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; ¡return(false); }
}
// establecer paradas
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES);
if (SL==0 && TP==0) return;
if (Mode==1) {
if (SL!=0) {
si (Tipo==0 || Tipo==2 || Tipo==4) SL=Precio Abierto del Pedido()-SL*Pp;
si (Tipo==1 || Tipo==3 | Tipo==5) SL=Precio Abierto de la Orden()+SL*Pp;
}
si (¡TP!=0) {
si (Tipo==0 || Tipo==2 | Tipo==4) TP=Precio Abierto del Pedido()+TP*Pp;
si (Tipo==1 || Tipo==3 || Tipo==5) TP=Precio Abierto del Pedido()-TP*Pp;
}
}

for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("Intentando establecer stops en una orden: ",Ticket," s/l: ",SL," t/p: ",TP),0);
si (IsTradeAllowed()) {
//TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(Symb,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE);
TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(SL,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE)
}else{ PnC(StringConcatenate("No se puede modificar la orden ",k),0); Sleep(3000); continue; }
if (TickeT == true) { PnC(StringConcatenate("Order Modified ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
return(true);

}

 

¿Puede alguien explicar por qué sale el error 131"volumen incorrecto" al modificar una orden?

El pendiente se abre normalmente, el lote se normaliza, cuando se imprime el lote mínimo es 0,01, que no es inferior a mi volumen (cuenta demo)

He releído todo en el foro y no he podido encontrar el problema.

Sigo preguntándome qué es lo que ocurre entre bastidores y qué es lo que no se describe.
 
forexman77:

¿Puede alguien explicar por qué sale el error 131"volumen incorrecto" al modificar una orden?

El pendiente se abre normalmente, el lote se normaliza, cuando se imprime el lote mínimo es 0,01, que no es inferior a mi volumen (cuenta demo)

He releído todo en mi foro pero no he podido encontrar el problema.

Eso sí, no dejes de sorprenderte con los bichos ocultos que surgen y no se describen.

Lo probé con otra empresa de corretaje y no me hizo cambiar de opinión. La pregunta es por qué cuando se llama:

double MinLot = MarketInfo(Symbol(),MODE_MINLOT);
double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT);
Alert("MinLot=",MinLot,"MaxLot=",MaxLot);  

descuenta 0.01, y el bot imprime 131?

Razón de la queja: