Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 827

 

aiutare a mettere a punto l'indicatore - non riesco a capire l'ultima barra!

L'indicatore considera una serie di vittorie continue per le opzioni binarie, tenendo conto che la scommessa sarà fatta ogni 2 barre (cioè, dopo una - vittoria/perdita, aspetta la barra corrente), la variabile esterna è un'analisi del prezzo della barra precedente in un prezzo al rialzo o al ribasso

Ho la sensazione che funzioni, ma online l'ultima barra non viene considerata correttamente, e di conseguenza se metto l'indicatore su M1 i dati della storia saranno corretti, ma tutto online non viene calcolato correttamente, il codice:

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

grazie in anticipo!

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Ошибки, баги, вопросы Ошибка после команды CopyClose...
 
Salve, per favore aiutatemi con il modulo dei segnali di chiusura. Cosa sto facendo di sbagliato?
File:
 
yur4ik:
Salve, per favore aiutatemi con il modulo dei segnali per chiudere le posizioni. Cosa sto facendo di sbagliato?

Il vostro file è il modulo SIGNAL. Nel sistema Expert Advisor, è integrato allo stesso modo del modulo SIGNALS dell'indicatore USER. In altre parole, i segnali generati dal vostro modulo hanno un PESO, e può succedere che questo peso non sia sufficiente per far scattare il segnale.


Dovete pensare al modo migliore per fare la chiusura nel vostro caso. Forse non dovreste farlo nel modulo dei segnali

 
Vladimir Karputov:

Il vostro file è il modulo SIGNAL. Nel sistema Expert Advisor, è integrato allo stesso modo del modulo SIGNALS dell'indicatore USER. In altre parole, i segnali generati dal vostro modulo hanno un PESO, e può succedere che questo peso non sia sufficiente per far scattare il segnale.


Dovete pensare al modo migliore per fare la chiusura nel vostro caso. Potresti non volerlo fare in un modulo di segnale.

Vorrei che fosse fatto come un modulo di segnali che potrebbe essere raccolto da un generatore di Expert Advisor. Nel momento in cui il modulo deve essere attivato, LongCondition() e ShortCondition() nel secondo modulo EA restituiscono valori zero - cioè peso=0, ho capito bene? Di conseguenza, il peso di questo modulo deve superare il segnale, ma non funziona. In CheckCloseLong() e CheckCloseShort(), ho inserito le funzioni Print("-------------"); e Print(time_GMT_DST()); che, durante il normale funzionamento del modulo, dovrebbero fare delle voci appropriate nel log al ricevimento di ogni tick. Le entrate non vengono effettuate; CheckCloseLong() e CheckCloseShort() non vengono chiamate. Qual è la fregatura?

Sono maldestro, naturalmente, ma sto imparando.
 
yur4ik:

Mi piacerebbe che fosse sotto forma di un modulo di segnali, in modo da poterlo assemblare attraverso il generatore di EA. Nel momento in cui il modulo deve essere attivato, LongCondition() e ShortCondition() nel secondo modulo dell'EA restituiscono valori zero - cioè peso=0, ho capito bene? Di conseguenza, il peso di questo modulo deve superare il segnale, ma non funziona. In CheckCloseLong() e CheckCloseShort(), ho inserito le funzioni Print("-------------"); e Print(time_GMT_DST()); che, durante il normale funzionamento del modulo, dovrebbero fare delle voci appropriate nel log al ricevimento di ogni tick. Le entrate non vengono effettuate; CheckCloseLong() e CheckCloseShort() non vengono chiamate. Qual è la fregatura?

Sono certamente una spiegazione maldestra, ma sto imparando

Utilizzare i metodi

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

Invece dei loro CheckCloseLong e CheckCloseShort.

 
fxsaber:

Grazie.

 

Ciao, puoi dirmi come fare un contatore per i trade perdenti?
L'Expert Advisor analizza l'ultimo trade sulla storia - se non è redditizio, allora aggiunge +1 alla variabile, che sarà il numero di trade perdenti consecutivi.

Non appena arriva un trade redditizio - la variabile deve essere azzerata.

 
Nikita Chernyshov:

Salve, potreste consigliarmi come fare un contatore per i trade perdenti?
L'Expert Advisor analizza l'ultimo trade sulla storia - se è perdente, allora aggiunge +1 alla variabile, che sarà il numero di trade perdenti consecutivi.

Non appena arriva un trade redditizio, la variabile deve essere azzerata.

Possiamo rifiutarci di lavorare con la storia del trading e lavorare solo con OnTradeTransaction() - lì prenderemo una transazione di tipo "OUT" - cioè sarà la chiusura della posizione. Una volta trovato questo commercio - determiniamo se è stato redditizio o non redditizio. Rispettivamente, le"perdite" del contatore dovrebbero essere azzerate o aumentate.

//+------------------------------------------------------------------+
//| 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++;
              }
           }
     }
  }
E il controllo della storia del trading dovrebbe essere fatto in OnInit() - una volta all'inizio dell'Expert Advisor.
 

Ciao a tutti,

Potete dirmi come posso cancellare programmaticamente il registro EA prima di visualizzare le informazioni in esso:?

Solo attraverso Win API?

Grazie!

 
Vitaliy Sendyaev:

Ciao a tutti,

Potete dirmi come posso cancellare programmaticamente il registro EA prima di visualizzare le informazioni in esso:?

Solo attraverso Win API?

Grazie!

Registra solo tramite Win API.