Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 810

 


Hola, podrían ayudarme por favor - Tengo un problema: El robot entra en una posición y en el siguiente tick modifica su stop-loss al mínimo anterior y necesito que el stop-loss se modifique sólo cuando se cierre la vela en la que se abrió la posición

void TrailingStop()
{  
  for(int i=0;i<OrdersTotal();i++)
  {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true);
    {
    if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
      {  
      if (OrderType()==OP_BUY)             
        {              
            double LOW_1 = iLow(NULL,0,1);       
            bool res=OrderModify(OrderTicket(),OrderOpenPrice(),LOW_1,OrderTakeProfit(),0,White);                
            if(!res)  Print("Ошибка модификации ордера. Код ошибки=",GetLastError());         
        }               
       if (OrderType()==OP_SELL)              
        {                  
            double HIGH_1 = iHigh(NULL,0,1);                    
            res=OrderModify(OrderTicket(),OrderOpenPrice(),HIGH_1,OrderTakeProfit(),0,White);                
            if(!res)  Print("Ошибка модификации ордера. Код ошибки=",GetLastError());          
        }                      
      }
    } 
  }     
 return;                   
}
 

o cómo deshacerse de este error


 
remjte:
¡Caballeros! ¿Puedes decirme el código que dejará de probar un EA cuando no haya suficiente margen para abrir una posición?
Gracias.
Si AccountFreeMarginCheck() es inferior a un determinado valor (por ejemplo, menos del 50% de AccountFreeMargin) - salir de la función de negociación, la prueba termina rápidamente porque los bucles vacíos son casi descargables.
 
evillive:
Si AccountFreeMarginCheck() es inferior a un determinado valor (por ejemplo, menos del 50% de AccountFreeMargin) - salida de la función comercial, la prueba termina rápidamente, porque los bucles vacíos casi no se cargan.

Sinceramente, aún estoy muy verde, he encontrado este trozo de código ¿me podéis decir cómo corregirlo?

if (AccountFreeMarginCheck(Symbol(), a_cmd_0, l_lots_4) <= 0.0) return (-1);
if(GetLastError() == 134/* NOT_ENOUGH_MONEY */) return (-2);
return (l_lots_4);

 
En palabras más sencillas: ¿Cómo escribo esta condición - No modificar una orden abierta hasta que aparezca una nueva vela?
 
zhezheria:
Permítanme escribir de una manera más sencilla: cómo escribir esta condición - No modificar una orden abierta hasta que aparezca una nueva vela
Trabaja en la apertura de un nuevo bar en el plazo correspondiente. Un montón de ejemplos de código
 
remjte:

Sinceramente, aún estoy muy verde, he encontrado este trozo de código ¿me podéis decir cómo corregirlo?

if (AccountFreeMarginCheck(Symbol(), a_cmd_0, l_lots_4) <= 0.0) return (-1);
if (GetLastError() == 134/* NOT_ENOUGH_MONEY */) return (-2);
return (l_lots_4);

No hace falta que lo edites, te servirá. A no ser que sustituyas las variables por tus propios nombres.

Pero si necesitamos menos riesgo, entonces si (AccountFreeMarginCheck(Symbol(), a_cmd_0, l_lots_4) <= AccountFreeMargin()*0.5) devuelve (-1); - en este caso, si queda un 50% o menos de dinero libre después de abrir la posición con el lote especificado, entonces devuelve (-1)

 
¿Puedes darme una pista, por favor? Necesito escribir una parte de código en la que se seleccione el segundo pedido de la lista y luego se elimine (pendiente). Devuelve 4051 cuando OrderSelect(1, SELECT_BY_POS, MODE_TRADES)
 
remjte:
¡Caballeros! ¿Puedes decirme el código que dejará de probar un EA cuando no haya suficiente margen para abrir una posición?
Gracias.
      // проверяем доступность свободных средств
      if(AccountFreeMarginCheck(Symbol(),OP_BUY,OpenLot)<=0 || GetLastError()==134)
            {
               Print("It is impossible to open the order Buy, not enough money.");
               return(0);
            }
      // проверяем доступность свободных средств
      if(AccountFreeMarginCheck(Symbol(),OP_SELL,OpenLot)<=0 || GetLastError()==134)
            {
               Print("It is impossible to open the order Sell, not enough money.");
               return(0);
            }
doube OpenLot; // Лот который вы хотите открыть.
Insértelo antes de abrir una orden de mercado.
 
Pomid:
¿Puedes darme una pista, por favor? Necesito escribir una parte de código en la que se seleccione el segundo pedido de la lista y luego se elimine (pendiente). Devuelve 4051 cuando OrderSelect(1, SELECT_BY_POS, MODE_TRADES)
El recuento de pedidos empieza por 0. Try, OrderSelect(0, SELECT_BY_POS, MODE_TRADES)