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

 
hoz:

Wenn es 7.43 Uhr ist und ich noch nicht im Bett bin... Also wird es wohl Gral geschrieben!

Nein, kein Grund, so zu fluchen :)) Yusuf gab mir den Gral. Ich sitze in meinen Koffern und warte auf Manna vom Himmel, ich fahre auf die Malediven :))

 
artmedia70:
Zeigen Sie mir, was Sie getan haben... Keine Telepathen hier - die sind im Urlaub.

extern string time1 = "n";// 
extern string time2="m";
extern double lot=0.2;// объявили лот
extern int slippage=2;// объявили макс отклонение от цены





int start()
{
double max;// максимальная цена 6-ти свечей
double min;// минимальная цена 6-ти свечей
int hour1 = TimeHour(StrToTime(time1)); // время часы
int minute1 = TimeMinute(StrToTime(time1));// время минуты


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
 int ticket1=-1;
 int ticket2=-1;
if ((volum<=0.0018)==true)// если объем свечей меньше или равно z пунктов 

if (ticket1<0)
{ 
OrderSend ( Symbol (), OP_BUYSTOP, lot,max+Point,3,min-Point,max+0.0022, NULL,0,time2, Red);
Alert(GetLastError());
}
if(ticket2<0)
{
OrderSend( Symbol (), OP_SELLSTOP, lot,min-Point,3,max+Point,min-0.0022, NULL,0,time2, Yellow);
Alert(GetLastError());
}


return;


if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY)) ///если первый открытый ордер закрылся с профитом 
if(OrderProfit()>0)
{
OrderDelete(OrderTicket());// удаляем второй отложенный
}

}



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);//Закрытие ордера селл если такой есть
if (OrderType()==OP_BUYSTOP)
{ 
OrderDelete(OrderTicket()); //удаляем отложенный байстоп
}                    
if(OrderType()==OP_SELLSTOP)
{ 
OrderDelete(OrderTicket()); //удаляем отложенный sellstop
}                    

Ich habe den allgemeinen Code des Expert Advisors hochgeladen, um deutlicher zu machen, was er tun soll... Ich weiß, dass es ein Chaos ist, aber ich habe noch nichts anderes gelernt =)))
Ich werde Ihnen noch einmal sagen, wo es dumm ist
einen schwebenden Auftrag öffnen: öffnet entweder einen schwebenden Auftrag ohne den entgegengesetzten oder eine ganze Reihe von schwebenden Aufträgen in einer Richtung.
Es löscht Aufträge: manchmal abends zu einer genau festgelegten Zeit, manchmal an einem Tag, oder es schließt gar nicht ...

Nun, die Bedingung ist:
Wenn die erste offene Pending-Order mit Gewinn schließt, wird die zweite sofort gelöscht - ich bezweifle, dass ich es richtig geschrieben habe, aber ich kann es nicht in der Praxis überprüfen, da ich nicht zwei entgegengesetzte Positionen eröffnen möchte=(((((
 
artmedia70:
Bei der Suche nach dem letzten abgeschlossenen Auftrag sollten wir zuerst den zuletzt abgeschlossenen Auftrag finden, aber die Prüfung, ob er zum Zeitpunkt "Take" abgeschlossen wurde, sollte aus der Schleife herausgenommen werden, da sonst für jeden abgeschlossenen Auftrag geprüft wird, ob er zum Zeitpunkt "Take" abgeschlossen wurde, und wenn dies der Fall ist, wird der Zeitpunkt des ersten zum Zeitpunkt "Take" abgeschlossenen Auftrags in der Schleife gespeichert und nicht der letzte.


Nun, das ist Code-Optimierung. Das Ergebnis wird sich aus meiner Sicht nicht ändern. Es dauert nur länger, sie zu berechnen. Ich habe den Code korrigiert, aber es ist immer noch dasselbe.

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTMarket = -1,          // Время открытия последнего открытого ордера рыночного
            lastOOTHist = -1;            // Время открытия последнего открытого ордера из истории
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
          lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
      Comment("Время закрытия последнего ордера в истории lastOrderCloseTime = ", lastOrderCloseTime);
   }

   if (MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return(0);
      Comment("OrderTakeProfit() - OrderOpenPrice() < i_tp * pt = ", MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt);
   lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
      Comment("Время закрытия последнего ордера в истории lastOOTHist = ", lastOOTHist);
   
      Comment("Время открытия последнего открытого ордера = ", lastOOTHist);
  
   for (int h=OrdersTotal()-1; i>=0; i--)
   {   
      if (!OrderSelect(h, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      {
         if (lastOOTMarket < OrderOpenTime())
             lastOOTMarket = OrderOpenTime();
  
         if (lastOOTMarket < lastOOTHist)      // Если время открытия последнего открытого ордера (рыночного) ниже последнего открытого ордера из истории..
             lastOrderCloseTime = OrderCloseTime(); // Значит это искомый ордер
      }
   }

   Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}

Trotzdem stimmt etwas nicht mit ihr.

 
ex1m:

Ich habe versucht, Ihnen den Code eines EA zu zeigen, ich weiß, es ist ein Chaos, aber ich habe nie gelernt, wie man es auf andere Weise zu tun).
Ich werde Ihnen noch einmal sagen, wo es blöd ist
Pending Orders zu eröffnen: Es wird entweder eine Pending Order ohne die Gegenseite oder eine ganze Reihe von Pending Orders in eine Richtung eröffnet.
Löschung von Aufträgen: löscht sie jedes Mal, manchmal abends zu einer genau festgelegten Zeit, manchmal an einem Tag, oder schließt sie überhaupt nicht...

Nun, die Bedingung:
Wenn die erste offene Pending Order mit einem Gewinn schließt, wird die zweite sofort gelöscht - ich bezweifle auch, dass ich es richtig geschrieben habe, aber ich kann nicht in der Arbeit überprüfen, weil ich nicht zwei entgegengesetzte Positionen öffnen möchte=(((((



Um eine Frage mit einer Frage zu beantworten. Was zum Teufel ist das?

if ((volum<=0.0018)==true)// если объем свечей меньше или равно z пунктов 

Entschlüsseln Sie es für mich, ich verstehe es nicht :)

Die Prüfung zur Eröffnung einer Position sollte nach dem Versuch, eine Position zu eröffnen, erfolgen. D.h.

if (ticket1<0)

Sie platzieren ihn, nachdem Sie eine Bestellung abgeschickt haben.

Der Preis muss höher oder niedriger als der Asc- oder Bid-Preis sein, um die Position zu eröffnen. So verhält es sich auch mit dem Buy:

 if (OOP > Ask)
 
hoz:


Nun, das ist Code-Optimierung. Das Ergebnis wird sich aus meiner Sicht nicht ändern. Es dauert nur länger, sie zu berechnen. Ich habe den Code korrigiert, aber es ist immer noch dasselbe.

Es ist immer noch etwas faul.

Nein, es geht nicht um Code-Optimierung. Es sucht nur nach genau dem letzten. Wenn wir die Suche nach allen geschlossenen Aufträgen abgeschlossen und den letzten geschlossenen Auftrag gefunden haben, sollten wir erst dann prüfen, ob er durch den Take geschlossen wurde, und wenn er durch den Take geschlossen wurde, ist es nur dann sinnvoll, die Suche nach dem Rest fortzusetzen.

Was erhalten wir, wenn wir innerhalb der Schleife nach einer geschlossenen Schleife suchen? Wir erhalten einen Logikfehler:
Angenommen, wir haben einen Auftrag ausgewählt, der vor einem Jahr abgeschlossen wurde. Seine Zeit wird in jedem Fall größer als -1 sein, so dass wir sie überprüfen, um sie bei take zu schließen (sie wird innerhalb der Schleife überprüft). Ja, es wurde bei der Übernahme geschlossen... Was macht Ihre Funktion als nächstes? Richtig - es funktioniert weiterhin mit diesem Auftrag, der vor einem Jahr an der Marke abgeschlossen wurde. Lassen Sie mich sehen, was sonst noch falsch ist. Bin gerade nach Hause gekommen...

 

Es wurde geschrieben: 2. Wenn die letzte offene Position beim Take geschlossen wird, dann schließen Sie das Ganze!

Es geht also folgendermaßen:

//-----------------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos (string sy, int mn, int delta) {
   datetime t=0;
   int   i, k, j=-1;
   
// Сначала определим, что последняя закрытая позиция была закрыта по тейку (в пределах дельты)
   k=OrdersHistoryTotal()-1;
   for(i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()>1)            continue;            // Сначала забыл вписать, подправил
         if (t<OrderCloseTime()) {t=OrderCloseTime(); j=i;}
         }
      }  
   // Нашли последнюю. Проверим её закрытие по тейку
   if (OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) {                      
      if (OrderProfit()+OrderSwap()+OrderCommission()<=0)   return(false);          // Закрыта с убытком или в ноль
      if (MathAbs(OrderTakeProfit()-OrderClosePrice())>delta*Point) return(false);  // закрыта в профите, но не в пределах дельты
      else t=OrderOpenTime();    // Если последняя закрытая была закрыта по тейку (в пределах дельты), запомним время её открытия
      }
   else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");return(false);}
// Здесь мы имеем последнюю закрытую позицию в профите и закрытую по тейку (в пределах дельты), ищем дальше
   k=OrdersTotal()-1;
   for(i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()>1)            continue;
         if (t<OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
         }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
      }
   return(true);  // Найденная закрытая по тейку позиция была открыта позже всех, возвращаем её время открытия
}
//-----------------------------------------------------------------------------------------------+

Wir übergeben der Funktion das zu prüfende Symbol, die magische Zahl und das Delta (Abstand in Pips == Differenz zwischen Take- und Close-Kurs der Order), wie folgt:

   if (isCloseByTakeLastOpenPos (Symbol(), Magic, 5)) { // Если последняя открытая была закрыта по тейку ...
      // ... тут обрабатываем эту ситуёвину
      }
   else {   // Иначе ...
      // тут обрабатываем, если последняя закрытая была открыта не последней или ...
      // ... последняя закрытая была закрыта с убытком или в профите, но за пределами дельты
      }

Ich habe diese Funktion nicht überprüft, ich habe sie eigenhändig geschrieben. Ich überlasse es also Ihnen , nach Fehlern zu suchen.

Sie können es int machen und Rückgabecodes verwenden. Zum Beispiel, wenn die gesuchte Position nicht existiert oder existiert, aber mit einem Verlust geschlossen wurde, wird -1 zurückgegeben;
wenn sie existiert und mit einem Gewinn geschlossen wurde, aber nicht innerhalb des Deltas, wird 0 zurückgegeben;
wenn sie existiert und mit einem Gewinn geschlossen wurde und bei Take (innerhalb des Deltas), wird 1 zurückgegeben...

Der Spielraum für Phantasie ist enorm...

 
artmedia70:

Wenn wir andererseits prüfen, ob die Einnahme abgeschlossen ist, was erhalten wir dann? Wir erhalten einen Logikfehler:

Angenommen, wir haben einen Auftrag ausgewählt, der vor einem Jahr abgeschlossen wurde. Seine Zeit wird auf jeden Fall größer als -1 sein, also überprüfen wir sie, um sie bei der Aufnahme zu schließen (diese Überprüfung innerhalb der Schleife ist im Code enthalten). Ja, es wurde bei der Übernahme geschlossen...


Wenn wir also eine Schleife über alle Aufträge machen, wird die Schleife trotzdem durch alle Aufträge laufen. Der Zeitpunkt des Abschlusses jeder Bestellung wird mit der zuvor ausgewählten Bestellung verglichen. Aber genau hier haben wir ein Leistungsproblem. TakeProfit wird in der Schleife ständig überprüft, bei jeder geschlossenen Position und nicht nur bei der letzten. Ist es nicht so!?
 
PapaYozh:

Richtig.

Aber es gibt Open[], mit einem Eröffnungspreis.


Verstanden, danke :)
 
hoz:

Wenn Sie also alle Aufträge durchlaufen, wird der Zyklus auf jeden Fall alle Aufträge durchlaufen. Der Zeitpunkt des Abschlusses jeder Bestellung wird mit der zuvor ausgewählten Bestellung verglichen. Aber genau hier haben wir ein Leistungsproblem. TakeProfit wird in der Schleife ständig überprüft, bei jeder geschlossenen Position und nicht nur bei der letzten. Ist es nicht so?
Ich habe bereits ein Beispiel für diese Funktion geschrieben.
 
hoz:

Wenn wir also eine Schleife über alle Aufträge machen, wird die Schleife sowieso über alle Aufträge laufen. Die Schlusszeit jeder Bestellung wird mit der zuvor ausgewählten Bestellung verglichen. Aber hier haben wir ein Leistungsproblem. TakeProfit wird in der Schleife ständig überprüft, bei jeder geschlossenen Position und nicht nur bei der letzten. Ist es nicht so!?

Das ist eine Störung:

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют.. 
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
          lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
      
      if (MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return(0); // ЗДЕСЬ ВЫХОДИМ ПРИ ПЕРВОМ ВСТРЕЧНОМ
      
      lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
   }
Grund der Beschwerde: