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

 
Mes amis, j'ai plutôt une question sur les réglages du signal.
Le problème est le suivant : lorsque les commandes du fournisseur sont clôturées, les commandes de l'abonné sont toujours en attente. Apparemment, à cause de la différence d'écart. Comment faire en sorte que les transactions d'un Abonné soient fermées immédiatement lorsqu'elles sont fermées chez le Prestataire ? Quel paramètre doit être modifié ?
 
Leo59:
Merci Alexey !!!! pour 4))))

Alors... j'ai trouvé ma vieille dinde et j'ai découpé ce dont j'avais besoin. Je ne l'écrirai pas pour vous)), mais cela fera l'affaire pour démarrer. J'y ai ajouté des commentaires, les noms des variables sont clairs d'après les noms.

datetime date[]; // тут будем хранить данные времени баров, которые видны на экране
// если нужны другие данные баров, заводим соотв. массивы 

void DoWork(bool redrawAll = false)
{
    int visibleBars = 1, firstVisibleBars = 0;
    visibleBars = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
    firstVisibleBars = (int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
    
    ArrayResize(date, visibleBars + 10); // выделяем память с запасом

    // так можно узнать масштаб графика, может пригодится
    int scale = (int)ChartGetInteger(0, CHART_SCALE);
    // копируем данные времен баров 
    if (CopyTime(Symbol(), Period(), startpos, visibleBars, date) == -1)
    {
        Print("Не удалось скопировать значения времени! Код ошибки = ", GetLastError());
        return;
    }

    //--- определим шаг, если надо работать с масштабом
    int step = 1;
    switch (scale)
    {
    case 0:
        step = 12;
        break;
    case 1:
        step = 6;
        break;
    case 2:
        step = 4;
        break;
    case 3:
        step = 2;
        break;
    }
    double priceMin = ChartGetDouble(0,CHART_PRICE_MIN,0);
    double priceMax = ChartGetDouble(0,CHART_PRICE_MAX,0);

    for (int i = visibleBars - 1; i >= 0; i--)
    {
        /*
        проходимся по всем видимым барам и ищем стрелки, искать можно путями:
        1. Изначально при создании стрелок надо формировать имена стрелок с привязкой ко времени, например
        string name = "UpArrow"  + IntegerToString(TimeCurrent());
        тогда тупо ищем стрелку с таким именем и далее двигаем, куда надо
        2. Заносить стрелки в структуры и класть их в хештаблицу, первый проще
        */
    }
    
}
 
Artem Prischepa:
Mes amis, j'ai une question qui concerne davantage le réglage du signal.
Le problème est le suivant : lorsque les commandes d'un fournisseur sont clôturées, elles restent toujours sur celle de l'abonné. Apparemment, à cause de la différence d'écart. Comment faire en sorte que les transactions d'un Abonné soient fermées immédiatement lorsqu'elles sont fermées chez le Prestataire ? Quel paramètre doit être modifié ?

L'affaire devrait également être conclue presque instantanément. Questions :

  1. Le terminal de l'abonné est-il allumé à ce moment-là ?
  2. Veuillez joindre le fichier journal du terminal pour le jour du problème.
 
Alexey Volchanskiy:

Alors... j'ai trouvé ma vieille dinde et j'ai découpé ce dont j'avais besoin. Je ne l'écrirai pas pour vous)), mais cela fera l'affaire pour commencer. J'y ai ajouté des commentaires, les noms des variables sont clairs d'après les noms.

De plus, je devrais probablement mettre le numéro de la sous-fenêtre des indicateurs dans cette ligne ? Je ne sais pas exactement ce qu'il faut.

ChartGetDouble(0,CHART_PRICE_MIN,0);
 
Alexey Volchanskiy:

Addendum, vous devriez probablement mettre le numéro de la sous-fenêtre de l'indicateur sur cette ligne ? Je ne sais pas exactement ce qu'il faut.

Oups, j'ai été distrait ce matin, je n'ai pas copié la gestion des événements du graphique dans le code.

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
    if(id == CHARTEVENT_CHART_CHANGE)
    {
        DoWork(true);
        ChartRedraw();
    }    
}
 
Alexey Volchanskiy:

Alors... j'ai trouvé ma vieille dinde et j'ai découpé ce dont j'avais besoin. Je ne l'écrirai pas pour vous)), mais cela fera l'affaire pour démarrer. J'y ai ajouté des commentaires, les noms des variables sont clairs d'après les noms.

Merci Alexey pour votre aide !

Et où fixer l'étape, et en général sa fonctionnalité, à propos de quoi ?

    //--- определим шаг, если надо работать с масштабом
    int step = 1;

Et ceci :

        2. Заносить стрелки в структуры и класть их в хештаблицу, первый проще

Je ne l'ai jamais fait. Si vous le pouvez, veuillez me donner un exemple de code, afin que je puisse le comprendre, l'appréhender et l'appliquer.

 
Alexey Volchanskiy:

Oups, j'ai été distrait ce matin, je n'ai pas copié la gestion des événements du graphique dans le code.

J'aimerais avoir votre étourderie en plus de vos connaissances)).
C'est assez facile quand on sait. Il suffit de taper sur les touches, pour autant que vous ayez le désir et les moyens de le faire.
Et quand vous ne savez pas et que vous creusez... c'est une douleur dans le cul... Et s'il y a d'autres indices, vous êtes foutu, aucun nerf.
Alors merci pour les conseils !!!!
 
Leo59:
Merci Alexey pour votre aide !

A propos de quoi, vous visez le terrain, et sa fonctionnalité en général ?

Et ceci :

Je ne l'ai jamais fait. Si vous le pouvez, veuillez me donner un exemple de code, afin que je puisse le comprendre, l'appréhender et l'utiliser.

Lorsque nous compressons le graphique horizontalement (touches +/-), il change d'échelle et parfois les objets graphiques peuvent se chevaucher. J'ai cité ce code juste au cas où, comment déterminer l'échelle.

Je ne citerai pas le code avec le hachage - je ne l'ai pas, il m'est venu à l'esprit. Il est préférable de faire la variante 1, c'est plus simple.

En ce qui concerne les connaissances - je conseille à tous ceux qui étudient de lire l'aide à loisir, de faire le tour des sections, où tout se trouve. C'est-à-dire, ne le bachotez pas, j'étais un tel bachot, en vain. Il suffit de savoir, au moins approximativement, qu'il y a telle ou telle... au moins des sections/sous-sections. Ensuite, lorsque des questions se poseront, les engrenages tourneront dans votre tête et une direction de recherche se dégagera. En principe, l'aide n'est pas parfaite, mais c'est bien, il y a beaucoup d'exemples.

La langue elle-même étant simple, elle n'est pas difficile à apprendre. Des difficultés apparaissent avec l'API, où chercher quoi et comment l'appliquer.

 
Bonjour !

À première vue, la tâche semble aussi simple que trois sous. MAIS ! ....
Il y a une ligne de n'importe quel oscillateur dans la fenêtre de l'indicateur, qui oscille par rapport à "0" avec une amplitude différente.
Le problème réel est le suivant :
- En croisant le "0" de bas en haut, dessinez une flèche sur le bord inférieur de la fenêtre de l'indicateur,
- En croisant "0" du haut vers le bas, pour dessiner une flèche près du bord supérieur de la fenêtre de l'indicateur,
- lors de la mise à l'échelle automatique du graphique de l'oscillateur dans la fenêtre de l'indicateur, les flèches devraient automatiquement rester à leurs limites de la fenêtre de l'indicateur.
Par exemple, si vous faites défiler le graphique vers l'avant ou l'arrière dans l'historique, ou si vous modifiez son échelle horizontale, les flèches doivent toujours rester automatiquement aux limites de la fenêtre de l'indicateur.

S'il vous plaît, ne donnez pas de conseils, "aidez-moi financièrement")). Veuillez joindre le code source d'une telle fonction, ou un lien vers celui-ci.

Merci d'avance !
 

Aidez-moi à comprendre !

J'ai besoin de trouver le drawdown maximum pour chaque jour (disons) (l'écriture dans le fichier se fait une fois par jour) - terminal MT4.

Le drawdown maximum est la distance sur le graphique entre le pic et le drawdown actuel des fonds et le drawdown des fonds est la perte actuelle.

J'ai écrit le code suivant

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew==AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Mais elle est correcte sur certains graphiques et incorrecte sur d'autres. En même temps, les graphiques sont visuellement les mêmes.

J'ai dû faire une erreur dans le code ou la logique, mais je n'arrive pas à comprendre de quel type.