Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 762

 
Alexey Kozitsyn:
Y no son las posiciones ni las operaciones las que hay que comprobar, sino las órdenes, porque primero es una orden, luego una operación y después una posición.

¿Por qué sólo pedidos? ¿Un acuerdo no tiene una identificación de posición (billete)?

 
Alexey Viktorov:

¿Por qué sólo pedidos? ¿Un acuerdo no tiene una identificación de posición (billete)?

Sí, tienes razón. Tanto las órdenes como las operaciones tienen un identificador de posición. Sin embargo, en el caso general debemos saber que a la posición se le asigna un identificador de la primera orden que inició el trato. En consecuencia, la "entidad" que inicia la posición es la orden, y no la operación. Y lo que hay que buscar son órdenes, no tratos.

De la documentación:

El identificador de posición es un número único que se asigna a cada posición recién abierta y que no cambia a lo largo de su vida. Corresponde al ticket de la orden con la que se abrió la posición.

El identificador de la posición se especifica en cada orden (ORDER_POSITION_ID) y en cada operación (DEAL_POSITION_ID) que la haya abierto, modificado o cerrado. Utilice esta propiedad para buscar órdenes y operaciones relacionadas con la posición.

 
Alexey Kozitsyn:

Sí, tienes razón. Tanto las órdenes como las operaciones tienen un identificador de posición. Sin embargo, en general, debe saber que a la posición se le asigna el identificador de la primera orden que inició la operación. En consecuencia, la "entidad" que inicia la posición es la orden, y no la operación. Y lo que hay que buscar son órdenes, no tratos.

De la documentación:

No voy a discutir, eso es exactamente lo que dice la documentación. Pero en otra parte de la misma documentación dice"Como norma...", lo que significa que puede haber incoherencias. Y este es el "por regla general" que me encontré una vez...

posición

El boleto de la posición. Debe rellenarse cuando se cambie y se cierre una posición, para su identificación única. Por regla general, corresponde al ticket de la orden, a raíz de la cual se abrió la posición.

No lo recuerdo, y es poco probable que lo haya entendido, leído, corregido y olvidado. Lo leí, lo corregí y lo olvidé.
 
Vitaly Muzichenko:
Por favor, indíqueme cómo recuperar el billete que se utilizó para el comercio. En la captura de pantalla es "63214735".

Aquí se buscael número de la Posición, en la lista de Ofertas, o bien está mal.

Aquí hay un script que demuestra lo que HistorySelectByPosition da

//--- input parameters
input int      Position;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ ulong Ticket;
  if ( HistorySelectByPosition(Position) )
  { Print("Position = "+IntegerToString(Position));
    int o=HistoryOrdersTotal()-1;
    while ( o>=0 )
    { Ticket=HistoryOrderGetTicket(o);
      Print("Order "+IntegerToString(o)+" = "+IntegerToString(Ticket));
      o--;
    }
    int d=HistoryDealsTotal()-1;
    while ( d>=0 )
    { Ticket=HistoryDealGetTicket(d);
      Print("Deal "+IntegerToString(d)+" = "+IntegerToString(Ticket));
      d--;
    }
  }
}

Y así es como se ve el resultado :

Position = 65328142
Order 1 = 65347809
Order 0 = 65328142
Deal 1 = 4070777
Deal 0 = 4051254

0 = Posición abierta

1 = Posición de cierre

Si no lo consigues = no has entrado en una Posición de Billete

El mismo resultado se puede obtener si empezamos con el billete de la transacción:

Para la función HistoryDealGetInteger()

ENUM_DEAL_PROPERTY_INTEGER

Identificador

Descripción

Tipo

DEAL_TICKET

Billete de oferta. Número único que se asigna a cada operación

largo

PEDIDO_DEAL

Orden, en base a la cual se ejecutó la operación

largo

DEAL_TIME

Tiempo de ejecución de la operación

datetime

DEAL_TIME_MSC

Tiempo de ejecución de la operación en milisegundos desde el 01.01.1970

largo

TIPO DE OFERTA

Tipo de acuerdo

ENUM_DEAL_TYPE

DEAL_ENTRY

Dirección de la operación - entrada en el mercado, salida del mercado o inversión

ENUM_DEAL_ENTRY

DEAL_MAGIC

Número mágico de la operación (ver ORDER_MAGIC)

largo

DEAL_REASON

Motivo o fuente del acuerdo

ENUM_DEAL_REASON

DEAL_POSITION_ID

El identificador de laposición en la apertura, la modificación o el cierre de la que participó esta operación. Cada posición tiene un identificador único, que se asigna a todas las operaciones realizadas en el instrumento durante la vida de la posición.

largo

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ivan Ivanov:

Gracias.

Necesitaba esto:HistoryOrderGetTicket

 
Vitaly Muzichenko:

Gracias.

Necesitaba esto:HistoryOrderGetTicket

La orden puede ser de 1.0 lote. Pero puede ejecutarse parcialmente, por ejemplo, el lote 0,9 - el resto será rechazado (depende del modo de ejecución). Entonces la operación será el lote 0,9. Y cuando se empiece a buscar lotes en la orden, habrá incoherencias.

 

Por favor, ayuda - Necesito un código sano para obtener el valor del entorno OHLC - los existentes son muy lentos

Opción 1

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,0,Bars(Symbol(),0),Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,0,Bars(Symbol(),0),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
//   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),Close);
   int copied=CopyClose(Symbol(),0,0,Bars(Symbol(),0),Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   ArraySetAsSeries(OpenI,true);
   int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),OpenI);
   if(copied>0 && index<copied) open=OpenI[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(LowI,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),LowI);
   if(copied>0 && index<copied) low=LowI[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(HighI,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),HighI);
   if(copied>0 && index<copied) high=HighI[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   ArraySetAsSeries(CloseI,true);
   int copied=CopyClose(symbol,timeframe,0,Bars(symbol,timeframe),CloseI);
   if(copied>0 && index<copied) close=CloseI[index];
   return(close);
  }


Opción 2

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }
 
Aleksey Vyazmikin:

Por favor, ayúdenme - necesito un código sano para obtener el valor del entorno OHLC - los existentes son muy lentos

Opción 1


Opción 2

Publica un fragmento de código para mostrar cómo lo aplicas.
 
Vitaly Muzichenko:
Publica un trozo de código de cómo los aplicas

No sé qué pieza es la que se ralentiza - las aplico de diferentes maneras, incluso en bucles...


aquí hay un ejemplo


            for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               if((Low(X)>PricePeresek && High(X)>PricePeresek) || 
                  (Low(X)<PricePeresek && High(X)<PricePeresek))
                  calcBarPeresek++;
               else break;
              }
 
Aleksey Vyazmikin:

No sé qué pieza es la que se ralentiza - la aplico de diferentes maneras, incluso en bucles...

Así parece en los bucles, y se puede prescindir de la función

            double LOW[1],HIGH[1];
             for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               CopyLow(Symbol(),PERIOD_CURRENT,X,1,LOW);
               CopyHigh(Symbol(),PERIOD_CURRENT,X,1,HIGH);
               if((LOW[0]>PricePeresek && HIGH[0]>PricePeresek) || 
                  (LOW[0]<PricePeresek && HIGH[0]<PricePeresek))
                  calcBarPeresek++;
               else break;
              }