Questions des débutants MQL5 MT5 MetaTrader 5 - page 935

 

Ce problème semble se produire s'il existe d'autres ordres sur le marché, mais d'une taille différente.

Supposons que nous ayons 4 ventes d'un lot et 4 achats d'un lot. Et 1 achète 0,5 lot.

Comment éviter cela ? Je pense que cette fonction a besoin d'une boucle.

 
EgorKim:

Ce problème semble se produire s'il existe d'autres ordres sur le marché, mais d'une taille différente.

Supposons que nous ayons 4 ventes d'un lot et 4 achats d'un lot. Et 1 achète 0,5 lot.

Comment éviter cela ? Peut-être, il devrait y avoir une boucle dans cette fonction.

Je ne sais pas où est la "drubashka". C'est sa spécialité de travailler à travers la bibliothèque standard. Je ne sais pas ce qu'il choisit.

      if(m_position.SelectByIndex(i))

Et il serait trop paresseux pour s'en occuper.

J'aurais abordé la solution un peu différemment. Je créerais deux tableaux avec des tickets de position d'achat et de vente séparément et je fermerais les positions par paires dans la deuxième boucle.

Ou nous pouvons créer un tableau à deux dimensions. Mais il faut être très attentif à la distribution des indices. Pour qu'il n'y ait pas de lacunes...

 
Alexey Viktorov:

Quelque part, le batteur a disparu. C'est son truc de travailler avec la bibliothèque standard. Je ne sais pas ce qu'il choisit.

Oui, et je suis trop paresseux pour le faire.

J'aurais abordé la solution un peu différemment. Je créerais deux tableaux avec des tickets de position d'achat et de vente séparément et les fermerais dans la deuxième boucle par paires.

Ou nous pouvons utiliser un tableau à deux dimensions. Mais je dois être très attentif à la distribution des index. Pour qu'il n'y ait pas de lacunes...

J'y ai pensé moi-même. Pouvez-vous partager le code avec deux tableaux ? Je ne peux pas le faire moi-même.

Comme solution temporaire, j'ai créé une boucle limitée. Je ne sais pas si ce code est correct ou non, mais c'est peut-être quelque chose. C'est vrai, ça se termine bizarrement par la division des lots.

Apparemment, même les volumes du compteur doivent être comparés pour éviter le fractionnement. J'abandonne.

void CloseBy()
  {
   int s=10;
   do // цикл
     {
      s--;
      ulong ticket_buy=ULONG_MAX;
      ulong ticket_sell=ULONG_MAX;
      for(int i=0;i<PositionsTotal();i++) // ATTENTION! Here, specially began a detour with "0"
         if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY && ticket_buy==ULONG_MAX)
               ticket_buy=m_position.Ticket();

            if(m_position.PositionType()==POSITION_TYPE_SELL && ticket_sell==ULONG_MAX)
               ticket_sell=m_position.Ticket();
           }
      if(ticket_buy!=ULONG_MAX && ticket_sell!=ULONG_MAX)
         m_trade.PositionCloseBy(ticket_buy,ticket_sell);
     }
   while(s>1);// цикл
   return;
  }
 
EgorKim:

J'y ai moi-même pensé. Pouvez-vous partager le code avec deux tableaux ?

Non, pour plusieurs raisons.

1. Je n'utilise pas la contre-fermeture moi-même.

2. Il n'existe pas de code prêt à l'emploi, et il n'y a aucune envie de l'écrire spécialement.

3. Hier, j'ai eu une telle idée. Hier, j'ai eu une telle idée. Aujourd'hui, j'en ai un autre, et demain, à Dieu ne plaise, j'en aurai un autre. Par conséquent, je n'écris que ce qui me vient à l'esprit sur le moment.

Et la raison principale - je pense qu'aider et faire le travail de quelqu'un d'autre, c'est deux grandes différences.

Je ne peux qu'aider. Mais je ne peux pas vous aider, je n'utilise presque pas la bibliothèque standard et pour comprendre votre code, je dois comprendre la SB.

 

Bonjour à tous

Pouvez-vous me donner un exemple d'un indicateur ou d'une fonction qui permet de créer un indicateur qui n'affichera le résultat sur le graphique que dans une certaine plage ou zone du graphique !

Par exemple de 1:00 à 2:35 heure terminale, Et ce choix doit être fait avec la souris directement sur le graphique.


J'ai spécifiquement besoin de compter le nombre de bougies d'achat ou de vente dans la plage sélectionnée.

 
Milhail Novgorodcev:

Bonjour à tous

Pouvez-vous me donner un exemple d'un indicateur ou d'une fonction qui permet de créer un indicateur qui n'affichera le résultat sur le graphique que dans une certaine plage ou zone du graphique !

Par exemple de 1:00 à 2:35 heure terminale, Et ce choix doit être fait avec la souris directement sur le graphique.


J'ai spécifiquement besoin de compter le nombre de chandeliers d'achat ou de vente dans la plage sélectionnée.

La première chose qui m'est venue à l'esprit :

  • un script, deux paramètres d'entrée - l'heure de départ et l'heure d'arrivée.
  • un rectangle est dessiné manuellement et le script doit être lancé avec le nom du rectangle dans les paramètres d'entrée.
  • Expert Advisor ou indicateur qui trace la création d'un rectangle avec un nom donné ...

 
Milhail Novgorodcev:

Bonjour à tous

Pouvez-vous me donner un exemple d'un indicateur ou d'une fonction qui permet de créer un indicateur qui n'affichera le résultat sur le graphique que dans une certaine plage ou zone du graphique !

Par exemple de 1:00 à 2:35 heure terminale, Et ce choix doit être fait avec la souris directement sur le graphique.


J'ai spécifiquement besoin de compter le nombre de chandeliers d'achat ou de vente dans la plage sélectionnée.

Quel est le problème ?

Dans OnChartEvent () à deux variables, on assigne tour à tour l'heure du clic de la souris en deux points (pas l'heure actuelle, mais l'heure de la barre, sur laquelle on a cliqué) et, à condition que les deux variables ne soient pas nulles, on calcule cet intervalle. Après la sortie de ces variables, elles sont remises à zéro et attendent le prochain clic de souris.

Le seul problème que je vois est que si le premier clic est fait par erreur, comment l'annuler ? Mais, je pense qu'il est possible d'arriver à quelque chose de soigné après avoir lu la documentation. Par exemple, appuyer sur une touche ou faire défiler la molette de la souris...

 

Aidez-moi !

Fatigué de réparer le script pour prendre des captures d'écran sur l'historique. Le script est censé défiler jusqu'à 8h du matin chaque jour et prendre une capture d'écran.

Le script ne fonctionne pas comme il le devrait.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ChartSetInteger(0,CHART_SHIFT,false);
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
   int _bars=Bars(Symbol(),0);
 
   for(int i=0; i<_bars; i++)
     {
      MqlDateTime time_now;
      //datetime candle_time=iTime(NULL,_period,0);
      TimeToStruct(iTime(NULL,_Period,i),time_now);  // change time to struct

      if(time_now.hour==8 && time_now.min==0)
        {
         //--- прокрутим на 10 баров вправо от начала истории 
         ChartNavigate(0,CHART_BEGIN,i);
         Sleep(5000);
         //--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
         long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
         Print(first_bar);
         string name=_Sumbol_N(string(Symbol()))+"_"+Symbol()+"_"+TFMigrate(Period())+" "+string(time_now.year)+"."+string(time_now.mon)+"."+string(time_now.day)+" "+string(time_now.hour)+"."+string(time_now.min);

         ChartScreenShot(0,name+" 2560_1600.PNG",2560,1600,ALIGN_LEFT);
         //i=5;
        };
     };

//Print(iTime(NULL,_Period,0));

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string _Sumbol_N(string ft)
  {
   if(ft ==  "EURUSD" ) return("01");
   if(ft ==  "GBPUSD" ) return("02");

   return "";
  }
//+------------------------------------------------------------------+
string TFMigrate(int tf)
  {
   switch(tf)
     {
      case 0: return("CURRENT");
      case 1: return("M1");
      case 5: return("M5");
      case 15: return("M15");
      case 30: return("M30");
      case 60: return("H1");
      case 240: return("H4");
      case 1440: return("D1");
      case 10080: return("W1");
      case 43200: return("MN1");

     }
  }
//+------------------------------------------------------------------+
 
oleg360:

Aidez-moi !

Fatigué de réparer le script pour prendre des captures d'écran sur l'historique. Le script est censé défiler jusqu'à 8h du matin chaque jour et prendre une capture d'écran.

Le script ne fonctionne pas comme il le devrait.

Jusqu'à présent, la fonction de défilement fonctionne de manière erratique (ou plutôt imprévisible). L'administrateur est en train de faire le tri.

 
Vladimir Karputov:

Jusqu'à présent, la fonction de défilement fonctionne mal (ou plutôt fonctionne de manière imprévisible). L'administrateur est en train de faire le tri.

Merci !