Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 412

 
Ekburg:

Bon sang... Je suis certainement heureux que vous avez commencé à résoudre le problème, mais mon message vous en quelque sorte n'ont pas remarqué, où j'ai dit la même chose, un peu de mots différents, et a immédiatement dit les lacunes, sauf pour la fermeture du fichier, pas immédiatement vu où vous avez il se passe :)

Vous avez écrit une réponse en trois points. Dans le premier cas, vous avez fait une erreur (mon entrée est tout à fait correcte), dans le deuxième cas, vous avez également fait une erreur (bien que ce message l'ait nivelée :) Le troisième point semblait indiquer que vous suggériez de déplacer le curseur à la fin après l'entrée, et non avant (ce qui a été pris comme une erreur à nouveau). Face à une telle image, j'ai préféré faire une mise au point auprès d'un modérateur beaucoup plus expérimenté qui a répondu.

Quoi qu'il en soit, je vous remercie pour vos commentaires. Et une bonne année ! :)

 

Bonjour. Face à une situation désagréable. Aidez-moi.

J'ai un conseiller expert. Il fonctionne bien dans le testeur de stratégie, je n'ai aucune réclamation. Lorsque je l'exécute sur une démo, le conseiller expert ne peut pas placer d'arrêts sur certains ordres. Il y a une erreur qui apparaît pas toujours, mais parfois. Je suis désespérée de le trouver par moi-même et j'espère obtenir votre aide. Il convient de noter que l'EA fonctionne parfaitement dans tous les autres aspects, tout comme dans le testeur, aucune plainte, sauf que le problème est que les arrêts ne sont pas toujours fixés. L'erreur apparaît chez différents courtiers sur différents comptes. Voici la partie du code responsable des opérations commerciales

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {
  //---- обновление инфы
  OrderSelect(ord_ticket,SELECT_BY_TICKET);
  ord_openpr=OrderOpenPrice();
  ZigZagInfo[0][ZZ_TimeP]=t_cur;
  ZigZagInfo[k][ZZ_TryCount]++;
  //---- проверка стопов
  if(ND(a*(ord_tp-ord_openpr)-stops,Digits)<0) ord_tp=ND(ord_openpr+a*stops,Digits); 
  if(ND(a*(ord_openpr-ord_sl)-stops,Digits)<0) ord_sl=ND(ord_openpr-a*stops,Digits);
  //---- время удаления
  if(TimeDelete>0) td=TimeCurrent()+60*TimeDelete;
  else td=0;
  //----
  if(!OrderModify(ord_ticket,ord_openpr,ord_sl,ord_tp,td)) {
    Alert(Error(GetLastError()),"/nSL=",DoubleToStr(ord_sl,5)," TP=",DoubleToStr(ord_tp,5),"/nTimeDel=",TimeToStr(td),
          "OP=",DoubleToStr(ord_openpr,5));
  }
}

Voici le code de la fonction Error(int er)

string Error(int er) {
  switch(er) {
    case 0:   return("Нет ошибки");
    case 1:   return("Нет ошибки, но результат неизвестен");
    case 2:   return("Общая ошибка(сбой системы, глюк, и т.п.)");
    case 3:   return("Неправильные параметры");
    case 4:   return("Торговый сервер занят");
    case 6:   return("Нет связи с торговым сервером");
    case 7:   return("Недостаточно прав");
    case 8:   return("Слишком частые запросы");
    case 9:   return("Недопустимая операция нарушающая функционирование сервера");
    case 128: return("Истек срок ожидания совершения сделки");
    case 129: return("Неправильная цена");
    case 130: return("Неправильные стопы");
    case 131: return("Неправильный объем");
    case 133: return("Торговля запрещена");
    case 134: return("Недостаточно денег для совершения операции");
    case 135: return("Цена изменилась");
    case 137: return("Брокер занят");
    case 138: return("Новые цены");
    case 139: return("Ордер заблокирован и уже обрабатывается");
    case 140: return("Разрешена только покупка");
    case 141: return("Слишком много запросов");
    case 145: return("Модификация запрещена, так как ордер слишком близок к рынку");
    case 146: return("Подсистема торговли занята");
    case 147: return("Использование даты истечения ордера запрещено брокером");
    case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером");
    case 149: return("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");
    default:  return("Неизвестная ошибка "+DoubleToStr(er,0));
  }
}

Ainsi, lorsque l'EA ne parvient pas à fixer des arrêts, un message s'affiche pour indiquer l'erreur et les paramètres de l'ordre qu'il a essayé de modifier. Ce qu'il écrit est le vrai mystère pour moi. Comme vous pouvez le voir sur les images ci-dessous, il écrit constamment que le volume est faux. C'est étrange. Je dois ajouter que tous les paramètres de l'ordre sont calculés correctement avant la modification, on peut le voir dans les messages. Sinon, l'erreur serait différente. Le programme a été testé avec un écart plus élevé que celui de la démo.

Enigmaun autre

 
_Vladimir_:

Bonjour. Face à une situation désagréable. Aidez-moi.

J'ai un conseiller expert. Il fonctionne bien dans le testeur de stratégie, je n'ai aucune réclamation. Cependant, lorsque je l'exécute sur une démo, je constate que l'EA ne peut pas placer de stops sur certains ordres. Il y a une erreur qui apparaît pas toujours, mais parfois. Je suis désespérée de le trouver par moi-même et j'espère obtenir votre aide. Il convient de noter que l'EA fonctionne parfaitement dans tous les autres aspects, tout comme dans le testeur, aucune plainte, sauf que le problème est que les arrêts ne sont pas toujours fixés. L'erreur apparaît chez différents courtiers sur différents comptes. Voici la partie du code responsable des opérations commerciales

Voici le code de la fonction Error(int er)

Ainsi, lorsque l'EA ne parvient pas à fixer des arrêts, un message s'affiche pour indiquer l'erreur et les paramètres de l'ordre qu'il a essayé de modifier. Ce qu'il écrit est le vrai mystère pour moi. Comme vous pouvez le voir sur les images ci-dessous, il écrit constamment que le volume est faux. C'est étrange. Je dois ajouter que tous les paramètres de l'ordre sont calculés correctement avant la modification, on peut le voir dans les messages. Sinon, l'erreur serait différente. Le programme a été testé avec un écart plus élevé que celui de la démo.

Faites attention aux valeurs de vos variables globales. Je peux supposer que ord_ticket est une variable globale, ce qui signifie que la valeur précédente peut y être stockée. Et avant d'appeler GetLastError() pour attraper l'erreur, vous devez réinitialiser la valeur précédente en l'appelant au début du code.
 
TarasBY:
Vous devez être très prudent avec les valeurs de vos variables globales. Je peux suggérer que ord_ticket est une variable globale et qu'elle peut donc stocker la valeur précédente. Et avant d'appeler GetLastError() pour attraper l'erreur, vous devez réinitialiser la valeur précédente en l'appelant au début du code.

ord_ticket est déclaré au niveau local. Et puis, même si elle est déclarée globalement dans la première ligne

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {

sa valeur va certainement changer. Ce sera soit le numéro de commande en cas de transaction réussie, soit -1 sinon. Ainsi, si l'ordre n'est pas ouvert, nous n'arrivons pas au blocage de la mise en place des stops.

Il convient également de noter que la fonction OrderSend() modifie toujours la valeur de la dernière erreur(selon la documentation et la logique), de sorte que la réinitialisation de la lecture précédente dans ce cas n'est pas nécessaire et entraînerait une simple perte de temps. C'est-à-dire que l'erreur 131 apparaît après l'entrée dans le bloc de réglage de l'arrêt et avant l'affichage du message d'erreur. Comme les arrêts ne sont pas réellement placés, la fonction OrderModify() doit être la dernière fonction à être appelée, qui, tout comme la précédente, modifie toujours la valeur de la dernière erreur. Mais je ne comprends pas pourquoi cela ne change pas la valeur de la dernière erreur. D'où vient-il ? Une fois encore, je dirai qu'il n'y a eu aucun problème dans le testeur.

J'avais l'idée que le courtier trichait parce que le serveur envoyait des numéros d'erreur au terminal et que ce dernier les envoyait à son tour au conseiller expert. J'ai abandonné cette idée car seuls les ordres d'un EA ont des erreurs, les autres EA travaillant en parallèle n'ont pas de telles erreurs.

 
_Vladimir_:

ord_ticket est déclaré au niveau local. Et puis, même si elle est déclarée globalement dans la première ligne

sa valeur va certainement changer. Ce sera soit le numéro de commande en cas de transaction réussie, soit -1 sinon. Ainsi, si l'ordre n'est pas ouvert, nous n'arrivons pas au blocage de la mise en place des stops.

Il convient également de noter que la fonction OrderSend() modifie toujours la valeur de la dernière erreur (selon la documentation et la logique), de sorte que la réinitialisation de la lecture précédente dans ce cas n'est pas nécessaire et entraînerait une simple perte de temps. C'est-à-dire que l'erreur 131 apparaît après l'entrée dans le bloc de réglage de l'arrêt et avant l'affichage du message d'erreur. Comme les arrêts ne sont pas réellement placés, la fonction OrderModify() doit être la dernière fonction à être appelée, qui, tout comme la précédente, modifie toujours la valeur de la dernière erreur. Mais je ne comprends pas pourquoi il ne change pas la valeur de la dernière erreur. D'où vient-il ? Une fois encore, je dirai qu'il n'y a eu aucun problème dans le testeur.

J'avais l'idée que le courtier trichait parce que le serveur envoyait des numéros d'erreur au terminal et que ce dernier les envoyait à son tour au conseiller expert. J'ai rapidement abandonné cette idée car seuls les ordres d'un EA ont des erreurs, les autres EA travaillant en parallèle n'ont pas de telles erreurs.


Je vais ajouter. Le code de l'EA travaillant en parallèle est exactement le même, il est responsable de la mise en place des stops. Cet EA n'a jamais connu de situation où les stops n'étaient pas fixés pour les ordres.

Il semble qu'il y ait une erreur dans le calcul des paramètres quelque part ci-dessus, mais si un seul paramètre est erroné, une autre erreur devrait apparaître. Par exemple, le célèbre 130

 
_Vladimir_:

ord_ticket est déclaré au niveau local. Et puis, même si elle est déclarée globalement dans la première ligne

sa valeur va certainement changer. Il s'agira soit du numéro de commande en cas de transaction réussie, soit de -1 dans le cas contraire. Ainsi, si l'ordre n'est pas ouvert, nous n'arrivons pas au blocage de la mise en place des stops.

Il convient également de noter que la fonction OrderSend() modifie toujours la valeur de la dernière erreur (selon la documentation et la logique), de sorte que la réinitialisation de la lecture précédente dans ce cas n'est pas nécessaire et entraînerait une simple perte de temps. C'est-à-dire que l'erreur 131 apparaît après l'entrée dans le bloc de réglage de l'arrêt et avant l'affichage du message d'erreur. Comme les arrêts ne sont pas réellement placés, la fonction OrderModify() doit être la dernière fonction à être appelée, qui, tout comme la précédente, modifie toujours la valeur de la dernière erreur. Mais je ne comprends pas pourquoi il ne change pas la valeur de la dernière erreur. D'où vient-il ? Une fois encore, je dirai qu'il n'y a eu aucun problème dans le testeur.

J'avais l'idée que le courtier trichait parce que le serveur envoyait des numéros d'erreur au terminal et que ce dernier les envoyait à son tour au conseiller expert. J'ai rapidement abandonné cette idée car seuls les ordres d'un EA ont des erreurs, les autres EA travaillant en parallèle n'ont pas de telles erreurs.

La pensée, c'est la course ! Mais l'expérience montre que ce que nous pensons (comme il se doit) et ce qui est réellement présent sont très souvent des choses DIFFÉRENTES. Ce qui peut être conseillé : "Préimprimez toute la séquence d'exécution de votre code, c'est le moyen le plus rapide de trouver une erreur (ou de vous assurer que vous avez raison). :)
 
yan720:

Vous avez écrit une réponse en trois points. Dans le premier cas, vous avez fait une erreur (mon entrée est tout à fait correcte), dans le deuxième cas, vous avez également fait une erreur (bien que ce message l'ait nivelée :) Le troisième point semblait indiquer que vous suggériez de déplacer le curseur à la fin après l'entrée, et non avant (ce qui a été pris comme une erreur à nouveau). Face à une telle image, j'ai préféré apporter une précision au modérateur polyvalent qui répondait.

Néanmoins, je vous remercie pour votre réponse. Et bonne année ! :)



:D ok, bonne année à vous aussi :)
 
Pour en revenir à ce qui a été écrit à la page 411 ... Quelqu'un a-t-il une idée de la façon de combiner ce code et les conditions d'entrée/sortie pour le franchissement de deux MA ? ou les ordres en attente sont-ils la seule option ?
 
petya33r:
Pour en revenir à ce qui a été écrit à la page 411 ... Quelqu'un a-t-il une idée de la façon de combiner ce code et les conditions d'entrée/sortie pour le croisement de deux MA ? ou les ordres en attente sont-ils la seule option ?

Après avoir ouvert une transaction sur un signal de mouvement, commencez à surveiller le nombre d'ordres ou cet ordre spécifiquement, si le nombre d'ordres à diminuer ou comme la deuxième option est fermée spécifiquement cet ordre, puis découvrez comment il a été fermé, si un arrêt, puis ouvre juste l'ordre opposé au prix actuel, c'est tout.
 
Ekburg:

Après l'ouverture d'une transaction sur des signaux mobiles, commencez à surveiller le nombre d'ordres ou cet ordre en particulier, si le nombre d'ordres à diminuer ou que la deuxième option est fermée spécifiquement cet ordre, alors découvrez comment il est fermé, si l'arrêt, alors il suffit d'ouvrir l'ordre opposé au prix actuel, c'est tout.

Je le comprends, mais je ne peux pas l'écrire. Soit le conseiller expert ne négocie que sur les signaux muwings et n'ouvre pas de position inverse en cas de perte, soit il fait simplement planter le terminal lorsque les tests commencent. J'ai donc écrit quelque chose qui ne peut pas être traité du tout. Je ne suis pas très doué pour l'écriture. J'ai besoin d'aide sous forme de code écrit.

//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер 
  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) 
  {
     if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         old_order_type = OrderType();
         if ( OrderProfit()<0 ) //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
         {
                break; //прекращаем поиск
         }
     }
  }
  //если раньше покупали, то теперь продаем
  if ( old_order_type == OP_BUY )
  {
      ticket = OrderSend(Symbol(), OP_SELL, Lot,  NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
      Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      return (0);  
  }

Si OrderProfit()<0, il ouvrira l' ordreopposé. Mais il ne fonctionne pas avec les signaux des aides à la mobilité. Pouvez-vous écrire un seul code pour fournir à la fois les signaux muwings et les conditions d'ouverture d'une position opposée ?