Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 14
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
ce n'è un po' quihttps://docs.mql4.com/ru/convert/normalizedouble
DoubleToString, IMHO...
Stampa.
ce n'è un po' quihttps://docs.mql4.com/ru/convert/normalizedouble
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(...)
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...
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));
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:
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));
}
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);
}
Ecco cosa uso
I cicli dovrebbero essere contati in ordine inverso, daOrdersTotal()-1 a 0.