Ayúdame a aprender a programar. - página 2

 
Alexey Viktorov:

Gracias por el ejemplo.

Creía que era el único que prefería exponer las cosas de esa manera, en lugar de escribir de forma caprichosa.

hz - traducido al ruso como "me gustaría saber"... no pienses mal...

Es mejor usar clases de la biblioteca estándar para no tener que escribir todos esos largos PositionGet... etc.

 
Dmitry Fedoseev:
Gracias. Digerir.
 
Alexey Viktorov:

Gracias por el ejemplo.

Creía que era el único que prefería exponer las cosas de esa manera en lugar de escribirlas de forma atontada.

¿Cuál es el problema?

No te tomes esto comoun "nazi de los códigos", pero a mí, por ejemplo, me parecen inquietantes estas construcciones:

for(int index=PositionsTotal()-1; index>=0; index--) { /* тело цикла */ }

Es una molestia para la vista. ¿No sería mejor que no fuera"zaz cómo", sino así?

int index = PositionsTotal();

while (index-- > 0) { /* тело цикла */ }

O este tipo de "shithcodling":

for(int i=0;i<PositionsTotal();i++)

¡DondePositionsTotal()es llamado en cada iteración del bucle!

Un codificador normal nunca manipularía el cuerpo del bucle que recorre las posiciones por su índice (que, gracias a Dios, está ausente aquí) llevando a un cambio de su número. Esto es el colmo del analfabetismo y del código con fallos. Tienes que, en el buen sentido, reiniciar todo el bucle si se supone que ocurre algo así.

También a algunas personas les gusta algo así:

double Lot;

// где-то вычисляется значение Lot, финальная проверка и приведение к допустимым границам фееричны:
if(Lot > MaxLot) Lot = MaxLot;
if(Lot < MinLot) Lot = MinLot;

// а то и вовсе:
if(Lot > MaxLot) Lot = MaxLot;
  else
    if(Lot < MinLot) Lot = MinLot;

// а не проще ли сделать так?
Lot = MathMin(MathMax(Lot, MinLot), MaxLot);

Aunque, para un principiante y no preocupado por las horas extra de CPU para la optimización, esas construcciones "si-entonces-todo" de las lecciones escolares de "programación" en BASIC, son más claras.

Y todo esto sereplica de código a código por el principio de copiar y pegar.

Así que ahí tienes...

 
Tio Nisla:

...

O este tipo de "shithcoding":

¡DondePositionsTotal()es llamado por cada iteración del bucle!

...

¿Está seguro? Querías ser inteligente, pero estás en la rutina...

¿Y te has registrado para ello? Así de fácil - desde el primer puesto y perderse...

 
Dmitry Fedoseev:

¿Está seguro? Intentabas ser inteligente, pero te has vuelto un pícaro...

¿Y te registraste para esto a propósito? Así de fácil, desde el primer post, estás en el retrete...

Oh, Dios. "Aprende las matemáticas", Elger y Knut. No te metas en lo personal.

Muy bien, te lo explicaré:

    for  (            int i=0            ;          i<PositionsTotal()            ;    i++     )    { }
    ^^^               ^^^^^^^                       ^^^^^^^^^^^^^^^^^^                 ^^^          ^^^
объявление   |   объявление переменной   | проверка условия выполнения цикла:     | инкремент  | тело цикла
  цикла      | типа "int", инициализация | 'i' < значения, возвращаемого функцией | переменной |
типа "for"   |       значением '0'       | которая вызывается на каждую итерацию  |

¿Está claro, querida?

Si no es así, lea detenidamente https://learnc.info/c/loop.html a partir de [ctrl+f , busque "Cycle for"].

Aquí ni siquiera hay pereza de encontrar el enlace.

Y aprende a escribir un código literario, agradable y conciso. Deberías haber empezado con ensamblador, con microcontroladores donde cada byte cuenta.

P.D.

Aquí incluso me dio pereza mostrarle al experto un simple ejemplo de su bucle "for".

int OnInit()
{
   for(int i=0;i<somefunc();i++) PrintFormat("array[%d]\n", i);
   return(INIT_SUCCEEDED);
}

int somefunc() {
   static int count = 0;
   PrintFormat("Туточки уже %d-й раз!\n", ++count);
   return 3; // это типа количество чего-то там, элементов массива например
}

Y este es el resultado de la ejecución de la muestra:

2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: initialized
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 4-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[2]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 3-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[1]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 2-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[0]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 1-й раз!

Puedes ver que la función no sólo se llama en cada iteración, sino incluso +1 vez al final.

Así que ahí tienes.

Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
  • 1989.04.14
  • Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev
  • learnc.info
Циклы в Си: цикл while с предусловием, цикл do while с постусловием, цикл for со сщётчиком. Бесконечный цикл. Оператор break. Оператор continue. Примеры работы с циклами
 
Tio Nisla:

Eh, cariño. "Aprende las matemáticas", Elger y Knut. No te metas en lo personal.

Muy bien, te lo explicaré:

¿Está claro, querida?

Si no es así, lea detenidamente https://learnc.info/c/loop.html a partir de [ctrl+f , busque "Cycle for"].

Aquí ni siquiera hay pereza de encontrar el enlace.

Y aprende a escribir un código literario, agradable y conciso. Deberías haber empezado con ensamblador, con microcontroladores donde cada byte cuenta.

P.D.

Aquí incluso me dio pereza mostrarle al experto un simple ejemplo de su bucle "for".

Y este es el resultado de la ejecución de la muestra:

Puedes ver que la función no sólo se llama en cada iteración, sino incluso +1 vez al final.

Así que ahí tienes.

¡Aplaudo! Sigue...


 
Dmitry Fedoseev:

¡Aplaudo! Continúa...


¿Por qué has montado semejante lío? Y ponerlo en la red. ¡Tu madre te regañará!
 
Si algún código es estresante, de ojo, hay muchas otras profesiones en el mundo: conserje, cargador, limpiador, sanitario...
 
Dmitry Fedoseev:

¿Está seguro? Intentabas ser inteligente, pero te has vuelto un pícaro...

¿Y te registraste para esto a propósito? Así, desde el primer puesto y en un charco...

Quéconversación tan interesante estáis teniendo) ))

Señores, las personalidades son las personalidades, pero averigüemos la verdad.

Usando el ejemplo, puedo ver quePositionsTotal()es llamado en cada iteración del bucle.

Pero Dimitri, por el contrario, estás diciendo que el compilador lo hace de una manera diferente, no lo entiendo. Explícate.

//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;
CSymbolInfo    m_symbol;
//-------------------------------------------------------------------+
void OnInit()
  {
   m_symbol.Name(Symbol());
   m_symbol.RefreshRates();

   for(int i = 0; i < 10; i++)
     {
      m_trade.Buy(1, _Symbol, m_symbol.Ask() + i * 2 * _Point, 0, 0);
     }

//---закомментировать не нужное
   for(int i = 5; i < PositionsTotal(); i++) // так удаляются только 3 сделки
     {
      m_trade.PositionClose(_Symbol);
     }
//---закомментировать не нужное
   int index = PositionsTotal();
   for(int i = 5; i < index; i++) // так удаляются 5 сделок
     {
      m_trade.PositionClose(_Symbol);
     }

//вывод: PositionsTotal() вызывается на каждой итерации
  }
//+------------------------------------------------------------------+

Si quieres decir que la funciónPositionsTotal() no recalcula las posiciones cada vez, sino que simplemente devuelve el valor de una variable que contiene el número de posiciones abiertas, entonces sí, tienes razón, no tiene sentido declarar una variable más, pero entonces ¿qué tiene que ver el compilador?

Y si esta función recalcula las posiciones abiertas cada vez, entonces resulta que el compilador tiene que entender si el valor de esta función afecta a los cálculos posteriores y en base a ello debe sustituir la función o la variable.

Algo no me cuadra.

 
Aleksandr Slavskii:

Interesante conversación la que están teniendo)))

Quería añadir antes que si la función somefunc() realiza algunas otras manipulaciones además de devolver alguna cantidad o algo, calcula parámetros comerciales, por ejemplo, tal uso provoca artefactos difíciles de atrapar y puede llevar al autor de un código a un estupor: "¿Ht??? ¿Cómo es que 4 veces? ¡¡¡O_o F$#@!!! ¿No se supone que está ahí tres veces? ¿Por qué me miente mi EA?". Eso es lo que yo llamaba "shithcod", que un experto se escandalizaba hasta las raíces del pelo. No lo he sacado a relucir, porque es obvio, pero tú lo has hecho por mí. Pero no has tenido en cuenta que el direccionamiento por un índice calculado dinámicamente sin reinicialización del array es otra cosa. En sys desnudos esto suele llevar a GPF, en pluses con punteros y arrays inteligentes a una excepción y su manejador. En mql no está claro a qué conduce.