Questions des débutants MQL5 MT5 MetaTrader 5 - page 827

 

aidez à modifier l'indicateur - je n'arrive pas à gérer la dernière barre !

L'indicateur considère une série de gains continus pour les options binaires, en tenant compte du fait que le pari sera fait toutes les 2 barres (c'est-à-dire, après un - gain/perte, attendre la barre actuelle), la variable externe est une analyse du prix de la barre précédente à la hausse ou à la baisse.

J'ai l'impression que cela fonctionne, mais en ligne la dernière barre n'est pas considérée correctement, et en conséquence si je place l'indicateur sur M1 les données de l'historique seront correctes, mais tout en ligne n'est pas calculé correctement, le code :

//+------------------------------------------------------------------+
//|                                                         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);
  }
//+------------------------------------------------------------------+

Merci d'avance !

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Ошибки, баги, вопросы Ошибка после команды CopyClose...
 
Bonjour, veuillez m'aider avec le module des signaux de fermeture. Qu'est-ce que je fais de mal ?
Dossiers :
 
yur4ik:
Bonjour ! Veuillez m'aider avec le module de signaux pour fermer des positions. Qu'est-ce que je fais de mal ?

Votre fichier est le module SIGNAL. Dans le système Expert Advisor, il est intégré de la même manière que le module SIGNAUX de l'indicateur USER. En d'autres termes, les signaux générés par votre module ont un POIDS, et il peut arriver que ce poids ne soit pas suffisant pour déclencher le signal.


Vous devez réfléchir à la meilleure façon de procéder à la clôture dans votre cas. Peut-être que vous ne devriez pas le faire dans le module de signal

 
Vladimir Karputov:

Votre fichier est le module SIGNAL. Dans le système Expert Advisor, il est intégré de la même manière que le module SIGNAUX de l'indicateur USER. En d'autres termes, les signaux générés par votre module ont un POIDS, et il peut arriver que ce poids ne soit pas suffisant pour déclencher le signal.


Vous devez réfléchir à la meilleure façon de procéder à la clôture dans votre cas. Vous ne voudrez peut-être pas le faire dans un module de signal.

J'aimerais qu'il s'agisse d'un module de signaux qui pourrait être collecté par un générateur de conseiller expert. Au moment où le module doit être déclenché, LongCondition() et ShortCondition() dans le second module EA renvoient des valeurs nulles - c'est-à-dire poids=0, ai-je bien compris ? En conséquence, le poids de ce module doit l'emporter sur le signal, mais cela ne fonctionne pas. Dans CheckCloseLong() et CheckCloseShort(), j'ai inséré les fonctions Print("-------------") ; et Print(time_GMT_DST()) ; qui, lors du fonctionnement normal du module, devraient effectuer les entrées appropriées dans le journal à la réception de chaque tick. Les entrées ne sont pas effectuées ; CheckCloseLong() et CheckCloseShort() ne sont pas appelés. Quel est le piège ?

Je suis maladroit, bien sûr, mais j'apprends juste.
 
yur4ik:

J'aimerais qu'il se présente sous la forme d'un module de signaux, afin qu'il puisse être assemblé par le générateur d'EA. Au moment où le module doit être déclenché, LongCondition() et ShortCondition() du second module de l'EA renvoient des valeurs nulles - c'est-à-dire un poids=0, ai-je bien compris ? En conséquence, le poids de ce module doit l'emporter sur le signal, mais il ne fonctionne pas. Dans CheckCloseLong() et CheckCloseShort(), j'ai inséré les fonctions Print("-------------") ; et Print(time_GMT_DST()) ; qui, lors du fonctionnement normal du module, devraient effectuer les entrées appropriées dans le journal à la réception de chaque tick. Les entrées ne sont pas effectuées ; CheckCloseLong() et CheckCloseShort() ne sont pas appelés. Quel est le piège ?

Je suis certainement une explication maladroite, mais j'apprends juste

Utiliser des méthodes

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

Au lieu de leurs CheckCloseLong et CheckCloseShort.

 
fxsaber:

Merci.

 

Bonjour, pouvez-vous me dire comment faire un compteur pour les trades perdants ?
Le conseiller expert analyse le dernier trade de l'historique - s'il n'est pas rentable, il ajoute +1 à la variable, qui sera le nombre de trades perdants consécutifs.

Dès qu'une transaction rentable est réalisée, la variable doit être remise à zéro.

 
Nikita Chernyshov:

Bonjour, pourriez-vous m'indiquer comment faire un compteur pour les trades perdants ?
Le conseiller expert analyse le dernier trade de l'historique - s'il est perdant, il ajoute +1 à la variable, qui sera le nombre de trades perdants consécutifs.

Dès qu'une transaction rentable se présente, la variable doit être remise à zéro.

Nous pouvons refuser de travailler avec l'historique des transactions et travailler uniquement avec OnTradeTransaction() - là nous attraperons une transaction de type "OUT" - c'est-à-dire qu'il s'agira de la clôture de la position. Une fois cette transaction trouvée, nous déterminons si elle a été rentable ou non. Respectivement, les"pertes" du compteur doivent être remises à zéro ou augmentées.

//+------------------------------------------------------------------+
//| 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++;
              }
           }
     }
  }
Et la vérification de l'historique des transactions devrait être effectuée dans OnInit() - une fois au démarrage du conseiller expert.
 

Bonjour à tous,

Pouvez-vous me dire comment je peux effacer par programme le journal de l'EA avant d'y afficher des informations : ?

Uniquement par le biais de l'API Win ?

Merci !

 
Vitaliy Sendyaev:

Bonjour à tous,

Pouvez-vous me dire comment je peux effacer par programme le journal de l'EA avant d'y afficher des informations : ?

Uniquement par le biais de l'API Win ?

Merci !

Enregistrement uniquement via l'API Win.
Raison: