[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 1114

 
pr0fess0r64


1. Nous devons supprimer &&OrderSymbol()==Symbol() du code.

2. Il faut normaliser l'offre et la demande.

3. Il est préférable de ne pas fixer le slippage à 10 points, mais de le calculer dynamiquement. Par exemple, si un ordre sur l'or et que cet instrument transite à 50 points par tick, alors 10 points de dérapage entraîneront des requêtes. Il est donc préférable de calculer la taille minimale des ticks et de la multiplier par ces 10.

4. Vous devez insérer la gestion des erreurs dans votre code. Sinon, en cas d'échec, vous ne comprendrez pas les raisons pour lesquelles les commandes n'ont pas été clôturées.

 
drknn:


1. Vous devriez supprimer &&OrderSymbol()==Symbol() du code

2. Il faut normaliser l'offre et la demande.

3. Il est préférable de calculer le slippage de manière dynamique plutôt que d'utiliser 10 pips. Par exemple, si un ordre sur l'or et que cet instrument évolue de 50 points par tick, alors 10 points de slippage vous causeront beaucoup de requêtes. Il est donc préférable de calculer la taille minimale des ticks et de la multiplier par ces 10.

4. Vous devez insérer la gestion des erreurs dans votre code. Sinon, en cas d'échec, vous ne comprendrez pas les raisons pour lesquelles les commandes n'ont pas été clôturées.

C'est la vision générale, et vous pouvez penser à une foule de choses à faire.
 
pr0fess0r64:
Merci beaucoup, je vais l'essayer dans le testeur, mais en ce qui concerne la modification des commandes, avez-vous des conseils ?
Y a-t-il des erreurs dans le journal de bord lors de la modification ?
 

Où le retour se fait-il ?

En clair, à la ligne 0 et attendre un tick

int start()
  {
//----
   
//----
   return(0);
  }

c'est clair ici aussi - stop

   if(Lot_s<=0){
    Alert("Не выбран лот!");
    return;

Et ici ?

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ko=0, ot;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) ko++;
        }
      }
    }
  }
  return(ko);
}
La valeur du nombre de commandes est ko, donc la fonction suivante doit-elle être écrite en utilisant ko ? Que fait le retour ici ?
 

return() n'envoie personne nulle part.

L'opérateur return met fin à la fonction en cours et rend le contrôle au programme appelant. L'utilisation de return(expression) ; met fin à la fonction en cours et envoie le résultat. L'expression de l'opérateur est placée entre parenthèses et ne doit pas contenir d'opérateur d'affectation.

 
Vinin:

return() n'envoie personne nulle part.

L'opérateur return met fin à la fonction en cours et rend le contrôle au programme appelant. L'utilisation de return(expression) ; met fin à la fonction en cours et envoie le résultat. L'expression de l'opérateur est placée entre parenthèses et ne doit pas contenir d'opérateur d'affectation.

Oh, donc au lieu d'assigner explicitement le résultat de ko, nous le passons par return ? Je crois que j'ai compris, merci.
 
Comment, alors, est-il correct d'empêcher l'EA de fonctionner si les conditions ne sont pas remplies ? Pas pour l'endormir, mais pour l'arrêter complètement.
 
Abzasc:
Comment, alors, est-il correct d'empêcher l'EA de fonctionner si les conditions ne sont pas remplies ? Pas pour l'endormir, mais pour l'arrêter complètement.

Que voulez-vous dire par "endormir" et que voulez-vous dire par "arrêter" ?
 
Vinin:

Que signifie "endormir" et que signifie "arrêter" ?

Mettre en veille - mettre en veille, puis il essaiera de redémarrer.

Stop - complètement, de sorte que le conseiller expert cesse de fonctionner (change de "visage").

Par exemple, le conseiller expert est sous Eurobucks, mais il a été lancé sur l'EuroJPY. Il vérifie le symbole et en cas de non-concordance, il lance l'alerte et n'essaie plus de travailler avant le redémarrage manuel.

 
Abzasc:

Mettre en veille - mettre en veille, puis il essaiera de redémarrer.

Stop - complètement, de sorte que le conseiller expert cesse de fonctionner (change de "visage").

Par exemple, le conseiller expert est sous Eurobucks, mais il a été lancé sur l'EuroJPY. Il vérifie le symbole et en cas de non-concordance, il lance une alerte et n'essaie pas de travailler à nouveau avant le redémarrage manuel.


Pourquoi si compliqué ?

Il suffit de prévoir la gestion des conditions dans la fonction start().

int start(){
  if (Symbol()!="EURUSD") {
     Alert("Советник должен работать только на EURUSD");
     return(0);
  }
  // Далее обработка, принятие решений

}
Dans ce cas, si vous placez l'EA sur le mauvais instrument, vous serez inondé d'alertes, jusqu'à ce que vous le désactiviez (l'EA) vous-même.

Vous pouvez également ajouter un son de sirène, puis vous pouvez l'éteindre à coup sûr.

Raison: