[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 524

 
sss2019:

Mon conseiller expert ouvre trois ordres dans mon terminal, à un moment donné il devrait fermer les trois ordres, mais pour une raison quelconque il n'en ferme que deux, il ne donne aucune erreur.

Voici ce morceau qui devrait clore les échanges

Je ne comprends pas ce qui ne va pas et pourquoi seules deux affaires sont conclues. S'il vous plaît, dites-moi qui sait quoi.

if(OrderSelect(i, SELECT_BY_POS) == false) continue;
 
Vinin:


Faites le cycle différemment


Cela n'a pas aidé non plus. Le fait de ne pas réarranger la boucle ou de substituer continue n'a pas aidé, comme si l'EA ne voyait pas ses trois propres ordres, et n'en supprimait que deux.

 
Inverser la direction du recalcul du cycle
 
Prenez-le et utilisez-le.
Dossiers :
 
Parfois, les choses sont tellement incompréhensibles, pas du tout logiques, que je pense qu'il y a des erreurs dans l'environnement du terminal lui-même.
 
sss2019:
Parfois, les choses sont tellement incompréhensibles, pas du tout logiques, que je pense qu'il y a des erreurs dans l'environnement du terminal lui-même.
Pour que cela paraisse moins, vous devez commencer par étudier un manuel et un livre. Essayez ensuite de trouver des explications sur des problèmes similaires sur le forum.
 
sss2019:

Comment mieux organiser le drawdown maximum de l'EA, à partir duquel il cesse de fonctionner, pouvez-vous définir une variable statique qui accumulera le montant des pertes ?

Le conseiller expert devrait cesser de fonctionner, mais il recommencera à fonctionner après un redémarrage ou une modification des paramètres.


Lors de l'initialisation d'un EA, vous pouvez enregistrer le solde actuel dans une variable statique. Et dans la fonction Start, vous pouvez vérifier combien de pourcentages du solde actuel ont diminué par rapport au solde initial et si le pourcentage est supérieur à ce qui est autorisé, vous pouvez interdire la transaction. Brièvement, sans aucun code. Après le redémarrage, le conseiller expert se souviendra de la nouvelle balance initiale...
 
MrSoros:

Lors de l'initialisation de l'Expert Advisor, le solde actuel peut être enregistré dans une variable statique. Et dans la fonction Start, vérifiez de combien le solde actuel a glissé par rapport au solde initial, et si le pourcentage est supérieur à celui autorisé - le commerce est interdit. Brièvement, sans aucun code. Après le redémarrage, le conseiller expert se souviendra du nouveau solde initial.

Avez-vous compris la question ?
 
MrSoros:

1. Lors de l'initialisation de l'Expert Advisor, vous pouvez enregistrer la balance actuelle dans une variable statique. Ensuite, la fonction Start vérifie de combien de pour cent le solde actuel a baissé par rapport au solde initial et si le pourcentage est supérieur, la transaction sera interdite. En bref, sans aucun code.

2. Après le redémarrage, l'évaluateur se souviendra du nouveau solde original...

1. Vous pouvez. J'ai cette option (avec code) - vous initialisez vous-même les variables :

extern int MaxLoss = 90;          // Максимально допустимая просадка в процентах от баланса
int  orderIndex;
bool IsExpertFailed = false;
bool IsExpertStopped = false;
double lots;                       // вспомогательная переменная для расчета нового размера лота 
double Lots_New;                   // Количество лотов для новых ордеров
int ticket;                        // Номер ордера
double orderLots;                  // Lots   
double orderProfit;                // Profit
double Price;                      // Цена открытия рыночного ордера
double SL;                         // Значение StopLoss ордера
double  TP;                        // Значение TakeProfit ордера
static datetime prevtime = 0;       // по ценам открытия
int start()
{  
   if (IsExpertStopped)
   {
      Comment("Не удалось инициализировать советник!");
      return (0);
   }
   
   if (IsExpertFailed)
   {
      Comment("Критическая ошибка! Советник остановлен.");
      return (0);
   }
      Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL );    
 
   int orderCount = 0;  
      // ------------------------------------------------Учет ордеров только ЭТОГО ЭКСПА---------------------------

   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
     {  
      if (!OrderSelect(orderIndex, SELECT_BY_POS))    continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))    continue;

      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))     continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }
          // Проверка на предельную просадку      
      double loss = - ((orderProfit * 100.0) / AccountBalance());
      if (loss > MaxLoss)
      {
         Print ("MaxLoss");
         CloseAllOrders(magic);
         IsExpertFailed = true;
         return (0);
      }        
         
      orderCount++;                     // считаем ордера (не больше i)                   
     
    }   

2. Non. Il ne se souviendra pas du niveau d'équilibre qui était avant le début de cet EXPERT la première fois. Ne retiendra que le niveau actuel de la variable

AccountBalance()

. pour ce compte.

 

Bonjour, j'ai déjà eu une question sur la représentation correcte des guillemets dans Excel. Cette question a trouvé une réponse grâce àcosty .Maintenant j'ai une question, est-il possible de faire (sans MQL5 et dll) les données pour plus de devises à télécharger ? Le schéma est présenté ci-dessous, à la place de "..." les valeurs de date correspondantes, les valeurs de prix de clôture et la période actuelle.

Je suppose que la réponse à la question impliquera d'éventuelles corrections de mon code. Je joins le code du conseiller expert qui écrit dans le fichier les valeurs des prix de clôture pour un instrument financier courant.

#property copyright "S.I.Shlikov"
#property link      ""
int init()  
  {
   string Name=Symbol();
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,"Date",Name,"Period",Period());
   FileClose(h);        
  }
int start()
  {
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   string Wtime=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,Wtime,NormalizeDouble(Close[0], Digits));
   FileClose(h);   
   return(0);
  }