Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 827

 

¡ayudar a ajustar el indicador - no puede conseguir una manija en la última barra!

El indicador considera una serie de ganancias continuas para las opciones binarias, teniendo en cuenta que la apuesta se hará cada 2 barras (es decir, después de una - ganancia / pérdida, esperar a que la barra actual), la variable externa es un análisis de precios de la barra anterior en un precio al alza o a la baja

Tengo la sensación de que funciona, pero en línea la última barra no se considera correctamente, y como consecuencia si coloco el indicador en M1 los datos del historial serán correctos, pero todo en línea no se calcula correctamente, el código:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  4
#property indicator_level1  2
#property indicator_level2  4
#property indicator_level3  6
//--- input parameters
input bool     on_a_higher=true;
//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int count;
bool win;
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   count = 0;
   win = false;
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
      int start;
      if(prev_calculated==rates_total) return(rates_total);
      if(prev_calculated==0) start=1; else start=prev_calculated-1;
      for(int i=start;i<rates_total;i++){
            if (win){  // признак выигрыша на предыдущей ставке
                  win = false;
                  Label1Buffer[i]=count;
            }
            else{
                  if(on_a_higher){    // on_a_higher = true - расчитываем на рост цены относительно предидущего бара
                     if (price[i]>price[i-1]){
                           count++;
                           win = true;
                     } else{
                                 count = 0;
                                 win = false;
                     }
                  Label1Buffer[i]=count;
                  }else{              // on_a_higher = false - расчитываем на падение цены относительно предидущего бара
                        if (price[i]<price[i-1]){
                           count++;
                           win = true;
                     } else{
                                 count = 0;
                                 win = false;
                     }
                  Label1Buffer[i]=count;
                  }
            }
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Gracias por adelantado.

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Ошибки, баги, вопросы Ошибка после команды CopyClose...
 
Hola! Por favor, ayuda con el módulo de señales de cierre. ¿Qué estoy haciendo mal?
Archivos adjuntos:
 
yur4ik:
Hola! Por favor, ayúdenme con el módulo de señales para cerrar posiciones. ¿Qué estoy haciendo mal?

Su archivo es el módulo SIGNAL. En el sistema Expert Advisor, se integra de la misma manera que el módulo de SEÑALES del indicador USER. En otras palabras, las señales generadas por su módulo tienen un PESO, y puede ocurrir que este peso no sea suficiente para activar la señal.


Tiene que pensar en la mejor manera de hacer el cierre en su caso. Tal vez no deba hacerlo en el módulo de señales

 
Vladimir Karputov:

Su archivo es el módulo SIGNAL. En el sistema Expert Advisor, se integra de la misma manera que el módulo de SEÑALES del indicador USER. En otras palabras, las señales generadas por su módulo tienen un PESO, y puede ocurrir que este peso no sea suficiente para activar la señal.


Tiene que pensar en la mejor manera de hacer el cierre en su caso. Es posible que no quieras hacerlo en un módulo de señales.

Me gustaría que se hiciera como un módulo de señales que pudiera ser recogido por un generador de Asesores Expertos. En el momento en que el módulo se va a activar, LongCondition() y ShortCondition() en el segundo módulo de EA devuelven valores cero - es decir, peso=0, ¿lo he entendido bien? En consecuencia, el peso de este módulo debe superar la señal, pero no funciona. En CheckCloseLong() y CheckCloseShort(), he insertado el Print("-------------"); y Print(time_GMT_DST()); que, durante el funcionamiento normal del módulo, deberían hacer las entradas apropiadas en el registro al recibir cada tick. Las entradas no se realizan; no se llama a CheckCloseLong() ni a CheckCloseShort(). ¿Cuál es la trampa?

Soy torpe, por supuesto, pero estoy aprendiendo.
 
yur4ik:

Me gustaría que fuera en forma de módulo de señales, para que fuera posible montarlo a través del generador de EA. En el momento en que el módulo se va a activar, LongCondition() y ShortCondition() en el segundo módulo del EA devuelven valores cero - es decir, peso=0, ¿lo he entendido bien? En consecuencia, el peso de este módulo debe superar la señal, pero no funciona. En CheckCloseLong() y CheckCloseShort(), he insertado el Print("-------------"); y Print(time_GMT_DST()); que, durante el funcionamiento normal del módulo, deberían hacer las entradas apropiadas en el registro al recibir cada tick. Las entradas no se realizan; no se llama a CheckCloseLong() ni a CheckCloseShort(). ¿Cuál es la trampa?

Ciertamente soy una explicación torpe, pero estoy aprendiendo

Utilizar métodos

   //--- methods of checking if the market models are formed
   virtual int       LongCondition(void);
   virtual int       ShortCondition(void);

En lugar de su CheckCloseLong y CheckCloseShort.

 
fxsaber:

Gracias.

 

Hola, ¿me pueden decir cómo hacer un contador para las operaciones perdedoras?
El Asesor Experto analiza la última operación en el historial - si no es rentable, entonces añade +1 a la variable, que será el número de operaciones perdedoras consecutivas.

En cuanto se produce una operación rentable, la variable debe ponerse a cero.

 
Nikita Chernyshov:

Hola, ¿podríais aconsejarme cómo hacer un contador de operaciones perdedoras?
El Asesor Experto analiza la última operación en el historial - si es perdedora, entonces añade +1 a la variable, que será el número de operaciones perdedoras consecutivas.

En cuanto llega una operación rentable, la variable debe ponerse a cero.

Podemos negarnos a trabajar con el historial de operaciones y trabajar sólo con OnTradeTransaction() - allí cogeremos una operación de tipo "OUT" - es decir, será el cierre de la posición. Una vez encontrada esta operación, determinamos si fue rentable o no. Respectivamente, las"pérdidas" del contador deben restablecerse o incrementarse.

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_ticket       =0;
      long     deal_order        =0;
      long     deal_time         =0;
      long     deal_time_msc     =0;
      long     deal_type         =-1;
      long     deal_entry        =-1;
      long     deal_magic        =0;
      long     deal_reason       =-1;
      long     deal_position_id  =0;
      double   deal_volume       =0.0;
      double   deal_price        =0.0;
      double   deal_commission   =0.0;
      double   deal_swap         =0.0;
      double   deal_profit       =0.0;
      string   deal_symbol       ="";
      string   deal_comment      ="";
      string   deal_external_id  ="";
      if(HistoryDealSelect(trans.deal))
        {
         deal_ticket       =HistoryDealGetInteger(trans.deal,DEAL_TICKET);
         deal_order        =HistoryDealGetInteger(trans.deal,DEAL_ORDER);
         deal_time         =HistoryDealGetInteger(trans.deal,DEAL_TIME);
         deal_time_msc     =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);
         deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_entry        =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_reason       =HistoryDealGetInteger(trans.deal,DEAL_REASON);
         deal_position_id  =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);

         deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
         deal_price        =HistoryDealGetDouble(trans.deal,DEAL_PRICE);
         deal_commission   =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);
         deal_swap         =HistoryDealGetDouble(trans.deal,DEAL_SWAP);
         deal_profit       =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);

         deal_symbol       =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_comment      =HistoryDealGetString(trans.deal,DEAL_COMMENT);
         deal_external_id  =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_commission+deal_swap+deal_profit>0)
              {
               losses=0;
              }
            else
              {
               losses++;
              }
           }
     }
  }
Y la comprobación en el historial de operaciones debe hacerse en OnInit() - una vez al inicio del Asesor Experto.
 

Hola a todos,

¿Puede decirme cómo puedo borrar programáticamente el registro del EA antes de mostrar la información en él :?

¿Sólo a través de Win API?

Gracias.

 
Vitaliy Sendyaev:

Hola a todos,

¿Puede decirme cómo puedo borrar programáticamente el registro del EA antes de mostrar la información en él :?

¿Sólo a través de Win API?

Gracias.

Registro sólo a través de la API de Win.