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

 
Motzaart:

Por la tarde.

En un Asesor Experto multidivisa, necesito cerrar una orden pendiente colocada contra un beneficio cuando se dispara una posición abierta.

Ahora mismo, cuando cierro una orden pendiente en beneficio, se cierran todas las órdenes pendientes de todas las divisas.

¿Cómo puedo cambiar el código para que sólo se cierre la orden pendiente relacionada con un par de divisas y el resto permanezca abierto?

¿Qué debo cambiar en este código?

Mn en este código es un número mágico de una orden pendiente BUY_STOP o SELL_STOP.

La lógica es que cuando se cierra una posición abierta en Take Profit, se deja este número mágico y se supone que se ejecuta la orden de borrarlo.

Esto funciona al probar cada par. Sin embargo, cuando se trabaja con otras divisas, se eliminan todas las órdenes colocadas en todos los pares.

Por favor, ayude, si puede.

Entiendo que nadie debería molestarse con este problema, pero ¿quizás alguien tenga una plantilla preparada?

Se lo agradecería mucho.

He tenido que copiar el código en el editor y hacer un estilismo normal (Ctrl+<) para entender lo que has estropeado ahí.

Así que: comenté en el código lo que se estropeó allí:

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   operation=0; // неиспользуемая переменная
     { // лишняя скобка
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         OrderSelect(i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибки
         int  type   = OrderType();
         bool result = false;
         switch(type)
           { // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДА
            case OP_BUYSTOP   : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red);  //break;
            case OP_SELLSTOP  : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);   //break;
               // Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
               result = OrderDelete(OrderTicket());  //break;
           }
        }
     } // лишняя скобка
  }
//+------------------------------------------------------------------+

Como resultado, su código hace esto, es decir, es equivalente a este código:

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   bool result=false;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS)) {}
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, clrRed);
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, clrRed);
      result = OrderDelete(OrderTicket());
     }
  }
//+------------------------------------------------------------------+

Ahora pregúntate: ¿qué querías conseguir con ello?

 
Artyom Trishkin:

Para entender lo que has estropeado ahí, he tenido que copiar el código en el editor y hacer una estilización adecuada (Ctrl+<).

Así que: comentado en el código lo que has liado ahí:

Como resultado, su código hace esto, es decir, es igual a este código:

Ahora pregúntate: ¿qué querías conseguir con ello?

DE ACUERDO.

if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?

aquí:

extern int mn;//магический номер открытой позиции
int Mn=10*mn; //магический номер отложенного ордера
int TimFr1=72,TimFr2=24,TimFr3=24;

int start()
 {if(Symbol()=="EURUSD")mn=1;if(Symbol()=="GBPUSD")mn=2;if(Symbol()=="USDCHF")mn=3;if(Symbol()=="USDJPY")mn=4;
  if(Symbol()=="USDCAD")mn=5;if(Symbol()=="EURGBP")mn=6;if(Symbol()=="AUDUSD")mn=7;if(Symbol()=="NZDUSD")mn=8;
  if(Symbol()=="EURJPY")mn=9;if(Symbol()=="EURCHF")mn=10;

Cuando se abre una posición (OP_BUY o OP_SELL ), colocamos simultáneamente órdenes pendientes (OP_SELLSTOP y OP_BUYSTOP), respectivamente.

Al cerrar una posición abierta en el take profit, la orden pendiente correspondiente debe ser cancelada. Este algoritmo se aplica a todos los pares de divisas.

El resto de órdenes pendientes de otras divisas deben permanecer.

 

¡Buenos días a todos!

Hay un indicador MTF_RSI está cambiando

input ENUM_TIMEFRAMES      TimeFrame   =  0;

¿Puede decirme si es posible establecer el cambio automático de TimeFrame al cambiar de gráfico?

Algo así como

if(TimeFrame=Period())
   TimeFrame="Следующий период";        
 
MakarFX:

¡Buenos días a todos!

Hay un indicador MTF_RSI está cambiando

¿Puede decirme si es posible establecer el cambio automático de TimeFrame al cambiar de gráfico?

Algo así

Crea una estructura o un array multidimensional y deja que se ejecute en la dimensión deseada, si se cumple el criterio, trabaja con una columna (cada columna es responsable de su propio marco temporal), si no con otra columna, y ya está. El programa en sí tiene acceso a todos los plazos a la vez, así que lo que escribes es posible, pero la implementación es muy extensa y no se puede ver esta cantidad de trabajo en el foro, porque es muy extensa.

 
Seric29:

Crear una estructura o matriz multidimensional

Gracias.

 

¿Por qué no funciona este código?

typedef double(*CenBr)(string,int,int);CenBr cn_br[4];//глобально
//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[0]=iOpen;

Funciona con funciones sencillas, pero tiene algo raro.

 
MakarFX:

Gracias.

создаём массив double BarOCLH[1000][2][4]
далее сохраняем цену открытия 0 вого бара дневного таймфрейма
BarOCLH[0,0,0]=iOpen ();
далее сохраняем цену открытия 0 вого бара часового таймфрейма
BarOCLH[0,1,0]=iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
 
Seric29:
¿Me estás hablando a mí?
 
MakarFX:
¿Me estás hablando a mí?

Sí a ti. Tendrá que trabajar a través del juego con plazos en cada detalle en cada bucle y en cada función. Por eso recomiendo utilizar matrices multidimensionales.

 
Seric29:

Sí a ti. Tendrá que trabajar a través del juego con plazos en cada detalle en cada bucle y en cada función. Por eso recomiendo utilizar matrices multidimensionales.

Esta cuestión se resuelve más fácilmente:

   switch(period)
     {
      case PERIOD_M1  : TimeFrame = PERIOD_M5;  break;
      case PERIOD_M5  : TimeFrame = PERIOD_M15; break;
      case PERIOD_M15 : TimeFrame = PERIOD_M30; break;
      case PERIOD_M30 : TimeFrame = PERIOD_H1;  break;
      case PERIOD_H1  : TimeFrame = PERIOD_H4;  break;
      case PERIOD_H4  : TimeFrame = PERIOD_D1;  break;
      case PERIOD_D1  : TimeFrame = PERIOD_W1;  break;
      case PERIOD_W1  : TimeFrame = PERIOD_MN1; break;
      case PERIOD_MN1 : TimeFrame = PERIOD_MN1; break;
      default :        return(INIT_FAILED);
     }