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

 
Maxim Kuznetsov:
Parece que el texto original viene de un universo paralelo, fue traducido dos veces por google-translate y luego recontado por Alice :-)

De acuerdo. Hay una función que se puede utilizar para encontrar el último lote. Se llamaFindLastLots. Pero quiero hacer una función que no se limite a buscar el último lote, sino que con la ayuda de ella se puedan cambiar los lotes. Es decir, si lotes externos = 0,01; quiero cambiar lotes = 0,01, digamos, a 0,04 usandoesta función. Y aquí necesito ayuda para entender cómo se puede implementar en general.

double FindLastLots()
  {
   double oldlots=0;
   int oldticket;
   int ticket=0;

   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               oldlots= OrderLots();
               ticket = oldticket;
              }
           }
        }
     }
   return(oldlots);
  }
Общие принципы - Торговые операции - Справка по MetaTrader 5
Общие принципы - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
Corvin85:

...

cambiar lotes = 0,01, digamos a 0,04. Sin usar la multiplicación.

...

Bueno... si la multiplicación es un problema, puedes obtener el resultado deseado mediante la suma.

 
Alexey Viktorov:

Bueno... si la multiplicación es un problema, puedes obtener el resultado que quieres sumando.

-:)

sin decir
 
¿Puedo añadir un bucle while a esta función, para poder recorrer la variable externa una a una en los pedidos seleccionados? Pero, ¿cómo puedo entonces sacar el "valor de retorno" y utilizarlo?
 
Alexey Viktorov:

Bueno... si hay problemas con la multiplicación, se puede obtener el resultado deseado mediante la suma.

Entiendo tu sarcasmo, pero que en los casos de multiplicación o cálculo, debería haber tantos multiplicadores como variables externas Lotes. Eso no es una forma de salir de la situación. Aunque voy a ser sincero, he pensado en ello...

 
Hola!!! estoy haciendo un EA basado en un timeframe M5.... pero las señales se disparan (por ejemplo a las 9:33, 12:11) etc..... ¿me podéis decir cómo abrir una orden en una nueva vela si la señal estaba en la actual?
 
Corvin85:

Entiendo tu sarcasmo, pero que en los casos de multiplicación o cálculo, debería haber tantos multiplicadores como variables externas Lotes. Eso no es una forma de salir de la situación. Aunque voy a ser honesto, he pensado en ello.

No puedo recordar los detalles ahora mismo, pero me ordenaron algo complicado en el cálculo de Lots. Como resultado, se encontró una fórmula con la que se hizo el cálculo.

¿Quizás sería mejor que expusiera el orden en detalle? Entonces alguien puede sugerir esta fórmula.

 
Alexey Viktorov:

Ahora no recuerdo los detalles, pero me ordenaron hacer algo elaborado para calcular el lote. El resultado fue una fórmula que se utilizó para calcularlo.

¿Quizás sería mejor que expusiera el orden en detalle? Entonces alguien puede sugerir esta fórmula.

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double Lot  = 0.01;
extern double Lot2  = 0.02;
extern double Lot3  = 0.05;
extern double Lot3  = 0.07;
//----------- И так далее-------//

Hay varias variables externas de Lot. Si una orden se cierra por Stop Loss, se abre una nueva orden con el nuevo lote que se especifica en la variable externa. (Tal vez, así es como deberíamos haberlo escrito originalmente). Sólo que no sé cómo escribirlo correctamente en código. Y como escribí más arriba, ninguna multiplicación o cálculo, ningún multiplicador externo ayudará. Tenemos que revisar de alguna manera los datos de los pedidos cerrados...

 
Corvin85:

Hay varias variables externas Lot. Si una orden se cierra por StopLoss, entonces se abre una nueva orden con un nuevo lote, que se especifica en la variable externa. (Tal vez, esto debería haber sido escrito originalmente de esta manera) Y aquí está el inconveniente. Sólo que no sé cómo escribirlo correctamente en código. Y como escribí más arriba, ninguna multiplicación o cálculo, ningún multiplicador externo ayudará. Necesitamos recuperar de alguna manera los datos de los pedidos cerrados ...

Al abrir una orden, escriba el número de la regla/variable en el comentario.

entonces, cuando revise el historial, busque este número, súmele 1 y obtenga un nuevo número de regla

 
Corvin85:

Hay varias variables externas Lot. Si una orden se cierra por StopLoss, entonces se abre una nueva orden con un nuevo lote, que se especifica en la variable externa. (Tal vez, esto debería haber sido escrito originalmente de esta manera) Y aquí está el inconveniente. Sólo que no sé cómo escribirlo correctamente en código. Como he escrito más arriba, ninguna multiplicación o cálculo, ningún multiplicador externo ayudará. Tenemos que revisar los datos de los pedidos cerrados de alguna manera.

Experimente con este código, tal vez esto es lo que necesita

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict

input double Lot_01  = 0.1;
input double Lot_02  = 0.2;
input double Lot_03  = 0.3;
input double Lot_04  = 0.4;
input double Lot_05  = 0.5;
input double Lot_06  = 0.6;
input double Lot_07  = 0.7;

double GetNextLot(const double last_lot)
{
   if(last_lot>=Lot_07) return(Lot_07);
   if(last_lot>=Lot_06) return(Lot_07);
   if(last_lot>=Lot_05) return(Lot_06);
   if(last_lot>=Lot_04) return(Lot_05);
   if(last_lot>=Lot_03) return(Lot_04);
   if(last_lot>=Lot_02) return(Lot_03);
   if(last_lot>=Lot_01) return(Lot_02);
   return(Lot_01);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print(Lot_01," ---> ",GetNextLot(Lot_01));
   Print(Lot_02," ---> ",GetNextLot(Lot_02));
   Print(Lot_03," ---> ",GetNextLot(Lot_03));
   Print(Lot_04," ---> ",GetNextLot(Lot_04));
   Print(Lot_05," ---> ",GetNextLot(Lot_05));
   Print(Lot_06," ---> ",GetNextLot(Lot_06));
   Print(Lot_07," ---> ",GetNextLot(Lot_07));
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
void OnTick()
  {

   
  }
//+------------------------------------------------------------------+

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.7 ---> 0.7

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.6 ---> 0.7

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.5 ---> 0.6

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.4 ---> 0.5

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.3 ---> 0.4

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.2 ---> 0.3

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.1 ---> 0.2

En mi función GetNextLot() se introduce el volumen de la última orden cerrada, y devolverá el siguiente valor de la configuración Lot_XX

la única limitación de este código es que los lotes deben estar en orden ascendente - creo que el código es simple y sencillo, puedes modificarlo para adaptarlo a tus necesidades

Razón de la queja: