Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 54

 
O meu irmão mais velho está aqui. Acho que estarei de volta amanhã.
 
Merkulovv_Artem:

Por favor informe onde está o erro. Estou a obter o valor exacto, mas não posso fazer com que o valor "Obem_Pozic" seja 1,00, por isso posso calcular o lote para exibição, não o quero normalizar, apenas dá 4 casas decimais.

Estou a escrever em MQL4.

Estou a perguntar sobre a MQL4 no fórum apropriado, aqui está um A.


Deve usar DoubleToStr() para exibir valores mais precisos no ecrã.

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

Este par é provavelmente fornecido pelo terminal, só precisa de ser ligado. Se manualmente, então em Market Watch. E se for um adulto, deve ser feito manualmente com SymbolSelect().

Assim que tiver um erro, outros o seguirão. Os primeiros erros estão no fundo do terminal. Portanto, devemos tentar eliminar os primeiros erros e depois veremos :)

Obrigado!!! Muito bem compreendido e maravilhosamente escrito. Eu tenho SymbolSelect() na minha EA. Afixei-o com o código em pg. 53, se precisar dele, pode vê-lo. Verifiquei com a ajuda - é correcto!!! Então, se este par é fornecido pelo terminal, o que devo pensar?

Além disso, se os erros do Primeiro da linha estiverem no fundo do terminal. Porque é que as mensagens de erro da impressora e as mensagens do terminal não se alternam - não, estão agrupadas?

Talvez o terminal não esteja a comunicar o erro a partir desta função?

 
Aparentemente este não!!!! Ou este, mas não assim. Primeiro as mensagens do programa (impressoras) e as mensagens do terminal realmente alternam, e depois de repente - e 10-12 vezes de repente surge o próprio erro 4002!!!
 
Provavelmente ainda devo procurar no código... onde mais poderia ter um indicador
 
Dimka-novitsek: Eu tenho SymbolSelect() no meu EA. Afixei-o com o código na página 53. 53, se precisar de o ver.

Sim, estou a ver que sim. Vamos tentar desta forma:

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

Obrigado!!! !!

Poderia dizer-me, por favor, como deve ser a impressão do período de tempo variável, pode ser digital? Vejo um, quero dizer que o número um é exibido.

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

Pergunto porquê. Esta é uma função, tem uma linha com as impressões digitais. A segunda a partir do topo, em conformidade.

Aqui está a chamada de função.

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

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

Note-se que utilizo outra função na linha de chamada. É utilizado para condenar o período de tempo. É assim porque o meu Conselheiro Especialista tem sido pyrivédico desde 4. Usei umabre-caixas nele. Mais tarde, só por precaução, acrescentei F a F4 prazos para a sua utilização posterior.

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

E isto é o que eu vejo

 
Dimka-novitsek: Por favor, diga-me, como deve ser a impressão da variável temporal, pode ser numérica? Vejo um, quero dizer que o número um é exibido.

Bem, logo abaixo neste código é utilizado

EnumToString(timeframe), 
 
Obrigado! Vou dar outra vista de olhos.
 
Dimka-novitsek: Obrigado! Deixem-me voltar a olhar para ela.

Penso ter descoberto onde poderá estar o problema. Descrevê-lo-ei agora.

A partir da imagem, pode-se ver que a EA está a funcionar em M1, timeframe===1, period===140. É correcto?

O prazo===1 valor muito provavelmente indica que o prazo===M1. Ao mesmo tempo, a entrada periodd(período) significa periodd(140). De acordo com o código, a função periodd(140) deve devolver o valor PERIOD_CURRENT. Acontece que esse períodod(140)==M1.
E isso significa que a chamada iMA é assim: iMA(símbolo,M1,M1...) Não sei se é aceitável ao calcular o iMA para que o valor do segundo argumento coincida com o valor do terceiro argumento (ou seja, para que o período coincida com o período médio), mas algo me diz que está errado.