[¡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

 

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);


Archivos adjuntos:
ala.mq4  3 kb
 
Reshetov >> :

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.

 
mukata >> :


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.

 
Enter писал(а) >>

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!

Bueno, para el trabajo de experto, la "carne" de asesor debe ser colocado en la función de inicio todos los mismos...
 

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];
}
}*/
}
//+----------------------------------------------------------------------------+

 
VNG писал(а) >>

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.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
#property indicator_width1 2

//------- Внешние параметры индикатора ----------------------------------------+
extern int MTM_Period = 1; 
//extern int MTM_Integr_Period = 1000; 

//extern int Applied_Price = 0; // Используемая цена:
// 0 - PRICE_CLOSE
// 1 - PRICE_OPEN
// 2 - PRICE_HIGH
// 3 - PRICE_LOW
// 4 - PRICE_MEDIAN
// 5 - PRICE_TYPICAL
// 6 - PRICE_WEIGHTED
extern int NumberOfBars = 1000; // Количество баров обсчёта (0-все)
extern int MA_Period=3;
extern int MA_Mode=0;

//------- Буферы индикатора ---------------------------------------------------+
double buf0[];
double MA[];
//+----------------------------------------------------------------------------+
//| Custom indicator initialization function |
//+----------------------------------------------------------------------------+
void init() {
  SetIndexBuffer (0, buf0);
  SetIndexEmptyValue(0, 0);
  SetIndexLabel (0, "i-mtm_integr");
  SetIndexStyle (0, DRAW_LINE);
  SetIndexBuffer (1, MA);
  SetIndexLabel (1, "MA");
  SetIndexStyle (1, DRAW_LINE);

}

//+----------------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() {
Comment("");
}

//+----------------------------------------------------------------------------+
//| Custom indicator iteration function |
//+----------------------------------------------------------------------------+
void start() {
  int LoopBegin, i, j, per=3;
  double mtm, mtmsum;

  if ( NumberOfBars==0) LoopBegin=Bars-1;
  else LoopBegin= NumberOfBars;
  LoopBegin=MathMin( LoopBegin, Bars-1);

  for ( i= LoopBegin; i>=0; i--) {
    mtm=Close[ i]-Close[ MTM_Period+ i];
    mtmsum= mtmsum+ mtm;
    buf0[ i]= mtmsum;
  }
  for ( i= LoopBegin- per; i>= per; i--){
     MA[ i]= iMAOnArray( buf0, 0, MA_Period, 0, MA_Mode, i);
  }
}
//+----------------------------------------------------------------------------+
Quizás esta variante sirva. No comprobé el código, lo escribí en el navegador
 
Reshetov >> :

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ó.

 
Silen >> :

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)