Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1252

 
ANDREY:
Buona giornata a tutti voi!
Sto testando questo algoritmo in MT4 tester usando mql4. Ho bisogno della funzione Print() per emettere il prezzo dell'offerta in log con 5 (cinque) cifre decimali. Ma stamperebbe solo 4 (quattro) cifre decimali. Per favore, ditemi come risolvere il mio errore, se esiste.
Ecco il mio codice.
void OnTick()
{
Print("=======Bid ======= ",NormalizeDouble(Bid,Digits) );

}


Allo stesso tempo, se stampo con Print() il prezzo di apertura e di chiusura dell'ordine (per SL e TP), allora Print() stampa il prezzo con 5 (cinque) cifre.
Grazie a tutti per il vostro aiuto.

DoubleToString(), non NormalizeDouble()

 
Igor Makanu:

Ti ho detto che non mi piaceva la mia decisione (((

Troppo pigro per scrivere di nuovo.

Cerca su Google "array trova ripetizioni" - penso che troverai qualcosa

enum EResult{Ok,AllocError};

template<typename T>
EResult GetRepeat(const T &arr[],T &ret[],uint count){
   int size=ArraySize(arr);
   if (ArrayResize(ret,size)!=size) return AllocError;
   int ii=0;
   for (int i=0;i<size;){
      T tmp=arr[i];
      uint repeatCount=1;
      while(++i<size&&arr[i]==tmp) ++repeatCount;
      if (repeatCount>=count) ret[ii++]=tmp;}
   return ArrayResize(ret,ii)==ii?Ok:AllocError;
}

void OnStart()
{
   int arr[]={1,2,4,4,4,55,55,7,7,7,7,7,8,9,77,66,66,66};
   int ret[];
   if (!GetRepeat(arr,ret,3)) ArrayPrint(ret);
} 
 
Artyom Trishkin:

DoubleToString(), non NormalizeDouble()

Grazie mille per il vostro supporto informativo.

 
Colleghi, se non è troppo disturbo, vi prego di esaminare la mia domanda.
https://www.mql5.com/ru/forum/160683/page1251#comment_18219493
In particolare, come faccio a sapere il valore del minuto in cui la posizione è aperta?
 
Aleksey Masterov:
In particolare, come trovate il valore del minuto in cui una posizione è aperta?

utilizzare TimeToStruct()

https://www.mql5.com/ru/docs/dateandtime/timetostruct

 
Igor Makanu:

utilizzare TimeToStruct()

https://www.mql5.com/ru/docs/dateandtime/timetostruct

Sì, ce l'ho su mt4
 
Aleksey Masterov:
Sì, ce l'ho su mt4

funziona in MT4

 
Igor Makanu:

funziona in MT4

Non ho ancora capito come posso ottenere il valore del minuto in cui unaposizione è stata aperta da questa struttura...
 
Aleksey Masterov:
Non capisco come posso ottenere il valore di minuto quandola posizione è stata aperta da questa struct che restituisce tromba...

datetime o_open = OrderOpenTime();

MqlDateTime dt_struct;

TimeToStruct( o_open, dt_struct;)

int min = dt_struct.min;

 

Se potete aiutarmi a capire cosa c'è di sbagliato quando si cerca di leggere i dati del buffer dell'indicatore.

Ecco il codice dell'EA:

      if (IsTesting())
         {
         Trend    = GlobalVariableGet(GV_tradesTrend);
         TrendUP  = iCustom(NULL,0,"Used\\# Once Trades Trend",3,0);
         TrendDN  = iCustom(NULL,0,"Used\\# Once Trades Trend",4,0);
         if (TrendUP>0) {Trend=1; GlobalVariableSet(GV_tradesTrend,1);}
         if (TrendDN>0) {Trend=-1;GlobalVariableSet(GV_tradesTrend,-1);}
         if (Trend==1)  {GlobalVariableSet(GV_Trend,1);}
         if (Trend==-1) {GlobalVariableSet(GV_Trend,-1);}
         if (Trend==0)  {GlobalVariableSet(GV_Trend,0);}
         }
      else
         {
         Trend = GetLastTrendChange();
         if (Trend==1)  {GlobalVariableSet(GV_Trend,1);}
         if (Trend==-1) {GlobalVariableSet(GV_Trend,-1);}
         if (Trend==0)  {GlobalVariableSet(GV_Trend,0);}
         }
//+----------------------------------------------------------------------------+
int GetLastTrendChange()
   {
   int   trendType=0;
   int   y=0;
   int   t=500;
   while (y<t)
      {
      if (iOpen(NULL,0,t)==y) {return(0);}
      trendType=FindTrendChange(y);
      if (trendType==1 || trendType==-1) {return(trendType);}
      y++;
      }
   return(0);
   }
//+----------------------------------------------------------------------------+
int FindTrendChange(int index)
   {
   double   trendUP,trendDN;
   int      trendType=0;
   trendUP = iCustom(NULL,0,"Used\\# Once Trades Trend",3,index);
   trendDN = iCustom(NULL,0,"Used\\# Once Trades Trend",4,index);
   if (trendUP>0) {trendType=1;}
   if (trendDN>0) {trendType=-1;}
   return (trendType);
   }
//+----------------------------------------------------------------------------+

Nella realtà e nei test la ricerca dell'ultimo valore attraverso la funzione funziona, ma il test è catastroficamente lento (il test di metà anno si estende per diversi giorni).

Così ho deciso di usare swap su test e salvare l'ultimo valore nella variabile globale - l'Expert Advisor ha smesso di vedere i dati del buffer. E anche se i buffer vuoti sono 0, per qualche ragione le variabili di EA prendono valori EMPTY_VALUE e non cambiano.

comm

Ma quando metto il cursore sulla linea del buffer nella finestra dei dati, due valori appaiono nel tooltip, e il primo valore è 0, per esempio Value 5; 0.0000; 0.8855.

Non riesco a scoprirlo, anche se mi aggiro nel codice dell'indicatore. La ricerca in Internet e la documentazione non hanno aiutato. Qualcuno può consigliarmi perché il test è così lento quando cerco di usare questo indicatore?

Per favore, aiutatemi!

File: