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

 
Alexey Viktorov:

Il problema è in questa linea

Dato che voglio controllare diverse valute su una barra, dovrei controllare l'ora e la valuta per evitare di ripetere un allarme su una barra e un simbolo, ma permettere un allarme sulla stessa barra con un simbolo diverso. A prima vista, abbiamo bisogno di un altro array con i flag se il simbolo è visto o no.

In generale, dobbiamo aggiungere un controllo dei simboli a questa linea, o ripetere il ciclo solo quando appare una nuova barra. Ma ho paura che quando una nuova barra appare sul simbolo con questo indicatore, una nuova barra non è ancora apparsa su un altro simbolo.

La conclusione: dobbiamo sforzare i nostri muscoli della testa per determinare se una nuova barra appare su ogni simbolo separatamente, ma allo stesso tempo per non allungare il numero di linee all'infinito. Non ho una soluzione pronta. E non mi piace suggerirlo scrivendo codice...

E non ho risolto il suo problema?

Forse mi sono perso qualcosa da qualche parte - ho scritto il codice sul mio ginocchio.

 
Artyom Trishkin:

E non ho risolto il suo problema?

Forse mi sono perso qualcosa da qualche parte - ho scritto il codice sul mio ginocchio.

Artem, l'ultima frase del mio post spiega tutto. Non ha nemmeno guardato il suo codice. Aperto il primo non letto, domanda con una citazione della mia risposta precedente, ho risposto e poi visto altri consigli. Non dubito della correttezza del tuo codice, anche dal mio ginocchio...

 
Alexey Viktorov:

Artyom, l'ultima frase del mio post spiega tutto. Non ha nemmeno guardato il suo codice. Aperto il primo non letto, domanda con una citazione della mia risposta precedente, ho risposto e poi visto altri consigli. Non dubito della correttezza del tuo codice, anche dal mio ginocchio...

Avrei detto pigro ;)

Anche a prima vista si può vedere che il codice dipende dai tick sul simbolo corrente. E quindi dobbiamo rimuovere il ciclo da OnTick() e spingerlo in un timer. E modificare leggermente la definizione di avvisi di tempo.

 

Ciao a tutti, c'è un malinteso del processo, nella funzione "start" nel ciclo mm++; e seguire i cambiamenti in esso attraverso Print(); quindi la domanda: "Perché invece di 1,2,3,4, ecc. appaiono numeri a quattro cifre? "

il codice stesso

int start()

  {
   int    counted_bars=IndicatorCounted();
   int limit, i;
                                               int mm=0;     // ======= ПЕРВОЕ========
  

   if(counted_bars<0) return(-1);

   limit=(Bars-counted_bars)-1;

for (i=limit; i>=0;i--)
    { 
       if (TimeDayOfWeek(Time[i]) != 0)
       {if (High[i+1]>LastHigh) LastHigh=High[i+1];if (Low[i+1]<LastLow) LastLow=Low[i+1];}
 

if (TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0)
   {
      
                                                   mm++; // ==========ВТОРОЕ==========
       
   
   
                                                   Print(" TEST= ",mm);// ========ТРЕТЬЕ========
  
   LastLow=Open[i]; LastHigh=Open[i];

  /* ObjectMove("Pivot", 0, Time[i],P);
     ObjectMove("S1", 0, Time[i],S1);
     ObjectMove("R1", 0, Time[i],R1); */
   }
   
   // S1Buffer[i]=S1;
   // R1Buffer[i]=R1;

}

//----
   return(0);
  }
//+------------------------------------------------------------------+
 
виталик:

Ciao a tutti, c'è un malinteso del processo, nella funzione "start" nel ciclo mm++; e seguire i cambiamenti in esso attraverso Print(); quindi la domanda: "Perché invece di 1,2,3,4, ecc. appaiono numeri a quattro cifre? "

il codice stesso


Alla prima esecuzione, 10 secondiIndicatorCounted()=0

 limit=(Bars-counted_bars)-1;

quindilimite= max barre nella storia-1

 
Alekseu Fedotov:


Alla prima esecuzione, per 10 secondiIndicatorCounted()=0

significalimite= max barre nella storia-1

ancora non chiaro, dichiarazione e inizializzazione con zero fuori dal ciclo int mm=0; e posto nel ciclo mm++; print() mostra numeri a quattro cifre che cambiano con una differenza di una unità solo in direzione discendente per qualche motivo
 
виталик:
ancora non chiaro, dichiarazione e inizializzazione con zero fuori dal ciclo int mm=0; e posto nel ciclo mm++; print() mostra numeri a quattro cifre che cambiano con una differenza di una unità, solo in direzione discendente per qualche motivo
Non tutte le stampe sono stampate in questo registro. Guarda nel file.
 

Alexey Viktorov:

...devi sforzare i muscoli della testa...

Grazie a tutti quelli che hanno risposto.

Artyom Trishkin: Così:

Artem, perché scrivi che non l'hai risolto? Invia i segnali per tutti gli strumenti, ma carica solo pesantemente il sistema. È possibile ridurre il carico?

Limitare il controllo su una nuova barra non funzionerà perché ci saranno anche condizioni che devono essere controllate ad ogni spunta.

Ho provato ad aggiungere OnTimer() al tuo codice. Ha funzionato in EA quando OnTick() ma come farlo con OnCalculate?

int OnInit()
  {
  EventSetMillisecondTimer(1);
//--- indicator buffers mapping
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
  
  void OnDeinit(const int reason)
{// ---
        EventKillTimer();
 // ---
}
void OnTimer()
  {
   RefreshRates();
  // OnTick();
   OnCalculate();
  }

 
Ibragim Dzhanaev:

Potete dirmi perché gli ordini non si aprono?


OK, si aprirà:
//пересечение вверх
bool PeresVverh()
  {//Объявление пересечения вверх
   //if(Ma(MaPer1,2)>Ma(MaPer2,2))
      if(Ma(MaPer1,1)>=Ma(MaPer2,1))
         if(Ma(MaPer1,0)<Ma(MaPer2,0))
            return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool PeresVniz()
  {//Объявление пересечения вниз
   //if(Ma(MaPer1,2)<Ma(MaPer2,2))
      if(Ma(MaPer1,1)<=Ma(MaPer2,1))
         if(Ma(MaPer1,0)>Ma(MaPer2,0))
            return(true);
   return(false);
  }

 
Sile Si:

Grazie a tutti quelli che hanno risposto.

Artyom, perché scrivi che non l'hai risolto? Sta segnalando su tutti gli strumenti, ma sta caricando pesantemente il sistema. C'è un modo per ridurre il carico?

Il limite di controllo su una nuova barra non va bene perché ci saranno anche condizioni che dovranno essere controllate ad ogni tick.

Nel tuo codice, ho provato ad aggiungere OnTimer(), ha funzionato in EA quando OnTick() ma come fare con OnCalculate?


Prova con un timer per 200 millisecondi.

//+------------------------------------------------------------------+
//|                                                      Test_01.mq4 |
//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window

input string Symbols = "EURUSD, GBPUSD, USDJPY"; // Список символов, разделитель - запятая
//---
struct SSymbolsData
  {
   string   name;       // Имя символа
   datetime time_alert; // Время последнего алерта
  };
SSymbolsData symbols_array[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(200);
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   for(int i=0; i<ArraySize(symbols_array); i++) {
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_BUY) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);;
         if(symbols_array[i].time_alert!=tm) {
            Alert("UP - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_SELL) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);
         if(symbols_array[i].time_alert!=tm) {
            Alert("Down - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Condition(string symbol_name,int shift) {
   MqlRates array[];
   if(CopyRates(symbol_name,PERIOD_CURRENT,shift,2,array)==2){
      if(array[0].open<array[0].close && array[1].open>array[1].close) return(ORDER_TYPE_BUY);
      if(array[0].open>array[0].close && array[1].open<array[1].close) return(ORDER_TYPE_SELL);
      }
   return(WRONG_VALUE);
}
//+------------------------------------------------------------------+
ushort SetSymbols(string symbols_list,SSymbolsData &array[]){
   symbols_list+=","; // Добавим признак конца строки
   short beg=WRONG_VALUE, end=1, len=(short)StringLen(symbols_list);
   string sy="";
   Print(__FUNCTION__," > ",symbols_list); // Посмотрим символы в строке
   while(beg<len) {
      beg++;
      end=(short)StringFind(symbols_list,",",beg);
      if(end==beg || end<0) continue;
      sy=StringSubstr(symbols_list,beg,end-beg);
      if(CheckSymbol(sy,array) || !IsPresentSymbol(sy)) continue;
      ushort sz=(ushort)ArraySize(array);
      ArrayResize(array,sz+1);
      array[sz].name=sy;
      array[sz].time_alert=0;
      //--- Посмотрим корректность найденного символа и записи его в массив
      Print("beg=",IntegerToString(beg,2,'0'),", end=",IntegerToString(end,2,'0'),", sy=|",sy,"|",", in array[",sz,"]=",array[sz].name);
      }
   return((ushort)ArraySize(array));
}
//+------------------------------------------------------------------+
bool CheckSymbol(string symbol_name,SSymbolsData &array[]){
   for(short i=0; i<ArraySize(array); i++) if(array[i].name==symbol_name) return(true);
   return(false);
}
//+------------------------------------------------------------------+
bool IsPresentSymbol(string symbol_name){
   for(ushort i=0; i<SymbolsTotal(false); i++){
      if(SymbolName(i,false)==symbol_name) {
         SymbolSelect(symbol_name,true);
         return(true);
         }
      }
   return(false);
}
//+------------------------------------------------------------------+