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

 
Alexey Viktorov:

O problema está nesta linha

Como quero verificar várias moedas em uma barra, devo verificar o tempo e a moeda para evitar repetir um alerta em uma barra e um símbolo, mas permitir um alerta na mesma barra com um símbolo diferente. À primeira vista, precisamos de mais um conjunto com bandeiras, quer o símbolo seja visto ou não.

Em geral, temos que adicionar uma verificação de símbolo a esta linha, ou repetir o laço somente quando uma nova barra aparece. Mas tenho medo de que quando uma nova barra aparece no símbolo com este indicador, uma nova barra ainda não tenha aparecido em outro símbolo.

A conclusão: devemos esforçar nossos músculos da cabeça para determinar se uma nova barra aparece em cada símbolo separadamente, mas ao mesmo tempo não devemos esticar o número de linhas até o infinito. Não tenho uma solução pronta. E não gosto de sugerir isso escrevendo código...

E eu ainda não resolvi o problema dele?

Talvez eu tenha perdido algo em algum lugar - eu escrevi o código no meu joelho.

 
Artyom Trishkin:

E eu ainda não resolvi o problema dele?

Talvez eu tenha perdido algo em algum lugar - eu escrevi o código no meu joelho.

Artem, a última frase do meu post explica tudo. Nem sequer olhou para o seu código. Abri a primeira pergunta não lida com uma citação da minha resposta anterior, respondi e depois vi os outros conselhos. Não duvido da correção do seu código, mesmo do meu joelho.

 
Alexey Viktorov:

Artyom, a última frase do meu posto explica tudo. Nem sequer olhou para o seu código. Abri a primeira pergunta não lida, com uma citação da minha resposta anterior, respondi e depois vi outros conselhos. Não duvido da correção do seu código, mesmo do meu joelho.

teria dito preguiçoso ;)

Mesmo à primeira vista, você pode ver que o código depende de carrapatos no símbolo atual. E assim devemos remover o laço da OnTick() e enfiá-lo em um temporizador. E modificar ligeiramente a definição de alertas de tempo.

 

Olá a todos, há um mal entendido do processo, na função "iniciar" no ciclo mm++; e acompanhar as mudanças nele através de Print(); então a pergunta: "Por que ao invés de 1,2,3,4, etc. aparecem números de quatro dígitos? "

o próprio código

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);
  }
//+------------------------------------------------------------------+
 
виталик:

Olá a todos, há um mal entendido do processo, na função "iniciar" no ciclo mm++; e acompanhar as mudanças nele através de Print(); então a pergunta: "Por que ao invés de 1,2,3,4, etc. aparecem números de quatro dígitos? "

o próprio código


Na primeira execução, 10 segundosIndicatorCounted()=0

 limit=(Bars-counted_bars)-1;

assimlimit= max barras na história-1

 
Alekseu Fedotov:


Na primeira execução, por 10 segundosIndicadorContado()=0

significalimite= máximo de barras na história-1

ainda não claro, declaração e inicialização com zero fora do loop int mm=0; e colocado no loop mm++; impressão() mostra números de quatro dígitos mudando com uma diferença de uma unidade apenas na direção descendente por algum motivo
 
виталик:
ainda não claro, declaração e inicialização com zero fora do loop int mm=0; e colocado no loop mm++; impressão() mostra números de quatro dígitos mudando com uma diferença de uma unidade, apenas na direção descendente por algum motivo
Nem todas as impressões são impressas neste registro. Veja no arquivo.
 

Alexey Viktorov:

...você tem que esticar os músculos da cabeça...

Obrigado a todos que responderam.

Artyom Trishkin: Assim:

Artem, por que você escreve que ainda não resolveu isso? Ele envia os sinais para todas as ferramentas, mas só carrega muito o sistema. É possível reduzir a carga?

Restringir a verificação em um novo bar não funcionará porque também haverá condições que devem ser verificadas em cada carrapato.

Tento adicionar OnTimer() ao seu código. Funcionou na EA quando OnTick() mas como fazer isso com 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:

Você pode me dizer por que as ordens não estão abrindo?


OK, ele será aberto:
//пересечение вверх
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:

Obrigado a todos que responderam.

Artyom, por que você escreve que ainda não resolveu isso? Está sinalizando em todos os instrumentos, mas está carregando muito o sistema. Existe alguma maneira de reduzir a carga?

O limite de verificação em um novo bar não serve porque também haverá condições que terão que ser verificadas em cada carrapato.

Em seu código, eu tento adicionar OnTimer(), ele funcionou na EA quando OnTick() mas como fazer isso com OnCalculate ?


Experimente-o com um temporizador por 200 milissegundos.

//+------------------------------------------------------------------+
//|                                                      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);
}
//+------------------------------------------------------------------+
Razão: