Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 838

 

¿Cómo puedo vaciar los valores altos y bajos del indicador? Por ejemplo, si establezco un máximo de 100 y un mínimo de 0, y luego necesito que el indicador lo visualice todo, ¿cómo lo organizo? El asunto es que escribo un indicador con varios modos, uno de los cuales utiliza el máximo y el mínimo, pero después de cambiar el modo en los parámetros de entrada el máximo sigue siendo 100, así como el mínimo 0


MQL5

 
Alekseu Fedotov:

Ya ha llamado y pasado el valor devuelto porDeviation(Kanal) a la funciónEnvelopes(........)

y en la propia funciónEnvelopes(........) se declara el último parámetro, que tomará este valor


así

Gracias, ahora tiene más sentido.

 

Modifiqué ligeramente el código para MT5 de acuerdo a tus consejos, quedó así:

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ólo que ahora no entiendo por qué en cada tick se escribe el primer valor calculado en todas partes.

Cálculos

¿Pueden decirme cómo solucionarlo?
 
Alexander Layzerevich:

Modifiqué ligeramente el código para MT5 de acuerdo a tus consejos, quedó así:

Sólo que ahora no entiendo por qué en cada tick se escribe un valor calculado en todas partes.

//---------------------------------------------------
   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()); }
//---------------------------------------------------

Se ve inmediatamente. Incluso sin ser destacado.

 
Artyom Trishkin:

Llama la atención de inmediato. Incluso sin el resaltado.

Gracias.

 

Cualquier pregunta de los novatos en MQL4, ayuda y discusión sobre algoritmos y códigos

WinProject, 2019.05.07 18:38

¿Pueden decirme por qué el mismo código funciona en MT4 pero no funciona en MT5? En MT5 la variable strNum siempre es =1, pero en MT4 el contador ++ funciona como debería y strNum = el número de partidas del fichero.

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

Me respondo a mí mismo, puede ser útil para aquellos que no tienen ningún bucle en MT5 al abrir o leer un archivo en matriz o estructura. En MT5, a diferencia de MT4, cuando se lee un archivo .csv, se debeestablecer adicionalmentela bandera de apertura del archivo FILE_ANSI.

Es decir, en MT5 la línea debería tener este aspecto:

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

¿Por qué? No lo sé, ¿quizás alguien lo sepa?

 
Si el registro del EA muestra una notificación de este formato - uninit reason 3 (la notificación se debe al cambio de la TM), pero el robot no se elimina del gráfico, ¿se guardan los valores de las variables y todos los cálculos que se han recibido?
 

Obtengo "OrderSend error 130" por razón desconocida, el programa se ejecuta en el probador de estrategias en la cuenta de demostración, por lo que no puede haber ninguna restricción del corredor por lo que entiendo, Stops Level = 30. Me aparece este error a intervalos regulares durante las pruebas y el stop se fija en porcentaje de ATR para todas las operaciones pero algunas órdenes se colocan con éxito mientras que otras no.

      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++;    
      }

Hay veces que un pedido es rechazado varias veces y luego pasa...



 

¿Cómo puedo publicar el mismo código en CodeBase para públicos de diferentes idiomas (por ejemplo, cómo puedo rellenar un formulario en el mercado para el idioma correspondiente)?


Ya he visto esto en CodeBase, aquí hay un ejemplo


¿Cómo puedo hacer lo mismo?

 

Por ejemplo, cuando se disminuye hasta el límite el tamaño de la escala de las velas con el ratón, entonces las lecturas del indicador cambian, aunque ninguno de los miles de velas en el código del indicador dice nada sobre el cambio del tamaño de las velas. Por ejemplo, a las 4 horas los volúmenes en forma reducida muestran un valor, pero si se aumenta ligeramente la escala de las velas, entonces se considerará otro ajuste como el correcto.