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

 
giannis1386:

Estoy completamente confundido.

double blevel=OrderStopLoss()<Bid-Point*TS; me funciona. SL va tras el precio sólo en beneficio.

double slevel=OrderStopLoss()>Ask+Point*TS; No sé cómo añadir este a else

No es un bool.

No es un bool, pero se llama conversión implícita

¿Qué estás haciendo de todos modos? ¿Arrastrar?

 
Artyom Trishkin:

No es un bool, pero se llama conversión implícita

¿Qué estás haciendo de todos modos? ¿Arrastrar?

Sí trató de hacer un arrastre. la secuencia de comandos original era sólo para cerrar cuando la orden llegó a los beneficios
 
giannis1386:
Sí trató de hacer un arrastre. la secuencia de comandos original era sólo para cerrar cuando el beneficio de la orden fue alcanzado
No es un guión, es un EA. Usted confunde los tipos de programas. El script se ejecuta una vez después de ser cargado en el gráfico y luego se borra. Si no está en bucle. Es poco probable que alguien haga un script en bucle para cerrar posiciones.
 
giannis1386:
Sí, intenté hacer una red de arrastre.

Lógica:

Si el beneficio de la orden actual seleccionada en el bucle es mayor que el valor establecido, si su stoploss es menor (para la Compra)/mayor (para la Venta) que el nivel de arrastre del stoploss calculado, entonces cambia el stop al nuevo valor.

Esto es en pocas palabras.

 
Artyom Trishkin:
¿No es eso lo que sugerí?

Sí, bueno... He mirado tu código con tan poca atención que es mejor decir que no lo he mirado en absoluto. Pero eso es la mitad del problema, luego he dicho tales tonterías que casi me avergüenzan. De alguna manera, de repente tuve la loca idea de que ArrayMaximum() podría aplicarse a un array de estructuras o incluso a un campo separado de este array.

Me arrepiento, no aconsejo a nadie más que piense así, no funciona...:)

 
Alexey Viktorov:

Sí, bueno... He mirado tu código con tan poca atención que es mejor decir que no lo he mirado en absoluto. Pero eso es la mitad del problema, luego he dicho tales tonterías que casi me avergüenzan. Por alguna razón, de repente tuve la loca idea de que ArrayMaximum() podría aplicarse a un array de estructuras o incluso a un campo separado de este array.

Me arrepiento, no aconsejo a nadie más que piense así, no funciona...:)

Bueno... ¿Y yo? He mirado tu código de la misma manera y te he dado las gracias, porque es realmente más corto...

En resumen - ambos valen una broma...

 
Artyom Trishkin:
No es un guión, es un Asesor Experto. Usted confunde los tipos de programas. El script se ejecuta una vez después de ser cargado en el gráfico y luego se borra. Si no está en bucle. Difícilmente alguien hará un script en bucle para cerrar posiciones.

según el autor:

Aquí hay un script estándar de MT4 close.mq4 ligeramente modificado

Ponga el archivo en la carpeta MetaTrader\\nde los scripts,

 
Artyom Trishkin:

Bueno... ¿Y yo? Justo cuando eché un vistazo a su código, me incliné en señal de gratitud - es realmente más corto...

En resumen - ambos valen una broma...

No, no estoy de acuerdo. Este código

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

probado y funciona. Hay matrices dobles simples definidas por el usuario, y CopyRates() llena una matriz de estructuras y por lo tanto no se puede elegir el máximo y el mínimo utilizando funciones de trabajo con matrices.

 
giannis1386:

según el autor:

Aquí hay un script estándar de MT4 close.mq4 ligeramente modificado

Ponga el archivo en la carpeta MetaTrader\\nde los scripts,

Así que su script funciona solo una vez - lo puse en el gráfico, el script funcionó(cerró posiciones) y se descargó.

No necesitas un script, necesitas un EA.

 
Alexey Viktorov:

No, no estoy de acuerdo. Este código

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

está probado y funciona. Aquí son simples matrices dobles personalizadas, y CopyRates() llena una matriz de estructuras y por lo tanto no se puede seleccionar el máximo y el mínimo usando funciones de matriz.

Pues te digo que yo también estuve observando tu código con mucha atención. Así que - la broma es sobre mí.

SZY... Pero mi código devuelve cuatro valores: Alto/Bajo/Más Alto/Más Bajo, el tuyo sólo devuelve Alto y Bajo, y mi código comprueba el éxito de la copia de datos (aunque no todos), el tuyo no...

Así es como mi código comprueba la copia completa de los datos necesarios:

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)==rangeBars) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+
Razón de la queja: