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

 
Seric29:

Quiero crear un array unidimensional en el que de 0 a 4 elementos se almacene double, de 5 a 9 se almacene datetame, de 10 a 14 se almacene int. ¿Es posible organizarlo en mql4? Si es así, ¿podrías mostrarme cómo, he visto un ejemplo con estructuras en C++, pero he perdido el enlace al sitio?

Si tienes celdas de array específicas asignadas para cada tipo, haz una estructura en lugar de un array.

 
Koldun Zloy:

Si tienes celdas de array específicas asignadas para cada tipo, entonces haz una estructura en lugar de un array.

Por desgracia, ni siquiera puede formalizar la tarea

por un lado parece que quiere alejarse de la tipificación estricta en C++ / MQL , aquí hay un buen hilo de discusión, aunque dudo que le ayudehttps://www.mql5.com/ru/forum/294094

En el transcurso de esta discusión (creo que ya lleva 3 meses...) resulta que@Seric29 necesita alejarse de la descripción de las firmas de las funciones y obtener unafunción "fantasma" que puede tener un número arbitrario de parámetros pasados a ella

Luego, durante la discusión, resulta que en todo esto deben intervenir matrices dinámicas multidimensionales, y estas matrices deben pasarse a la función como parámetros

Es decir, se trata de una tarea no formalizada, cuya solución termina constantemente en "gritos desde el campo", los desarrolladores redujeron la funcionalidad de algo y me dan el código fuente de los operadores de bucle, yo los rehago, entonces este último:

Seric29:
Cómo escribir una carta a los desarrolladores de mql4 cómo ver el código del compilador, ¿hay alguna forma de añadirle más funciones para que no sea tan estático?

... eso es todo... la frase "alucinante" es lo menos que se puede decir ))))

 

Por eso no doy detalles.

No hay que dejar de aprender lo básico.

 
Koldun Zloy:

No hay que dejar de aprender lo básico.

Es interesante que un hombre no aprenda lo básico, sino que intente demostrar que ya lo sabe todo, y que todos vosotros se áis metacitas que le impiden hacer su trabajo)

 
Taras Slobodyanik:

es interesante que el hombre no aprenda lo básico, sino que intente demostrar que ya lo sabe todo, y que todos vosotros se áis metacitas que le impiden hacer su trabajo)

Saludos. He visto el video del Asesor Experto "De MQL4 a MQL5 - Cómo reescribir un EA 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 - Vender abre. 3.
3. He puesto dtriger = 0 en los multienchufes - 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 prescribir correctamente el cierre de una posición activa en la apertura de una flecha (inversa)?
Muchas gracias.

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

CPositionInfo o_position;
CTrade o_trade;
CSymbolInfo o_símbolo;
COrderInfo o_order;

input int triger = 0;
input double LoteInicial = 0,01;
input double lpos_volume = 1.0;
input int Paso = 10;
input int MagicNumber = 12345; // Número mágico
input int Deslizamiento = 30; // deslizamiento

int dtriger;
int dPaso;

//+------------------------------------------------------------------+
//| Función de inicialización de expertos|
//+------------------------------------------------------------------+
int OnInit()
{
dPaso = Paso ;
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);
}
si no
{
o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
}
o_trade.SetDeviationInPoints(Slippage);

if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
dPaso = 10 ;
}

return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Función de desinicialización de expertos|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| función de tic experto|
//+------------------------------------------------------------------+
void OnTick()
{
datetimelpos_time = 0;
double lpos_price_open = 0.0;
ENUM_POSITION_TYPE lpos_type = -1;
intpos_count = 0;
double suma_ganancia = 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++;
suma_ganancia = suma_ganancia + o_posición.Comisión() + o_posición.Intercambio() + o_posición.Ganancia() ;
}
}
}

// Contar el número de órdenes pendientes
int cuenta_de_parada=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++;
}
}

si (!RefreshRates())
volver ;

if(dtriger == 0 )
{
CloseAll();
volver;
}

// + ----- Abrir la primera orden ++++++++++
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
}
}


// + ----- Reverse ++++++++++++++++++++++++++++

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

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


if(pos_count>0 && stop_count>0)
BorrarPedidosParados() ;

}
//-----------------------------------------------------------
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 relleno = (int)SymbolInfoInteger(símbolo, 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())
}
}
}
}

//-----------------------------------------------------------
// Borrar todas las órdenes pendientes
//-------------------------------------
void BorrarPedidosParados()
{
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....

Por favor, introduzca el código correctamente:


 
Artyom Trishkin:

Por favor, introduzca el código correctamente:


ok
#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());
   }
 } 
 
//+------------------------------------------------------------------+
Archivos adjuntos:
Stend_t1.mq5  12 kb
 
Igor Makanu:

empieza a leer al menos un libro sobre C++, tus preguntas son una pasada, escribes términos técnicos, a primera vista parece que estás haciendo una pregunta concreta, pero en realidad sólo operas en términos sin entender la esencia .... ¿qué devolverá la macro? ¿dónde devolverá? en el cuerpo de la macro una función recargable.... No puedo ni empezar a explicar cómo es tu pregunta.

Para entender lo que es una macro, deletrea el término correctamente, macroSETTING , quizás te sea más fácil entender lo que es

En mql4 se reducen las capacidades y C++, es decir, es un lenguaje demasiado estático. Puedo decir que mi idea fracasó, escribí una simple sobrecarga sin clases, añadí argumentos y les di 0, intenté llamarla en una macro, me dio un error diciendo que hay 3 funciones, así que resulta que tengo que describir todavía a cuál llamar y cómo, y no digo nada sobre qué tipo de tropiezos tendré que enfrentar después. Probablemente sea mejor no hacer nada, así no te equivocarás.

 
Seric29:

mql4 tiene características recortadas y C++, es decir, un lenguaje demasiado estático.

¿Qué se ha recortado exactamente?

En otras palabras, no es necesario, especialmente ni siquiera google sabe" lenguajedemasiado estático", C++ es un lenguaje estáticamente tipado y pensar en ello no tiene sentido - simplemente lo es.

Seric29:

Probablemente sea mejor no hacer nada, así no te equivocarás.

Seré breve RTFM ( lurkmore )

 

La cuestión es puramente estética.

¿Cómo hago para que haya una imagen propia aquí? MT4