Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 403

 
Link_x:

Y si vas a desmontar la función, no deberías haber cortado la cabecera de la función, ahí hay información importante.

Devuelve el tipo de la última posición abierta o -1 - esto significa que si no hay posiciones cerradas, entonces cuando se llame a la función, su valor será igual a -1

sy - nombre del instrumento (par de divisas)

mn - número mágico. Si ponemos -1, la función devolverá el tipo del último pedido cerrado sin importar el número mágico

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тип последней открытой позиции или -1               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
 
Link_x:
Respuesta punto por punto, lo siento.
1 - ¿Genio programador?
2 - para ser justos, nada es superfluo excepto las heces y otros productos de descomposición (opinión franca, lista para empezar a debatir, pero en otro hilo :) ).
3 - Todo tiene sentido ahora. :)
4 - tan cierto. Lo sé. Me equivoqué un poco y escribí con la función "OrderSend".

Gracias por contribuir a la plantilla "Function Bricks Parsing". :)

1. prescindamos del sarcasmo, ¿quieres? Hizo que su aprendizaje fuera cómodo y fácil. ¿Qué tiene que ver la genialidad con esto?
2. Argumentativo.
3. No entiendes nada, a juzgar por tus comentarios en el código.
4. Eso sucede.

int GetTypeLastClosePos(string sy="", int mn=-1) {    
   datetime t;                                        // Переменная хранит время закрытия
   int      i, k=OrdersHistoryTotal(), r=-1;          // Объявление переменных i - индекс k - количество ордеров в истории r - будет хранить тип ордера
   if (sy=="0") sy=Symbol();                          // Если в функцию в качестве значения символа передан NULL, то будет использоваться текущий символ графика
   for (i=0; i<k; i++) {                              // Цикл по истории от нуля до OrdersHistoryTotal()
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если ордер с индексом i выбран в истории
// ---------------------- определение нужного нам ордера ордера ---------------------               
         if ((OrderSymbol()==sy || sy=="") &&         // если переданный символ совпадает с символом ордера или передано значение по-умолчанию
             (mn<0 || OrderMagicNumber()==mn)) {      // если передано значение по-умолчанию или магик ордера равен переданному в функцию значению
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) { // если это или Buy или Sell
// --------------------- определение последнего закрытого ордера --------------------               
               if (t<OrderCloseTime()) {                       // если значение, записанное в t меньше времени закрытия ордера
                  t=OrderCloseTime();                          // запоминаем значение времени закрытия выбранного ордера для следующего сравнения
                  r=OrderType();                               // запоминаем тип ордера
                  }                                            // Конец блока определения времени закрытия.
               }                                               // Конец блока обработки найденного нужного ордера по типу (одного из возможных)
            }                                                  // Конец блока проверки по символу и магику
         }                                                     // Конец блока обработки выбранного ордера
      }                                                        // Идём проверять следующий ордер (если i всё ещё меньше k)
// -- после прохода в цикле по всей истории в r будет лежать тип ордера или -1 (если не нашли ничего) --               
   return(r);                                                  // возвращаем результат поиска (либо тип ордера, либо -1)
}                                                              // Аминь. 

En el punto 2, un ejemplo:

int GetTypeLastClosePos(string sy, int mn) {    
   datetime t;                                        // Переменная хранит время закрытия
   int      i, k=OrdersHistoryTotal()-1, r=-1;        // Объявление переменных i - индекс k - количество ордеров в истории r - будет хранить тип ордера
   for (i=k; i>=0; i--) {                             // Обратный цикл по истории от OrdersHistoryTotal()-1 до нуля 
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если ордер с индексом i выбран в истории
// ---------------------- определение нужного нам ордера ордера ---------------------               
         if(OrderMagicNumber()!=mn) continue;         // если магик не тот - идём выбирать следующий ордер в истории
         if(OrderSymbol()!=sy)      continue;         // если переданный символ не равен символу ордера - идём выбирать следующий ордер в истории
         if (OrderType()>1)         continue;         // если это не Buy и не Sell - идём выбирать следующий ордер в истории
// --------------------- дальше имеем выбранный нужный нам ордер --------------------        
// -------------------------- определяем время его закрытия -------------------------               
         if (t<OrderCloseTime()) {                    // если значение, записанное в t меньше времени закрытия ордера
            t=OrderCloseTime();                       // запоминаем значение времени закрытия выбранного ордера для следующего сравнения
            r=OrderType();                            // запоминаем тип ордера
            }                                         // Конец блока определения времени закрытия.
         }                                            // Конец блока обработки выбранного ордера
      }                                               // Идём проверять следующий ордер (если i всё ещё больше k)
// -- после прохода в цикле по всей истории в r будет лежать тип ордера или -1 (если не нашли ничего) --               
   return(r);                                         // возвращаем результат поиска (либо тип ордера, либо -1)
}                                                     // Аминь. 

Aquí hay menos cosas innecesarias

 
Link_x:

He aquí un ejemplo de uso práctico de una función personalizada:

.
Gracias.
Así que hay que aplicar el nombre de la función para utilizarla, ¡y la propia variable "r" se establece para determinar el valor de esa función!
¡Aquí hay un pequeño descubrimiento para mí! ^^
Gracias de nuevo, Yuri. :)


Para una última aclaración, esto es posible:

?


Sus ejemplos no son correctos. Cuando se llama a una función que tiene parámetros, hay que dar los valores de esos parámetros entre paréntesis, separados por comas. También debe tener en cuenta que no todas las funciones tienen valores asignados. Si el tipo de función es void, no tiene ningún significado y está destinada a realizar alguna acción o calcular algunas variables. En este último caso, es necesario conocer los nombres de estas variables, para poder utilizar los resultados de esta función.

 
Link_x:

if(GetTypeLastClosePos == OP_BUY)

El compilador le dará un error en esta línea de que la variable no está declarada.

al menos deberías hacer esto:

if(GetTypeLastClosePos() == OP_BUY)
 
artmedia70:

En el punto 2, un ejemplo:

Hay menos elementos innecesarios



Perdón por la pregunta tonta, pero ¿por qué se rebusca en todo el historial para encontrar el último pedido cerrado? Encuentras el primero desde el final y sales directamente, supongo.
 
Roger:


Perdón por la pregunta tonta, pero ¿por qué se rebusca en el historial para encontrar el último pedido cerrado? Encuentras el primero desde el final y sales inmediatamente, según tengo entendido.
Una vez se habló de un problema cuando el historial se almacenaba en la forma en que el usuario lo ordenaba. Por lo tanto (para estar seguros) la búsqueda es exactamente así.
 
artmedia70:
Hubo una vez una discusión sobre un problema en el que el historial se almacenaba a medida que el usuario lo ordenaba. Por lo tanto (para estar seguros) la búsqueda es exactamente así.

El usuario sólo puede ordenar el historial para su percepción visual, los números de posición en el historial no pueden ser modificados.
 
Roger:
El usuario sólo puede ordenar la historia visualmente, los números de posición en la historia no se pueden cambiar.

Esto es algo bueno. Pero antes era diferente. Ahora no voy a buscar información en el foro, hace mucho tiempo. Así que me pregunté, ¿y si vuelve a ocurrir? Prefiero pasar por las órdenes que obtener un resultado erróneo.
 
Roger:
El usuario sólo puede ordenar la historia visualmente, los números de posición en la historia no se pueden cambiar.

En realidad, sólo se puede esperar que haya orden en el probador.
 
TheXpert:
En realidad, sólo se puede esperar que haya orden en el probador.


No me he dado cuenta, pero bueno, no voy a discutir. Hacer la profundidad 10-20, debería ser suficiente. Pero toda la historia... En mi opinión, eso es demasiado.