[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 284

 
borilunad:

Si vous cherchez un point d'entrée,MathAbs() le rend barbouillé. Pour moi, cela devrait être spécifié du début à la fin, afin que l'on sache clairement quand et avec quelle tolérance !


Corrigé... De toute façon, aucune des conditions n'est remplie.

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на указанном баре                                             |
//+-------------------------------------------------------------------------------------+
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]);
         }
      }
   }
}

àreturnSign[i] = true; et par conséquent à la fonctionVrPr (qui est la fonction qui sort les données que je contrôle) n'est pas utilisée. Bien que la traversée vers le bas ait déjà commencé. Voici une capture d'écran, vous pouvez voir que le tableaucrossDir[] est rempli lorsque chaque machine rapide croise la lente...

Remarquez que 2 roues ont traversé la plus épaisse, et que 2 éléments du tableau ont déjà la valeur 1, ce qui signifie que leur valeur estCROSS_DN.

Ce qui signifie que la condition

 if (crossDir[i] == CROSS_DN)

et puis...

 
borilunad:

Si vous cherchez un point d'entrée,MathAbs() introduit un certain flou. Pour moi, elle doit être précisée du début à la fin, afin que l'on sache clairement quand et avec quelle tolérance !

Et aussi avec qui et pourquoi.
 
tara:

Qui d'autre et pourquoi.

Sauf que visuellement c'est plus facile à percevoir sans MathAbc() par habitude, mais... il n'y a pas de différence. Mais nous nous sommes éloignés du sujet. Y a-t-il des remarques sur mon code ? Après tout, la question reste ouverte...
 
Je n'ai aucune réserve sur le code.
 
Alors pourquoi la condition n'est-elle pas remplie ? Un commentaire sur la logique ?
 

Non.

 
Oui. Ça ira mieux demain matin, j'espère que ça s'éclaircira demain.
 

Bonjour à tous !

Je teste USD/JPY dans MT-4 d'Alpari.

J'ai téléchargé l'historique USD/JPY 1 minute.

Note : Après le chargement dans l'archive des cotations de l'historique des minutes à double clic sur "1 minute".

La liste des citations d'une minute n'apparaît pas dans la fenêtre des archives de citations de la base de données pour une raison quelconque.


1 heure TF.

Toutes les tiques

Période 01.01.2000. - 01.01.2013.

A la fin du test, l'onglet REPORTS affiche une barre rouge et indique que la qualité de la simulation est de 25%.

J'ai testé la même période avec les mêmes paramètres ......mais séparément pour chaque mois

et pour chaque mois, il montre une barre verte et une qualité de simulation de 90%.

J'ai ensuite testé la même période mais en la divisant en deux parties égales : 2000-2006 et 2006-2013.

Pour chaque pièce, la barre est verte et la qualité de la simulation est de 90%.


QUESTION

Que dois-je faire pour que la qualité des tests effectués pendant une période de 13 ans soit également de 90 % en général ?

Merci.

 

Bien. Je crois que j'ai fini. Voici le collecteur de tiques redessiné avec son emballage dans les secondes bougies.

C'était :

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

Devenu :

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);//запоминаем позицию записи в файле
}

Commentaires sur le code.

1. N'a pas fait de switch-case dans la sélection des chandeliers virtuels pour économiser du temps CPU, mais a commenté les sections avec sélection (puisque la sélection est faite pour des besoins spécifiques une fois avant la compilation).

2. Au travail, l'heure locale (hors ligne, donc) n'a pas été prise en compte. Dans la boucle"while(time==TimeLocal()){//until one second has passed", je soupçonne qu'il doit y avoirMarketInfo dans FileWriteDouble (ça me semble être le haut d'un idiot). Si vous me dites ce qui serait plus logique à cet endroit, je vous en serai reconnaissant.

3. Une construction d'auteur

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

Je l'ai déclaré à la toute fin de init().

4. Au début de init() des tableaux dynamiques

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

au lieu des variables utilisées.

5. Pour l'optimisation, vous pouvez théoriquement utiliser les fonctions de fichier WinAPI et écrire dans l'historique en une seule fois dans un bloc de 44 octets (longueur de la structure MarketInfo ou autre dans .hst).

6. Suppression complète de la modélisation du temps d'écriture de l'auteur dans la cellule Time[]. Pour la même raison, dans la boucle head while, il n'y a pas de vérification de TimeLocal(), seulement de TimeCurrent().

7. Que suggérez-vous d'autre pour optimiser le code ?

 
gyfto:

Bien. Je crois que j'ai fini. Voici le collecteur de tiques retravaillé avec son emballage dans les secondes bougies.

C'était :

Devenu :

Commentaires sur le code.

1. N'a pas fait de switch-case dans la sélection des chandeliers virtuels pour économiser du temps CPU, mais a commenté les sections avec sélection (puisque la sélection est faite pour des besoins spécifiques une fois avant la compilation).

2. Au travail, l'heure locale (hors ligne, donc) n'a pas été prise en compte. Dans la boucle"while(time==TimeLocal()){//until one second has passed", je soupçonne qu'il doit y avoirMarketInfo dans FileWriteDouble (ça me semble être le haut d'un idiot). Si vous me dites ce qui serait plus logique à cet endroit, je vous en serai reconnaissant.

3. Une construction d'auteur

Je l'ai déclaré à la toute fin de init().

4. Au début de init() des tableaux dynamiques

au lieu des variables utilisées.

5. Pour l'optimisation, vous pouvez théoriquement utiliser les fonctions de fichier WinAPI et écrire dans l'historique en une seule fois dans un bloc de 44 octets (longueur de la structure MarketInfo ou autre dans .hst).

6. Suppression complète de la modélisation du temps d'écriture de l'auteur dans la cellule Time[]. Pour la même raison, dans la boucle head while, il n'y a pas de vérification de TimeLocal(), seulement de TimeCurrent().

7. Que suggérez-vous d'autre pour optimiser le code ?

A partir du point 4 il faut comprendre que vous faisiez un indicateur, alors de telles actions ne sont pas claires :

ArrayResize (bid, 1);//урезаем и обнуляем использованные массивы
ArrayResize (ask, 1);

ArrayInitialize() est très probablement approprié !

Et très probablement, vous devriez refuser d'utiliser les tableaux d'indicateurs.