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

 
trader781:
Vous obtiendrez le dernier perdant, ce qu'il faut en faire et les paramètres à ajuster pour vous-même, je pense que vous trouverez.

Merci, je crois que j'ai trouvé.

Comment faire en sorte que le lot revienne à sa valeur initiale après la prise de bénéfices?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
cela ne fonctionne pas de cette façon)
 
wishmast:

Merci, je crois que j'ai trouvé.

Comment faire pour que le lot revienne à sa valeur initiale après la prise de bénéfices?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
cela ne fonctionne pas de cette façon)

J'ai le schéma suivant

si (OrdersTotal()==0)

{

ouvert avec le lot initial

}

sinon

...

c'est-à-dire que s'il n'y a pas d'ordres, il ne s'ouvrira pas avec l'ancien lot.

Bien sûr, il est possible de mémoriser chaque ordre, mais ils ne nous disent pas comment faire.
 
Vitalie Postolache:
Un compteur doit être lancé et remis à sa valeur initiale lorsqu'un certain seuil est atteint :

Merci.

Aidez-moi à résoudre un problème.
Il y a 3 positions d'achat, une position de vente est apparue, nous devons fermer la position de vente et la position d'achat la plus ancienne. Deux positions d'achat devraient rester.
Je les ai toutes fermées.

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

 

Expliquez pourquoi la fonction OrderProfit()<0 ne fonctionne pas ?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

Je veux voir combien de stoploss par jour de la semaine.

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()>0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

et ici je pense que c'est la même raison pour laquelle ça ne marche pas

 
wishmast:

Expliquez pourquoi la fonction OrderProfit()<0 ne fonctionne pas ?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

Je veux voir combien de stoploss par jour de la semaine.

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()<0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

et j'en déduis que c'est la même raison pour laquelle ça ne marche pas.

Parce que DayOfWeek() renvoie le numéro d'ordre du jour de la semaine de la dernière heure connue du serveur.

Et vous avez besoin du jour de la semaine de l'heure de clôture de l'ordre : TimeDayOfWeek(OrderCloseTime()) ;

 
Artyom Trishkin:

Parce que DayOfWeek() renvoie le numéro d'ordre du jour de la semaine de la dernière heure connue du serveur.

Et vous avez besoin du jour de la semaine de l'heure de clôture de l'ordre : TimeDayOfWeek(OrderCloseTime()) ;

Mais le résultat est le même, comme si on ignoraitif(OrderProfit()<0) et qu'il y a une boucle, les variables prennent des valeurs importantes.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

Qu'en est-il de la boucle avec un lot ? Je l'ai copié incorrectement ici, en corrigeant le signeif(OrderProfit()>0&&OrderType()<2), mais cela ne change pas l'essence, la boucle fonctionne correctement sans cette condition.

 
wishmast:

Mais le résultat est le même, comme sisi(OrderProfit()<0) est ignoré et qu'il y a une boucle, les variables ont de grandes valeurs.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

Et à propos de la boucle avec un lot ? Je l'ai copié incorrectement ici, j'ai corrigé le signeif(OrderProfit()>0&&OrderType()<2), mais cela ne change pas l'essence, la boucle fonctionne correctement sans cette condition.

Où sont déclarés les jours 1 et 2 ?
 
Artyom Trishkin:
Où sont déclarés les jours 1 et 2 ?
comme global, au début, avant OnTick () et avant toutes les fonctions
 
Artyom Trishkin:
Où sont déclarés les jours 1 et 2 ?

Je pense que je sélectionne mal l'ordre, cela ne fonctionne pas(OrderProfit()<0), je dois être plus précis sur l'ordre dont j'ai besoin. Je ne sais pas pourquoi il saute une commande lorsque la dernière a été clôturée au point de prise et qu'il n'y en a pas d'autres. Peut-être que, si je veux faire une recherche dans l'historique, la boucle devrait être construite différemment ?

for(int w=OrdersHistoryTotal()-1; w>=0; w--)
      {
      if(OrderSelect(w,SELECT_BY_POS,MODE_HISTORY))

La raison en est que les conseillers experts construisent des boucles avec des conditions similaires et qu'ils fonctionnent comme il se doit, mais ils fonctionnent en utilisantOrdersTotal().

for(int n=OrdersTotal()-1;n>=0;n--)            
         {                                          
         if(OrderSelect(n,SELECT_BY_POS))            
            {                                        
            if(OrderMagicNumber()==magic)                  
               {
               if(OrderType()>OP_SELL)
 
sile:
Merci.

Aidez-moi à résoudre un problème.
Il y a 3 positions d'achat, une position de vente est apparue, nous devons fermer la position de vente et la position d'achat la plus ancienne. Deux positions d'achat devraient rester.
Ils sont tous fermés.

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

Ce problème ne peut être résolu en un seul cycle. Dans cette boucle, vous devez mémoriser les tickers des ordres à supprimer dans le tableau, dans la boucle suivante, vous devez les supprimer par tickers.

De plus, vous avez un problème avec les accolades, vous travaillez avec des commandes en dehors du blocOrderSelect{}, ce qui est incorrect.

Raison: