Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 784

 
Roman Efimov:
In generale, il problema è il seguente! Voglio pescare il profitto con un altro EA ma questo EA non mi permette di tirare lo stop loss per il profitto! Qualcuno può aggiustarlo! L'autore non risponde!

Quindi metti "0" nei parametri di input e non ci saranno trailing stop.

extern int TrailingStop = 0; // Trailing Stop, se 0, nessun Trailing Stop

 
Vitaly Muzichenko:
Come è possibile rimuovere un indicatore specifico da tutti i grafici con una sola mossa? L'applicazione di un nuovo modello non funziona. Forse una sceneggiatura?

Devi ancora chiudere il grafico per cancellare l'indicatore

Perché il modello non si adatta? - Expert Advisor è appeso ad esso? - Ho controllato. Puoi salvare Expert Advisor in un modello di grafico e applicare il modello nello stesso EA - Expert Advisor sarà cancellato e poi verrà eseguito di nuovo su questo modello

 
Igor Makanu:

Devi ancora chiudere il grafico per cancellare l'indicatore

Perché il modello non si adatta? - Expert Advisor è appeso ad esso? - Ho controllato, è possibile salvare Expert Advisor in un modello di grafico e applicare il modello dallo stesso Expert Advisor - Expert Advisor sarà cancellato e poi riavviato su questo modello

Non si può cambiare il modello su diversi layout dei grafici, ecc.)

 
Vitaly Muzichenko:

Su diversi grafici di markup e altre cose, non si può sostituire il modello)

Cercando su Google, c'è ChartIndicatorDelete()

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

non l'ho mai usato, non posso dire nulla

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

Cercando su Google, c'è ChartIndicatorDelete()

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

Non l'ho mai usato, quindi non posso dire nulla.

Sì, grazie, Alexey ha già avvisato.

Fatto in questo modo, tutto funziona tranne: Come posso magicamente scriverlo in modo da avere una scelta nei parametri di input quale cancellare?

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

C'è un indicatore che può ottenere valori da un periodo superiore, for(i=0;y=0;i<li_0;i++)

Come fare un ciclo 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ì, grazie, Alexei mi ha già informato.

Fatto in questo modo, tutto funziona tranne: Come faccio a prescriverlo magicamente in modo che ci sia una scelta nei parametri di input quale eliminare?

Ecco uno script per controllare

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

Ecco uno script da testare

Capisco che è necessario selezionare tramite interruttore, e lì inserire i nomi

Il tuo codice stampa un valore int, devi selezionare stringa


 
Vitaly Muzichenko:

Ho capito che bisogna selezionare tramite interruttore, e inserire i nomi lì

Il tuo codice stampa un valore int, devi selezionare stringa


EnumToString() non vi aiuterebbe? L'unico problema può verificarsi se c'è uno spazio o qualche altro carattere non valido nel nome dell'indicatore breve. Come ultima risorsa, potete creare un array di variabili stringa e prendere l'indice di enumerazione da lì. O non è per uso individuale e ci vorrà più tempo per spiegare che per scrivere il codice?

 
Alexey Viktorov:

EnumToString() non vi aiuterebbe? Il problema può verificarsi se c'è uno spazio o qualche altro carattere non valido nel nome dell'indicatore breve. Come ultima risorsa, potete creare un array di variabili stringa e prendere da lì l'indice di enumerazione. O non è per uso individuale e ci vorrà più tempo per spiegare che per scrivere il codice?

Cercherò di farlo con un interruttore, ma più tardi. Ci sono spazi nei nomi.

Motivazione: