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

 
Vitaly Muzichenko:
Introduisez-vous les prix en une seule fois, ou les obtenez-vous et les introduisez-vous ensuite dans le calcul ?
Vitaly Muzichenko:
Définissez-vous les prix en une fois, ou les obtenez-vous et les collez-vous ensuite dans le calcul ?
int k=période ;
for(int i=1 ; i<=period ; i++)
{
H1_Close[i]=Close[k];
k-- ;
}
Je prends un morceau de timesession égal à la période commençant à partir de la dernière barre fermée et je le retourne dans le tableau, parce que 1 est l'avant-dernière barre dans timesession et que le calcul doit commencer à partir de la i-ème barre.
c'est-à-dire que ma fonction doit retourner la valeur SMMA de la dernière barre fermée.
 
Bonjour à tous.
Le code ci-dessous encode une idée simple.
Si le dernier ordre clôturé était sur SEL
Si le dernier ordre clôturé était sur le NEL
Ouvrir une commande NEL
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                            
if ( OrderType ()==OP_SELL)                                            
X = OrderProfit( );                                            

if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                            
if ( OrderType ()==OP_BUY)                                              
if(X < 0)                                              

OrderSend(Symbol(),OP_SELL,0.1,Bid ,3,Ask+400*Point,Ask-200*Point,"17-10",123 );



QUESTION
Quelle construction linguistique peut être utilisée pour ajouter deux conditions supplémentaires à ce code (entourées en rouge) ?

Si le dernier ordre clôturé est NEL
Si le dernier ordre CEL a été clôturé
Si le dernier ordre clôturé l'a été sur le NEL
Si le dernier ordre clôturé l'a été sur unSL

Merci de votre aide.


Je vous serais très reconnaissant si vous pouviez écrire le code et pas seulement expliquer ce qu'il faut faire.
 
Bonjour. J'écris un script pour supprimer tous les ordres en attente. Cependant, il ne supprime qu'une seule commande. J'ai toujours deux ordres en attente ou un seul. Dans les deux cas, cela ne supprime qu'un seul Buy Stop. Pour supprimer le Sell Stop, vous devez exécuter à nouveau le script, à condition qu'il n'y ait pas d'autres ordres Buy Stop. Veuillez indiquer où se trouve l'erreur.

void DeleteOrders()
{
int Total=OrdersTotal() ;
for(int i=0;i<Total;i++)
if(OrderSelect(i,SELECT_BY_POS))
{
int type=OrderType(), ticket=OrderTicket() ;
bool c ;
switch(type)
{
cas 4 :
c=OrdreDelete(ticket) ;
si(!c)
Print(GetLastError()) ;
pause ;
cas 5 :
c=OrdreDelete(ticket) ;
si(!c)
Print(GetLastError()) ;
pause ;
}
}
}
 
0B53RV3R:
Bonjour. J'écris un script pour supprimer tous les ordres en attente. Cependant, il ne supprime qu'une seule commande. J'ai toujours deux ordres en attente ou un seul. Dans les deux cas, cela ne supprime qu'un seul Buy Stop. Pour supprimer le Sell Stop, vous devez exécuter à nouveau le script, à condition qu'il n'y ait pas d'autres ordres Buy Stop. Veuillez indiquer où se trouve l'erreur.

void DeleteOrders()
{
int Total=OrdersTotal() ;
for(int i=0;i<Total;i++)
if(OrderSelect(i,SELECT_BY_POS))
{
int type=OrderType(), ticket=OrderTicket() ;
bool c ;
switch(type)
{
cas 4 :
c=OrdreDelete(ticket) ;
si(!c)
Print(GetLastError()) ;
pause ;
cas 5 :
c=OrdreDelete(ticket) ;
si(!c)
Print(GetLastError()) ;
pause ;
}
}
}
Changez la direction de la recherche pour(i=total-1;i>=0;i--)
 
Maxim Kuznetsov:
changer la direction de la recherche for(i=total-1;i>=0;i--)
Merci, maintenant ça marche. Dois-je comprendre que lorsqu'un ordre d'index 0 est supprimé, un ordre d'index 1 se voit attribuer l'index 0, et à l'itération suivante i == 1, et un tel ordre n'existe pas. Pouvez-vous me dire si c'est le cas ?
 
0B53RV3R:
Merci, maintenant ça marche. Est-ce que je comprends bien que lorsqu'un ordre d'indice 0 est supprimé, un ordre d'indice 1 se voit attribuer l'indice 0, et à l'itération suivante i == 1, et aucun ordre de ce type n'apparaît. Pouvez-vous dire si c'est le cas ?
Bien.
 

Il y a une fonction fractale personnalisable, eh bien, c'est terriblement lourd. J'ai laissé le dessin des objets uniquement pour montrer visuellement si les fractales se forment correctement - cela ne va pas se produire.

Question : comment pouvons-nous rendre cela plus facile, parce que les tests visuels sont stupides :

extern int FrLeft=15; // Баров слева
extern int FrRight=5; // Баров справа

//-----------------------------------------------------------------------------------------------
void OnTick()
{
int nFrUp= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_UPPER); // Возвращает номер бара
int nFrDn= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_LOWER); // Возвращает номер бара
double FrHigh = High[nFrUp]; // Цена верхнего фрактала
double FrLow  = Low [nFrDn]; // Цена нижнего фрактала

SetArrow("FrUp"+"_"+(string)Time[nFrUp], Time[nFrUp], High[nFrUp], clrDeepSkyBlue, 217, 2, ANCHOR_BOTTOM);
SetArrow("FrDn"+"_"+(string)Time[nFrDn], Time[nFrDn], Low[nFrDn], clrDeepPink, 218, 2, ANCHOR_TOP);

// Comment("Price: ",FrHigh,", Num: ",nFrUp,"\nPrice: ",FrLow,", Num: ",nFrDn);
}

//----------------------------------------------------------------------------------------------+
//---------------------- Возвращает номер бара фрактала (настраиваемый) ------------------------+
//----------------------------------------------------------------------------------------------+
int GetBarFractal(string symb,ENUM_TIMEFRAMES tf=0,int nLeft=2,int nRight=2,int numFr=0,int mode=MODE_UPPER) {
int i=0,cn=0,pos=0,r=0,l=0,e=0,equals,bars;
double _high[], _low[];
nLeft=nLeft<=2?2:nLeft;
nRight=nRight<=2?2:nRight;
equals=nLeft+nRight;
bars=Bars(symb,tf)-equals;
ArraySetAsSeries(_high,true);
ArraySetAsSeries(_low,true);

  for(pos=nRight+1; pos<bars; pos++) {
   r=nRight;
   if(mode==MODE_UPPER) {
    CopyHigh(symb,tf,0,pos+equals+1,_high);
    for(i=1; i<=r; i++) {
     if(_high[pos]<=_high[pos-i]) break;
   }}
   if(mode==MODE_LOWER) {
    CopyLow(symb,tf,0,pos+equals+1,_low);
    for(i=1; i<=r; i++) {
     if(_low[pos]>=_low[pos-i]) break;
   }}
   //--
   if(i==r+1) {
    l=nLeft;
    e=equals;
     for(int j=1; j<=l+equals; j++) {
      if(mode==MODE_UPPER) {
       if(_high[pos]<_high[pos+j])  break;
       if(_high[pos]>_high[pos+j])  l--;
       if(_high[pos]==_high[pos+j]) e--;
      }
      if(mode==MODE_LOWER) {
       if(_low[pos]>_low[pos+j])  break;
       if(_low[pos]<_low[pos+j])  l--;
       if(_low[pos]==_low[pos+j]) e--;
      }
      if(l==0) {
       cn++;
       if(cn>numFr) return(pos);
      }
      //--
      if(e<0) break;
   }}
  }
   Print(__FUNCTION__": Фрактал не найден");
  return(0);
}

//----------------------------------------------------------------------------------------------+
//------------------- Функция рисования значка на графике, объект OBJ_ARROW --------------------+
//----------------------------------------------------------------------------------------------+
void SetArrow(string nm="", datetime t1=0, double p1=0, color col=clrRed,
                                           int code=252, int width=1, int anchor=0) {
if(ObjectFind(0,nm)==-1) {
    ObjectCreate(0,nm,OBJ_ARROW,0,0,0);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
    ObjectSetInteger(0,nm,OBJPROP_ARROWCODE,code);
    ObjectSetInteger(0,nm,OBJPROP_ANCHOR,anchor);
    ObjectSetInteger(0,nm,OBJPROP_WIDTH,width);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,false);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetDouble(0,nm,OBJPROP_PRICE,p1);
    ObjectSetInteger(0,nm,OBJPROP_TIME,t1);
   }
}

Merci !

 
Vitaly Muzichenko:

Il y a une fonction fractale personnalisable, eh bien, c'est terriblement lourd. J'ai laissé le dessin des objets uniquement pour montrer visuellement si les fractales se forment correctement - cela ne va pas se produire.

Question : comment puis-je le rendre plus facile, parce que les tests visuels sont stupides :

Merci !

Vous ne pouvez que vous faciliter la tâche en transformant tout cela en indicateur. Même le commentaire dans le coin supérieur gauche du graphique et surtout les marques d'ouverture et de fermeture des positions, que le testeur met lui-même, ralentissent les tests.
 

Bonjour. Pourriez-vous conseiller un nouvel arrivant ?

Voici un exemple :

if(Condition1)

if(Condition2)

{

}

sinon

{

}

Selon le code, Else devrait se référer à if(condition1) et sera exécuté si la condition1 n'est pas remplie

Mais en fait, il sera également exécuté si la condition 2 n'est pas remplie.

 
Andy-D:

Bonjour. Pourriez-vous conseiller un nouvel arrivant ?

Voici un exemple :

if(Condition1)

if(Condition2)

{

}

sinon

{

}

Selon le code, Else devrait se référer à if(condition1) et sera exécuté si la condition1 n'est pas remplie

Mais en fait, il sera exécuté si la condition 2 n'est pas satisfaite.


Prenez l'habitude de mettre des bagues frisées immédiatement avec la condition

if(Condition)

{

}

A selon votre question

if(Условие1)
   {
       if(Условие2)

        {

        }
    }
   else

    {

    }