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

 
double GetLastUpperFractalPrice()
{
for (int i = 3 ; i<=Bars ; i++)
if (iFractals(Symbol(),PERIOD_M5,MODE_UPPER,i) != 0) return (i) ;
double LastUpperFractalPrice = High [i] ; return (LastUpperFractalPrice) ;

}

c'est bien ça ? Cette fonction renverra-t-elle le prix de la dernière fractale supérieure?

 
Trader7777:

Est-ce correct ? Cette fonction renverra-t-elle le prix de la dernière fractale supérieure ?


Exemple de recherche fractale
 
double GetLastUpperFractalPrice()
{
for (int i = 3 ; i<=Bars ; i++)
{
if (iFractals(Symbol(),PERIOD_M5,MODE_UPPER,i) != 0) return (i) ;
{
double LastUpperFractalPrice = High [i] ;
}
}
return (LastUpperFractalPrice) ;

}

Est-ce que ça va marcher ou pas ?

 
Trader7777:
double GetLastUpperFractalPrice()
{
for (int i = 3 ; i<=Bars ; i++)
{
si (iFractals(Symbol(),PERIOD_M5,MODE_UPPER,i) != 0)
{
double LastUpperFractalPrice = High [i] ;
}
}
retourner (LastUpperFractalPrice ;)

}

Est-ce que ça va marcher ou pas ?


Donc, par exemple, il le fera :

double GetLastUpperFractalPrice()
{
   for (int i = 3; i<=Bars; i++)
   {
      if (iFractals(Symbol(),PERIOD_M5,MODE_UPPER,i) != 0)
      {
         return(High [i]);
      }
   }
   return(EMPTY_VALUE);
}

Comme vous l'avez dit, ce ne sera pas le cas.

 
Trader7777:
double GetLastUpperFractalPrice()
{
for (int i = 3 ; i<=Bars ; i++)
{
if (iFractals(Symbol(),PERIOD_M5,MODE_UPPER,i) != 0) return (i) ;
{
double LastUpperFractalPrice = High [i] ;
}
}
return (LastUpperFractalPrice) ;

}

Est-ce que ça va marcher ou pas ?


Non. Insérez le code à travers le SRC du panneau.

return (ХХХ) retournera de la fonction utilisateur - ce qui a été entré là sera retourné par cette fonction - la valeur de ХХХ ou un résultat de certaines fonctions de calcul.

Ainsi, lorsqu'une fractale est trouvée, on écrit return (High [i]) - il n'est pas nécessaire d'inventer autre chose.

Bien en avance sur vous))

 

Il s'agit d'une fonction élémentaire de placement d'ordres en attente, les paramètres ne sont pas importants, mais il est important de faire en sorte que le conseiller expert (il peut utiliser la boucle existante d'ordres en attente) après avoir reçu un "nouveau prix" ou pour réinitialiser ou autrement éviter de placer des ordres au même prix. Dans ce cas, la boucle de passation des ordres ne doit pas s'arrêter.

double Dist=10000.0 ;
chaîne SMB ;
double NewPrice ;
int i ;
int start()
{
RefreshRates() ;
SMB=Symbole() ;
{UstanOtlozh();}
}
retour(0) ;
void UstanOtlozh()
{
double OldPrice=WindowPriceOnDropped() ; // Le script est lancé ici.
RefreshRates() ;
SMB=Symbole() ;
{
int i=1 ;
while(i<=OrdersTotal())
{
si (OrderSelect(i-1,SELECT_BY_POS)==true) // s'il existe un
{ // Analyse de l'ordre :
if (OrderSymbol()!= SMB) continue ; // Pas notre instrument financier.
int Tip=OrderType() ; // Type de commande
if (Tip<2) continue ; // Ordre de marché
double NewPrice=OrderOpenPrice() ; // Prix de la commande
{
while(NewPrice<=Ask+200*Point||NewPrice>=Ask+50*Point)
{
NewPrice=NewPrice+50*Point ;
OrderSend(SMB,OP_BUYSTOP,0.01,NewPrice,3,0,0,NULL,0,CLR_NONE) ;
if(NewPrice>Ask+200*Point||NewPrice<Ask+50*Point)
pause ;
}}}}}}

 
ALXIMIKS:
Je l'ai réparé pour compiler - et utiliser 555 build de MT4 EDITOR - cela aide vraiment à trouver les problèmes rapidement. Il suffit de lire le manuel avant d'installer - les 15 premières pages.

Je n'aurais jamais cru que je demanderais une chose aussi simple. Lors de la compilation, je reçois un message indiquant que la fonction BU() n'est pas impliquée. Je l'ai mis de cette façon (le code est donné) maintenant tout compile, mais la fonction breakeven ne fonctionne pas. Il fonctionne dans d'autres EAs et il a la même fonction Breakeven.

int start()
  {
   if(Volume[0]>1) return; 
  
   if (CountTrades()==0 && Open[1]>Close[1] && Open[2]<Close[2] && High[1]>High[2] && Low[1]<Low[2])  // продажа
   {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"Pattern_1",111,0,Red);
      if (OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES))
      {
         TP=NormalizeDouble(Bid - TakeProfit * Point, Digits);
         OrderModify(ticket, OrderOpenPrice(),0,TP,0);
      }
   }
   else
   if (CountTrades()==0 && Open[1]<Close[1] && Open[2]>Close[2] && High[1]>High[2] && Low[1]<Low[2]) // покупка
    {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"Pattern_1",111,0,Blue);   
      if (OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES))
      {
         TP=NormalizeDouble(Ask + TakeProfit * Point, Digits);
         OrderModify(ticket, OrderOpenPrice(),0,TP,0);
      }
    }
   if (CountTrades()>0)
      {
      otype = FindLastOrderType();
      if (otype == OP_BUY)
         { // ценапоследнего ордера на покупку
         price = FindLastBayPrice();
         
         if ((Bid - price) / Point >= Step)
            {
               ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid,Slippage,0,0,"Pattern_1",111,0,Red);  
            }
         }
      else if (otype == OP_SELL)
         { // цена последнего ордера на продажу
         price = FindLastSellPrice();
         
          if ((price - Ask) / Point >= Step)
            {
               ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask,Slippage,0,0,"Pattern_1",111,0,Blue);  
            }
         }
      }
    BU();  
    return(0);
  }
 
alexey1979621:

Je n'aurais jamais cru que je demanderais une chose aussi simple. Lors de la compilation, je reçois un message indiquant que la fonction BU() n'est pas impliquée. Je l'ai mis de cette façon (le code est donné) maintenant tout compile, mais la fonction breakeven ne fonctionne pas. Dans d'autres EA, la fonction de seuil de rentabilité est exactement la même.




La seule raison est un retour incorrect de l'opérateur if(...) ; Il semble que vous n'en ayez qu'un seul - au début du programme.
 

Messieurs ! !! Qu'est-ce qui vous trouble ?

iFractals() renvoie le prix, et non le numéro de barre de la fractale.

 
tara:

La seule raison est un retour incorrect de l'opérateur if(...) ; Il semble que vous en ayez un - au début du programme.
Celui-ci a été supprimé. Mais le problème se situe ailleurs - dans la normalisation. Pour une raison quelconque, mon conseiller expert a lu 4 décimales, et non 5.
extern double  Lots             = 0.1;
extern string Сomment           = "Pattern_1";
extern int TakeProfit           = 10;     
extern int StopLoss             = 0;   
extern int Step                 = 2;   

extern int BULevel              = 2;
extern int   NotBULevel         = 2;         // Уровень безубытка в пунктах

extern int Slippage             = 2; // проскальзывание 
extern int Magic                = 111;



//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
      if (Digits ==5) // для пятизначного брокера
         {
            TakeProfit *= 10;
            StopLoss *= 10;
            Slippage *= 10;
            Step *= 10;
            BULevel *= 10;
            NotBULevel *= 10;
         }
      return(0);
}
Comment le réparer ?