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

 
Reshetov:

Dans le testeur et dans le graphique, les fichiers sont écrits et lus dans des répertoires différents :

  1. MetaTrader 4 - Testeur - Experts - Fichiers
  2. MetaTrader 4 ``Experts'' (fichiers)

Yuri, respect ! Je l'ai compris maintenant et je l'ai corrigé.

Zhunko, merci. J'ai essayé de cette façon, mais j'ai obtenu une erreur du type "Impossible de lire les données binaires d'un fichier de type chaîne" ou quelque chose du genre. Bref, ma construction fonctionne.

 
snail09_1:

Je ne créerais pas un tableau de tickets à fermer, mais dans la boucle d'énumération des ordres du marché, je vérifierais chaque ordre en envoyant son ticket à l'entrée de la fonction de fermeture avec une vérification des conditions possibles.

Pouvez-vous montrer cela dans le code ?

Je veux dire, comment cela peut-il être mis en œuvre ?

 

Bonjour à tous !

Cette question n'est peut-être pas destinée aux débutants, mais je n'ai pas trouvé d'autre fil de discussion où je pourrais poser une question :

Comment puis-je décharger un rapport détaillé de MetaTrader 4 pour avoir l'équité sur le graphique au lieu du solde ? Je ne sais pas, si je l'ai téléchargé à partir de MT4 ou d'un autre moyen pratique, cela serait-il réaliste ? Je ne sais pas si j'ai le bon équilibre ou pas, je veux juste connaître les résultats du drawdown.

Je n'ai aucune idée de la façon d'utiliser ces courtiers.

 
belous:

Pouvez-vous le montrer en code ?

Je veux dire, comment la mettre en œuvre ?

Quelque chose comme ça ?

int ticket;

for(int z=OrdersTotal()-1;z>=0;z--)
   {
   if(!OrderSelect(z,SELECT_BY_POS))
      {
      _GetLastError=GetLastError();
      Print(" OrderSelect(",z,",SELECT_BY_POS)-Error #",_GetLastError);
      continue;
      }
   if(OrderMagicNumber()==magic && OrderSymbol()==Symbol())
      {
      if((OrderType()==OP_BUY)||(OrderType()==OP_SELL))
          {
          // Проверим условие для закрытия, и если истинно          
              {
              ticket=OrderTicket();
              //Закрываем его
              }
           }
       }
    }
 

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

Voici le code


//-----------------Закрытие по истории в безубыток--------------------
   //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0,
Time_at_History_Previos = 0;     
 
 if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0)
                  break;
               }
            }
         }
      }
   }

if (Sum_Loss < 0.0) { // Имеем убыток по закрытым позам
double money = Lots;
   BuyLots = GetBuyLotsSum();
        SellLots = GetSellLotsSum();
        if(BuyLots  > SellLots)money = BuyLots * 10;
        if(BuyLots  < SellLots)money = SellLots * 10;
  if (((AccountEquity() + Sum_Loss + (Sum_Loss / money)) >= AccountBalance()) && (((totalSell > 0) && (totalBuy < 1)) || ((totalSell < 1) && (totalBuy > 0)))) { // Достигли безубытка
    // Здесь какой-то код, который необходимо выполнить при достижении безубытка
        CloseAllBuy();
           CloseAllSell();
           Sum_Loss = 0.0;
           

Je n'ai aucun moyen de faire en sorte qu'une boucle s'ouvre lorsqu'une transaction a été clôturée en négatif et que si la commande suivante a été clôturée au-dessus de zéro, c'est-à-dire un solde positif, mais inférieur au négatif, on ajoute le plus au négatif et on obtient une nouvelle valeur négative, qui est déjà inférieure.

if(OrderProfit() >= 0 && Sum_Loss < 0.0)
                  double lastLoss_two = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss_two;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
               }

S'il est plus négatif, selon le signal, nous fermons l'ordre et recommençons le cycle depuis le début.


La situation est que lorsque ce code ferme la transaction en perte, alors il se souvient du solde négatif, et lorsqu'il ferme la transaction en plus, et que le plus est inférieur au solde, alors il réinitialise Sum_Loss et j'ai besoin qu'il n'ait pas été mis à zéro, et fauché.

C'est donc comme ça que ça marche maintenant :

il vérifie un ordre fermé, si le profit de l'ordre fermé est inférieur à zéro, alors ce profit est ajouté à Sum_Loss, et ainsi de suite jusqu'à ce que le profit de la transaction ouverte dépasse (sera supérieur à) Sum_Loss, lorsqu'il est atteint, la transaction est fermée, et Sum_Loss est remis à zéro et le cycle recommence.

J'en ai besoin :

Si l'ordre suivant s'est clôturé avec un profit positif, Sum_Loss est réduit du montant dérivé du profit, ce qui signifie que le prochain ordre ouvert Sum_Loss est déjà plus petit, et ainsi de suite jusqu'à ce que le profit de l'ordre soit supérieur à Sum_Loss, et alors Sum_Loss est effacé et un nouveau cycle commence.

Sum_Loss = 0 ;

1er ordre fermé : Profit (-50) < 0

Somme_Perte + bénéfice (Somme_Perte + (-50))

Sum_Loss = -50 ;

2ème ordre fermé : Profit (+40) > 0 et Sum_Loss < 0

Somme_perte + bénéfice (Somme_perte + 40)

Sum_Loss = -10


Peut-être que la variable Sum_Loss devrait être spécifiée comme une variable négative ? En général, je suis confus. J'ai essayé de nombreuses variantes, mais je n'ai pas obtenu le bon résultat. J'ai essayé de nombreuses variantes et je n'ai toujours pas obtenu le bon résultat.
 
Comment puis-je tester un EA sans tenir compte du spread ? Est-ce possible ?
 
Max79:
Comment puis-je tester un EA sans tenir compte du spread ? Est-ce possible ?
Google et vous le trouverez, par exemple ici (set spread ? site:mql4.com) lire : https://www.mql5.com/ru/forum/102224/page2
 

Qui a une telle dinde ?

 

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

J'ai mis un modificateur d'ordres en attente, dans l'EA, et il me donne une erreur - 1 lors du test dans le Journal.

C'est-à-dire : "Si je passe des valeurs inchangées comme paramètres de fonction, l'erreur 1 (ERR_NO_RSULT) sera générée".

J'ai mis un chèque avant la modification, mais cela n'aide pas. Quelle est l'erreur ? L'EA est en cours de test, mais comment puis-je éliminer les ordres dont les valeurs sont inchangées ?