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

 

Saludos. He visto el vídeo competente "De MQL4 a MQL5 - cómo reescribir EAs para Metatrader 5".
Muchas gracias al autor. He decidido probarlo yo mismo. Decidí probarlo yo mismo. La idea es la siguiente:
1. He puesto dtriger = 1 en las entradas - Se abre la compra.
2. He puesto dtriger = -1 - Sell opens.
3. He puesto dtriger = 0 - todos los abiertos están cerrados.
He leído en los manuales de MT5 que no es posible mantener posiciones opuestas,
y yo los tengo.
Pregunta: ¿Cómo puedo prescribir correctamente el cierre de una posición abierta
La pregunta es: ¿Cómo registrar correctamente el cierre de una posición existente al abrir una inversa?
Muchas gracias.

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int          triger            = 0;
input double    StartLot             = 0.01;
input double    lpos_volume       = 1.0;
input int          Step         = 10;
input int          MagicNumber    = 12345;      //      Magic   nuaber
input int          Slippage          = 30;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name(Symbol()))
     return(INIT_FAILED);
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_FOK);
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_IOC);
   }
   else 
   {
      o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
   {
      dStep = 10 ;
   }
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      datetime              lpos_time          =        0;
      double                lpos_price_open    =        0.0;
      ENUM_POSITION_TYPE   lpos_type           =        -1;
      int                      pos_count               =        0;
      double                sum_profit         = 0;
 
   for (int i = PositionsTotal() - 1; i>=0; i--)
   {
      if (o_position.SelectByIndex(i))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();            //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
  int stop_count=0;

   for (int i=OrdersTotal()-1; i >=0; i--) 
   {
      if (o_order.SelectByIndex(i)) 
      {
         if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if(dtriger == 0 )
   {
      CloseAll();
      return;               
   } 
   
  // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0  && stop_count == 0    )
   {
      if ( dtriger == -1 &&  lpos_type != POSITION_TYPE_SELL)
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());  //   S E L L   11111
      }
      
      if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if(pos_count>0 && stop_count>0) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return(false) ;
     
    if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
      return(false);
      
    return(true);
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed (string symbol, int fill_type)
{ 
   int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE); 
 
   return((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for (int index = PositionsTotal()-1; index >=0; index--)
   {
      if (o_position.SelectByIndex(index))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
    for (int i = OrdersTotal() - 1; i >= 0; i-- ) 
   {
      if (o_order.SelectByIndex(i))
         if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
 
procom:

Saludos. He visto el útil clip "De MQL4 a MQL5 - cómo reescribir EAs para Metatrader 5".
Me gustaría felicitar al autor. He decidido probarlo yo mismo. Yo lo escribí. Mi idea es la siguiente:
1. Pongo dtriger = 1 - abre Buy.
2. He puesto dtriger = -1 - Sell opens.
3. He puesto dtriger = 0 - todos los abiertos están cerrados.
He leído en el FAQ que en MT5 no es posible mantener posiciones opuestas,
y yo los tengo.
Pregunta: ¿Cómo puedo prescribir correctamente el cierre de una posición abierta
La pregunta es: ¿Cómo registrar correctamente el cierre de una posición existente al abrir una inversa?
Muchas gracias.

Debes haber estado muy poco atento al leer la ficha técnica.

Referencia:Principios generales - Operaciones comerciales.

En resumen: MetaTrader 5 cuenta consistemas de Netting y Hedging.

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 

Yo formularía su tarea de otra manera:

1.dtriger= 1-Se abre lacompra.
2. dtriger = -1 - Se abre la venta.
3. dtriger = 0 - Se cierran todas las abiertas.

El Asesor Experto debe hacer lo siguiente:

  • si necesita abrir la COMPRA - primero debe cerrar la VENTA (emita una orden para cerrar las posiciones de VENTA - no importa si están o no)
  • si necesita abrir la VENTA - entonces primero necesita cerrar la COMPRA (se emitirá una orden para cerrar las posiciones de COMPRA, sin importar si están ahí o no)
  • si el cliente necesita cerrar todo - entonces solo cierra todas las posiciones (no importa si COMPRA o VENTA)

Se necesitan dos algoritmos para la implementación (el número mágico también contribuye aquí) - puede ser desactivado.

//+------------------------------------------------------------------+
//| Close positions                                                  |
//+------------------------------------------------------------------+
void ClosePositions(const ENUM_POSITION_TYPE pos_type)
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            if(m_position.PositionType()==pos_type) // gets the position type
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }

и

//+------------------------------------------------------------------+
//| Close all positions                                              |
//+------------------------------------------------------------------+
void CloseAllPositions(void)
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }


La idea general es hacer un bucle alrededor de todas las posiciones desdePositionsTotal()-1 hasta 0. Es de PositionsTotal()-1 a 0, no de cero a PositionsTotal()-1. Esto es importante.

 
También un consejo: cuando se trabaja en MetaTrader 5, una orden es una ORDEN REMOVIDA. Por lo tanto, es muy recomendable que ni siquiera mencione la palabra "orden" en esta etapa inicial, para no crear confusión en su mente.
 
Vladimir Karputov:
También un consejo: cuando se trabaja en MetaTrader 5, una orden es una ORDEN REMOVIDA. Por lo tanto, es muy recomendable que ni siquiera recuerde la palabra "orden" en esta etapa inicial, para no crear confusión en su mente.

También hay órdenes de mercado de compra y venta, así como órdenes CloseBy.

 

Muchas gracias, como la música.

 
procom:

Muchas gracias, como la música.

Si necesita una explicación de mis códigos, pídala.
 

Bueno, si eres tan amable, más entonces.
He puesto las entradas y he prescrito un pre-cierre, pero de nuevo las órdenes están colgadas ahí y ahí.

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.PositionClose(o_symbol.Name());
         }
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.PositionClose(o_symbol.Name());
         }
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }
 
procom:

Bueno, si eres tan amable, más entonces.
He insertado las entradas y prescrito un pre-cierre, pero de nuevo hay órdenes colgantes aquí y allá.

Es necesario separar las operaciones de cierre y apertura, es decir, no realizar estas operaciones en un montón.
Un plan de ejemplo: OnTick() comprueba primero tres banderas: ExtNeedCloseBuy, ExtNeedCloseSell y ExtNeedCloseAll.
Y sólo entonces comprobamos dos banderas: ExtNeedOpenBuy y ExtNeedOpenSell.
De este modo, todo funcionará en un orden estricto.
Y sí, no hay órdenes: hay posiciones abiertas.
 
procom:

Muchas gracias, al igual que las notas.

¿Cuál es la señal de apertura? Porque el código no está completo - sólo cerrar posiciones, pero también necesito abrir posiciones...


Comando de comercio.mq5
#versión de la propiedad "1.000"

Hasta ahora sólo realiza tres acciones:

  • Cerrar todas las compras
  • Cerrar todas las ventas
  • Cerrar todas las compras y ventas
El Take Profit, el Stop Loss y el Trailing ya están incorporados. Lo único que falta es la descripción de las señales para abrir posiciones.
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Archivos adjuntos:
Razón de la queja: