Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 54

 
Mio fratello maggiore è qui. Credo che ci andrò domani.
 
Merkulovv_Artem:

Sto ottenendo il valore esatto, ma non posso fare in modo che il valore "Obem_Pozic" sia 1.00, in modo da poter calcolare il lotto per la visualizzazione, non voglio normalizzarlo, dà solo 4 cifre decimali.

Sto scrivendo in MQL4.

Sto chiedendo di MQL4 nel forum appropriato, qui è una A.


Dovreste usare DoubleToStr() per visualizzare valori più accurati sullo schermo.

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

Questa coppia è probabilmente fornita dal terminale, deve solo essere collegata. Se manualmente, allora in Market Watch. E se siete adulti, dovete usare SymbolSelect().

Non appena avrete un errore, ne seguiranno altri. I primi errori sono nella parte inferiore del terminale. Quindi, dovremmo cercare di eliminare i primi errori e poi vedremo :)

Grazie!!! Molto ben compreso e ben scritto. Ho SymbolSelect() nel mio EA. L'ho postato con il codice su pg. 53, se ne avete bisogno, potete vederlo. Ho controllato con l'aiuto - è corretto!!! Quindi, se questa coppia è fornita dal terminale, cosa devo pensare?

Inoltre, se gli errori di First in line sono in fondo al terminale. Perché i messaggi di errore della stampante e i messaggi del terminale non si alternano - no, sono raggruppati insieme?

Forse il terminale non segnala l'errore di questa funzione?

 
A quanto pare non questo!!! O questo, ma non così. All'inizio i messaggi del programma (stampanti) e i messaggi del terminale si alternano davvero, e poi improvvisamente - e 10-12 volte all'improvviso viene fuori proprio l'errore 4002!!!
 
Probabilmente dovrei ancora cercare nel codice... dove altro potrei avere un indicatore
 
Dimka-novitsek: Ho SymbolSelect() nel mio EA. L'ho postato con il codice a pagina 53. 53, se ne avete bisogno, potete vederlo.

Sì, lo vedo. Proviamo in questo modo:

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

Grazie!!! !!

Potresti dirmi come dovrebbe essere la stampa a tempo variabile, può essere digitale? Vedo uno, cioè il numero uno è visualizzato.

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

Sto chiedendo perché. Questa è una funzione, ha una linea con le stampe. Il secondo dall'alto di conseguenza.

Ecco la chiamata della funzione.

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

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

Notate che uso un'altra funzione nella linea di chiamata. È usato per condannare il tempo. È così perché il mio Expert Advisor è stato pirivato dal 4. Ho usato l'apriscatole in esso. Inseguito, per sicurezza, ho aggiunto F a F4 timeframes per utilizzarlo ulteriormente.

///////////////////////////////////////////////////////////////////////////////////////////////  
    
   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 questo è quello che vedo

 
Dimka-novitsek: Per favore ditemi, come dovrebbe essere la stampa della variabile timeframe, può essere numerica? Vedo uno, cioè il numero uno è visualizzato.

Bene, appena sotto in questo codice viene usato

EnumToString(timeframe), 
 
Grazie! Darò un'altra occhiata.
 
Dimka-novitsek: Grazie! Lasciatemi guardare di nuovo.

Penso di aver capito dove potrebbe essere il problema. Lo descriverò ora.

Dall'immagine, si può vedere che l'EA è in esecuzione su M1, timeframe==1, periodo==140. È corretto?

Il valore timeframe==1 indica molto probabilmente che timeframe==M1. Allo stesso tempo, la voce periodd(period) significa periodd(140). Secondo il codice, la funzione periodd(140) deve restituire il valore PERIOD_CURRENT. Così si scopre che periodd(140)==M1.
E ciò significa che la chiamata iMA appare così: iMA(symbol,M1,M1...) Non so se sia accettabile, nel calcolo di iMA, che il valore del secondo argomento coincida con il valore del terzo argomento (cioè che il periodo coincida con il periodo di mediazione), ma qualcosa mi dice che questo è sbagliato.