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

 
Roman Efimov:
En general, el problema es el siguiente ¡Quiero arrastrar beneficios con otro EA pero este EA no me deja tirar de stop loss para obtener beneficios ! ¿Alguien puede arreglarlo? ¡El autor no responde!

Así que ponga "0" en los parámetros de entrada y no habrá trailing stops.

extern int TrailingStop = 0; // Trailing Stop, si es 0, no hay Trailing Stop

 
Vitaly Muzichenko:
¿Cómo es posible eliminar un indicador específico de todos los gráficos con un movimiento? La aplicación de una nueva plantilla no funciona. ¿Tal vez un guión?

Todavía tiene que cerrar el gráfico para eliminar el indicador

¿Por qué no encaja la plantilla? - ¿está el Asesor Experto pendiente de él? - Lo he comprobado. Puedes guardar el Asesor Experto en una plantilla de gráfico y aplicar la plantilla en el mismo EA - el Asesor Experto se borrará y luego se ejecutará de nuevo en esta plantilla

 
Igor Makanu:

Todavía tiene que cerrar el gráfico para eliminar el indicador

¿Por qué no encaja la plantilla? - ¿está el Asesor Experto pendiente de él? - He comprobado que se puede guardar el Asesor Experto en una plantilla de gráfico y aplicar la plantilla desde el mismo Asesor Experto - el Asesor Experto se borrará y luego se reiniciará en esta plantilla

No se puede cambiar la plantilla en diferentes diseños de gráficos, etc.)

 
Vitaly Muzichenko:

En los diferentes gráficos de marcado y demás, no se puede sustituir el patrón)

Buscando en Google, existe ChartIndicatorDelete()

https://docs.mql4.com/ru/chart_operations/chartindicatordelete

nunca lo he usado, no puedo decir nada

ChartIndicatorDelete - Операции с графиками - Справочник MQL4
ChartIndicatorDelete - Операции с графиками - Справочник MQL4
  • docs.mql4.com
Удаляет с указанного окна графика индикатор с указанным именем. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд. Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError...
 
Igor Makanu:

Buscando en Google, está ChartIndicatorDelete()

https://docs.mql4.com/ru/chart_operations/chartindicatordelete

Nunca lo he usado, así que no puedo decir nada.

Sí, gracias, Alexei ya me lo ha hecho saber.

Hecho así, todo funciona excepto: ¿Cómo puedo escribirlo mágicamente para poder elegir en los parámetros de entrada cuál es el que hay que borrar?

#property version   "1.00"
#property strict
#property show_inputs

enum ind {
 ind_1, // Indicator 1
 ind_2, // Indicator 2
 ind_3, // Indicator 3
 ind_4  // Indicator 4
};

input string ProgName = "Candles Signal";

long list_id[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
 int size=ChartGetIDList(list_id);
  //
  for(int i=size-1;i>=0;i--) {
   long id=list_id[i];
   for(int k=ChartIndicatorsTotal(id,0);k>=0;k--) {
    if(ChartIndicatorName(id,0,k)==ProgName) {
     Print(ChartSymbol(id),"=",ChartIndicatorName(id,0,k));
     ChartIndicatorDelete(id,0,ProgName);
    }
   }
  }
 }
//+------------------------------------------------------------------+
int ChartGetIDList(long &List[]) {
 int i=0;
 long chartID=ChartFirst();
 while(chartID!=-1) {
    i++;
     ArrayResize(List,i);
     List[i-1]=chartID;
   chartID=ChartNext(chartID);
  }
  return(ArraySize(List));
 }
 

Hay un indicador que puede obtener valores de un periodo superior, for(i=0;y=0;i<li_0;i++)

Cómo hacer un bucle for (int i = li_0; i >= 0; i--)

   datetime TimeArray[];
   int    i,shift,y=0;
      int counted = IndicatorCounted();
   if (counted < 0) return (-1);
   if (counted > 0) counted--;
   int li_0 = Bars - counted;
    
   // Plot defined timeframe on to current timeframe   
   ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame); 
   
   for(i=0,y=0;i<li_0;i++)
 //  for (int i = li_0; i >= 0; i--) //ДЛЯ ТАКОГО ЦИКЛА КАК СДЕЛАТЬ
     {
     if (Time[i]<TimeArray[y]) y++;
     stro_1=NormalizeDouble(iCustom(NULL, TimeFrame, "slow", 0, y+1), Digits);
     }
 
Vitaly Muzichenko:

Sí, gracias, Alexei ya me lo ha comunicado.

Hecho así, todo funciona excepto: ¿Cómo lo prescribo mágicamente para que se pueda elegir en los parámetros de entrada cuál es el que hay que eliminar?

aquí hay un script para comprobarlo

#property strict
#property show_inputs
enum Eind {
 ind_1, // Indicator 1
 ind_2, // Indicator 2
 ind_3, // Indicator 3
 ind_4  // Indicator 4
};

input Eind param = ind_1;
//+------------------------------------------------------------------+
void OnStart()
  {
   Alert("Выбран :",param);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

aquí hay un script para probar

Entiendo que hay que seleccionar a través del interruptor, y allí introducir los nombres

Su código imprime un valor int, necesita seleccionar cadena


 
Vitaly Muzichenko:

Entiendo que hay que seleccionar a través del interruptor, e introducir los nombres allí

Su código imprime un valor int, necesita seleccionar cadena


¿No te ayudaría EnumToString()? El único problema puede ocurrir si hay un espacio o algún otro carácter no válido en el nombre del indicador corto. Como último recurso, puedes crear un array de variables de cadena y tomar el índice de la enumeración de ahí. ¿O no es para uso individual y se necesitará más tiempo para explicarlo que para escribir el código?

 
Alexey Viktorov:

¿No te ayudaría EnumToString()? El problema puede ocurrir si hay un espacio o algún otro carácter no válido en el nombre del indicador corto. Como último recurso, puedes crear un array de variables de cadena y tomar de ahí el índice de la enumeración. ¿O no es para uso individual y se necesitará más tiempo para explicarlo que para escribir el código?

Intentaré hacerlo con un interruptor, pero más adelante. Hay espacios en los nombres.