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

 

Hallo zusammen!

Ich habe die halbe Nacht damit verbracht, herauszufinden, warum eine einfache Bedingung nicht funktioniert, bitte helfen Sie mir, es herauszufinden:

      macd1 = iMACD (_Symbol,PERIOD_CURRENT,5,34,5,0,1,0);
      macd2 = iMACD (_Symbol,PERIOD_CURRENT,5,34,5,0,1,1);
      highprice1 = High [0];
      highprice2 = High [1];
      lowprice1 = Low [0];
      lowprice2 = Low [1];
              if (macd1 > 0 && macd1 > macd2 && highprice1 > highprice2) 
                 {
                 maxprice1 = highprice1;
                 macdMAXSell = macd1;
                 Print("maxprice1 = highprice1",maxprice1);
                 }
              if (macd1 < 0 && macd1 < macd2 && lowprice1 < lowprice2)
                 {
                 minprice1 = lowprice1;
                 macdMAXBuy = macd1;
                 Print("minprice1 = lowprice1",minprice1);
          	 } 

Ich laufe auf historischen Daten, die Variablen macd1,2, lowprice, highprice sind Werte zugewiesen, aber die Bedingung will nicht laufen, ich brach mir den Kopf kann nicht verstehen, wo zu graben ... (((

 
Nikolay Gaylis:

vielleicht 1 und 1 ?/d.h. wahr und Fehlercode 1

ERR_NO_RESULT1Kein Fehler, aber das Ergebnis ist unbekannt

Totales Durcheinander und kein Verständnis für das, was Sie tun

bool takelimit;   // Здесь переменная равна false

//--- Здесь вот что: сначала выбирается ордер по тикету (MODE_TRADES здесь не нужно от слова "совсем", что говорит о том, что вы не представляете что вы делаете), 
//--- далее переменной takelimit присваивается результат работы функции выбора ордера, 
//--- и если ордер есть с таким тикетом, или был когда-то, то функция вернёт true, и takelimit будет присвоено true, соответственно, будет выведен код последней ошибки,
//--- что вовсе не говорит, что ошибка здесь была при выборе ордера по тикету - вы же переменную, хранящую код последней ошибки, не сбросили при помощи ResetLastError()
//--- И далее вообще не понятно к чему у вас фигурные скобки - они висят в пустоте, а это составной оператор, который должен после условия идти.

if(takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
   Print(string(takelimit)+"   :",GetLastError());//здесь возвращает число 11, получается ошибка код 11, но не нашел расшифровку нигде?
  {
   if(iBarShift(Symbol(),0,OrderOpenTime())==1)
      deletelimit=OrderDelete(ticket);
   if(!deletelimit)
      Comment(GetLastError());
  }
//+------------------------------------------------------------------+
//--- А нужно примерно так (фигурные скобки специально оставил для понимания где какой блок кода):
   ResetLastError();
   if(OrderSelect(ticket,SELECT_BY_TICKET) && OrderCloseTime()==0)
     {
      if(iBarShift(Symbol(),PERIOD_CURRENT,OrderOpenTime())==1)
        {
         if(!OrderDelete(ticket))
            Print("Ошибка удаления ордера #",(string)ticket,": ",GetLastError());
        }
     }
   else
     {
      Print("Ошибка выбора ордера #",(string)ticket,": ",GetLastError());
     }
 
Вадим Мотеюнас:

Print(takelimit,GetLastError()) gibt zwei Werte zurück, da die erste Variable vom Typ bool ist und GetLastError nicht benötigt, und da es ein Komma gibt, gibt GetLastError den letzten Fehler im Code zum Zeitpunkt des Aufrufs von GetLastError?

Ja... es gibt zwei Werte, die drucken.....

Das ist fast genau das, was Sie geschrieben haben.

int ticket;

void Fn()
  {
   ResetLastError();//Сбрасываем код предыдущей ошибки
   if(!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){Print(GetLastError());}//Если не выбран ордер по указанному тикету-принтим код ошибки
   else//иначе(если ордер нашёлся)
     {
      if(iBarShift(Symbol(),0,OrderOpenTime())==1 && !OrderDelete(ticket)){Comment(GetLastError());}//Если выбранный ордер открылся на предыдущем баре и не удалось его удалить(надеюсь Вы работаете с отложенниками)-тогда выводим комент ошибки
     }
  }
 
Nikolay Gaylis:

Ja... es gibt zwei Werte für .....

Das ist fast genau das, was Sie geschrieben haben.

Und du bist es auch...
Und wenn der Auftrag bereits gelöscht ist, was dann?
 
Artyom Trishkin:

Ein völliges Durcheinander und ein Missverständnis dessen, was Sie tun...

Ich mache eigentlich gar nichts, ich bin nur davon ausgegangen, dass der Mann 1 und 1 anstelle von 11 drucken wird))

und das ist alles...

 
Artyom Trishkin:

Ein völliges Durcheinander und Missverständnis dessen, was Sie tun...

Ah...Sie antworten also der falschen Person...ich verstehe)

 
Nikolay Gaylis:

Ich mache eigentlich gar nichts, ich gehe nur davon aus, dass die Person nicht 11, sondern 1 und 1 ausdrucken wird).

Wie diese Zeile hier:

Print(string(takelimit)+"   :",GetLastError());

Soll ich "11" drucken?

Es wird dann "1:1" gedruckt.

Der Fehlercode 1 ist kein Fehler, aber das Ergebnis ist unbekannt.

 
Artyom Trishkin:

Wie diese Zeile hier:

Kann es "11" drucken?

Es wird dann "1:1" gedruckt.

Der Fehlercode 1 ist kein Fehler, aber das Ergebnis ist unbekannt.

Ja, ich habe es bereits geändert!

 
Nikolay Gaylis:

Ah... Sie antworten also der falschen Person... Ich verstehe)

Ja, ich habe der gleichen Person geantwortet, der Sie geantwortet haben. Aber Sie haben ihm auch das Falsche gesagt - lesen Sie, wann MODE_TRADES erforderlich ist und wann nicht. Und wie ein Auftrag auf einem Ticket ausgewählt werden sollte.

 
Artyom Trishkin:

Nun ja, ich habe derselben Person geantwortet, der Sie geantwortet haben. Aber Sie haben ihm auch nicht alles richtig gesagt - lesen Sie, wann MODE_TRADES erforderlich ist und wann nicht. Und wie ein Auftrag auf einem Ticket ausgewählt werden sollte.

MODE_TRADES hat es sich noch nicht angeschaut, nur das Stück, das 11 gedruckt hat...

Grund der Beschwerde: