Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 504

 

Ciao a tutti!

Ho passato metà della notte cercando di capire perché una semplice condizione non funziona, per favore aiutatemi a capirlo:

      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);
          	 } 

Sono in esecuzione su dati storici, le variabili macd1,2, lowprice, highprice sono assegnati valori, ma la condizione non vuole eseguire, mi sono rotto la testa non può capire dove scavare ... (((

 
Nikolay Gaylis:

forse 1 e 1 ?/i.e. vero e codice di errore 1

ERR_NO_RESULT1Nessun errore, ma il risultato è sconosciuto

Un casino totale e nessuna comprensione di ciò che si sta facendo

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()) restituisce due valori perché la 1° variabile è di tipo bool e non ha bisogno di GetLastError, e poiché c'è una virgola, GetLastError restituisce l'ultimo errore nel codice al momento della chiamata di GetLastError?

Sì... ci sono due valori che stampano .....

È quasi esattamente quello che hai scritto.

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:

Sì...ci sono due valori da stampare.....

È quasi esattamente quello che hai scritto.

E anche tu...
E se l'ordine è già stato cancellato, allora cosa?
 
Artyom Trishkin:

Un casino totale e un'incomprensione di quello che stai facendo...

In realtà non sto facendo nulla, ho solo supposto che l'uomo stamperà 1 e 1 invece di 11))

e questo è tutto...

 
Artyom Trishkin:

Un casino totale e un'incomprensione di quello che stai facendo...

Ah... quindi stai rispondendo alla persona sbagliata... capisco)

 
Nikolay Gaylis:

In realtà non sto facendo nulla, ho solo supposto che la persona stamperà non 11, ma 1 e 1).

Come questa linea qui:

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

Devo stampare "11"?

Verrà stampato "1:1" allora.

Il codice di errore 1 non è un errore, ma il risultato è sconosciuto.

 
Artyom Trishkin:

Come questa linea qui:

Può stampare "11"?

Verrà stampato "1:1" allora.

Il codice di errore 1 non è un errore, ma il risultato è sconosciuto.

Sì, l'ho già cambiato!

 
Nikolay Gaylis:

Ah... quindi stai rispondendo alla persona sbagliata... capisco)

Sì, stavo rispondendo alla stessa persona a cui stavi rispondendo tu. Ma gli hai anche detto la cosa sbagliata - leggi quando MODE_TRADES è richiesto e quando non lo è. E come dovrebbe essere selezionato un ordine su un biglietto.

 
Artyom Trishkin:

Beh, sì, stavo rispondendo alla stessa persona a cui stavi rispondendo tu. Ma non gli avete nemmeno detto tutto correttamente - leggete quando MODE_TRADES è richiesto e quando non lo è. E come un ordine dovrebbe essere selezionato su un biglietto.

MODE_TRADES non l'ha ancora guardato, solo il pezzo che 11 ha stampato...