Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 475

 

@Artyom Trishkin@Konstantin Nikitin

Dites-moi, est-il correct d'interroger la fonctionvoid NOTIFICATION() par le biais de l'int start ? Il y a une boucle constante là ! Peut-être serait-il plus correct de mettre cette logique directement dans le démarrage ? Afin de ne pas surcharger la fonction ! Et à l'origine, je l'ai écrit de manière à ce qu'il soit plus agréable de le lire moi-même !

 
Rewerpool:

@Artyom Trishkin@Konstantin Nikitin

Dites-moi, est-il correct d'interroger la fonctionvoid NOTIFICATION() par le biais de l'int start ? Il y a une boucle constante là ! Peut-être serait-il plus logique de mettre cette logique en route en une seule fois ?

Utilisez OnTick(). Tout dépend de la logique requise.
 
S'il vous plaît, dites-moi où insérer ceci ?//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }
 

Le code du conseiller expert lui-même


enum t
{
e=1, // par indicateur parabolique
} ;
enum tf
{
af=0, // courant
bf=1, // 1 minute
cf=2, // 5 minutes
df=3, // 15 minutes
ef=4, // 30 minutes
ff=5, // 1 heure
gf=6, // 4 heures
hf=7, // 1 jour
} ;

extern int Magic = 123654789 ;
extern inttern Slippage = 0 ;
inttern double Lots = 1 ;
extern int rsi_period = 14 ;
extern int rsi_high = 50 ;
int rsi_price = PRICE_CLOSE ;
extern int rsi_low = 50 ;
int loss_stop = 5000 ;
extern int take_profit = 5000 ;
double sar_step = 0,03 ;
double sar_max = 0,03 ;

int GeneralNoLoss = false ; // trailing à partir du seuil de rentabilité
int parameters_trailing = e ; // méthode de chalutage
int StartTrall = -5000 ; // profit minimal du chalut en points
int StepTrall = 1 ; //step trailing stop loss
input tf TF_Tralling = af ; // indicateurs timeframe (0-current)
extern int delta = 50 ; // indentation du niveau stop loss calculé

double Step = 0.03 ; //Parabolique Step (méthode 4)
double Maximum = 0,03 ; //Maximum parabolique (méthode 4)


color text_color = Lime ; //couleur de la sortie d'information

double ma, rsi, sar_1, sar_2, ma_1, ma_2, ma_3, ma_4, ma_5, ma_6 ;
datetime LastBuyTime, LastSellTime ;

int STOPLEVEL ;
int TF[10]={0,1,5,15,30,60,240,1440,10080,43200};
double SLB=0,SLS=0 ;


int OnInit()

{
//---

//---
retour(0) ;
}

void OnTick(){
STOPLEVEL=(int)MarketInfo(Symbol(),MODE_STOPLEVEL) ;

int b=0,s=0 ;
double OOP,price_b=0,price_s=0,lot=0,NLb=0,NLs=0,LS=0,LB=0 ;
int tip,Ticket ;
bool error ;
double SL,OSL ;
int n=0 ;
si (b==0) SLB=0 ;
si (s==0) SLS=0 ;
for (int i=OrdersTotal() ; i>=0 ; i--)
{
si (OrderSelect(i, SELECT_BY_POS)==true)
{
tip = OrderType() ;
si (tip<2 && (OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magic ))
{
OSL = OrderStopLoss() ;
OOP = OrderOpenPrice() ;
Ticket = OrderTicket() ;
n++ ;
si (tip==OP_BUY)
{
si (GeneralNoLoss)
{
SL = SlLastBar(OP_BUY,Bid,NLb) ;
si (SL < NLb+StartTrall*Point) continuer ;
}
sinon
{
SL = SlLastBar(OP_BUY,Bid,OOP) ;
si (SL < OOP+StartTrall*Point) continuer ;
}
//si (OSL >= OOP && only_NoLoss) continue ;
si (SL >= OSL + StepTrall*Point && (Bid-SL)/Point>STOPLEVEL)
{
error=OrderModify(Ticket,OOP,SL,OrderTakeProfit(),0,White) ;
if (!error) Comment("TrailingStop Error ",GetLastError()," order ",Ticket," SL ",SL) ;
else Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES)) ;
}
}
si (tip==OP_SELL)
{
si (GeneralNoLoss)
{
SL = SlLastBar(OP_SELL,Ask,NLs) ;
si (SL > NLs-StartTrall*Point) continuer ;
}
sinon
{
SL = SlLastBar(OP_SELL,Ask,OOP) ;
si (SL > OOP-StartTrall*Point) continuer ;
}
//si (OSL <= OOP && only_NoLoss) continue ;
si ((SL <= OSL-StepTrall*Point || OSL==0) && (SL-Ask)/Point>STOPLEVEL)
{
error=OrderModify(Ticket,OOP,SL,OrderTakeProfit(),0,White) ;
if (!error) Comment("TrailingStop Error ",GetLastError()," order ",Ticket," SL ",SL) ;
else Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES)) ;
}
}
}
}
}
ma = iMA(Symbole(), 0, 70, 0, MODE_SMA, PRICE_CLOSE, 1) ;
rsi = iRSI(Symbol(), 0, rsi_period, rsi_price, 1) ;
sar_1 = iSAR(Symbol(), 0, sar_step, sar_max, 1) ;
sar_2 = iSAR(Symbol(), 0, sar_step, sar_max, 2) ;


si ((sar_step))
{
LastBuyTime = Time[0] ;
if(OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask,Digits), Slippage, Ask - loss_stop*Point, Ask + take_profit*Point, "Order", Magic, 0, clrGreen) > 0){
Print("L'ordre d'achat a été envoyé !") ;
retour ;
}else Print("Erreur d'ordre d'achat") ;
}
si ((hhchhchhchhchhchhchhh))
{
LastSellTime = Time[0] ;
if(OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid, Digits), Slippage, Bid + loss_stop*Point, Bid - take_profit*Point, "Order", Magic, 0, clrRed) > 0)
{
Print("L'ordre de vente a été envoyé !") ;
retour ;
}else Print("Erreur d'ordre de vente") ;
}
}

//--------------------------------------------------------------------
double SlLastBar(int tip,double price,double OOP)
{
double prc=0 ;
switch(paramètres_trailing)
{
cas 1 : // par indicateur parabolique
prc = iSAR(Symbol(),TF[TF_Tralling],Step,Maximum,0) ;
si (tip==OP_BUY)
{
prc = NormalizeDouble(prc - delta*Point,Digits) ;
si(prix-STOPLEVEL*Point < prc) prc=0 ;
ARROW("cm_SL_Buy", prc, 4, clrAqua) ;
}
si (tip==OP_SELL)
{
prc = NormalizeDouble(prc + delta*Point,Digits) ;
si(prix+STOPLEVEL*Point > prc) prc=0 ;
ARROW("cm_SL_Sell", prc, 4, clrRed) ;
}
pause ;
}
retour(prc) ;
}

//--------------------------------------------------------------------
string StrPer(int per)
{
si (per == 0) per=Période() ;
si (per == 1) return("M1") ;
si (per == 5) return("M5") ;
si (per == 15) return("M15") ;
si (per == 30) return("M30") ;
si (per == 60) return("H1") ;
si (per == 240) return("H4") ;
si (per == 1440) return("D1") ;
if (per == 10080) return("W1")
si (per == 43200) return("MN1")
return("erreur de période") ;
}
//+------------------------------------------------------------------+
void ARROW(string Name, double Price, int ARROWCODE, color c)
{
ObjectDelete(Nom) ;
ObjectCreate(Name,OBJ_ARROW,0,Time[0],Price,0,0,0) ;
ObjectSetInteger(0,Name,OBJPROP_ARROWCODE,ARROWCODE) ;
ObjectSetInteger(0,Name,OBJPROP_SELECTABLE, false) ;
ObjectSetInteger(0,Name,OBJPROP_SELECTED, false) ;
ObjectSetInteger(0,Name,OBJPROP_COLOR, c) ;
ObjectSetInteger(0,Name,OBJPROP_WIDTH, 1) ;
}
//--------------------------------------------------------------------
couleur Couleur(bool P,couleur a,couleur b)
{
if (P) return(a) ;
retour(b) ;
}
//--------------------------------------------------------------------

 
Vladimir Ozharovskiy:
Pouvez-vous me dire où insérer ceci ?//+------------------------------------------------------------------+

Bien.... si c'est critique

faire en sorte qu'il en soit ainsi :

//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+

sympa...)))

 
Alekseu Fedotov:

Bien.... si c'est critique

faire en sorte qu'il en soit ainsi :

(beau...)))

Mais sérieusement ?)

 
Vladimir Ozharovskiy:

Mais sérieusement ?)

Si vous voulez parler de la fonction elle-même, copiez et collez-la à la toute fin du programme,

nécessairement en dehors de la fonction void OnTick()

 
Vladimir Ozharovskiy:

Mais sérieusement ?)

Je suppose que cette fonction n'a pas d'enchères, de contrôles et derapports...

 
Alekseu Fedotov:

Si vous voulez parler de la fonction elle-même, copiez et collez-la à la fin du programme,

assurez-vous que c'est en dehors de la fonction void OnTick().

Et alors, que doit faire un homme ? Vous devez l'appeler correctement !

 
Ça semble aider... Merci !
Raison: