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

 
Alexey Viktorov:

Así de fácil.

Gracias, justo lo que necesitaba.

 

¡Buenas tardes!

¿Podría aconsejarnos sobre esta cuestión?

Pongo una orden pendiente:

bool send1=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price,3,SL,TP,NULL,MagicNumber,0,clrGreen);

Y luego trato de hacer un trailing stop en él después de que se abra:

 {
 for(int i=0; i<OrdersTotal(); i++) 
  {
  if(OrderSelect(i,SELECT_BY_POS))
  if(OrderSymbol()==Symbol()||OrderMagicNumber()==MagicNumber)
  if(OrderType()==OP_BUY)
   {
  if(TrailingStop>0)  
    {                 
  if(Bid-OrderOpenPrice()>TrailingStop)
     {
  if(OrderStopLoss()<Bid-TrailingStop)
      {
     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop,OrderTakeProfit(),0,clrRed);
      }
     }
    }
   }
  }
 }

Tras su apertura la orden se convierte en OP_BUY? ¿Cuál es el truco, por qué el arrastre no funciona en este caso?

 
YanSay:

¡Buenas tardes!

¿Podría aconsejarnos sobre esta cuestión?

Pongo una orden pendiente:

Y luego trato de hacer un trailing stop en él después de que se abra:

Después de su apertura la orden se convierte en OP_BUY? ¿Cuál es el truco, por qué el arrastre no funciona en este caso?

100500 razones. La primera obviedad es que el Bid-TrailngStop no está normalizado. Podría estar aún más cerca del nivel de parada y entonces también opaco.
 
YanSay:

¡Buenas tardes!

¿Podría aconsejarnos sobre esta cuestión?

Pongo una orden pendiente:

Y luego trato de hacer un trailing stop en él después de que se abra:

Tras su apertura la orden se convierte en OP_BUY? ¿Cuál es el truco, por qué el arrastre no funciona en este caso?

¿TrailingStop en pips? Multiplique por Punto entonces.
 

Me he equivocado de pregunta, lo siento. Sacado de contexto.

Especialmente para probar el código de arrastre, las operaciones se abren, pero el arrastre no funciona, no importa cómo lo he convertido, stalemate(

//Вводные
#define  MagicNumber 150
double SL=0;                        //Stop Loss
input int Trailing=100;             //Трэйлинг

//Код

void OnTick()
{
 if (OrdersTotal()==0)
 {
   if(TimeCurrent()>StrToTime("17:59")&&TimeCurrent()<StrToTime("18:01"))
  {
SL = Low[1]-Point; //Стоп лосс
bool send1=OrderSend (Symbol(), OP_BUY,1,Bid,30,SL,0,NULL,MagicNumber,0,clrNONE);
  }
 }
 if (OrdersTotal()>0)
   {
      for (int i=0; i<OrdersTotal (); i++)
    {
   bool select1=OrderSelect (i, SELECT_BY_POS);
   if (OrderMagicNumber() == MagicNumber && OrderSymbol () == Symbol())
     {
   if (OrderType()==OP_BUY)
      {
     if (NormalizeDouble(Ask-OrderStopLoss(),Digits)>NormalizeDouble(Trailing,Digits))
     bool modify1=OrderModify (OrderTicket(),0,Ask-Trailing,OrderTakeProfit(),0,CLR_NONE);
      }
     }
    }
   }
}
 
YanSay:

Me he equivocado de pregunta, lo siento. Sacado de contexto.

Especialmente para probar el código de arrastre, las operaciones se abren, pero el arrastre no funciona, no importa cómo lo he convertido, stalemate(

Respondí a su pregunta más arriba.
 
Vladislav Andruschenko:
Respondí a su pregunta más arriba.
Muchas gracias, me ha servido de ayuda.
 
YanSay:
Muchas gracias, me ha servido de ayuda.

Todavía tienes problemas ahí.

El bucle es hacia adelante, debería ser inverso - hacia adelante saltará posiciones después de que uno de ellos se cierre en la red de arrastre

No hay comprobación de la distancia mínima del stop (StopLevel) - habrá errores de modificación si el stop está más cerca del precio que la distancia mínima permitida (no olvidar el spread flotante)

Tal vez algo más - miró en diagonal - de paso, ya que se le ha dicho.

ZS. Miró de nuevo:

if (NormalizeDouble(Ask-OrderStopLoss(),Digits)>NormalizeDouble(Trailing,Digits))

este es el tipo de comprobación que carece del sentido mismo de la comprobación con normalización, ya que has normalizado ambos valores y cuando compruebas, el resultado no se normaliza de nuevo.

Hay que comprobar la diferencia normalizada de los dos valores dobles. Estás comparando dos valores normalizados.

 
Artyom Trishkin:

Todavía tienes problemas ahí.

El bucle es hacia adelante; debe ser inverso - con un bucle hacia adelante se saltarán posiciones después de que una de ellas se cierre en la red de arrastre

No hay comprobación de la distancia mínima del stop (StopLevel) - habrá errores de modificación si el stop está más cerca del precio que la distancia mínima permitida (no olvidar el spread flotante)

Tal vez algo más - miró en diagonal - de paso, ya que se le ha dicho.

ZS. Miró de nuevo:

este es el tipo de comprobación que carece del sentido mismo de la comprobación con normalización, ya que has normalizado ambos valores y cuando compruebas, el resultado no se normaliza de nuevo.

Debe comprobar la diferencia normalizada de dos valores dobles. Estás comparando dos valores normalizados.

¿Así?

for (int i = OrdersTotal() - 1; i >= 0; --i)
if (NormalizeDouble((Ask-OrderStopLoss()>Trailing*Point),Digits))
 
the size of local variables is too large (more than 512 kb)
¿Qué significa el error?


Tengo una función con dos objetos:

bool              CheckCandleOneRules(CCandlePropertiesBase *candle,
                                      CCandleRule *rule,
                                      int dir);

Una de las clases tiene una estructura con más de 4000 campos (en su mayoría enums).

¿Qué hacer con este error?