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

 
DanilaMactep:
Y este proceso debe escribirse después de cada línea en la que se intente abrir una orden mediante el envío de órdenes, ¿no es así?

Después de todas las operaciones OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

 
MakarFX:

Después de todas las operaciones OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

Si mi Asesor Experto es eliminado del gráfico, no funcionará, a menos que lo añada manualmente de nuevo. ¿Cómo puedo restablecerlo para que funcione automáticamente?
 
DanilaMactep:
Esto debe escribirse después de cada línea en la que se intente abrir una orden mediante el envío de órdenes, ¿es esto correcto?

Si excluye los errores relacionados con

MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT, MODE_LOTSTEP, MODE_MAXLOT

entonces los búhos no estarán golpeando el servidor

 
DanilaMactep:
Si el EA se borra del gráfico, no funcionará hasta que lo vuelva a cargar manualmente. ¿Cómo puedo restablecerlo automáticamente?
No se puede hacer automáticamente, es para corregir el error
 
DanilaMactep:

Y este caso debe escribirse después de cada línea en la que se intente abrir una orden mediante ordersend - ¿correcto?

Si por "este caso" nos referimos a la comprobación del volumen mínimo y máximo permitido de la orden, el paso del volumen, el número máximo permitido de operaciones+orden, la suficiencia del margen libre (estos son los puntos principales, por los que el validador rechaza más a menudo), entonces es más razonable escribir una función, llamándola OrderCheck por ejemplo.
Entonces, antes de abrir un nuevo acuerdo, simplemente comprueba el volumen.
Más o menos:

Lot=OrderCheck(OP_BUY,Lot);
// или
Lot=OrderCheck(OP_SELL,Lot);
 

¡Buenos días a todos los queridos programadores! Llevo un día luchando con un problema y no consigo resolverlo. Por favor, ayúdenme a resolverlo.

El resultado final:

El instrumento son los futuros RTS,periodo de M5;

Algoritmo tiene que cambiar los parámetros SL y TP en función del tiempo, y lo más importante, la posición abierta se cierra no por TP ( request.tp = ....) y la orden de mercado de contador, si se cumplen ciertas condiciones.

Hay tres intervalos: 1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // de 12:00:01 - 12:03:00

2) (stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09) // 16:05:01 - 16:09:00

3) (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04) // 20:00:11 - 20:04:00


En el intervalo "1)" los parámetros SL y TP = 200 y 200

En los intervalos "2)" y "3)", SL y TP = 100 y 100


El problema: El algoritmo fija el beneficio SÓLO EN EL CAMBIO ACTUAL, pero necesitamos mantener la condición de toma de beneficios durante n velas más (al menos 10-15)
período del gráfico M5

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime some_time=TimeCurrent();
#define  EXPERT_MAGIC 1010   // MagicNumber эксперта 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   double  Ask = SymbolInfoDouble(NULL, SYMBOL_ASK);
   double  Bid = SymbolInfoDouble(NULL, SYMBOL_BID);

   double SL=0;
   double TP=0;

   datetime    tm=TimeCurrent();
   MqlDateTime stm;
   TimeToStruct(tm,stm);

   bool is_siesta=false;

   if (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03)    // Условия SL и TP работают только в этом интервале времени
     {
       SL=200/_Point;
      TP=200/_Point;
      is_siesta=true;
     }
   else
     {


      if(((stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09)) || (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04))    // Условия SL и TP работают только в этих интервалах времени
        {
         SL=100/_Point;
         TP=100/_Point; // тейк профит закрывается кодом
         is_siesta=true;
        }
      else
        {
         return;
        }
     }

   double Lots=1;

   datetime timeBar = iTime(NULL,PERIOD_CURRENT,0);// период можно поставить по своему усмотрению
   datetime static timeOpen = 0;


   if( (is_siesta==true)&& (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50))  // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {

      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};

      request.action   =TRADE_ACTION_DEAL;
      request.symbol   =Symbol();
      request.volume   =Lots;
      request.type     =ORDER_TYPE_BUY;
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      request.deviation= 5;
      request.sl    = NormalizeDouble(Ask-SL*_Point,_Digits);
      request.magic    = 1010;

      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }


   if( (is_siesta==true) && (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {
      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};

      request.action   =TRADE_ACTION_DEAL;
      request.symbol   =Symbol();
      request.volume   =Lots;
      request.type     =ORDER_TYPE_SELL;
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID);
      request.deviation= 5;
      request.sl    = NormalizeDouble(Bid+SL*_Point,_Digits);
      request.magic    = 1010;

      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL)

   if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10))   // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {


      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};
      int total=PositionsTotal(); // количество открытых позиций
      //--- перебор всех открытых позиций
      for(int i=total-1; i>=0; i--)
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
         double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
         ulong  magic=PositionGetInteger(POSITION_MAGIC);
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции

         if((type==POSITION_TYPE_SELL)&& (magic==1010)) // если позиция тип BUY и соотв. магику
           {
            request.action   =TRADE_ACTION_DEAL;
            request.symbol   =Symbol();
            request.volume   =Lots;
            request.type     =ORDER_TYPE_BUY;
            request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); 

            if(!OrderSend(request,result))
               PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp

///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY)

   if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10))  // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {
      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};
      int total=PositionsTotal(); // количество открытых позиций
      //--- перебор всех открытых позиций
      for(int i=total-1; i>=0; i--)
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
         double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
         ulong  magic=PositionGetInteger(POSITION_MAGIC);
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции

         if((type==POSITION_TYPE_BUY)&& (magic==1010)) // если позиция тип BUY и соотв. магику
           {
            request.action   =TRADE_ACTION_DEAL;
            request.symbol   =Symbol();
            request.volume   =Lots;
            request.type     =ORDER_TYPE_SELL;
            request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID);

            if(!OrderSend(request,result))
               PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp
  }

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 

Alexey Belyakov:

El problema: El algoritmo fija el beneficio SÓLO EN EL CAMBIO ACTUAL, pero necesitamos mantener la condición de toma de beneficios para n curvas (al menos 10-15).

Período de la carta M5

La acción de SL y TP está limitada por el tiempo en el código. SL y TP separados para la siesta, y SL y TP separados para la siesta

 
Alexey Belyakov:

¡Buenos días a todos los queridos programadores! Llevo un día luchando con un problema y no consigo resolverlo. Por favor, ayúdenme a resolverlo.

Se puede cambiar el tiempo de funcionamiento y el número de barras

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime some_time=TimeCurrent();
#define  EXPERT_MAGIC 1010   // MagicNumber эксперта 
input string TimeStart_1= "12:00:01"; 
input string TimeStop_1 = "12:03:00";
input string TimeStart_2= "16:05:01";
input string TimeStop_2 = "16:09:00";
input string TimeStart_3= "20:00:11"; 
input string TimeStop_3 = "20:04:00";
input int    BarTrade   = 10;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   double  Ask = SymbolInfoDouble(NULL, SYMBOL_ASK);
   double  Bid = SymbolInfoDouble(NULL, SYMBOL_BID);

   double SL=0;
   double TP=0;

   datetime    tm=TimeCurrent();
   MqlDateTime stm;
   TimeToStruct(tm,stm);

   int TimeBarTrade=BarTrade*Period()*60;
   bool is_siesta=false;

   if((TimeCurrent()>=StringToTime(TimeStart_1) && TimeCurrent()<=StringToTime(TimeStop_1))||    
      (TimeCurrent()>=StringToTime(TimeStart_2) && TimeCurrent()<=StringToTime(TimeStop_2))||    
      (TimeCurrent()>=StringToTime(TimeStart_3) && TimeCurrent()<=StringToTime(TimeStop_3)))    
     {is_siesta=true;}
   else
     {is_siesta=false;}

   if(TimeCurrent()>=StringToTime(TimeStart_1) && TimeCurrent()<=(StringToTime(TimeStop_1)+TimeBarTrade))    
        {
         SL=200/_Point;
         TP=200/_Point;
        }
   if((TimeCurrent()>=StringToTime(TimeStart_2) && TimeCurrent()<=(StringToTime(TimeStop_2)+TimeBarTrade))||    
      (TimeCurrent()>=StringToTime(TimeStart_3) && TimeCurrent()<=(StringToTime(TimeStop_3)+TimeBarTrade)))    
        {
         SL=100/_Point;
         TP=100/_Point; 
        }

   double Lots=1;

   datetime timeBar = iTime(NULL,PERIOD_CURRENT,0);// период можно поставить по своему усмотрению
   datetime static timeOpen = 0;


   if( (is_siesta==true)&& (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50))  // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {

      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};

      request.action   =TRADE_ACTION_DEAL;
      request.symbol   =Symbol();
      request.volume   =Lots;
      request.type     =ORDER_TYPE_BUY;
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      request.deviation= 5;
      request.sl    = NormalizeDouble(Ask-SL*_Point,_Digits);
      request.magic    = 1010;

      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }


   if( (is_siesta==true) && (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {
      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};

      request.action   =TRADE_ACTION_DEAL;
      request.symbol   =Symbol();
      request.volume   =Lots;
      request.type     =ORDER_TYPE_SELL;
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID);
      request.deviation= 5;
      request.sl    = NormalizeDouble(Bid+SL*_Point,_Digits);
      request.magic    = 1010;

      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL)

   if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10))   // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {


      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};
      int total=PositionsTotal(); // количество открытых позиций
      //--- перебор всех открытых позиций
      for(int i=total-1; i>=0; i--)
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
         double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
         ulong  magic=PositionGetInteger(POSITION_MAGIC);
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции

         if((type==POSITION_TYPE_SELL)&& (magic==1010)) // если позиция тип BUY и соотв. магику
           {
            request.action   =TRADE_ACTION_DEAL;
            request.symbol   =Symbol();
            request.volume   =Lots;
            request.type     =ORDER_TYPE_BUY;
            request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); 

            if(!OrderSend(request,result))
               PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp

///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY)

   if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10))  // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {
      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};
      int total=PositionsTotal(); // количество открытых позиций
      //--- перебор всех открытых позиций
      for(int i=total-1; i>=0; i--)
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
         double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
         ulong  magic=PositionGetInteger(POSITION_MAGIC);
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции

         if((type==POSITION_TYPE_BUY)&& (magic==1010)) // если позиция тип BUY и соотв. магику
           {
            request.action   =TRADE_ACTION_DEAL;
            request.symbol   =Symbol();
            request.volume   =Lots;
            request.type     =ORDER_TYPE_SELL;
            request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID);

            if(!OrderSend(request,result))
               PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp
  }
 
¡Muchas gracias MakarFX ! Ahora funciona correctamente.
 
Alexey Belyakov:
¡Muchas gracias MakarFX ! Ahora funciona como debería.

De nada)

Razón de la queja: