Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 223

 
ALXIMIKS:


J'ai eu le temps - j'ai élaboré un algorithme pour cette tâche, je l'ai décrit (en détail, peut-être un peu incorrect pour certaines personnes - les gens sont différents en termes de rentabilité).

sarcasme ? Je ne sais pas, juste pour aider.

écrire le code à quelqu'un ? optimiser davantage ? (oui, je peux, mais est-ce que ça en vaut la peine ?)

(PS artmedia70, sans vouloir vous offenser, je respecte votre attitude et votre opinion en général - honnêtement, mais l'autre jour, vous avez vous-même donné le code d'iCustom-y pour le moins pas très optimisé).

Quelque chose comme ça devrait fonctionner si vous l'insérez dans la vérification d'une nouvelle barre.

Le code serait plus optimal si kilkict=iBars(sy,tf) était réduit après un certain nombre de fractales, afin de ne pas passer constamment par toutes les barres.

Merci. J'ai commencé à écrire en suivant votre algorithme. Mais avec des drapeaux, vous êtes aussi proche que moi de Pékin. Merci encore.
 
gince:
Merci. J'ai commencé à écrire en suivant votre algorithme. Mais avec des drapeaux, je suis aussi loin de Pékin que vous. Merci encore.


https://www.mql5.com/ru/forum/131516/page34

Là-bas - un article précoce a partagé son expérience. Exactement sur cette question.

 
tara:


https://www.mql5.com/ru/forum/131516/page34

Là-bas - un article précoce a partagé son expérience. Exactement sur cette question.


SPS
 

Quel pourrait être le problème ?

Parfois, une erreur de division par "O" est affichée pendant un test.

double LotsOptimized()
  {
   double lot=Lots;
   double Lot;
   if (isFloatLots == true)          // если флаг true то проводится оптимизация величины лота, иначе лот неизменен
     {  
        int orders=HistoryTotal();  // history orders total
        int losses=0; // number of losses orders without a break
        double loss=0;              
//---- select lot size
        double  lot_min         = MarketInfo( Symbol(), MODE_MINLOT  ); 
        double  lot_max         = MarketInfo( Symbol(), MODE_MAXLOT  ); 
        double  lot_step        = MarketInfo( Symbol(), MODE_LOTSTEP ); 
        double  lotcost         = MarketInfo( Symbol(), MODE_TICKVALUE );       
                
        lot                             = 0.0;
        double  dollarsPerPip   = 0.0;
        
        lot = AccountBalance()*MaxR/100.0;
        dollarsPerPip = lot/SL;
                
        lot = NormalizeDouble( dollarsPerPip/lotcost, 2 );      
        
        lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
        
        if ( lot < lot_min ) lot = lot_min;
        if ( lot > lot_max ) lot = lot_max;
        
        if ( AccountFreeMarginCheck( Symbol(), type, lot ) < 10 || GetLastError() == 134 ) 
        { 
                Alert ( "Impossible to open position with lot = ", DoubleToStr( lot, 2 ), ". Not enough money." );
                return(-1);
        }
//---- return lot size
//         if(lot<0.1) lot=0.1;
           
//---- calcuulate number of losses orders without a break
           if(DcF>0)
          {  
        for(int i=orders-1;i>=0;i--)
                  {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                 if(OrderProfit()>0)  break;
                if(OrderProfit()<0) losses++;loss=loss-OrderProfit();
                  }
        if(losses>=losses_orders) {Lot=NormalizeDouble(MathAbs(loss)/FV/MarketInfo(Symbol(),MODE_TICKVALUE)/TakeProfit1,1);
         }
       }
     }  
//---- return lot size
     if (Lot>lot) lot=Lot; 
   
  return(lot);
  }
 
Stells:

Quel pourrait être le problème ?

Parfois, l'erreur de division par "O" apparaît pendant un test.


Cherchez le signe "/" et voyez quelles variables de l'utilisateur participent à la division :

SL ;

FV ;

TakeProfit1 .

Certains d'entre eux peuvent être 0.

 
Stells:

Quel pourrait être le problème ?

Parfois, une erreur de division par "O" est affichée pendant un test.

Faites un test de type :

if(!SL==0)
   {
  dollarsPerPip = lot/SL;
   }
Et ainsi de suite.
 
ALXIMIKS:


Merci encore. J'ai essayé de comprendre votre code et d'écrire des commentaires. Je l'ai fait pour me comprendre et peut-être que j'écrirai quelque chose de similaire. J'étudie et j'essaie de comprendre la logique du travail des autres. Ensuite, je l'essaie moi-même.

Peut-être pouvez-vous trouver le temps de vérifier mes commentaires et de les corriger si nécessaire. Une dernière question.

  if (Bufer0!=EMPTY_VALUE) 

Cela signifie-t-il que le tampon de l'indicateur n'est pas vide ou cette variable a-t-elle une autre signification ? Le tampon indicateur serait

Bufer0[i]

Tout le code avec des commentaires.

 int    counted_bars=IndicatorCounted();
//----
   int   a1=0,                               //преведущий фрактал (-1 ->нижний, 1 -> верхний)
         a2,                                 //нынешний фрактал  (-1 ->нижний, 1 -> верхний)
         a3,                                 //сума преведущий + нынешний
         kilkict,
         frac,                               //frac - флаг существования фракталов,
         frac1=0;                            //frac1- счетчик фракталов (+1 или 0 за цикл)
   int i;
   double Bufer0;                            //
   kilkict=iBars(NULL, 0);

   for (i=3; i<kilkict;i++){
      a2=0;frac=0;
      if(iFractals(NULL, 0, MODE_UPPER, i)>0) {            
         if (Bufer0!=EMPTY_VALUE) {          //
            a2+=1;                           //к числу фракталов добовляем 1
            frac=1;                          //флаг - фрактал есть
            frac1++;                         //счечик увеличиваем на 1
         }
      }
      if(iFractals(NULL, 0, MODE_LOWER, i)>0) {            
         if (Bufer0!=EMPTY_VALUE) {          //
            if(a2==0){
               frac1++;                      //счечик увеличиваем на 1 
               frac=1;                       //флаг - фрактал есть
            }
            a2+=-1;                          //к числу фракталов добовляем -1(т. е. уменшаем)
         }
      } 
      if (frac==0){continue;}                // если флага нет (фрактал ненайден)
      if (frac1==1){                         //если счечик равен 1,
         a1=a2; continue;
      }          
      a3=a1+a2;
      if(a3<0)           { a1=a2;continue;}//Два фрактала вниз  подряд найдено// 
      if(a3>0)           { a1=a2; continue;}//Два фрактала вверх подряд найдено //
      if(a3==0 && a1==0) { a1=a2;}// Два фрактала подряд вверх и два фрактала подряд вниз найдено //
   }

 

gince:

if (Bufer0!=EMPTY_VALUE) 

Cela signifie-t-il que le tampon de l'indicateur n'est plus vide ou cette variable a-t-elle une autre signification ?

Cette ligne peut être supprimée, car iFractals() renvoie zéro, et non une "valeur vide"(EMPTY_VALUE), comme absence de fractale.

Ma question est la suivante : essayez-vous de créer un indicateur qui recherchera deux fractales consécutives ? Ou bien cherchez-vous dans votre EA les deux fractales consécutives les plus proches de la barre actuelle ? Cette question n'est pas une curiosité futile car les méthodes de recherche de l'indicateur et du conseiller expert sont différentes - l'indicateur calcule de la fin au début - du passé au présent, et le conseiller expert examine les barres du présent au passé. Par conséquent, les directions de recherche sont également différentes pour le conseiller expert et l'indicateur.

Une dernière question : quel devrait être le résultat de la sortie ?

 
artmedia70:

Cette ligne peut être supprimée car iFractals() renvoie zéro comme aucune fractale, et non pas une "valeur vide" (EMPTY_VALUE).

Ma question est la suivante : essayez-vous de créer un indicateur qui recherchera deux fractales consécutives ? Ou bien cherchez-vous dans votre EA les deux fractales consécutives les plus proches de la barre actuelle ? Cette question n'est pas une curiosité futile car les méthodes de recherche de l'indicateur et du conseiller expert sont différentes - l'indicateur calcule de la fin au début - du passé au présent, et le conseiller expert examine les barres du présent au passé. En conséquence, les directions de recherche sont également différentes dans le conseiller expert et dans l'indicateur.

Et la dernière question : quel doit être le résultat ?



Les méthodes de recherche dans l'indicateur et dans l'EA sont différentes - l'indicateur calcule de la fin au début - du passé au présent, tandis que l'EA examine les barres du présent au passé .

pour (i=kilkict;i>0;i--)

Le résultat : les deux premiers -> vendre (flèche vers le bas), les deux derniers -> acheter (flèche vers le haut). Le signal apparaîtra à +2 barres à droite de la fractale. C'est ce que j'aimerais voir visuellement sur l'historique au début. Et nous aurons probablement besoin d'un filtre.

 
ALXIMIKS:


...

quelque chose comme ça...

...


Dites-moi, expliquez, comment se fait-il qu'au lieu de "ceci" ils écrivent "ceci" ?

1. Tu ne sais pas que "ça" s'écrit avec un "e", pas un "f" ?

2. Trop paresseux pour déplacer votre main vers la lettre "e", il est plus facile d'appuyer sur "e" ?

3. il n'y a pas de touche "e" sur le clavier ? Si non, pourquoi ?

4. C'est une sorte de ponce spéciale ?

5. Une autre raison inconnue. Qu'est-ce que c'est ?

Raison: