[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 347
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Por favor, ayúdenme a mejorar este código para conseguir un Asesor Experto sencillo. La esencia es simple: abrimos 2 posiciones Vender y Bui con paradas especificadas en el precio actual. Entonces, cuando uno o ambos se activan, abrimos nuevas posiciones. La esencia parece sencilla pero sigue sin funcionar ¡Muchas gracias!
//+------------------------------------------------------------------+
//| 2DiffOrders.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
extern double lots=0.01;
extern int SL_in_pips;
extern int TP_in_pips;
int x2;
int init()
{
if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0)
{
SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0)
{
TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
x2=1;
while(x2!=0)
{
if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1)
{
Alert("Ордер типа BUY успешно открыт");
OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0);
x2=GetLastError();
if(x2==0)
Alert("Ордер типа SELL успешно открыт");
if(x2!=0)
Alert("Ордер типа SELL не открыт. Ошибка №: ",x2);
}else
{
x2=GetLastError();
if(x2!=0)
Alert("Ордер типа BUY не открыт. Ошибка №: ",x2);
}
}
//----
return(0);
Esto sólo parece ser exactamente correcto, pero en la vista de la máquina el último bit puede tomar diferentes valores. Es decir, 2,9999, 3 o 3,00000001
Para deshacerse de estos malentendidos existe la función NormalizeDouble() en MQL.
Sí, NormalizeDouble() ayuda, gracias.
Pero todavía no está claro cómo es posible, parece ser una simple división, y si se divide 0,5 o 0,9 o incluso 0,31 por 0,1, todo está bien.
y aquí tiene claramente 2,9, no está claro... la calculadora es más precisa :-)
Gracias a Reshetov y splxgf por su ayuda.
Pero todavía no está claro cómo es posible, parece ser una simple división. Y si divides 0,5 o 0,9 o incluso 0,31 entre 0,1, está bien.
y aquí es 2,9, no está claro... la calculadora es más precisa :-)
Las calculadoras llevan incorporadas funciones de redondeo. Y se resuelven de la misma manera porque utilizan el mismo coprocesador matemático para calcular los números en coma flotante.
¡Hola!
¿Puedes darme una pista, por favor?
Yo mismo no entiendo cómo hacerlo.
Tarea:
EA pone 1-2 órdenes una vez al día.
El valor inicial de la variable se establece manualmente y puede tomar un valor de 1 a 10.
Es necesario cambiar la variable previamente establecida en incrementos de 1 a un valor de - 10
en cada día laborable del EA, sólo en 1, si en ese día no se ejecuta TP.
Cuando se ejecuta TP, la variable devuelve el valor - 1.
Contar la SL no es adecuado, porque puede ser una o dos, y el valor sólo puede cambiarse una vez al día.
Es decir
Variable = 1
Día 1 SL - variable =2
Día 2 SL - variable =3
Día 3 SL - variable =4
Día 4 TP - variable =1
Día 5 SL - variable =2
... Y así sucesivamente.
¡Ayuda!
Gracias.
Por favor, ayúdenme a mejorar este código para conseguir un Asesor Experto sencillo. La esencia es simple: abrimos 2 posiciones Vender y Bui con paradas especificadas en el precio actual. Entonces, cuando uno o ambos se activan, abrimos nuevas posiciones. La esencia parece sencilla pero sigue sin funcionar ¡Muchas gracias!
Conocedores, por favor, ayuda.
Hay un código que calcula un momento de un solo período y lo integra con un período grande, luego lo emite como un indicador.
Necesito escribir un indicador con un periodo determinado que encuentre la media de la curva resultante y la emita como indicador.
Se adjunta el código:
#property indicador_separar_ventana
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_width1 2
//------- Parámetros del indicador externo ----------------------------------------+
extern int MTM_Period = 1;
//extern int MTM_Integr_Period = 1000;
//extern int Precio_aplicado = 0; // Precio utilizado:
// 0 - PRICE_CLOSE
// 1 - PRECIO_ABIERTO
// 2 - PRECIO_ALTO
// 3 - PRECIO_BAJO
// 4 - PRECIO_MEDIO
// 5 - PRECIO_TÍPICO
// 6 - PRECIO_PONDERADO
extern NumberOfBars = 1000; // Número de barras (0-todo)
//------- Bufferes indicadores ---------------------------------------------------+
doble buf0[];
//+----------------------------------------------------------------------------+
//| Función de inicialización de indicadores personalizada |
//+----------------------------------------------------------------------------+
void init() {
SetIndexBuffer (0, buf0);
SetIndexEmptyValue(0, 0);
SetIndexLabel (0, "i-mtm_integr");
SetIndexStyle (0, DRAW_LINE);
}
//+----------------------------------------------------------------------------+
//| Función de desinicialización de indicadores personalizada |
//+----------------------------------------------------------------------------+
void deinit() {
Comentario(");
}
//+----------------------------------------------------------------------------+
//| Función de iteración de indicadores personalizada |
//+----------------------------------------------------------------------------+
void start() {
int LoopBegin, i,j, per=3;
doble mtm, mtmsum;
if (NumberOfBars==0) LoopBegin=Bars-1;
else LoopBegin=NúmeroDeBarras;
LoopBegin=MathMin(LoopBegin, Bars-1);
for (i=LoopBegin; i>=0; i--) {
mtm=Cierre[i]-Cierre[MTM_Period+i];
mtmsum=mtmsum+mtm;
buf0[i]=mtmsum;
}
/* for (i=LoopBegin-per;i>=per;i--){
mtm=Cierre[i]-Cierre[MTM_Period+i];
mtmsum[i]=0+mtm;
for (j=per;j<=0;j--){
mtmsum[i]=0+mtmsum[i+j];
mtmsum[i]=mtmsum[i]/per;
buf0[i]=mtmsum[i];
}
}*/
}
//+----------------------------------------------------------------------------+
Conocedores, por favor, ayuda.
Hay un código que calcula un impulso de un solo período y lo integra con un período grande, luego lo emite como un indicador.
Necesito escribir un indicador con un periodo determinado que encuentre la media de la curva resultante y la emita como indicador.
Esto sólo parece ser exactamente correcto, pero en la vista de la máquina el último bit puede tomar diferentes valores. Es decir, 2,9999, 3 o 3,00000001
Para evitar estos malentendidos, MQL dispone de la función NormalizeDouble()
¿Por qué la función NormalizeDouble() no se ejecuta por defecto para todos los valores de Ask, Bid, Low, etc.?
Todo el mundo ha caído en ello y luego tiene que arreglarlo "manualmente"... Es extraño que MT no pueda leer lo que ella misma engendró.
Gracias, ¿hay alguna garantía de que los datos estén disponibles en start()?
puede intentar usar RefreshRates() - vea los ejemplos en la ayuda estándar de MetaEditor
Hay una opción "Guardar como informe" en la optimización de EA, pero los "Parámetros de entrada" no se muestran en el explorador de Internet,
aunque, a juzgar por el código html, están presentes allí. En general, la optimización se inició por estos parámetros.
¿Tal vez alguien sepa cómo verlas en el Explorer?
(También existe la posibilidad de copiarlos a un archivo de texto mediante un comando separado, pero es preferible verlos en IE)