[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 284

 
hoz:
Non importa. Sto restituendo un valore assoluto, modulo attraverso MathAbs...


Se state cercando un punto di ingressoMathAbs() introduce una sbavatura. Per me dovrebbe essere specificato da e verso, così è chiaro quando e con quale tolleranza!
 
borilunad:

Se state cercando il punto di ingresso,MathAbs() lo rende spalmato. Per me dovrebbe essere specificato dall'inizio alla fine, così è chiaro quando e con quale tolleranza!


Corretto... Nessuna delle condizioni è comunque soddisfatta.

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на указанном баре                                             |
//+-------------------------------------------------------------------------------------+
double GetMA(int index, int maPeriod)
{
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, index));
}
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок?                                                              |
//+-------------------------------------------------------------------------------------+
void IsRebound(int crossDir[], bool& returnSign[])
{
   for (int i = 0; i < 4; i++)
   {
      if (crossDir[i] == CROSS_NO)
         continue;

      returnSign[i] = false;
      double ema = GetMA(1, g_maPeriod[i]);

 //     VrPr (ND(MathAbs(ema - Ask)));
   //   VrPr (i_thresholdFromMa * pt);
      if (crossDir[i] == CROSS_UP)
      {
         if (ND(Ask - ema) <= i_thresholdFromMa * pt) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
         {
         //   VrPr (ND(MathAbs(ema - Ask)) <= i_thresholdFromMa * pt);
            returnSign[i] = true;
            VrPr (" returnSign["+0+"]"+" = "+ returnSign[0]);
            VrPr (" returnSign["+1+"]"+" = "+ returnSign[1]);
            VrPr (" returnSign["+2+"]"+" = "+ returnSign[2]);
            VrPr (" returnSign["+3+"]"+" = "+ returnSign[3]);
         }
      }
      if (crossDir[i] == CROSS_DN)
      {
         if (ND(ema - Bid) <= i_thresholdFromMa * pt) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
         {
            returnSign[i] = true;
            VrPr (" returnSign["+0+"]"+" = "+ returnSign[0]);
            VrPr (" returnSign["+1+"]"+" = "+ returnSign[1]);
            VrPr (" returnSign["+2+"]"+" = "+ returnSign[2]);
            VrPr (" returnSign["+3+"]"+" = "+ returnSign[3]);
         }
      }
   }
}

areturnSign[i] = true; e di conseguenza alla funzioneVrPr (che è la funzione che emette i dati che controllo) non viene utilizzata. Anche se l'attraversamento è già iniziato. Ecco uno screenshot, potete vedere che l'arraycrossDir[] è riempito come ogni macchina veloce attraversa quella lenta...

Notate che 2 ruote hanno attraversato la più spessa, e 2 elementi dell'array hanno già assegnato il valore 1. Ciò significa che il loro valore èCROSS_DN

Il che significa che la condizione

 if (crossDir[i] == CROSS_DN)

e poi...

 
borilunad:

Se cercate un punto d'ingresso,MathAbs() introduce la sfocatura. Per me, dovrebbe essere specificato dall'inizio alla fine, in modo che sia chiaro quando e con quale tolleranza!

Anche con chi e perché.
 
tara:

Chi altro e perché.

Solo che visivamente è più facile da percepire senza MathAbc() per abitudine, ma... non c'è differenza. Ma ci siamo allontanati dall'argomento. Ci sono osservazioni sul mio codice? Dopo tutto, la questione è ancora aperta...
 
Non ho riserve sul codice.
 
Allora perché la condizione non è soddisfatta? Qualche commento sulla logica?
 

No.

 
Già. Andrà meglio domattina, speriamo che domani si chiarisca qualcosa.
 

Buon pomeriggio a tutti!

Sto testando USD/JPY in MT-4 di Alpari.

Ho scaricato la storia USD/JPY a 1 minuto

Nota: dopo aver caricato nell'archivio delle quotazioni della storia dei minuti a doppio clic su "1 minuto".

L'elenco delle citazioni di un minuto non appare nella finestra Archivio citazioni del Database per qualche motivo.


1 ora TF.

Tutte le zecche

Periodo 01.01.2000. - 01.01.2013.

Alla fine del test, la scheda REPORTS mostra una barra rossa e dice che la qualità della simulazione è del 25%.

Ho testato lo stesso periodo con gli stessi parametri ......ma separatamente per ogni mese

e per ogni mese mostra la barra verde e il 90% di qualità della simulazione

Poi ho testato lo stesso periodo ma dividendolo in 2 parti uguali 2000-2006 e 2006-2013.

Per ogni parte, la barra è verde e la qualità della simulazione è del 90%.


DOMANDA

Cosa devo fare per rendere la qualità dei test per un periodo di 13 anni in generale era anche il 90%?

Grazie

 

Giusto. Credo di aver finito. Ecco il raccoglitore di zecche ridisegnato con il suo impacchettamento in seconde candele.

Lo era:

int start()
  {  
//----
if(flag == true)
  {
  if(tick.time.local == true)
    {
    time = TimeLocal();
    }
    else{
    time = TimeCurrent();
    }
  if(t < time)
    { 
         t = time; 
    }
    else{ 
         t ++;
    }   

  if(FileSeek(hand1e, fpos, SEEK_SET) == false)
           { 
           error = GetLastError();
           Print("out: error(",error,"): ",ErrorDescription(error));
           flag = false;
           return;
           }
           else{
           bid = MarketInfo(symbol, MODE_BID);
           ask = MarketInfo(symbol, MODE_ASK);
           
                FileWriteInteger(hand1e,    t,   LONG_VALUE);            
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);          
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);            
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);    
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);                            
                FileWriteDouble (hand1e, time, DOUBLE_VALUE);                   
      FileFlush       (hand1e);  

      fpos = FileTell (hand1e);

Diventato:

int i;//аналогично i=0
        while((TimeCurrent()-time)>1){//то заносим старые значения столько раз, сколько было пропущено секунд минус один
                if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                                error = GetLastError();//если ошибка
                                Print("out: error(",error,"): ",ErrorDescription(error));//записываем её в лог
                                flag = false;
                                return;//и выходим
                        }else{//выдумываем несуществующую свечу (т.к. тика в эту секунду не было)
                                time++;
                                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
//выбор выдуманной свечи (секунда, при которой тика не было):
//прочерк на Close[]
/*
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Open[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//High[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Low[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                                FileWriteDouble (hand1e,  0, DOUBLE_VALUE);//Volume[]
*/
//свеча без теней
/*
                                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//High[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Low[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                                FileWriteDouble (hand1e,  last.index+1, DOUBLE_VALUE);//Volume[]
*/
//такая же свеча, как и была (не прочерк и не без теней)
                                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                                FileWriteDouble (hand1e,  last.index+1, DOUBLE_VALUE);//Volume[]
//конец выбора
                                FileFlush       (hand1e);
                                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
                }
        }
ArrayResize(bid, 1);//урезаем и обнуляем использованные нмассивы
ArrayResize(ask, 1);
if(flag==true){
        if(tick.time.local==true){//если флаг работы с историей поднят
                        time = TimeLocal();//работаем с локальным временем
                        while(time==TimeLocal()){//пока секунда не прошла
                                bid[i]=MarketInfo(symbol, MODE_BID);//заносим в индикаторный массив данные тиков
                                ask[i]=MarketInfo(symbol, MODE_ASK);
                                i++;
                        }
                }else{//иначе
                        time = TimeCurrent();//работаем с временем сервера
                        while(time==TimeCurrent()){//пока секунда не прошла
                                bid[i]=MarketInfo(symbol, MODE_BID);//заносим в индикаторный массив данные тиков
                                ask[i]=MarketInfo(symbol, MODE_ASK);
                                i++;
                        }                       
        }
}
//Вышли из цикла, т.к. время изменилось. Заносим в файл:
if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                error = GetLastError();//если ошибка
                Print("out: error(",error,"): ",ErrorDescription(error));//записываем её в лог
                flag = false;
                return;//и выходим
        }else{
                int last.index=ArraySize(ask)-1;
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  last.index+1, DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
}

Commenti sul codice.

1. Non ha fatto lo switch-case nella selezione delle candele virtuali per risparmiare tempo di CPU, invece ha commentato le sezioni con la selezione (dato che la selezione viene fatta per esigenze specifiche una volta prima della compilazione).

2. Sul lavoro con l'ora locale (off-line che è) non portato alla mente. Nel ciclo"while(time==TimeLocal()){//fino a quando è passato un secondo", sospetto che ci debba essereMarketInfo in FileWriteDouble (mi sembra il top di un idiota). Se mi dite cosa sarebbe più logico lì, ve ne sarò grato.

3. Un costrutto d'autore

if(flag == true)
  {
  if(tick.time.local == true)
    {
    time = TimeLocal();
    }
    else{
    time = TimeCurrent();
    }

L'ho dichiarato alla fine di init().

4. All'inizio di init() gli array dinamici

   IndicatorBuffers(2);
   SetIndexBuffer(0, bid);
   SetIndexBuffer(1, ask);

al posto delle variabili usate.

5. Per l'ottimizzazione, potete teoricamente usare le funzioni di file WinAPI e scrivere nella cronologia in una volta sola in un blocco di 44 byte (lunghezza della struttura MarketInfo o qualunque cosa sia in .hst).

6. Completamente rimossa la modellazione del tempo dell'autore per la scrittura nella cella Time[]. Per la stessa ragione, in head while loop non c'è nessun controllo per TimeLocal(), solo per TimeCurrent().

7. Cos'altro suggerisci per ottimizzare il codice?