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

 
LBatters:

Bonjour à tous)

J'ai essayé d'écrire une fonction pour fermer une partie de la position, mais quand je l'exécute dans le testeur, 138 fait apparaître une erreur, je ne comprends pas quel est le problème. Aidez-moi s'il vous plaît.

Voici un EA où cette fonction devrait fonctionner)

138 - "Le prix demandé n'est pas à jour ou l'offre et la demande sont mélangées".

Le prix d'ouverture/fermeture ne peut pas être recalculé, parce qu'il est là, et c'est là le problème(vous devez demander le prix et lui donner une valeur en utilisant MarketInfo, et renommer celle-ci à une autre variable) :

                 PriceCl    = NormalizeDouble((takeprofit + OrderOpenPrice())/t,Digits);  //примерную цену закрытия
                 order = OrderTicket();    //получили ордер
                 if(Bid>PriceCl) //если текущая цена оказалась выше нашей цены ,то закрываем часть ордера
                 {OrderClose(order,NormalizeDouble(lot*percent/100,2),PriceCl,3);}
 
7Konstantin7:

Bonjour à tous.

J'essaie de mettre à jour un simple EA de trawl par Kim pour supprimer les ordres en attente après la fermeture de tous les ordres de marché, il échoue (

J'ai ajouté une fonction pour supprimer les commandes en attente :

J'ai trouvé un autre problème que je ne peux pas résoudre parce que je ne suis pas très doué pour le codage.

Je suppose que je devrais écrire une condition telle que :

Ce n'est qu'un exemple tiré d'un autre EA.


Aidez-moi, s'il vous plaît.

Kostya, lancez une boucle calculant le nombre d'ordres des types requis, puis supprimez-la comme vous le souhaitez.
 
_new-rena:
Kostya, fais une boucle pour calculer le nombre de commandes pour les types requis, puis supprime comme tu le souhaites, ne fais pas le malin.

Je suis un geek du code) J'ai ajouté plus de pauses ici, peut-être que ça aidera)

  if (OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
 
7Konstantin7:

Je suis un geek du code) J'y ai ajouté quelques pauses supplémentaires, peut-être que ça aidera.)

Le surligné n'est pas le problème. Le problème, c'est qu'avant d'ajouter les pauses, vous auriez dû vous demander : "Qu'est-ce que vous y gagnez ?". Ça ne fera rien... et y a-t-il un intérêt à l'ajouter ???

Je n'ai pas compris le reste, je suis ivre et ne respecte pas les codes de Kim... désolé...

 
AlexeyVik:

La mise en évidence n'est pas le problème. Le problème, c'est qu'avant d'ajouter les ordres en attente, vous auriez dû vous demander : "Qu'est-ce que vous y gagnez ?". Ça ne va rien faire... et y a-t-il un intérêt à l'ajouter ???

Et le reste je n'ai pas compris, je suis bourré et les codes de Kim ne respectent pas ... désolé ...

Rien) Je le pensais, je dois écrire une condition et maintenant je pense.

Oui, les codes n'y sont pas pour de vrai) au moins pour le gratuit, pour le payant je ne sais pas.

 
7Konstantin7:

Il n'a rien fait) J'ai pensé alors, je dois écrire une condition, je pense.

Je ne sais pas comment faire, mais j'ai un code différent pour les vrais.

Pour les vrais, chaque maison de courtage a son propre code, il n'y a donc pas de code universel.

 

Problème résolu) réfléchi longtemps et durement) merci à tous.

   if (gdProfit>BEGIN_PROFIT) {
    ClosePosFirstProfit();
    if (DeleteOrders) DeleteOrders();
  }
 

Bonjour à tous !

Je suis confronté à un problème de clôture des contre-ordres sur un marqueur de cinq. Le fait est que je dois fermer, disons, 20 ordres d'achat et 33 ordres de vente lorsque le bénéfice total est atteint. Et je veux fermer 20 ordres d'achat et 20 ordres de vente à l'aide de la fonction OrderCloseBy(), et fermer les 13 ordres de vente restants à l'aide de la fonction OrderClose().

Si nous avons un spread fixe à 4 chiffres, nous n'aurons aucun problème pour fermer le spread et nous sauvegardons également le spread lorsque nous utilisons la fonction OrderCloseBy(). Si nous avons un spread à 5 chiffres, le spread est flottant et c'est pourquoi, je pense, les ordres ne sont pas fermés lorsque le profit total est atteint et que le journal indique OrderCloseBy(). En même temps, si nous le faisons fonctionner dans le testeur, tout est fermé normalement.

Les ordres dans un sens, lorsque le profit total est atteint, sont fermés sans problème.

Qui a rencontré un tel problème, et quelles sont les options pour le résoudre ?

Voici la fonction pour fermer les ordres.

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}  
 

Veuillez indiquer comment fermer les ordres dans l'ordre où ils ont été ouverts.

Je veux refaire cette fonction :

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

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
7Konstantin7:

Veuillez indiquer comment fermer les ordres dans l'ordre où ils ont été ouverts.

Je veux refaire cette fonction :

La réponse est évidente. Trier les postes ouverts en fonction de leur date d'ouverture. Et ensuite les fermer dans la liste à partir du tableau trié.
Raison: