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

 
Andrey F. Zelinsky:
ce n'è un po' quihttps://docs.mql4.com/ru/convert/normalizedouble

DoubleToString, IMHO...

Stampa.

 
Andrey F. Zelinsky:
ce n'è un po' quihttps://docs.mql4.com/ru/convert/normalizedouble
Non ci crederete, ma in origine tutti i dati erano normalizzati, e c'era un digis dopo la virgola. So che anche i valori doppi devono essere normalizzati. Prova a ricalcolare tu stesso i dati statici normalizzati, penso che sia un errore del compilatore, ma spero di sbagliarmi, finora ho risolto con MathRound, ma è sbagliato!
 
arhipov-76:
Non ci crederete, ma in origine tutti i dati erano normalizzati e il digis era dopo la virgola. So che anche i valori doppi devono essere normalizzati. Prova a ricalcolare tu stesso i dati statici normalizzati, penso che sia un errore del compilatore, ma spero di sbagliarmi, finora ho risolto questo problema con la funzione MathRound, ma è sbagliato!

Non so cosa sia il digis, provate la funzione DoubleToString(...).

Se fate i calcoli con quello che avete ora all'interno dell'EA, i calcoli sono corretti, anche conNormalizeDouble(), ma se volete emettere parametri all'esterno, per esempio Print, Alert, Comment, allora usate la normalizzazione attraverso DoubleToString(...)

DoubleToString - Преобразование данных - Справочник MQL4
DoubleToString - Преобразование данных - Справочник MQL4
  • docs.mql4.com
DoubleToString - Преобразование данных - Справочник MQL4
 

Non importa come si normalizza il numero 0,0001, rimarrà una frazione periodica infinita nella rappresentazione binaria perché ha una divisione per 5. In un computer, questa frazione infinita deve essere troncata ad una lunghezza che vada bene. Dividendo per esso si ottiene di nuovo qualcosa di molto lungo, che deve anche essere tagliato. Per vedere "bene" il numero risultante in forma decimale, è necessario convertirlo nel programma in una stringa con un dato numero adeguato di cifre frazionarie. Usando, per esempio, DoubleToString, come già scritto qui.

P.S. "il risultato esce un decimo in meno di quello che dovrebbe essere" - non c'era niente del genere, un'accusa vana. Per un centomilionesimo ha fatto...

 
Timur1988:

Ciao, per favore aiutami con l'algoritmo!
Ho scritto un semplice script che calcola il coefficiente di correlazione di Pearson. Gli array sono basati sui prezzi di chiusura, a partire dalla prima barra.

L'array di prezzi è preso dalla prima barra alla 24esima barra.
Ora voglio calcolare la correlazione anche per 24 barre, ma prendere l'array di prezzi dalla SECONDA(!) barra.

Non conoscendo l'algoritmo, ho inserito ogni array di prezzi manualmente:

24 barre sono una seccatura, e se voglio conoscere la correlazione per 100 barre, è una rottura di palle inserire ogni array.
Cosa fare, gente?)

Probabilmente dovrei correggere la radice quadrata della stringa Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w));

 
Vladimir:

Probabilmente dovremmo anche correggere la radice quadrata del calcolo della stringa Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w));

Ecco una funzione funzionante per calcolare la correlazione, basta dare gli array con i prezzi, e l'output sarà il valore:

string Correlation1(double& CurOpen[], double& SubOpen[]) {
double sumXY2=0, sumX2=0, sumY2=0, sumXs2=0, sumYs2=0, res2=1;

int k=MathMin(ArraySize(CurOpen), ArraySize(SubOpen));
  if(k>2) {
   for(int i=0; i<k; i++) {
     sumXY2+=CurOpen[i]*SubOpen[i];
     sumX2 +=CurOpen[i];
     sumY2 +=SubOpen[i];
     sumXs2+=CurOpen[i]*CurOpen[i];
     sumYs2+=SubOpen[i]*SubOpen[i];    
    }
   res2 = (k*sumXY2-sumX2*sumY2) / MathSqrt( (k*sumXs2-sumX2*sumX2)*(k*sumYs2-sumY2*sumY2) );
  }
  return(DoubleToStr(res2,2));
}
 
Ciao, ho messo il mio robot su un conto demo e sta funzionando per il secondo mese. Oggi apro il terminale, due ordini sono stati piazzati da un segnale, anche se un ordine è stato piazzato prima. Ho una restrizione sul numero di ordini. Quale può essere la ragione?
 

Ecco cosa uso

Вот что я использую

if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Buy<Low[1]&& sar>Close[1])
{SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);}
if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Sell>High[1] && sar<Close[1])
{SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);}


//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//--------------------------------------------------------------------------------//


bool ExistPositions(string sy="", int op=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symb;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if ( OrderMagicNumber()==Magik_number) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 
Neron_76:

Ecco cosa uso

I cicli devono essere contati in ordine inverso, daOrdersTotal()-1 a 0.
 
Vitalie Postolache:
I cicli dovrebbero essere contati in ordine inverso, daOrdersTotal()-1 a 0.
Grazie, dovrò rifarlo.