Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 54

 
Mi hermano mayor está aquí. Supongo que iré mañana.
 
Merkulovv_Artem:

Por favor, avisen donde está el error, me sale el valor exacto, pero no puedo hacer que el valor de "Obem_Pozic" sea 1,00, para poder calcular el lote para visualizarlo, no quiero normalizarlo, solo da 4 decimales.

Estoy escribiendo en MQL4.

Pregunto por el MQL4 en el foro correspondiente, aquí es un A.


Debería utilizar DoubleToStr() para mostrar valores más precisos en la pantalla.

DoubleToStr - Документация на MQL4
  • docs.mql4.com
DoubleToStr - Документация на MQL4
 
Yedelkin:

Este par es probablemente proporcionado por el terminal, sólo necesita ser conectado. Si es manualmente, entonces en Market Watch. Y si se trata de un adulto, debe hacerse manualmente con SymbolSelect().

En cuanto tengas un error, vendrán otros. Los primeros errores están en la parte inferior del terminal. Por lo tanto, deberíamos intentar eliminar los primeros errores y luego ya veremos :)

¡¡¡Gracias!!! Muy bien entendido y bellamente escrito. Tengo SymbolSelect() en mi EA. Lo he publicado con el código en la pg. 53, si lo necesitas, puedes verlo. Lo he comprobado con la ayuda - ¡¡¡es correcto!!! Entonces, si este par es proporcionado por el terminal, ¿qué debo pensar?

Además, si los errores de la primera línea están en la parte inferior del terminal. ¿Por qué no se alternan los mensajes de error de la impresora y los mensajes del terminal?

¿Quizá el terminal no está informando del error de esta función?

 
Al parecer, ¡¡¡ésta no!!! O este, pero no así. ¡¡¡Al principio los mensajes del programa (impresoras) y los mensajes de la terminal realmente se alternan, y de repente - y 10-12 veces el mismo error 4002!!!
 
Probablemente debería seguir buscando en el código... dónde más podría tener un indicador
 
Dimka-novitsek: Tengo SymbolSelect() en mi EA. Lo publiqué con el código en la página 53. 53, si necesitas verlo.

Sí, ya lo veo. Intentémoslo de esta manera:

ResetLastError();
if(SymbolSelect(a_symbol,true)) Print("Символ ",a_symbol," успешно выбран");
else Print("Неудача с выбором символа ",a_symbol,", error = ",_LastError);
 

¡¡¡Gracias!!! ¡¡!!

¿Podría decirme cómo debe ser la impresión de tiempo variable, puede ser digital? Veo uno, quiero decir que aparece el número uno.

///////////////////////////////////////////////////////////////////////////////////////////////////////
 
 double  iMAf( string symbol, ENUM_TIMEFRAMES timeframe, int period, int mama_shift, ENUM_MA_METHOD mama_method, int applied_pricece, int shift){
 
    Print ( " iMAfsymbol  ",symbol,"    iMAftimeframe ",timeframe,"  iMAfperiod  ",period," iMAfmama_shift  ",mama_shift ,"  iMAfmama_method ",mama_method,
    "  iMAfapplied_pricece ", applied_pricece,"  iMAfshift ",shift);
 
                     MA_handle=iMA(symbol,timeframe,periodd(period),mama_shift, mama_method,applied_pricece);Sleep(2000);
                     //--- если не удалось создать хэндл
   if(MA_handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
     PrintFormat("Не удалось создать хэндл индикатора iMA для пары %s/%s, код ошибки %d",
                 symbol,
                  EnumToString(timeframe),
                  GetLastError()); ResetLastError();return (0.0);} 
                     
                    CopyBuffer( MA_handle,0,0,100,MA);
                    ArraySetAsSeries(MA,true);
                     if(shift>99) return(0);
    return( (MA[shift])); } 
                   
///////////////////////////////////////////////////////////////////////////////////////////////////////

Pregunto por qué. Esto es una función, tiene una línea con las huellas. El segundo desde arriba en consecuencia.

Aquí está la llamada a la función.

/////////////////////////////////////////////////////////////////////
int Distance_from_MA(string symbb)
{
 double MAMA = iMAf( symbb, periodd(TFMA), periodMA, ma_shift, ma_method, applied_price, 0);
 
 int spread = (int) MathRound(SymbolInfoInteger(symbb,SYMBOL_SPREAD));
 double point = SymbolInfoDouble(symbb,SYMBOL_POINT);
 
if(SymbolInfoInteger(symbb,SYMBOL_DIGITS) == 3 || SymbolInfoInteger(symbb,SYMBOL_DIGITS) == 5)
{spread = (int) MathRound(SymbolInfoInteger(symbb,SYMBOL_SPREAD)/10);
point = SymbolInfoDouble(symbb,SYMBOL_POINT)*10;}
 
 if(iClose(symb,TF_Price,0)+(spread*point)+(Min_Distance_from_MA*point)<=MAMA) return(-1);
 if(iClose(symb,TF_Price,0)-(Min_Distance_from_MA*point)>=MAMA) return (1);
 
 
 return(0);
} 

////////////////////////////////////////////////////////////////////

Obsérvese que utilizo otra función en la línea de llamada. Se utiliza para condenar el marco temporal. Esto es así porque mi Asesor Experto ha sido pirateado desde el 4. He utilizado el abridor decajas en él.Más tarde, por si acaso, añadí F a F4 timeframes para seguir utilizándolo.

///////////////////////////////////////////////////////////////////////////////////////////////  
    
   ENUM_TIMEFRAMES  periodd(int per)
  {
   switch(per)
     {
      case 0: return(PERIOD_CURRENT);
      case 1: return(PERIOD_M1);
      case 5: return(PERIOD_M5);
      case 15: return(PERIOD_M15);
      case 30: return(PERIOD_M30);
      case 60: return(PERIOD_H1);
      case 240: return(PERIOD_H4);
      case 1440: return(PERIOD_D1);
      case 10080: return(PERIOD_W1);
      case 43200: return(PERIOD_MN1);
      
      case 2: return(PERIOD_M2);
      case 3: return(PERIOD_M3);
      case 4: return(PERIOD_M4);      
      case 6: return(PERIOD_M6);
      case 10: return(PERIOD_M10);
      case 12: return(PERIOD_M12);
      case 16385: return(PERIOD_H1);
      case 16386: return(PERIOD_H2);
      case 16387: return(PERIOD_H3);
      case 16388: return(PERIOD_H4);
      case 16390: return(PERIOD_H6);
      case 16392: return(PERIOD_H8);
      case 16396: return(PERIOD_H12);
      case 16408: return(PERIOD_D1);
      case 32769: return(PERIOD_W1);
      case 49153: return(PERIOD_MN1);      
      default: return(PERIOD_CURRENT);
     }
  }  
  
  
  ///////////////////////////////////////////////////////////////////////////

Y esto es lo que veo

 
Dimka-novitsek: Por favor, dígame, ¿cómo debe ser la impresión de la variable de tiempo, puede ser numérica? Veo uno, quiero decir que aparece el número uno.

Pues bien, justo debajo en este código se utiliza

EnumToString(timeframe), 
 
Gracias. Voy a echar otro vistazo.
 
Dimka-novitsek: Gracias. Déjame verlo de nuevo.

Creo que he descubierto dónde puede estar el problema. Lo describiré ahora.

En la imagen, se puede ver que el EA se está ejecutando en M1, timeframe==1, period==140. ¿Es correcto?

El valor timeframe==1 indica probablemente que timeframe==M1. Al mismo tiempo, la entrada periodd(period) significa periodd(140). Según el código, la función periodd(140) debe devolver el valor PERIOD_CURRENTE. Así que resulta que periodd(140)==M1.
Y eso significa que la llamada a iMA tiene el siguiente aspecto: iMA(símbolo,M1,M1...) No sé si es aceptable a la hora de calcular iMA que el valor del segundo argumento coincida con el valor del tercer argumento (es decir, que el periodo coincida con el periodo de promediación), pero algo me dice que eso está mal.

Razón de la queja: