Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 784

 
Roman Efimov:
Em geral, o problema é o seguinte! Eu quero arrastá-lo com outro EA, mas este EA não me deixa parar de perder para ter lucro! Qualquer um pode consertá-lo! O autor não está respondendo!

Portanto, coloque "0" nos parâmetros de entrada e não haverá paradas para trás.

TrailingStop externo int = 0; // Trailing Stop, se 0, sem Trailing Stop

 
Vitaly Muzichenko:
Como é possível remover um indicador específico de todos os gráficos com um único movimento? A aplicação de um novo modelo não funciona. Talvez um roteiro?

Você ainda precisa fechar o gráfico para apagar o indicador

Por que o modelo não se encaixa? - O Expert Advisor está pendurado nele? - Eu verifiquei. Você pode salvar o Expert Advisor em um modelo de gráfico e aplicar o modelo no mesmo EA - Expert Advisor será excluído e então ele será executado novamente neste modelo

 
Igor Makanu:

Você ainda precisa fechar o gráfico para apagar o indicador

Por que o modelo não se encaixa? - O Expert Advisor está pendurado nele? - Eu verifiquei, você pode salvar o Expert Advisor em um modelo de gráfico e aplicar o modelo do mesmo Expert Advisor - o Expert Advisor será excluído e então ele será executado novamente neste modelo

Você não pode alterar o modelo em diferentes layouts de gráficos, etc.)

 
Vitaly Muzichenko:

Em diferentes gráficos de marcação e outras coisas, você não pode substituir o padrão)

Googled, há ChartIndicatorDelete()

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

nunca o usou, não pode dizer nada

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

Googled, há ChartIndicatorDelete()

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

Eu nunca a usei, portanto não posso dizer nada.

Sim, obrigado, Alexei já me avisou sobre isso.

Feito desta maneira, tudo funciona, exceto: Como posso escrevê-lo magicamente para que eu possa escolher nos parâmetros de entrada qual deles apagar?

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

Há um indicador que pode obter valores de um período superior, para(i=0;y=0;i<li_0;i++)

Como fazer um loop para (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:

Sim, obrigado, Alexei já me avisou sobre isso.

Feito desta maneira, tudo funciona, exceto: Como eu o prescrevo magicamente para que haja uma escolha nos parâmetros de entrada, qual deles devo apagar?

aqui está um roteiro para verificar

#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:

aqui está um roteiro para testar

Eu entendo que você precisa selecionar via switch, e aí inserir os nomes

Seu código imprime um valor int, você precisa selecionar uma corda


 
Vitaly Muzichenko:

Eu entendo que você precisa selecionar via switch, e digitar os nomes lá

Seu código imprime um valor int, você precisa selecionar uma corda


EnumToString() não o ajudaria? O único problema pode ocorrer se houver um espaço ou algum outro personagem inválido no nome do indicador curto. Como último recurso, você pode criar uma série de variáveis de cordas e tirar o índice de enumeração a partir daí. Ou não é para uso individual e levará mais tempo para explicar do que para escrever o código?

 
Alexey Viktorov:

EnumToString() não o ajudaria? O único problema pode ocorrer se houver um espaço ou algum outro personagem inválido no nome do indicador curto. Como último recurso, você pode criar um conjunto de variáveis de cadeia e tirar daí o índice de enumeração. Ou não é para uso individual e levará mais tempo para explicar do que para escrever o código?

Vou tentar fazer isso com um interruptor, mas mais tarde. Há espaços nos nomes.

Razão: