[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 3

 

oops :-)

Merci !

 

Bonjour les connaisseurs !

Voici un EA. Il ouvre une position sur une fractale haut/bas. Comment faire pour que le stop soit 5 pips plus haut (en cas d'achat) et 5 pips plus bas (en cas de vente) par rapport au sommet de la fractale ?

P_up0=iCustom(0,0,"Ценовой канал", Chperiod,0,0);
   P_down0=iCustom(0,0,"Ценовой канал", Chperiod,1,0);
   P_up1=iCustom(0,0,"Ценовой канал", Chperiod,0,1);
   P_down1=iCustom(0,0,"Ценовой канал", Chperiod,1,1);
   Up=iCustom(0,0,"olyakish_fractals_02(для Skonti)",15,150,"Процент для отсеивания по объему",110,1,3);
   Down=iCustom(0,0,"olyakish_fractals_02(для Skonti)",15,150,"Процент для отсеивания по объему",110,3,3);
//задали все данные 

   total=OrdersTotal();
   if( total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000* Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if( Up> Down)
        {
         Lots= GetSizeLot();
         ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,3,0,0,"",16384,0,Green);
         if( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if( Up< Down)
        {
         Lots= GetSizeLot();
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,3,0,0,"",16384,0,Red);
         if( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for( cnt=0; cnt< total; cnt++)
     {
      OrderSelect( cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if( P_down1> P_down0|| Up< Down)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if( TrailingStop>0)  
              {                  
               if(Bid-OrderOpenPrice()>Point* TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point* TrailingStop && OrderStopLoss()!=OrderOpenPrice()+ X*Point)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+ X*Point,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if( P_up1< P_up0|| Up> Down)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if( TrailingStop>0)  
              {               
               if((OrderOpenPrice()-Ask)>(Point* TrailingStop))
                 {
                  if(NormalizeDouble(OrderStopLoss(),Digits) != NormalizeDouble(OrderOpenPrice()- X*Point,Digits))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()- X*Point,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }

J'ai utilisé le canal de prix ici.

// условие закрытия короткой позиции
            if( P_up1< P_up0|| Up> Down)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
и
// условие закрытие длинной позиции
            if( P_down1> P_down0|| Up< Down)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }

J'ai du mal à identifier le L ou le H de la fractale à laquelle la position a été ouverte !

à peu près comme ça ! !!?

if (NormalizeDouble (MathAbs (High [ i]-5),Digits) < Price)
 
quel instrument le prix est=5 ?
if (NormalizeDouble (MathAbs (High [ i]-5),Digits) < Price)

donc multiplier par le prix du chiffre le plus bas

5*Point
 

C'est là que j'ai fait une erreur. Merci.

Comment fixer le sommet de la fractale sur laquelle la position a été ouverte ????

 
Toutes les questions sont résolues par l'expérience - écrire un script, l'exécuter,
- nous voyons les différences suivantes par rapport à la méthode iFractals() standard
1. l'indicateur par l'indice fractal est exactement égal à High/Low
2. valeur inexistante de la fractale ==0
int i;
   double f;
   for( i=0; i<50; i++) { f=iFractals(NULL,0,MODE_UPPER, i); if( f!=0) break;}
 Alert(f,"  ",High[i]," i=",i);
P.S. regardez en arrière de la position par ce cycle, au moment de l'ouverture de la position, rappelez-vous
datetime timeFractalOnOpenPos=Time[i]
 
Je ne comprends pas comment afficher cela dans l'EA. lors de l'ouverture d'une position, il faut se souvenir de cette fractale. ensuite comment l'appeler dans la condition de fermeture ?
 
le sens de l'appel n'est pas clair,
dans les variables globales du programme
-Se souvenir du temps d'une barre fractale pour ouvrir une position. En utilisant le temps de la barre, nous connaissons le numéro de la barre grâce à iBars().
-souvenez-vous du prix fractal
rappelez-vous le prix fractal - rappelez-vous le haut / bas
et puis quoi faire à nouveau ?
 
Peut-être que je ne l'ai pas dit comme ça. Je n'ai juste aucune idée de comment le coder.
 
combien de commandes et lesquelles pour chaque côté ?
 

au-dessus de tous les blocs

double UfractalBuy,LfractalBuy;

écrire la fractale la plus proche lors de l'ouverture d'un ordre d'achat

int i; double f;

     if( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) 
            {
            Print("BUY order opened : ",OrderOpenPrice());
  
   for( i=0; i<50; i++) { f=iFractals(NULL,0,MODE_UPPER, i); if( f!=0) break;}
   UfractalBuy=High[ i];
   for( i=0; i<50; i++) { f=iFractals(NULL,0,MODE_LOWER, i); if( f!=0) break;}
   LfractalBuy=Low[ i];
            }
           }

entrer une autre condition pour l'ordre d'achat

if(P_down1>P_down0||Up<Down||Close[0]+5*Point<LfractalBuy)
Raison: