Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 827

 

ajude a ajustar o indicador - não se consegue controlar a última barra!

O indicador considera uma série de ganhos contínuos para opções binárias, tendo em conta que a aposta será feita a cada 2 barras (isto é, depois de uma - ganho/perda, esperar pela barra actual), a variável externa é uma análise do preço da barra anterior a um preço ascendente ou descendente

Tenho a sensação de que funciona, mas online a última barra não é considerada correctamente, e como consequência se eu colocar o indicador no M1 os dados do histórico estarão correctos, mas tudo online não é calculado correctamente, o 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);
  }
//+------------------------------------------------------------------+

obrigado de antemão!

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Ошибки, баги, вопросы Ошибка после команды CopyClose...
 
Olá! Por favor, ajudem com o módulo de sinais de fecho. O que é que estou a fazer mal?
Arquivos anexados:
 
yur4ik:
Olá! por favor ajudem-me com o módulo de sinais para fechar posições. O que é que estou a fazer mal?

O seu ficheiro é o módulo SIGNAL. No sistema Expert Advisor, está integrado da mesma forma que o módulo SIGNALS do indicador USER. Por outras palavras, os sinais gerados pelo seu módulo têm um PESO, e pode acontecer que este peso não seja suficiente para desencadear o sinal.


Tem de pensar na melhor maneira de fazer o encerramento do seu caso. Talvez não o devesse fazer no módulo de sinal

 
Vladimir Karputov:

O seu ficheiro é o módulo SIGNAL. No sistema Expert Advisor, está integrado da mesma forma que o módulo do indicador USER SIGNALS. Por outras palavras, os sinais gerados pelo seu módulo têm um PESO, e pode acontecer que este peso não seja suficiente para desencadear o sinal.


Tem de pensar na melhor maneira de fazer o encerramento do seu caso. Talvez não o queira fazer num módulo de sinal.

Gostaria que isso fosse feito como um módulo de sinais que pudesse ser recolhido por um gerador Expert Advisor. No momento em que o módulo deve ser accionado, LongCondition() e ShortCondition() no segundo módulo EA retornam valores zero - ou seja, peso=0, entendo-o correctamente? Por conseguinte, o peso deste módulo deve ser superior ao sinal, mas não funciona. Em CheckCloseLong() e CheckCloseShort(), introduzi o Print("-------------"); e Print(time_GMT_DST()); o qual, durante o funcionamento normal do módulo, deverá fazer as entradas apropriadas no registo após a recepção de cada tick. As entradas não são feitas; CheckCloseLong() e CheckCloseShort() não são chamadas. Qual é o senão?

Sou desajeitado, é claro, mas estou apenas a aprender.
 
yur4ik:

Gostaria que tivesse a forma de um módulo de sinais, para que fosse possível montar através do gerador de EA. No momento em que o módulo deve ser accionado, LongCondition() e ShortCondition() no segundo módulo da EA retornam valores zero - ou seja, peso=0, entendo-o correctamente? Consequentemente, o peso deste módulo deve ser superior ao do sinal, mas não funciona. Em CheckCloseLong() e CheckCloseShort(), introduzi o Print("-------------"); e Print(time_GMT_DST()); o qual, durante o funcionamento normal do módulo, deverá fazer as entradas apropriadas no registo após a recepção de cada tick. As entradas não são feitas; CheckCloseLong() e CheckCloseShort() não são chamadas. Qual é o senão?

Sou certamente uma explicação desastrada, mas estou apenas a aprender

Métodos de utilização

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

Em vez dos seus CheckCloseLong e CheckCloseShort.

 
fxsaber:

Obrigado.

 

Olá, pode dizer-me como fazer um contador para perder negócios?
O Expert Advisor analisa o último negócio na história - se não for rentável, então adiciona +1 à variável, que será o número de negócios perdidos consecutivos.

Assim que um comércio lucrativo entra - a variável precisa de ser reposta a zero.

 
Nikita Chernyshov:

Olá, poderia por favor aconselhar como fazer um balcão para perder negócios?
O Expert Advisor analisa a última troca na história - se estiver a perder, então adiciona +1 à variável, que será o número de trocas consecutivas a perder.

Assim que um comércio lucrativo chega, a variável deve ser zerada.

Podemos recusar-nos a trabalhar com o histórico comercial e trabalhar apenas com a OnTradeTransaction() - aí apanharemos um negócio do tipo "OUT" - ou seja, será o fecho da posição. Uma vez encontrado este comércio - determinamos se era rentável ou não rentável. Respectivamente, o contador de"perdas" deve ser reiniciado ou aumentado.

//+------------------------------------------------------------------+
//| 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 a verificação no histórico comercial deve ser feita no OnInit() - uma vez no início do Expert Advisor.
 

Olá a todos,

Pode dizer-me como posso limpar programmaticamente o registo da EA antes de exibir informação nele:?

Apenas através de Win API?

Obrigado!

 
Vitaliy Sendyaev:

Olá a todos,

Pode dizer-me como posso limpar programmaticamente o registo da EA antes de exibir informação nele:?

Apenas através de Win API?

Obrigado!

Registe-se apenas através de Win API.