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

 
Kapizdo4ka:

Hallo! Könnten Sie mir bitte sagen, warum ich manchmal einen ifle-Operator habe, der nicht funktioniert?
Hier ist ein Beispiel:

Wobei:
H3 ist der Preiswert des Levels
price ist der aktuelle Preis

Das Ergebnis ist, dass der Preis dieses Level erreicht (manchmal sogar an ihm stoppt), aber der Alarm nicht ausgelöst wird.
Können Sie mir sagen, was der Fehler ist?

Der Fehler besteht darin, dass der Preis selten genau mit dem Wert des Niveaus übereinstimmt. Entweder Preis >= H3 oder einen Fehlerbereich definieren.
 
//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
extern double gLot=0.1;            // размер лота для покупки 
extern double gPoint=0.001;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// -------- переменные --- К ----- 
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {

// Открытие позиции
   if(OrdersTotal()==0)
     {
      Print(" Открытие первой позиции ");
      double _Ask=MarketInfo("GBPUSD",MODE_ASK);
      int ticket=OrderSend("GBPUSD",OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0)
        {
         Print(" ОРДЕР ОТКРЫТ ",ticket);
        }
     }

   double _Bid=MarketInfo("GBPUSD",MODE_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS))
        {
         if(OrderOpenPrice()+gPoint<_Bid)
           {
            OrderClose(OrderTicket(),OrderLots(),_Bid,15);
            
ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

           }
        }
     }
   return(0);
  }

Guten Morgen.

Das Programm sieht folgendermaßen aus.

Beim Kompilieren gibt es einen Fehler:

Ozero.mq4'Ozero.mq4 1 1
Rückgabewert von 'OrderClose' sollte überprüft werden Ozero.mq4 46 13
implizite Umwandlung von 'Zahl' in 'String' Ozero.mq4 49 117
0 Fehler, 2 Warnung(en) 1 3


Die Registerkarte "Ergebnisse" zeigt an, dass Aufträge geöffnet und geschlossen werden.

1 2014.08.25 00:00 kaufen 1 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 close 1 0.10 1.6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31 kaufen 2 0.10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 close 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00 kaufen 3 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 close 3 0.10 1.6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58 kaufen 4 0.10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 close at stop 4 0.10 1.6576 0.0000 0.0000 -0.14 10000.18


8 - Ich habe die Arbeit unterbrochen, indem ich das Prüfgerät geschlossen habe.


Als nächstes sehen wir uns das "Journal" an:

2014.10.31 07:46:44.837 GBPUSD,M15: 4453 Tick-Ereignisse (5608 Balken, 340128 Balkenzustände) innerhalb von 312876 ms verarbeitet (Gesamtzeit 324436 ms)
2014.10.31 07:46:44.837 2014.08.26 13:13 Tester: Auftrag #4 ist abgeschlossen
2014.10.31 07:46:44.798 2014.08.26 13:13 Visueller Prüfer gestoppt
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: ORDER OPEN 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: open #4 buy 0.10 GBPUSD at 1.6590 ok
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: Open #4 buy 0.10 GBPUSD at 1.6590 ok
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Ich glaube nicht, dass er geschlossen wurde. Hier ist es: 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose Fehler 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: unbekanntes Ticket 3 für OrderClose-Funktion
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: close #3 buy 0.10 GBPUSD at 1.6576 at price 1.6586
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: HOLD OPEN #3
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: open #3 buy 0.10 GBPUSD at 1.6576 ok
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: Position #1 eröffnen
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: Was ist los? Hier ist es: 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose Fehler 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: unbekanntes Ticket 2 für OrderClose-Funktion
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: close #2 buy 0.10 GBPUSD at 1.6564 at price 1.6574
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: HOLD OPEN 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: open #2 buy 0.10 GBPUSD at 1.6564 ok
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: Eröffnung der ersten Position
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: Was ist los? Hier ist es: 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose Fehler 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: unbekanntes Ticket 1 für OrderClose-Funktion
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: close #1 buy 0.10 GBPUSD at 1.6550 at price 1.6562
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: ORDER OPEN 1
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: open #1 buy 0.10 GBPUSD at 1.6550 ok
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: open #1 buy 0.10 GBPUSD at 1.6550 ok
2014.10.31 07:41:31.958 Ozero Eingaben: gLot=0.1; gPoint=0.001;

Jetzt bin ich völlig ratlos. Einerseits werden die Aufträge geschlossen, wie Sie im Chart und in den Ergebnissen sehen können, andererseits wird der Code mit Fehlern ausgeführt, wie im Log zu sehen ist: (((((((((((

Ozero.

 
Sie versuchen, denselben Auftrag zweimal zu schließen. Entfernen Sie den oberen Teil.
 
Roger:
Sie versuchen, denselben Auftrag zweimal abzuschließen. Entfernen Sie den oberen Teil.
Vorzugsweise die untere. Der Auftrag muss vorher ausgewählt werden.
 
            
//ResetLastError();
//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

Guten Morgen.

Zwei Zeilen wurden gestrichen. Alles funktioniert. Und alles wird korrekt im Diagramm, in den Ergebnissen und in den Protokollen angezeigt.

Frage: Beim Kompilieren gibt es eine


'Ozero.mq4'Ozero.mq4 1 1
Rückgabewert von 'OrderClose' sollte überprüft werden Ozero.mq4 46 13
0 Fehler, 1 Warnung(en) 1 2



Wovor warnt mich der Compiler? Die 46. Zeile ist OrderClose(OrderTicket(),OrderLots(),_Bid,15);


Ozero.

 
tuner:

Könnt ihr mir sagen, was die Ursache für die heute aufgetretene Störung sein könnte?

Der EA hat die Option, den Handel 15 Minuten vor Börsenschluss am Freitag zu beenden.

Wenn ein neuer Tag erscheint, prüft der EA, ob es Freitag ist, dann beenden wir heute den Handel in StringToTime("23:59")-15*60

Im Strategietester funktioniert diese Funktion korrekt, aber im realen Handel sehe ich eine völlig andere Situation - der Expert Advisor stoppt den Handel mit dem ersten Tick, wenn der Freitag kommt.

Hier sind die Ausdrucke aus dem Journal von Expert Advisor:

Broker #1, Demo:

0 05:59:47.731 Scalper GBPAUDpt,M1: Finish In Friday = 2014.10.23 23:44:00

Makler 2, real:

0 03:00:11.999 Scalper EURUSD,M1: Finish In Freitag = 2014.10.23 23:44:00

Das heißt, wenn der Tagesbalken von heute (Freitag, 24. Oktober) auf dem ersten Tick erscheint, wird der EA

konvertiert die Zeile "23:59" in die Uhrzeit von gestern, anstatt den heutigen Tag zuzuordnen.

Wenn der Expert Advisor jedoch am Freitag mitten am Tag neu gestartet wird, bestimmt er den Zeitpunkt der Fertigstellung korrekt.

Ich habe die Ursache für dieses Problem gefunden: https://forum.mql4.com/33023

Wie erwartet, handelt es sich praktisch um einen Fehler in der Funktion StringToTime. Die Symptome sind alle ähnlich. Diese Funktion konvertiert den String "23:59" in datetime mit dem Datum des lokalen PCs, aber nicht mit dem Datum von MT4. Und im Tester wird, wie wir wissen, das Datum des lokalen PCs emuliert und mit der Terminalzeit gleichgesetzt. Das ist der Grund, warum im Tester alles richtig funktioniert, aber in der Demo/Echtzeit kommt es zu Pannen und Verlusten. Natürlich steht in der Dokumentation nicht, woher das Datum kommt, und der obige Link zeigt, dass dieses Problem vor 4 Jahren gemeldet wurde, aber anscheinend ist es den Methaquotes egal.

 
      RefreshRates();                     // Обновим данные
      _Bid=MarketInfo( "GBPUSD",MODE_BID);

      if (_Bid>=gPoint1)
        {
           for(pos=OrdersTotal();pos>=0;pos--)
             {
                OrderClose(OrderTicket()-1,OrderLots(),_Bid,15);
             }      
       
        }

Eine andere Frage. Verstehe ich das richtig?

1. Die Auftragsnummerierung beginnt bei "0".

2. dieser Code absolut alle Aufträge schließt, unabhängig davon, ob ich sie manuell oder programmatisch öffne? D.h., wir werden nie einen Auftrag finden, den dieser Teil des Programms nicht abschließen kann?


Ozero.

 

Hat schon jemand einen Lauftext auf dem Bildschirm erstellt? Zum Beispiel - Auftrag so und so geöffnet/geschlossen/geändert, etc. Neuigkeiten gibt es so und so... ?

Wenn Sie nichts dagegen haben, zeigen Sie mir bitte einen Teil des Codes.

Danke!

 
Vinin:
Die untere ist besser. Die Reihenfolge muss im Voraus festgelegt werden.

So ist es besser:

//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                         http://bomzh_inc.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Bomzh Inc"
#property link      "http://bomzh_inc.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
input double gLot=0.1;           // Размер лота для покупки 
input double gPoint=0.001;       // Дельта для закрытия 
input string symbol="GBPUSD";    // Рабочая валютная пара
void OnTick() {
   // Открытие позиции
   if(OrdersTotal()==0) {
      int ticket=0;
      double _Ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
      Print(" Открытие первой позиции ");
      ticket=OrderSend(symbol,OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0) Print("ОТКРЫТ ОРДЕР #"+IntegerToString(ticket));
      }
   //--- Закрытие позиций
   double _Bid=SymbolInfoDouble(symbol,SYMBOL_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--) {
      if(OrderSelect(pos,SELECT_BY_POS)) {
         if(OrderSymbol()!=symbol) continue;
         if(OrderType()!=OP_BUY)   continue;
         if(OrderOpenPrice()+gPoint<_Bid) {
            ResetLastError();
            if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) 
               Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+IntegerToString(GetLastError()));
            }
         }
      }
   //--- End OnTick()
}
//+------------------------------------------------------------------+
 
_new-rena:

Hat schon jemand einen Lauftext auf dem Bildschirm erstellt? Zum Beispiel - Auftrag so und so geöffnet/geschlossen/geändert, etc. Neuigkeiten gibt es so und so... ?

Wenn Sie nichts dagegen haben, zeigen Sie mir bitte einen Teil des Codes.

Senx!

Vertikales Scrollen im leeren Anzeigefenster. Hier ist die Funktion:

//+------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint(string mess1, int sz=9, color color1=clrDarkGray, 
            string mess2="", color color2=clrDarkGray, 
            string mess3="", color color3=clrDarkGray, 
            string mess4="", color color4=clrDarkGray, 
            bool draws=true) {
   string   NameGrafText, message, nm;
   int      i, y, k, shift, Win_Num=-1, num=0;
   color    cl;
   Win_Num=WindowFind("Win_Inform");
   if (mess1=="") {
      //Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   if (!draws || Win_Num<0) {
      message=mess1+mess2+mess3+mess4;
      Print(message); 
      return;
      }
   k=ArraySize(Mass_Name_Message)-1;
   if (StringLen(mess1)>0) num++;
   if (StringLen(mess2)>0) num++;
   if (StringLen(mess3)>0) num++;
   if (StringLen(mess4)>0) num++;
// Смещение и перекрашивание старых сообщений   
   for (i=k; i>=0; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
      if (StringLen(NameGrafText)>0) {
         if (ObjectFind(NameGrafText)==Win_Num) {
            if (i+num>k) {                   // Удаляем самую верхнюю строчку
               ObjectDelete(NameGrafText);  
               Mass_Name_Message[i]="";
               }
            else if (i+num<=k) {             // Сдвигаем и перекрашиваем старые сообщения
               Mass_Name_Message[i+num]=Mass_Name_Message[i];
               y=(int)ObjectGet(NameGrafText, OBJPROP_YDISTANCE);          // старая координата Y
               ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // новая координата Y
               ObjectSet  (NameGrafText, OBJPROP_COLOR, clrDimGray);       // новый цвет
               }
            }
         }
      }
// Вывод новых сообщений
   shift=num;
   uint v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v);   // Уникальное имя объекта
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {  // Если всё-таки такой объект есть
         app++;
         NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v)+"_"+IntegerToString(app); // добавим к его имени "хвостик"
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=color1; break;
         case 1: message=mess2; cl=color2; break;
         case 2: message=mess3; cl=color3; break;
         case 3: message=mess4; cl=color4; break;
         default:message=mess1; cl=color1; break;
         }
      ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
      ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR, cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER,    2);                // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE, 150);              // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift);   // координата Y
      WindowRedraw();
      }
}
//+------------------------------------------------------------------+

Als Beispiel für die Verwendung einer einfarbigen Nachricht (Sie können 4 Farben in einer Zeile für verschiedene Wörter verwenden):

if(get.BarOpenLastPos(sy,PERIOD_H4,OP_SELL,mn)!=0) {
   string mess1="На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём";
   iPrint(mess1,9,clrBlue);
   trade.OpenS(sy,lots,mn,0.0,0.0,co);
   }

Im Diagramm sollte ein leerer Indikator mit dem Namen Win_Inform vorhanden sein.