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

 
fxsaber:
Lo preguntaste sin perversiones. Y si lo hiciste, entonces...
Por eso es así.
double GetPositionCommission( void )
{
  double Commission = ::PositionGetDouble(POSITION_COMMISSION);

  // На случай, если POSITION_COMMISSION не работает
  if (Commission == 0)
  {
    const ulong Ticket = MT4ORDERS::GetPositionDealIn();

    if (Ticket > 0)
    {
      const double LotsIn = ::HistoryDealGetDouble(Ticket, DEAL_VOLUME);

      if (LotsIn > 0)
        Commission = ::HistoryDealGetDouble(Ticket, DEAL_COMMISSION) * ::PositionGetDouble(POSITION_VOLUME) / LotsIn;
    }
  }

  return(Commission);
}
O

Me doy cuenta de que el post es antiguo, pero ahora me ha dado una astilla.

Esta parte no es correcta, la comisión en forex puede ser cero

// На случай, если POSITION_COMMISSION не работает
  if (Commission == 0)
 
Artyom Trishkin:
ObjectGetValueByShift() (sólo MT4), ObjectGetValueByTime() (MT4, MT5)

Gracias
 
Alexey Volchanskiy:

Me doy cuenta de que el post es antiguo, pero ahora me ha dado una astilla.

Esta parte no es correcta, la comisión en forex puede ser cero


¿Por qué es incorrecto?
 


Problema con el constructor de copias en MQL5

Elarray dinámico this.arr, en el constructor de la copia, es visto por el depurador como unidimensional.

Como resultado, el tamaño de ob2.arr es igual a 0 en la salida.

¿Por qué?

El mismo fragmento funciona correctamente en MQL4.

Editor de MT5

MetaEditor 5.0 1578

Editor de MT4

MetaEditor 5.0 1562

class obj
  {
public:
   double            arr[][2];
                     obj(){}
                     obj(obj &o)
     {
      ArrayCopy(this.arr,o.arr);
     }
   obj operator=(obj &o)
     {
      ArrayCopy(this.arr,o.arr);
      return &this;
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
obj Copy(obj &o)
  {
   return o;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   obj ob1,ob2;
   ArrayResize(ob1.arr,3);
   ob2=Copy(ob1);
   bool stop=true;
  }


 
Klimenko_a_e:

El resultado es que el tamaño ob2.arr es 0 en la salida.

¿Por qué?

obj* Copy(obj &o)
  {
   return & o;
  };

De lo contrario, estará creando un nuevo objeto.


   void operator=(obj &o)
     {
      ArrayCopy(this.arr,o.arr);
      return; // &this;
     }

De lo contrario, ocurren cosas innecesarias.


Dudo que su código funcione correctamente en MQL4.

 
Buenos días, ¿podríais decirme cómo abrir una sola orden pendiente?
¿Cómo detengo el bucle si necesito abrir una orden pendiente cuando la bahía está abierta?

¡Puedo abrir un montón de ellos hasta que se acabe el depósito!

No sé cómo abrir una orden pendiente.

 
Akinak:
Buenos días, ¿podríais decirme cómo abrir una sola orden pendiente?
¿Cómo detengo el bucle si necesito abrir una orden pendiente cuando la bahía está abierta?

¡Puedo abrir un montón de ellos hasta que se acabe el depósito!

Gracias de antemano.


Primero tienes que averiguar "quién es".

 
Vladislav Andruschenko:


Primero hay que averiguar "quién es".


Vladislav Andruschenko:


primero tienes que averiguar "quién es".


for(int i=0; i<TotalPedidos();i++)
{
if(OrderSelect(i,SELECT_BY_POS))
if(OrderSymbol()==Symbol())
if(OrderMagicNumber()==Magic)
si(b>0)
{
int tak=OrderSend(Symbol(),OP_SELLSTOP,Lots_work,SOPrase,Slip,0,0,",Magic,0,clrRed);
si(tak>0)
Print("SELLSTOP Ok");
si no
Print("Error de SELLSTOP");
}
si(s>0)
{
OrderSend(Symbol(),OP_BUYSTOP,Lots_work,BOPrase,Slip,0,0,",Magic,0,clrBlue);
si(tik>0)
Print("BUYSTOP Ok");
si no
Print("Error en el BUYSTOP");
}

}


 

Bueno, lo que se hace en el ciclo es esto:

se abre una posición - se abre una orden, se añade el número de posiciones, el ciclo se repite - hasta el infinito.

int OrderSTotal=OrdersTotal();
for(int i=0; i<OrderSTotal;i++)
  {
   if(OrderSelect(i,SELECT_BY_POS))
      if(OrderSymbol()==Symbol())
         if(OrderMagicNumber()==Magic)

           {
            if(b>0)
              {
               int tak=OrderSend(Symbol(),OP_SELLSTOP,Lots_work,SOPrase,Slip,0,0,"",Magic,0,clrRed);
               if(tak>0)
                  Print("SELLSTOP  Ok");
               else
                  Print("SELLSTOP  Error");
              }

            if(s>0)
              {
                int tik=OrderSend(Symbol(),OP_BUYSTOP,Lots_work,BOPrase,Slip,0,0,"",Magic,0,clrBlue);
               if(tik>0)
                  Print("BUYSTOP  Ok");
               else
                  Print("BUYSTOP  Error");
              }
           }
  }
//+------------------------------------------------------------------+


Necesitas saber qué son la b y la s

 
fxsaber:

De lo contrario, estará creando un nuevo objeto.


De lo contrario, ocurren cosas innecesarias.


Dudo que su código funcione correctamente en MQL4.

En código real - la función devuelve un objeto.

Creo que el constructor de copias debería crear una copia temporal en este caso.

El código funciona correctamente en MQL5 build 1545.

En la nueva versión, el constructor de copias no puede redimensionar ni siquiera un array unidimensional: Error 4007.

En mi opinión, esto no es correcto.