[Archive] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 2. - page 56

 
Sergstuddek:


(Le cours est bon, mais il y a toujours un problème)))

Je comprends en théorie, mais en pratique cela ne fonctionne pas, pouvez-vous regarder mon code et me dire ce qui ne va pas ?

Je comprends qu'il s'agit d'un EA très simple, mais je viens de commencer mon parcours)))) et j'ai déjà un problème

// L'essence du conseiller expert est qu'il ouvre d'abord le premier ordre d'achat.
// puis met des arrêts dans deux directions
// dans un côté comme continuation d'un ordre ouvert
// de l'autre côté deux fois plus en cas de retournement du graphique
// les stops sont placés par rapport au dernier ordre ouvert par le conseiller.
// à chaque ouverture d'un nouvel ordre en attente, tous les ordres précédents sont supprimés.
// et les nouveaux stops en attente sont déjà ouverts par rapport à un nouvel ordre ouvert.


Les stops peuvent être compris comme deux choses : les ordres stop (Take Profit et Stop Loss) et les ordres stop (Bystop et Sell Stop). Ce que l'on entend par "arrêts" ici n'est probablement compris que par vous. Veuillez être précis dans les termes. Vous devez donner des instructions précises à l'ordinateur. La description doit également être aussi précise que possible
 
drknn:
Les stops peuvent avoir deux significations : les ordres d'arrêt (Take Profit et Stop Loss) et les ordres d'arrêt (Bystop et Sell Stop). Ce que l'on entend par "arrêts" ici n'est probablement compris que par vous. Veuillez être précis dans les termes. Vous devez donner des instructions précises à l'ordinateur. La description doit également être aussi précise que possible

Je suis désolé pour l'inexactitude, mais les ordres stop sont des ordres stop (Buy Stop et Sell Stop).
 
Sergstuddek:

Je m'excuse pour l'inexactitude : je veux parler des ordres stop (Buy Stop et Sell Stop).
void DeleteStopOrders()
{
  int res;
  for(int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
    {
      if(OrderType()==OP_SELLSTOP)
        res=OrderDelete(OrderTicket());
      if(OrderType()==OP_BUYSTOP)
        res=OrderDelete(OrderTicket());
     }
  }
}


Cette fonction est écrite de manière incorrecte. Les commandes doivent être recherchées de la dernière à la première dans la liste des commandes. Votre méthode fera sauter un ordre, car après sa suppression, la liste des ordres se déplacera en fonction de ses positions. La boucle doit être organisée comme suit :

for (int i=OrdersTotal()-1;i>=0;i--){

En outre, si l'ordre n'est pas sélectionné, vous n'avez pas besoin de faire une rupture - vous n'avez pas besoin de sortir du cycle - vous devez trouver la raison pour laquelle l'ordre n'est pas sélectionné. C'est comme suit :

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
  Print("При выборе ордера № ",i," произошла ошибка № ",GetLastError());

res=OrderDelete(OrderTicket()) ; - ceci n'est pas non plus assez correct. La fonction OrderDelete() est de type booléen. En plus de donner l'ordre de supprimer l'ordre, nous devons également gérer la situation si l'ordre ne peut pas être supprimé. En d'autres termes, ça se passe comme ça :

res=OrderDelete(OrderTicket());
if(!res){
  Print("Ордер № ",OrderTicket()," удалить не получилось - ошибка № ",GetLastError());
}

Je regarderai le reste plus tard.

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (CalculateCurrentOrders1(Symbol())==0)
   OpenBuy();
  if (CalculateCurrentOrders2(Symbol())<=1)
  DeleteStopOrders();
  if (CalculateCurrentOrders2(Symbol())<=1)
   OpenStops();
//----
   return(0);
}

Le code de la fonction de démarrage n'est pas écrit correctement.

Avec la première fonction, vous additionnez les ordres d'achat et de vente. Vous devez compter les ordres d'achat séparément et les ordres de vente séparément. Voici l'essentiel. S'il y a un ordre d'achat sur le marché, alors le stop d'achat doit être fixé avec un lot plus grand. N'est-ce pas ? Et s'il y a un ordre de vente sur le marché, alors le stop d'achat doit être fixé avec un lot normal et le stop de vente avec un lot plus grand. Comment détecter quel ordre est ouvert sur le marché si vous additionnez les ordres d'achat et de vente dans une même fonction ? Essayez de refaire le code à la lumière de ces faits.

 

Pouvez-vous me dire comment télécharger automatiquement l'historique depuis le courtier ? C'est un peu gênant de presser la maison pendant une heure.

 
_dude_:

Pouvez-vous me dire comment télécharger automatiquement l'historique depuis le courtier ? C'est un peu gênant de presser la maison pendant une heure.

Vadim Junko s'en est occupé pour vous. Script pour charger l'historique. Il y en a quelques autres dans la base (section Scripts).
 
gince:

Question sur l'indicateur.

L'indicateur est un indicateur en croix. Il attire beaucoup de flèches d'un côté, puis beaucoup de l'autre. Comment faire en sorte que seuls les premiers soient tirés au sort. J'ai essayé de le faire de la manière décrite dans le code, mais les flèches changent lorsque je change de cadre.

Veuillez m'indiquer comment le faire correctement.


Il faudrait que je regarde l'indicateur. Il y a peut-être une solution
 
nemo811:
Veuillez m'aider à corriger mon conseiller expert. Vous devez le faire fonctionner avec les ordres (propres et ouverts par l'utilisateur) de la paire de devises sur le graphique sur lequel il est installé. Nous voulons dire le moment de la fixation du profit ou de la perte. Dans la version actuelle, lorsqu'une condition (attraper le % de dépôt) se produit, il essaie de fermer toutes les positions (avec MAGIC=0) pour toutes les paires de devises et je n'en ai pas besoin. Il est nécessaire de délimiter complètement toutes les paires de devises. Je vous remercie d'avance.

Vous devez faire la même chose dans différents forums de discussion. Il s'agit de spam, et vous risquez d'être banni.
 
Vinin:

Et écrire la même chose dans différents fils de discussion - c'est du spam et cela peut entraîner un bannissement.

Je m'excuse - comme toujours je veux tout faire en même temps))
 

Merci de votre attention et de votre compréhension ;))

J'ai pu résoudre le problème moi-même :

Insertion d'une ligne délicate if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC) continuer ;

à un endroit tout aussi délicat. Après cela, tout a fonctionné comme prévu.

Merci pour le tuyau avec le magicien. Je ne suis pas un programmeur, donc parfois et ne pas penser à quelque chose par manque de connaissances.

Raison: