Erreurs, bugs, questions - page 1521

 
Alexandre:

Une cause amusante de l'erreur interne du compilateur (fonction utilisée dans l'indicateur) :

...

Le remède est évident, mais je suis d'accord - c'est un problème très drôle. :)))

Merci pour cet article !

Je vous ai écrit un message privé.
 
Bonjour. Je n'arrive pas à écrire un code qui ouvrirait une position dans un nombre n debarres après l'ouverture de la position précédente. J'ai essayé d'utiliser Time[i], iBarShift, iTime. Je n'ai pas eu de chance avec tout ça. Je suis novice en matière de programmation. La recherche n'a rien donné.
 

Dmitri Custurov:
Здравствуйте. Не получается написать код, который открывал бы позицию через n-количество баров после открытия предыдущей позиции. Пробовал использовать Time[i], iBarShift, iTime. Все безуспешно. В программировании новичок. Поиск ничего не дал.

Salutations, pour que vous puissiez obtenir de l'aide pour trouver l'erreur - vous devez joindre le code au moins. Personne ici n'écrira à votre place - il est d'usage ici de vous aider à trouver l'erreur et à la corriger par des conseils. Ou - contactez un indépendant.
 

Voici le code :

si((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red) ;
z=1 ;

Timer=Time[0];}

TimerNull=iBarShift(NULL,0,Timer,false) ;

si ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red) ;

z=2;}

J'ai aussi essayé de cette façon :

si ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red) ;
z=1 ;

Timer=Time[0];}

TimerNull=Time[0] ;

if ((TimerNull>=(Timer+2700))&&(z==1)) //à titre d'exemple ici, au lieu de n, j'ai mis 2700 secondes, ce qui dans les tests signifiait 3 bougies de 15 minutes) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red) ;

z=2;}

Et aussi comme ça :

si ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red) ;
z=1 ;

Timer=Time[0];}

TimerNull=Time[0] ;

si ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red) ; //Dans ce cas, lorsque j'ai retiré 2700, la deuxième transaction a été ouverte juste après la première dans la même barre, c'est logique. Et même lorsque j'ai mis n'importe quelle valeur jusqu'à 600 au lieu de 2700, la deuxième affaire a été ouverte dans la même barre. Avec une valeur supérieure à 600, la deuxième transaction ne s'est jamais ouverte. Je ne comprends pas quel est le problème. Je vous serais très reconnaissant de votre aide.

Les paramètres Timer et TimerNull sont au format date.


 

dans votre exemple, il n'y a pas d'énumération de positions, par exemple.

si ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1)))

il sélectionne donc toujours la position 0.

 
Je suis encore en train d'écrire un brouillon pour que la logique de base fonctionne. Après cela, je vais l'affiner. Dans ce cas, je me trompe peut-être, le problème se situe dans la deuxième partie du code.
 
Slawa:

Tout a un sens. J'ai fait une indulgence pour la suppression normale.

Quand tu fermeras le terminal, ce sera dur. Pas plus de 3 secondes.

Et je ne suis pas sûr que nous allons écrire cela dans la documentation, 1. pour ne pas se laisser aller à écrire des indicateurs aussi imprudents (avez-vous écrit cela pour vérifier ?) 2. Comme on l'a desserré, on le resserre.

Alors resserrez-le déjà, ou corrigez la référence. Se faire plaisir sans se faire plaisir n'est pas une conversation sérieuse. Ce que les programmeurs attendent de vous, ce n'est pas d'être "dorlotés", mais des logiciels clairs et bien documentés.

Bien sûr, ce code n'a pas d'autre but qu'une démonstration, que vous avez vous-même demandée. Et c'est tout à fait inoffensif, inoffensif de l'obtenir, si vous supprimez Sleep et remplacez Comment par Print. Il n'y a aucune protection contre le spamming de gigaoctets d'impression dans le journal, que ce soit dans Quartet ou Quartet 5.

 
Dmitri Custurov:

Voici le code :

si ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red) ;
z=1 ;

Timer=Time[0];}

TimerNull=iBarShift(NULL,0,Timer,false) ;

si ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red) ;

z=2;}

J'ai aussi essayé de cette façon :

si ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red) ;
z=1 ;

Timer=Time[0];}

TimerNull=Time[0] ;

if ((TimerNull>=(Timer+2700))&&(z==1)) //à titre d'exemple ici, j'ai mis 2700 secondes au lieu de n, ce qui dans les tests signifiait 3 bougies de 15 minutes) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red) ;

z=2;}

Et aussi comme ça :

si ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red) ;
z=1 ;

Timer=Time[0];}

TimerNull=Time[0] ;

si ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red) ; //Dans ce cas, lorsque j'ai retiré 2700, la deuxième transaction a été ouverte juste après la première dans la même barre, c'est logique. Et même lorsque j'ai mis n'importe quelle valeur jusqu'à 600 au lieu de 2700, la deuxième affaire a été ouverte dans la même barre. Avec une valeur supérieure à 600, la deuxième transaction ne s'est jamais ouverte. Je ne comprends pas quel est le problème. Je vous serais très reconnaissant de votre aide.

Les paramètres Timer et TimerNull sont au format date.


C'est l'une des implémentations possibles. Cet EA doit ouvrir un ordre après le nombre de barres spécifié. Et apprenez à insérer correctement le code EA, le bouton SRC sur la barre de message.

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int nymber_bar=10;
input double Volume_=0.01;
int send1;
int send2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Total_orders(_Symbol,OP_SELL)==0 && send1<=0)
     {
      send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
     }

   if(OrderSelect(send1,SELECT_BY_TICKET))
     {
      if(iBarShift(NULL,0,OrderOpenTime())>=nymber_bar)
        {
         send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
        }
     }

  }
//+------------------------------------------------------------------+
int Total_orders(string symbol,int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()!=type)continue;
         //if(OrderMagicNumber()!=Magic)continue;
         if(OrderSymbol()!=symbol)continue;
         n++;
        }
     }
   return(n);
  }
//+------------------------------------------------------------------+

111

 

Cette question s'adresse probablement aux développeurs de sites Web ou aux administrateurs de services indépendants.

---

Auparavant : 568 travaux réalisés, 75% personnels

Ajouté 13 travaux (tous personnels) et devenu : complété 581, 75% personnel

---

D'où la question : déchiffrez s'il vous plaît, que signifie 75% ?

 
Ilyas:
Merci pour le message ! <br / translate="no">
Je vous ai envoyé un message privé.
Bonjour, je vous ai envoyé un code avec une erreur dans un message privé.