Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 484

 
Freunde, ich habe eher eine Frage zu den Signaleinstellungen.
Das Problem ist folgendes: Wenn die Aufträge des Anbieters abgeschlossen sind, sind die Aufträge des Teilnehmers noch vorhanden. Offenbar wegen der unterschiedlichen Streuung. Wie kann ich dafür sorgen, dass Geschäfte eines Abonnenten sofort geschlossen werden, wenn sie beim Provider geschlossen werden? Welche Einstellung sollte geändert werden?
 
Leo59:
Vielen Dank Alexey!!!! für 4))))

Also habe ich meinen alten Truthahn gefunden und das herausgeschnitten, was ich brauchte. Ich werde ihn nicht für Sie schreiben, aber für den Anfang reicht er. Ich habe dort Kommentare hinzugefügt, die Namen der Variablen sind aus den Namen ersichtlich.

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:
Meine Freunde, ich habe eine Frage zur Signaleinstellung.
Das Problem ist folgendes: Wenn Aufträge eines Anbieters geschlossen werden, bleiben sie trotzdem auf dem des Abonnenten. Offenbar wegen der unterschiedlichen Streuung. Wie kann ich dafür sorgen, dass Geschäfte eines Abonnenten sofort geschlossen werden, wenn sie beim Provider geschlossen werden? Welche Einstellung sollte geändert werden?

Das Geschäft sollte auch fast sofort abgeschlossen werden. Fragen:

  1. Ist das Endgerät des Teilnehmers zu diesem Zeitpunkt eingeschaltet?
  2. Bitte fügen Sie die Protokolldatei des Terminals für den Problemtag bei.
 
Alexey Volchanskiy:

Also habe ich meinen alten Truthahn gefunden und das herausgeschnitten, was ich brauchte. Ich werde ihn nicht für Sie schreiben, aber für den Anfang reicht er. Ich habe dort Kommentare hinzugefügt, die Namen der Variablen sind aus den Namen ersichtlich.

Zusätzlich sollte ich wahrscheinlich Indikator Subwindow Nummer in dieser Zeile setzen? Ich weiß nur nicht genau, was nötig ist.

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

Nachtrag: Vielleicht sollten Sie die Nummer des Unterfensters des Indikators in diese Zeile schreiben? Ich weiß nur nicht genau, was nötig ist.

Oooops, ich war heute Morgen geistesabwesend und habe die Ereignisbehandlung des Diagramms nicht in den Code kopiert

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

Also habe ich meinen alten Truthahn gefunden und das herausgeschnitten, was ich brauchte. Ich werde ihn nicht für Sie schreiben, aber für den Anfang reicht er. Ich habe dort Kommentare hinzugefügt, die Namen der Variablen sind aus den Namen ersichtlich.

Danke Alexey für deine Hilfe!

Und wo die Stufe zu befestigen, und im Allgemeinen seine Funktionalität, über was?

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

Und dies:

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

Das habe ich noch nie getan. Wenn Sie können, geben Sie mir bitte ein Codebeispiel, damit ich es verstehen und anwenden kann.

 
Alexey Volchanskiy:

Oooops, ich war heute Morgen geistesabwesend und habe die Graph-Ereignisbehandlung nicht in den Code kopiert

Ich wünschte, ich hätte Ihre Zerstreutheit zusammen mit Ihrem Wissen))
Es ist einfach, wenn man es weiß. Schlagen Sie einfach in die Tasten, solange Sie die Lust und die Mittel dazu haben.
Und wenn man das nicht weiß und gräbt... das ist eine Qual... Und wenn es noch mehr Hinweise gibt, bist du am Ende, weil du keine Nerven mehr hast.
Vielen Dank also für die Tipps!!!!
 
Leo59:
Vielen Dank, Alexey, für deine Hilfe!

Woran schrauben Sie auf dem Spielfeld und an seiner Funktionalität im Allgemeinen?

Und dies:

Das habe ich noch nie getan. Wenn Sie können, geben Sie mir bitte ein Code-Beispiel, so dass ich es verstehen und anwenden kann.

Wenn wir das Diagramm horizontal komprimieren (+/- Tasten), ändert sich der Maßstab und manchmal können sich die grafischen Objekte überlappen. Ich habe diesen Code nur für den Fall zitiert, wie man die Skala bestimmt.

Ich werde den Code nicht mit Hash zitieren - ich habe ihn nicht, er ist mir nur eingefallen. Es ist besser, Variante 1 zu machen, sie ist einfacher.

Was das Wissen angeht - ich rate jedem, der studiert, die Hilfe in Ruhe zu lesen, einfach in den Abschnitten herumzuspringen, wo alles steht. Das heißt, nicht pauken, ich war so ein Pauker, zu nichts nutze. Sie müssen nur wissen, zumindest ungefähr, dass es solche und solche gibt... mindestens Abschnitte/Unterabschnitte. Wenn dann Fragen auftauchen, werden sich die Zahnräder in Ihrem Kopf drehen und eine Richtung der Suche wird sich ergeben. Im Prinzip ist die Hilfe nicht perfekt, aber sie ist in Ordnung, es gibt viele Beispiele.

Da die Sprache selbst einfach ist, ist es nicht schwer, sie zu lernen. Schwierigkeiten mit API, wo man was sucht und wie man es anwendet

 
Hallo!

Auf den ersten Blick scheint die Aufgabe so einfach zu sein wie drei Cents. ABER! ....
Im Indikatorfenster befindet sich eine Linie eines beliebigen Oszillators, die relativ zu "0" mit unterschiedlicher Amplitude wackelt.
Das eigentliche Problem ist:
- Zeichnen Sie bei "0" einen Pfeil am unteren Rand des Indikatorfensters, der von unten nach oben verläuft,
- Bei "0" kreuzen Sie von oben nach unten, um einen Pfeil am oberen Rand des Anzeigefensters zu zeichnen,
- bei der Selbstskalierung des Oszillatorcharts im Indikatorfenster sollten die Pfeile automatisch an den Grenzen des Indikatorfensters bleiben.
Wenn Sie z.B. das Diagramm in der Historie vor- und zurückblättern oder die horizontale Skala ändern, sollten die Pfeile immer automatisch an den Grenzen des Indikatorfensters bleiben.

Bitte geben Sie keine Tipps, "helfen Sie mir finanziell")). Bitte fügen Sie den Quellcode einer solchen Funktion bei oder verweisen Sie auf ihn.

Vielen Dank im Voraus!
 

Bitte helfen Sie mir zu verstehen!

Ich muss den maximalen Drawdown an jedem Tag (lassen Sie es sein) finden (das Schreiben in die Datei geschieht einmal pro Tag) - MT4 Terminal.

Der maximale Drawdown ist der Abstand zwischen dem Höchststand und dem aktuellen Drawdown der Mittel, und der Drawdown der Mittel ist der aktuelle Verlust.

Ich habe den folgenden Code geschrieben

   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
     }

In einigen Diagrammen ist sie jedoch korrekt, in anderen nicht, und gleichzeitig sind die Diagramme visuell identisch.

Ich muss einen Fehler im Code oder in der Logik gemacht haben, aber ich kann nicht verstehen, welcher Art.