Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 96

 
Vinin:

Sind Sie sicher, dass Sie alle Klammern haben. Sie fehlen an einigen Stellen. Deshalb ist Ihre Logik fehlerhaft. Und höchstwahrscheinlich ist das Ergebnis nicht das, was Sie erwartet haben.
Vitja, warst du verreist? Ich habe dich lange nicht mehr gesehen...
 
artmedia70:
Vitja, warst du verreist? Ich habe dich schon lange nicht mehr gesehen...


Ich war heute (fast) zu Hause.
 
Vinin:

Heute (fast) zu Hause gewesen
Ich bin fast zu Hause für die zweite Woche :))
 
Vinin:

Sind Sie sicher, dass Sie alle Klammern haben. Sie fehlen an einigen Stellen. Deshalb ist Ihre Logik fehlerhaft. Und höchstwahrscheinlich ist das Ergebnis nicht das, was Sie erwarten.

Wenn Sie den Code des Indikators meinen, ist dort alles in Ordnung, der Indikator funktioniert, gibt Signale in Form von Pfeilen (für Kauf/Verkauf-4 und 5 Indikatorpuffer). Aber wenn ich diese Pfeile vom Indikator im Expert Advisor ablese, erhalte ich Unsinn. Ich habe den Expert Advisor nicht vollständig erwähnt, weil es dort vor allem darum geht, zu verstehen, wie man das Signal liest und die entsprechende Operation ausführt. Im Allgemeinen liegt das Problem beim Lesen des Signals.
 
paladin80:

Um den Code hier korrekt einzufügen, klicken Sie zunächst auf SRC und kopieren Sie den Code dann dorthin.

Wenn ich Sie richtig verstanden habe, müssen wir zu einem bestimmten Zeitpunkt einen OP_BUYSTOP und einen OP_SELLSTOP öffnen? Ist es akzeptabel, dass zu diesem Zeitpunkt noch andere Aufträge offen sind? Es gibt z. B. noch nicht erledigte Aufträge, aber bevor ein neuer Auftrag eröffnet wird, sollen die alten Aufträge gelöscht werden?



if (hour1 == TimeHour(TimeCurrent()) && minute1 == TimeMinute(TimeCurrent()))// если время подошло то
{
min=Low[iLowest(Symbol(),0,MODE_LOW,6,1)]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest(Symbol(),0,MODE_HIGH,6,1)]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min;// общий объем локалки последних 6 свечей М5

if ((volum<=n)==true)// если объем свечей меньше или равно n пунктов 
{ 
OrderSend ( Symbol (), OP_BUYSTOP, параметры);// открываем отложенный ордер байстоп
OrderSend ( Symbol (), OP_SELLSTOP, параметры);// открываем отложенный ордер селлстоп
}

if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY)&& OrderTakeProfit()==true) ///если первый открывшийся отложенный ордер закрыт с профитом
{
OrderDelete(1);// удаляем второй открытый отложенный ордер
}

}
bool closeorder;//определим  закрытие ордеров
closeorder=true;

if (closeorder==true)//
{
int hour2 = TimeHour(StrToTime(time2));// вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour(TimeCurrent()) && minute2 == TimeMinute(TimeCurrent()))// если время 
{
for(int i=OrdersTotal()-1; i>=0; i--)// определяем количество открытых позиций, и отложенных ордеров и закрываем все возможные позиции, и отложенные ордера
 if (OrderSelect(1,SELECT_BY_POS,MODE_TRADES))break; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);// Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);//Закрытие ордера селл если такой есть
{
for(int D=OrdersTotal()-1; D>=0; D--)
if (OrderSelect(D,SELECT_BY_TICKET,MODE_TRADES)==true)
if (OrderType()==OP_BUYSTOP ) OrderDelete(D); //удаляем отложенный байстоп
if (OrderType()==OP_SELLSTOP) OrderDelete(D);// удаляем отложенный селлстоп

Ich habe den generischen Code bereits eingefügt, um ihn zu verdeutlichen... Am Ende des Tages wollte ich alle möglichen Positionen und Aufträge schließen...

und zum Zeitpunkt der Eröffnung von zwei schwebenden Aufträgen (am Morgen) gibt es keine offenen Aufträge oder offenen Positionen davor, da sie alle zu einer bestimmten Zeit am Abend geschlossen werden müssen. Ich frage mich, ob mein vollständiger Auftragsabschluss wenigstens richtig beschrieben ist =)))



 
artmedia70:

Ich kenne die Logik Ihrer Funktion wirklich nicht. Ob es Objekte löschen oder bauen soll, weiß ich nicht. Sagen Sie mir, was es tun soll, und wir werden sehen, wo die Logik falsch ist. Wenn die Funktion jedoch versucht, ein grafisches Objekt zu erstellen, aber fehlschlägt, bedeutet dies, dass es bereits existiert. Wie geht es nun nach der Logik Ihres Programms weiter? Sie können ein neues Objekt mit einem anderen Namen erstellen (z. B. fügen Sie dem Objektnamen die aktuelle Uhrzeit hinzu (TimeToStr(TimeCurrent()))) oder, wenn Sie bereits ein Objekt haben, aber seine Eigenschaften ändern müssen, erstellen Sie es nicht erneut, sondern ändern Sie einfach seine Eigenschaften. Dann wird der Fehler nicht mehr auftreten.

Das ist ganz einfach. Die Hauptsache ist, dass Sie wissen, was Sie wollen... :)



Eigentlich ist die Funktion nur ein visueller Ersatz für den Ausdruck, sie zeigt einfach alles auf dem Bildschirm an. Es ist noch nicht sehr gut geschrieben, aber es funktioniert. :) Ich werde es schaffen und umschreiben. Und dann kann man über die Frage nachdenken, die war.

Übrigens, wenn Sie keine neuen Objekte erstellen, sondern die Eigenschaften bestehender Objekte ändern, dann wiederum... Das wird Kopfschmerzen bereiten. Die Idee ist, die letzten N Untiefen auf dem Bildschirm anzuzeigen. Wenn wir immer das äußerste Objekt überschreiben, könnten wir am Ende nur ein Objekt haben, das einen bestimmten Fehler hat. Ich könnte noch weiter gehen und in einer Schleife so viele Objekte auswählen, wie ich benötige, und nur diese umschreiben, aber das ist wahrscheinlich den Aufwand nicht wert, da diese Funktion nur zum Testen ist und ich mich nicht wirklich damit langweile, da ich bereits zu viele Dinge zu tun habe. Eines Tages werde ich den Code dieser Funktion ausprobieren und ihn mir zu Gemüte führen, und dann kann ich darüber nachdenken!

 

Es hat sich eine Frage ergeben. Ich schreibe das folgende Experiment. Ich habe eine Reihe von Aufträgen, die natürlich nacheinander auf der Grundlage bestimmter Signale eröffnet werden. Wenn der letzte Auftrag geschlossen wird, sollten alle anderen Markt- und schwebenden Aufträge überhaupt geschlossen werden...

Natürlich kann alles über Arrays geschrieben werden, aber ich habe einen einfachen Weg gewählt. Jetzt geht's los:

for (int li_ord=OrdersTotal()-1; li_ord>=0; li_ord--)
   {
      if (!OrderSelect(li_ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();

      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

Zustand:

 if (GetLastOrderState() != 0)

wir prüfen, ob der letzte offene Auftrag geschlossen ist! Dann beginnen wir, die schwebenden Aufträge zu löschen und die Marktaufträge zu schließen...


Hier ist die Funktion selbst, so dass es keinen Zweifel gibt, dass etwas mit ihr nicht stimmt (Kritik und Kommentare sind willkommen, und sogar mehr als willkommen :)) ):

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
double GetLastOrderState()
{
   double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
          lastOrderOpenTime = -1;                     // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   
   return (lastOrderCloseTime);
}
 
vovak_85:

Wenn Sie über den Indikator-Code sprechen - alles ist in Ordnung dort mit den Klammern, der Indikator funktioniert, gibt Signale in Form von Pfeilen (für Kauf/Verkauf - 4 und 5 Indikator-Puffer). Aber wenn ich diese Pfeile vom Indikator im Expert Advisor ablese, erhalte ich Unsinn. Ich habe den Expert Advisor nicht vollständig erwähnt, weil es dort vor allem darum geht, zu verstehen, wie man das Signal liest und die entsprechende Operation ausführt. Im Allgemeinen liegt das Problem beim Lesen des Signals.
Das gehört Ihnen:
double L_B=iCustom(0,0,"Makedonskii",MM,MP,0,4);

double L_S=iCustom(0,0,"Makedonskii",MM,MP,0,5);

So sollte es sein:
double L_B=iCustom(NULL,0,"Makedonskii",MM,MP,4,0);

double L_S=iCustom(NULL,0,"Makedonskii",MM,MP,5,0);
Etwa so.
 
hoz:

Eigentlich ist die Funktion nur ein visueller Ersatz für den Ausdruck, aber sie zeigt alles auf dem Bildschirm an. Es ist noch nicht besonders gut geschrieben, aber es funktioniert... :) Ich werde es schaffen und umschreiben. Und dann kann man über die Frage nachdenken, die war.

Übrigens, wenn wir keine neuen Objekte bauen, sondern die Eigenschaften bestehender Objekte ändern, dann wiederum... Das würde uns Kopfschmerzen bereiten. Die Idee ist, die letzten N-Gelenke auf dem Bildschirm anzuzeigen. Wenn wir immer das äußerste Objekt überschreiben, könnten wir am Ende nur ein Objekt haben, das einen bestimmten Fehler hat. Ich könnte noch weiter gehen und in einer Schleife so viele Objekte auswählen, wie ich benötige, und nur diese umschreiben, aber das ist wahrscheinlich den Aufwand nicht wert, da diese Funktion nur zum Testen ist und ich mich nicht wirklich damit langweile, da ich bereits zu viele Dinge zu tun habe. Eines Tages werde ich den Code dieser Funktion ausprobieren und ihn mir zu Gemüte führen, und dann kann ich darüber nachdenken!

Ich habe einmal eine Funktion entwickelt, die Meldungen in einem leeren Anzeigefenster anzeigt. Sie können die Farben der angezeigten Linien anpassen. Sie ist bereits fehlerfrei. Wenn Sie sie brauchen, kann ich sie weitergeben.
 
r772ra:
Das gehört Ihnen: So sollte es sein:
Etwa so.

danke für die Korrektur, aber der Algorithmus hat nicht richtig funktioniert...