[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 347

 

Hallo, ich habe eine Frage. Wie kann ich in den Code schreiben, dass eine Operation nur auf einem festen Fraktal ausgeführt wird?

Wenn das Fraktal fixiert ist, ist es ....

mein Fraktal

int start()
  {
//----
    double CenBuy = High[isFractalUp()];
     double CenSell = Low[isFractalDn()];

   return(0);
}

int isFractalUp()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_UPPER, i)!= NULL) return(i);
 }
 return(-1);
}
 
int isFractalDn()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_LOWER, i)!= NULL) return(i);
 }
 return(-1);
}
 
hoz:

Ja, es ist kein Problem, auf diese Weise den passenden schwebenden Auftrag zu finden, wenn die Anzahl der schwebenden Aufträge in jeder Richtung gleich ist. Und wenn das anders ist, dann wird das nicht funktionieren, so wie ich es verstehe.

Bestimmen Sie dann die Tatsache der Auslösung eines schwebenden Auftrags und löschen Sie den am weitesten entfernten Gegenauftrag.

All dies wird nur für einen Sachverhalt und einen anhängigen Auftrag zu einem bestimmten Zeitpunkt durchgeführt. Es besteht keine Notwendigkeit, eine Anzahl von ausgelösten und gelöschten Dateien zu erstellen, wie Sie es versuchen. Sie werden die Tatsache der Umwandlung der schwebenden Aufträge auf einen Tick erkennen. Alle anderen Auslöser (falls es welche gibt) werden durch den nächsten Tick bestimmt.

 
Können Sie mir sagen, wer es weiß? Warum ist das Testergebnis an einem Wochentag anders als an einem Wochenende? Alpari
 

berezhnuy wegen der Ausbreitung, die mehrere Male größer ist an den Wochenenden.

 

Liebe Programmierer, hier ist der Code zum Zählen von Kauf- und Verkaufsaufträgen, um nur einen Kauf- oder Verkaufsauftrag zu eröffnen:

int CountBuy()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect(Handel, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_BUY)
count++;
}

}
return(count)
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect(Handel, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_SELL)
count++;
}

}
return(count);
}

Und alles scheint zu funktionieren, aber in meinem EA, gibt es Bedingungen zum Kauf und Verkauf auf einige Candlestick-Muster mit TP und SL. Aber wenn diese Bedingung erfüllt ist und der TP ausgelöst wird, dann bleiben bei der 0-Kerzenformation die Bedingungen für die Ordereröffnung weiterhin erfüllt und neue Orders werden eröffnet, was zu diesem Zeitpunkt nicht geschehen sollte. Könnten Sie uns bitte sagen, welchen Code wir verwenden müssen, um das weitere Öffnen von Aufträgen zu verhindern? Der EA selbst ist beigefügt.

Dateien:
expert.mq4  4 kb
 
artmedia70:

Stellen Sie dann fest, ob es einen ausgelösten schwebenden Auftrag gibt, und löschen Sie den am weitesten entfernten.

All dies geschieht nur aus einem einzigen Grund und zu einem einzigen Zeitpunkt. Es besteht keine Notwendigkeit, eine Anzahl von ausgelösten und gelöschten Dateien zu erstellen, wie Sie es versuchen. Sie werden die Tatsache der Umwandlung der schwebenden Aufträge auf einen Tick erkennen. Alle anderen Auslöser (falls es welche gibt) werden durch den nächsten Tick bestimmt.



Und was, wenn es mehr als das pro Tick ist? Wenn der Abstand zwischen den Aufträgen sehr klein ist, kann mehr als ein Auftrag ausgelöst werden. Natürlich werden wir nicht in der Lage sein, die erforderlichen Maßnahmen rechtzeitig zu ergreifen.
 
hoz:

Was ist, wenn mehr als eine Zecke vorbeikommt? Wenn der Abstand zwischen den Aufträgen sehr klein ist, kann mehr als ein Auftrag ausgelöst werden. Natürlich werden wir nicht in der Lage sein, die erforderlichen Maßnahmen rechtzeitig zu ergreifen.
Eine Schleife über offene Positionen auf der Suche nach ausgelösten Aufträgen auf dem aktuellen Balken und Löschen der ausstehenden Aufträge in der gleichen Schleife
 
artmedia70:
Die Schleife über offene Positionen auf der Suche nach ausgelösten Aufträgen auf dem aktuellen Balken und die Löschung von Positionen in der gleichen Schleife.


Nun, diese Schleife wird wiederholt und alles wird wieder gelöscht. Ich habe auch eine Bedingung in der Variante, die ich im Moment habe:

 while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
   {
      OrderDelete(s_ticket,Black);
      ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления на 1, т.к. строкой выше..
                                               // .. один отложенник уже удалили
   }

D.h. es sollte so lange gelöscht werden, bisordersToDelete Null ist. Aber es zerstört alles. Es scheint elementar zu sein, aber es gibt auch Empörung. In einem wertlosen Tutorial ist von solchen Momenten überhaupt nichts zu sehen. Ich habe es auf beide Arten versucht und auf verschiedene Arten umgeschrieben, aber es hat nicht so funktioniert, wie ich es sollte.

 

Anders umgeschrieben:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = -1,                                 // Тикет искомого ордера
       np = -1;                                       // Номер позиции искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                 // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);               // Если ничего удалять не нужно, выйдем из функции

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          np = i;
      }
   }
   if (OrderSelect(np,SELECT_BY_POS))
   {
      s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      OrderDelete(s_ticket,Black);
   }
   
   return (0);
}

Kim, auch auf der Suche nach dem gleichen Weg. Einen Auftrag mit einem Mindesteröffnungskurs gefunden, seine Position definiert und diesen Auftrag ausgewählt, sein Ticket definiert und ihn gelöscht. Sie wird aber nicht gelöscht.

 
Warum merken Sie sich nicht das Ticket des Auftrags und nicht seine Position? Und was passiert bei einer direkten Überweisung, wenn es keinen solchen Auftrag gibt? löschen Sie den Null-Auftrag?