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

 
MisterD:
Bonjour, pouvez-vous me dire où se trouve l'erreur dans le code suivant ?
J'appelle la boucle au moment de "deinit".
Il supprime tout sauf la dernière commande.
Je pense que cette ligne est très probablement une erreur >> for (int i=1 ; i<=OrdersTotal() ; i++) <<
Pourtant, logiquement, tout semble correct... qu'ai-je raté ?

Merci d'avance !


Faire la boucle à l'envers

//-------------------------------------------------------------------------------------------
for (int i=OrdersTotal()-1; i>=0; i--)
{
   if (OrderSelect(i,SELECT_BY_POS)==true)
   {
      int Type=OrderType();
      if (OrderSymbol()!= Symbol() || Type <2)continue;
      int Ticket=OrderTicket();
      bool Modify =OrderDelete(Ticket);
      if (Modify == true) Alert ("Ордер Удалён");continue;
      if (Modify != true) Alert ("Удаление ордера не удалась");
   }
} 
//-------------------------------------------------------------------------------------------
 
MisterD:
Bonjour, pouvez-vous me dire où se trouve l'erreur dans le code suivant ?
J'appelle la boucle au moment de "deinit".
Il supprime tout sauf la dernière commande.
Je pense que cette ligne est très probablement une erreur >> for (int i=1 ; i<=OrdersTotal() ; i++) <<
Pourtant, logiquement tout semble correct... qu'ai-je raté ?

Merci d'avance !

//-------------------------------------------------------------------------------------------
for (int i=1 ; i<=OrdersTotal() ; i++)
{
si (OrderSelect(i-1,SELECT_BY_POS)==true)
{
int Type=OrderType() ;
si (OrderSymbol()!= Symbol() || Type <2)continuer ;
int Ticket=OrderTicket() ;
Modifier=CommandeDelete(Ticket) ;
if (Modify == true) Alert ("Order Deleted") ; continue ;
if (Modify != true) Alert ("Order deleted failed") ;
continuer ;
}
}
//-------------------------------------------------------------------------------------------


Essayez comme ça :

for(int i=OrdersTotal()-1;i>=0;i--) {
  if(OrderSelect(i,......................
 

Bonjour. J'ai besoin d'un peu d'aide. Il existe une fonction qui ferme l'un des lots les plus importants en termes de profit.

J'ai besoin de le mettre en boucle.

Veuillez m'indiquer comment utiliser cette fonction, par exemple si l'équité de mon compte est supérieure à 5 pips, cette fonction devrait fonctionner.

void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  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 (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  } 

}

 
sannin:

Bonjour. J'ai besoin d'un peu d'aide. Il existe une fonction qui ferme l'un des lots les plus importants en termes de profit.

J'ai besoin de le mettre en boucle.

Par exemple, si l'équité de mon compte est supérieure à 5 pips, cette fonction devrait fonctionner.

Par exemple, si l'équité du compte est supérieure à 5 pips (pour 4 caractères) - sur le marché réel, si le nombre d'ordres est supérieur à 3-4, ils se transformeront facilement en moins (selon les résultats de la suppression). :)))

P.S. Comme je le vois, vous avez besoin d'un code tout fait, alors que l'algorithme pour résoudre un tel problème vous est inutile !

 
TarasBY:
5 pips (pour 4 signes) - dans le marché réel si le nombre d'ordres est supérieur à 3-4, il est facile de se transformer (par les résultats de la suppression) en moins. :)))


Pour ma part... et j'ai prêté attention à l'or dernièrement... il ne réagit pas aussi rapidement que je le pensais.

Je n'ai pas encore travaillé avec des fonctions de ce type... c'est pourquoi je demande de l'aide.

 
Bonjour, j'ai un problème avec le développement de l'Expert Advisor, il ne ferme pas les ordres, bien que les conditions prescrites pour la fermeture par un indicateur, s'il vous plaît expliquer ce que c'est, merci à l'avance.
Dossiers :
 
sannin:


Eh bien, pour ma part... et j'ai fait attention à l'or dernièrement... il n'est pas aussi rapide que je le pensais.

Je n'ai pas encore travaillé avec les fonctions de ce formulaire ... alors voici une demande d'assistance.

