Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 572

 
PolarSeaman:

Tut mir leid, ich verstehe nicht, warum Sie das nicht können.

Sie können, aber es wird nicht gerade ein Timer sein

if (IsTesting()) OnTimer();
 
PolarSeaman:

Da haben Sie es... Was ist, wenn die Zecke nicht gekommen ist? Sie müssen ohne Zecke "anfangen".

der erste Tick ist für die Synchronisation, und wenn der Starttick nicht kommt, ist der Markt geschlossen, da gibt es nichts zu tun

 

Guten Abend!

Wieder muss ich um Hilfe bitten:

In einer bestimmten Zeitspanne muss ein Auftrag eröffnet werden, wenn in den letzten 30 Minuten bereits ein Auftrag mit dieser Magie eröffnet wurde, muss kein Auftrag eröffnet werden. So zu schreiben:

if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_MINUTES) <= TimeToStr(D'00:30',TIME_MINUTES))
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

Wenn Sie nur den ersten Teil belassen, besteht das Problem darin, dass, wenn eine Stop/Take-Position in dieser halben Stunde geschlossen wird, eine andere eröffnet wird. Also habe ich den zweiten Teil hinzugefügt, um in die Bestellhistorie zu gelangen, und wenn es in den letzten 30 Minuten bereits eine Bestellung mit dieser Zeitschrift gab, dann öffne sie nicht. Aber irgendetwas stimmt mit dem zweiten Teil nicht - er öffnet sich immer noch.

Bitte um Rat!

 

müssen Sie in Sekunden zählen.

if ( TimeCurrent()-OrderOpenTime() <= 30*60 )
 
Taras Slobodyanik:

Sie müssen in Sekunden zählen.

Leider hat es nicht geklappt.

Ich habe es noch einmal versucht, auch hier kein Ergebnis:

  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_SECONDS) <= TimeToStr(30*60,TIME_SECONDS))
 
YanSay:

Leider hat es nicht geklappt.

Ich habe es noch einmal versucht, aber es hat auch nicht funktioniert:

Warum vergleichen Sie alle Zeilen? Taras sagte richtig - in Sekunden zählen. Seine Version hat nicht funktioniert, weil Sie immer noch nicht an den Kontoverlauf gelangt sind:

//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)

Dies ist ein Zyklus für Arbeitsaufträge. Wenn wir uns den Verlauf ansehen, sieht die Schleife folgendermaßen aus:

//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)

Dann sollten wir in der Schleife den Zeitpunkt des Auftragsschlusses anstelle des Zeitpunkts der Auftragseröffnung verwenden.

 
Ihor Herasko:

Warum vergleichen Sie alle Zeilen? Taras hatte Recht, als er sagte, man solle in Sekunden zählen. Seine Version passte nicht, weil man nie zum Kontoverlauf kam:

Dies ist ein Zyklus von Arbeitsaufträgen. Wenn wir uns den Verlauf ansehen, sieht die Schleife folgendermaßen aus:

In der Schleife sollten wir dann die Schlusszeit des Auftrags nehmen und nicht seine Eröffnungszeit.


if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

Wenn ich richtig verstanden habe, meinten Sie TimeToStr, d.h. Sie haben es in Text übersetzt?

Ich habe es korrigiert, aber trotzdem:

Tester

Entschuldigung, wenn ich völlig dumm bin.

 
YanSay:

Wenn ich richtig verstehe, meinen Sie TimeToStr - also in Text übersetzt?

Korrigiert, aber trotzdem:

Es tut mir leid, wenn ich völlig dumm bin.

Sprechen Sie Ihren Zustand laut aus und Sie werden sehen, was los ist).

if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
 

Wenn einem der vorherigen Indikatorpufferwerte ein leerer Wert zugewiesen wird, wird er dann aus dem Diagramm gelöscht?

oder wird ein leerer Wert im Puffer angezeigt und die Zeichnung bleibt auf dem Diagramm?

 
YanSay:

Wenn ich richtig verstehe, meinen Sie TimeToStr - also in Text übersetzt?

Ja. Es macht keinen Sinn, die Zeit in eine Zeichenkette umzuwandeln, denn die Zeit ist eine Zahl von Sekunden. Diese Zahl ist viel einfacher und schneller zu verarbeiten als Zeichenketten.

Korrigiert, aber trotzdem:

Tut mir leid, wenn ich völlig dumm bin.

Sie haben eine Sache korrigiert und eine andere verdorben.)

Im zweiten Teil anstelle von:

if (!OrderSelect(i, SELECT_BY_POS))
     continue;

bringen Sie es zurück:

if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     continue;

In Ihrem letzten Versuch hatten Sie diese Zeile richtig.

Grund der Beschwerde: