Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 504

 

Hola a todos.

Me he pasado media noche intentando averiguar por qué una simple condición no funciona, por favor, ayudadme a resolverlo:

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

Estoy ejecutando sobre datos históricos, las variables macd1,2, lowprice, highprice tienen valores asignados, pero la condición no quiere ejecutarse, me rompo la cabeza no entiendo donde escarbar... (((

 
Nikolay Gaylis:

tal vez 1 y 1, es decir, verdadero y código de error 1

ERR_NO_RESULTADO1No hay error, pero el resultado es desconocido

Lío total y no se entiende lo que se hace

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()) devuelve dos valores porque la 1ª variable es de tipo bool y no necesita GetLastError, y como hay una coma, GetLastError devuelve el último error del código en el momento de llamar a GetLastError?

Sí... hay dos valores que imprimen.....

Eso es casi exactamente lo que has escrito.

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í... hay dos valores para imprimir.....

Eso es casi exactamente lo que has escrito.

Y tú también...
Y si el pedido ya está borrado, ¿entonces qué?
 
Artyom Trishkin:

Un completo lío y un malentendido de lo que estás haciendo...

En realidad no estoy haciendo nada, sólo asumí que el hombre imprimirá 1 y 1 en lugar de 11))

y eso es todo...

 
Artyom Trishkin:

Un completo desorden y malentendido de lo que estás haciendo...

Ah... así que estás respondiendo a la persona equivocada... ya veo)

 
Nikolay Gaylis:

En realidad no estoy haciendo nada, sólo asumí que la persona no imprimirá 11, sino 1 y 1).

Como esta línea de aquí:

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

¿Debo imprimir "11"?

Entonces imprimirá "1:1".

El código de error 1 no es un error, pero el resultado es desconocido.

 
Artyom Trishkin:

Como esta línea de aquí:

¿Puede imprimir "11"?

Entonces imprimirá "1:1".

El código de error 1 no es un error, pero el resultado es desconocido.

Sí, ya lo he cambiado.

 
Nikolay Gaylis:

Ah... así que estás respondiendo a la persona equivocada... ya veo)

Sí, estaba respondiendo a la misma persona a la que tú respondías. Pero también le has dicho lo contrario: lee cuándo es necesario el MODE_TRADES y cuándo no. Y cómo debe seleccionarse un pedido en un billete.

 
Artyom Trishkin:

Pues sí, estaba respondiendo a la misma persona que tú. Pero tampoco le has dicho todo correctamente - lee cuando se requiere MODE_TRADES y cuando no. Y cómo debe seleccionarse un pedido en un billete.

MODE_TRADES aún no lo ha mirado, sólo el trozo que imprimió el 11...

Razón de la queja: