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

 

Como esvaziar os valores altos e baixos do indicador? Por exemplo, se eu fixar um máximo de 100 e um mínimo de 0, e depois preciso do indicador para visualizar tudo, como organizo isso? A questão é que eu escrevo um indicador com vários modos, um dos quais usa o máximo e o mínimo, mas depois de mudar o modo nos parâmetros de entrada o máximo permanece 100, assim como o mínimo 0


MQL5

 
Alekseu Fedotov:

Você já chamou e passou o valor devolvido peloDeviation(Kanal) para a funçãoEnvelopes(........)

e na própria funçãoEnvelopes(........), você declara o último parâmetro, que tomará este valor


como este

Obrigado, agora faz mais sentido.

 

Modificou ligeiramente o código para o MT5 de acordo com o seu conselho, e acabou assim:

input  string Parametrs_Indicator       = "Настройки Индикатора";// Настройки Индикатора

input  ENUM_TIMEFRAMES   Time_Frames    = PERIOD_M5;             // Временной период
       int                Ma_Period     = 120;                   // Период
       int                Ma_Shift      = 0;                     // Cдвиг средней
       ENUM_MA_METHOD     Ma_Method     = MODE_SMMA;             // Mетод усреднения
       ENUM_APPLIED_PRICE Applied_Price = PRICE_CLOSE;           // Tип цены
//************************************************************************************************/
void OnTick()
{
//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------
}
//************************************************************************************************/
double Envelopes(int buff, double _Deviation)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TimeFrames, Ma_Period, Ma_Shift, Ma_Method, Applied_Price, _Deviation);
   if(handle<0)
   {
    Print("Failed to create handle iEnvelopes, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,buff,0,1,buf)<0)
    {
     Print("Failed to copy data from the indicator iEnvelopes, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

Só agora eu não entendo porque a cada tique o primeiro valor calculado é escrito em todos os lugares.

Cálculos

Você pode me dizer como consertá-lo?
 
Alexander Layzerevich:

Modificou ligeiramente o código para o MT5 de acordo com o seu conselho, e acabou assim:

Só agora eu não entendo porque a cada tique um valor calculado é escrito em todos os lugares.

//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------

Isso é imediatamente visível. Mesmo sem ser destacado.

 
Artyom Trishkin:

Chama a atenção imediatamente. Mesmo sem o destaque.

Obrigado.

 

Qualquer pergunta de novatos sobre MQL4, ajuda e discussão sobre algoritmos e códigos

WinProject, 2019.05.07 18:38

Você pode me dizer por que o mesmo código funciona no MT4, mas não funciona no MT5? Em MT5 a variável strNum sempre =1, mas em MT4 o contador ++ funciona como deveria e strNum = número de itens de linha no arquivo.

int strNum;
void OnStart()
  {
 FileNum();
 Alert1();
  } 

  void FileNum()
{
      int handle=FileOpen("File.csv",FILE_CSV|FILE_READ,';');
      strNum=0; 
      while(!FileIsEnding(handle))
{
      FileReadString(handle);
      strNum++;
      if(FileIsEnding(handle)==true)
      break;
}
      FileClose(handle);
}

      void Alert1()
{
      Alert (strNum);
}

Estou respondendo a mim mesmo, pode ser útil para aqueles que não têm loop no MT5 ao abrir ou ler o arquivo em array ou estrutura. No MT5, ao contrário do MT4, ao ler o arquivo .csv, você deve, adicionalmente,colocar a bandeira FILE_ANSI paraabrir o arquivo.

Ou seja, no MT5 a linha deve ser parecida com esta:

int handle=FileOpen("File.csv",FILE_READ|FILE_ANSI|FILE_CSV,";");

Por que, eu não sei, talvez alguém saiba?

 
Se o log EA exibir uma notificação deste formato - razão não-init 3 (a notificação é devido à troca da TM), mas o robô não é removido do gráfico, os valores das variáveis e todos os cálculos que foram recebidos são retidos?
 

Eu recebo "OrderSend error 130" por razão desconhecida, o programa está sendo executado em testador de estratégia em conta demo, portanto não pode haver nenhuma restrição do corretor até onde eu entendo, Nível de Paradas = 30. Eu recebo este erro em intervalos regulares durante os testes e a parada é fixada em porcentagem de ATR para todas as negociações, mas algumas ordens são feitas com sucesso enquanto outras não são.

      Print("!!!long level = ", level, ", stop = ", NormalizeDouble(level - stop, Digits));
      if(Bid < level) {
         tickets[orders] = OrderSend(symbol, OP_BUYSTOP, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                                                                           
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;          
         firstTouchTimes[orders] = firstTouchTime;
         orders++;                   
      }       
      else { 
         tickets[orders] = OrderSend(symbol, OP_BUYLIMIT, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;
         firstTouchTimes[orders] = firstTouchTime;
         orders++;    
      }

Há momentos em que uma ordem é rejeitada várias vezes e depois passa...



 

Como posso publicar o mesmo código no CodeBase para diferentes idiomas (por exemplo, como posso preencher um formulário no mercado para o idioma correspondente)?


Eu já vi isso no CodeBase, aqui está um exemplo


Como posso fazer o mesmo?

 

Por exemplo, quando o tamanho dos castiçais diminui até o limite com o mouse, então as leituras dos indicadores mudam, embora nenhum dos milhares de castiçais no código indicador diga algo sobre a mudança de tamanho dos castiçais. Por exemplo, às 4 horas os volumes em forma reduzida mostram um valor, mas se você aumentar ligeiramente a escala dos castiçais, então outra configuração será considerada como a correta.