Tout d'abord, vous calculez la ligne BU d'une position globale pour l'instrument (elle est utilisée pour déterminer les conditions de clôture des ordres lorsqu'ils atteignent la rentabilité en pips) :

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Определение Уровня БезУбытка по символу                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_BreakEven (string fs_Symbol,     // Symbol
                       double fd_DeltaLots,  // разность объемов ордеров Buy и Sell
                       double fd_Profit)     // текущий профит по открытым ордера
{
    if (fd_DeltaLots == 0.) return (0.);
    double ld_BU = 0., ld_tickvalue = MarketInfo (fs_Symbol, MODE_TICKVALUE);   // цена одного пункта
//----
    //---- Уровень общего безубытка для открытых ордеров
    if (fd_DeltaLots > 0.) ld_BU = MarketInfo (fs_Symbol, MODE_BID) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
    else if (fd_DeltaLots < 0.) ld_BU = MarketInfo (fs_Symbol, MODE_ASK) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
//----
    return (ld_BU);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Ensuite, on calcule la différence entre le prix actuel et la ligne de Breakeven. Si la "différence" est satisfaisante, on passe à la procédure d'effacement des ordres. La première chose à faire est de trouver le ticket de l'ordre le plus rentable/perdant :

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Получаем Тикет самого прибыльного/убыточного ордера                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_TicketWithControlProfit (string fs_Symbol = "",  // Инструмент
                                  int fi_Magic = -1,      // Magic
                                  int fi_Type = -1,       // OrderType
                                  int fi_TypeProfit = 0)  // Профитность ордера среди остальных ордеров:
                                                          // >= 0 -  с самым большим профитом;
                                                          // < 0 - самый убыточный
{
    double ld_Profit = 0., ld_curProfit;
    int    li_Total = OrdersTotal(), li_Ticket = -1;
//----
    if (fs_Symbol == "") fs_Symbol = Symbol();
    if (fi_TypeProfit < 0) ld_Profit = 10000000000.;
    for (int i = li_Total - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != fs_Symbol) continue;
        if (fi_Magic > -1) if (OrderMagicNumber() != fi_Magic) continue;
        if (fi_Type > -1) if (OrderType() != fi_Type) continue;
        if (fi_Type > 1) continue;
        ld_curProfit = OrderProfit() + OrderSwap() + OrderCommission();
        if (fi_TypeProfit >= 0) {if (ld_Profit <= ld_curProfit) continue;}
        else if (ld_Profit >= ld_curProfit) continue;
        ld_Profit = ld_curProfit;
        li_Ticket = OrderTicket();
    }
//----
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

La suppression peut se faire dans les deux sens. Supprimons :

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция закрытия "своих" ордеров по признаку                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fClose_AllOrdersByProfit (string fs_Symbol = "",  // Инструмент
                              int fi_Magic = -1,      // Magic
                              int fi_Type = -1,       // OrderType
                              int fi_TypeProfit = 0)  // Направление закрытия ордеро по профитности:
                                                      // >= 0 - начиная от самого большого профита;
                                                      // < 0 - начиная от самого маленького профита;
{
    int li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit),
        li_cnt = 0;
//----
    while (li_Ticket > 0)
    {
         //---- Здесь вставите свою процедуру закрытия 
         //---- что-то типа:
         //ClosePosByTicket (li_Ticket);
         li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit);
         li_cnt++;
    }
//----
    return (li_cnt);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Assembler plus loin l'unité souhaitée n'est pas trop difficile : il faut le faire ou aller au travail... :)

 
Je veux affecter une valeur de prix à une variable.

a=(NormalizeDouble(OrderOpenPrice(),5));


Mais pour une raison quelconque, le prix est dessiné avec une valeur à quatre chiffres à 1,3360.

Pouvez-vous me dire quelle est l'erreur ?
 
lottamer:
Je veux affecter une valeur de prix à une variable.



Mais pour une raison quelconque, le prix est dessiné avec une valeur à quatre chiffres à 1,3360.

Pouvez-vous me dire quelle est l'erreur ?

Peut-être que le DC est à quatre chiffres ? Ou sortir le prix sans DoubleToStr(YourPrice,5)
 
Sepulca:

Peut-être que le DC est à quatre chiffres ? Ou afficher le prix sans DoubleToStr(YourPrice,5)


Le DC est à cinq chiffres...

Qu'est-ce que cela signifie SANS DoubleToStr(VotrePrix,5) ? Je n'ai pas DoubleToStr(VotrePrix,5) nulle part.