Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 741

 
fxsaber:
Pediu sem perversões. E se o fez, então...
É por isso que é assim.
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);
}
Ou

Compreendo que o posto é antigo, mas acabou de me atingir com uma lasca.

Esta parte aqui não é correcta, a comissão em forex pode ser zero

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

Obrigado
 
Alexey Volchanskiy:

Compreendo que o posto é antigo, mas acabou de me atingir com uma lasca.

Esta parte aqui não é correcta, a comissão em forex pode ser zero


Como é que está incorrecto?
 


Problema com o construtor de cópias na MQL5

A matriz dinâmica this.arr, no construtor de cópias, é vista pelo depurador como unidimensional.

Como resultado, o tamanho do ob2.arr é igual a 0 na produção.

Porquê?

O mesmo fragmento funciona correctamente na MQL4.

Editor MT5

MetaEditor 5.0 1578

Editor 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:

O resultado é que o tamanho ob2.arr é 0 na saída.

Porquê?

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

Caso contrário, estará a criar um novo objecto.


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

Caso contrário, acontecem coisas desnecessárias.


Duvido que o seu código tenha funcionado correctamente na MQL4.

 
Bom dia! Pode por favor dizer-me como abrir uma única encomenda pendente?
Como parar o laço se tiver de abrir uma ordem pendente quando a baía está aberta??

Posso abrir um monte deles até que o depósito se esgote!

Não sei como abrir uma ordem pendente.

 
Akinak:
Bom dia! Pode por favor dizer-me como abrir uma única encomenda pendente?
Como parar o laço se tiver de abrir uma ordem pendente quando a baía está aberta??

Posso abrir um monte deles até que o depósito se esgote!

Obrigado de antemão!


Primeiro é preciso descobrir "quem ele é".

 
Vladislav Andruschenko:


Primeiro é preciso descobrir "quem ele é".


Vladislav Andruschenko:


primeiro precisa de descobrir "quem ele é".


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)
Imprimir("SELLSTOP Ok");
senão
Imprimir("SELLSTOP Error");
}
if(s>0)
{
OrderSend(Symbol(),OP_BUYSTOP,Lots_work,BOPrase,Slip,0,0,",Magic,0,clrBlue);
if(tik>0)
Imprimir("BUYSTOP Ok");
senão
Imprimir("BUYSTOP Error");
}

}


 

Bem, o que se faz no ciclo é isto:

abre-se uma posição - abre-se uma ordem, o número de posições é acrescentado, o ciclo repete-se - até ao 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");
              }
           }
  }
//+------------------------------------------------------------------+


Precisa de saber o que são b e s

 
fxsaber:

Caso contrário, estará a criar um novo objecto.


Caso contrário, acontecem coisas desnecessárias.


Duvido que o seu código tenha funcionado correctamente na MQL4.

Em código real - a função devolve um objecto.

Penso que o construtor de cópias deveria criar uma cópia temporária neste caso.

O código funciona correctamente em MQL5 build 1545.

Na nova construção, o construtor de cópias não pode redimensionar nem mesmo uma matriz unidimensional: Erro 4007.

Isto não é correcto, na minha opinião.

Razão: