[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 628

 
hoz:


Eso existe. Aquí está la solución.

Y la función de modificación está aquí:

Extraño Pero no hay paradas y tomas en la salida de nuevo.



OrderSelect(g_ticket,SELECT_BY_TICKET) antes de la línea if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
 
TUNGUS:


History, History_Draw - funcionan como Asesores Expertos durante las pruebas.

Se necesita algo como esto para ver las correcciones en el historial por parámetros dados


¿En la historia o en el gráfico? En caso afirmativo, ¿qué tipo de datos quiere ver en la ventana del gráfico, en una ventana aparte, impresos en forma de tabla, en forma de velas de diferentes colores, o como una línea que conecte el inicio y el final del movimiento?
 
rigonich:

OrderSelect(g_ticket,SELECT_BY_TICKET) antes de la línea if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)


Eso es lo que hice:

bool Trade (int signal)
{
  int total = OrdersTotal() - 1;
  
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу

    if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

No hay paradas ni tomas de posesión. El registro dice error 130, diciendo que las paradas son incorrectas. No veo la razón.

 
hoz:


Eso es lo que hice:

No hay paradas ni tomas de posesión. El registro dice error 130, diciendo que las paradas son incorrectas. No veo la razón.


Sin ifs, simplementeOrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);, y puedes dejarlo en OrdersModifying()

//+------------------------------------------------------------------+

void Modificación de pedidos()

{

OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);

if(g_type == OP_BUY)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // Si el parámetro de entrada del stop loss no es 0

// Obtener el valor del Stop Loss para la orden seleccionada

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // Si el parámetro de entrada TakeProfit no es igual a 0, entonces...

// obtener el valor de TakeProfit para la orden seleccionada

}

if(g_type == OP_SELL)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Si el parámetro de entrada del stop loss no es 0, entonces

// Obtener el valor del Stop Loss para la orden seleccionada

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Si el parámetro de entrada TakeProfit no es igual a 0, entonces...

// obtener el valor de TakeProfit para la orden seleccionada

}

if(sl != 0 || tp != 0) // Si los valores obtenidos de sl y tp no son iguales a 0, entonces..

{

OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Modificar orden

}

}


 
anton.veksler:

Problema con Symbol() MT4:

2 funciones para ilustrar:

La ejecución de la primera da como resultado una cadena vacía:

Pero la segunda función da salida a una cadena ID "EURUSD" (bueno, depende del gráfico, pero da salida, aunque según la lógica de la función debería ser una cadena vacía):

Ayúdame a entender qué es lo que está mal? Gracias


No puede utilizar nombres reservados(valor) al declarar sus variables, llame a _valor
 
hoz:


Eso es lo que hice:

No hay paradas ni tomas de posesión. El registro dice error 130, diciendo que las paradas son incorrectas. No veo la razón.

¡Y no lo harán!

  double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!
 

Vitaly, he hecho lo que me has dicho, pero no ha cambiado nada. Al parecer, el error está enterrado en otra parte.

Antes tenía todo (órdenes de apertura - modificación y transferencia a b.w. cuando se alcanza el nivel de precio establecido) y todo funcionaba. Fue así:

bool Trade (int signal)
{
  FindOrders();
  
  double sl = 0, tp = 0;

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет...
    if(!OpenBuy())                                                           // открываем лимитный ордер на покупку
      return(false);
        
  if(signal == SIGNAL_SELL)                               // Если сигнал на продажу и открытых ордеров нет..
    if(!OpenSell())                                                          // Открываем лимитный ордер на продажу
      return(false);
  
  int total = OrdersTotal() - 1;
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }

  return(true);
}

Ahora, como he desglosado todo en funciones específicas especializadas, todo ha dejado de funcionar taaaan bien. Lo he probado de las dos maneras, nada funciona. Los topes no están puestos.

 
borilunad:

¡Y no lo harán!

 double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!

¿Dónde está la lógica en eso? Me gustaría entender... Esta es la función:

void OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

Si las variables de entrada i_sl e i_tp no son iguales a cero, obtenemos los precios de parada y toma que ya estarán en la orden - sl ytp. Después comprobaré si hemos calculadosl ytp aquí (si es para cortos):

 if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }

Si se obtienen los valores, entonces no pueden ser cero... ¡porque se modificarán! Son variables que obtenemos secuencialmente por contexto de código.

Y aquí, he comprobado si encontramos los valores de parada y toma. ¿Cómo pueden ser cero después de todas las condiciones?

if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
 

Primero construye tu lógica al principio, luego haz funciones, archivos, etc.

¿Por qué rascarse la mano izquierda detrás de la oreja derecha?

 

Mi función comienza con una declaración de parámetros, ¡véase la de Kim!

void ModifyOrder(int ticket, double pp, double sl, double tp, datetime e, color arrow_cl) 
Razón de la queja: