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

 
Kira27:

Por favor, diga-me de que classe herdar a sua classe a fim de utilizar todos os métodos destes

utilizar todos os métodos destas classes dentro da sua classe, sem criar objectos dentro da sua classe?

Herança significa criar uma classe.

 

Olá a todos!
Tenho um indicador - escrito em mql5 que gostaria de utilizar para criar uma EA.
Quando crio uma EA, não consigo encontrar os amortecedores de que preciso, parece que não os tenho de todo.
Tenho de o fazer desta forma:

  {
//--- indicator buffers mapping 
   SetIndexBuffer(2,BuyBuffer,INDICATOR_DATA);
   ResetLastError(); 

double   handle3 = 0; 
double   handle4 = 0;
double   UP = 0;
double   DW = 0;

for (int i=1; i<11; i++)
   {
      UP = iCustom(NULL,0,"StepMA_NRTR",Length,Kv,StepSize,Percentage,Switch,Shift,2,i); 
      DW = iCustom(NULL,0,"StepMA_NRTR",Length,Kv,StepSize,Percentage,Switch,Shift,3,i); 
 
      if (handle3==0)   
      if (UP != EMPTY_VALUE)
      handle3=1;

      if (handle4==0)   
      if (UP != EMPTY_VALUE)
      handle4=1;
      
      if (handle3>0 && handle4)
      break;      
   }  
   
Comment(DoubleToString(handle3,Digits())+"\n"+DoubleToString(handle3,Digits()));
   return(INIT_SUCCEEDED);
  }

Não importa como mudo ou acrescento uma linha iCustom - continuo a receber a mesma coisa no registo:

2021.06.26 17:59:42.251 Proba (EURUSD,M15) 1.00000

E o comentário: 1.00000 e 1.00000 novamente.

Ajude-me a compreender - é adequado para criar uma EA, ou preciso de a refinar, ou talvez esteja a fazer algo de errado?


Arquivos anexados:
StepMA_NRTR.mq5  13 kb
 

Em MT5 é utilizado de forma diferente. Veja o exemplo na ajuda.

iCustom

Devolve o cabo do indicador personalizado especificado.

https://www.mql5.com/ru/docs/indicators/icustom

Документация по MQL5: Технические индикаторы / iCustom
Документация по MQL5: Технические индикаторы / iCustom
  • www.mql5.com
iCustom - Технические индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Aleksei Stepanenko:

Em MT5 é utilizado de forma diferente. Veja o exemplo na ajuda.

iCustom

Devolve o cabo do indicador personalizado especificado.

https://www.mql5.com/ru/docs/indicators/icustom

Já li esta documentação, mas não tenho bem a certeza onde.... ou como colocar o tampão e o número da ficha?

Estou apenas a começar a programar e a pedir-vos que sejam indulgentes comigo.

Começo a suspeitar que isto requer uma função adicional

int copy=CopyBuffer(MA_handle,0,0,rates_total,Label1Buffer); 

Por favor explique.... onde .... e como....?

 
Sprut 185:

Olá a todos!
Tenho um indicador - escrito em mql5 que gostaria de utilizar para criar uma EA.
Quando crio uma EA, não consigo encontrar os amortecedores de que preciso, parece que não os tenho de todo.
É assim que eu o faço:

Não importa como mudo ou acrescento uma linha iCustom - continuo a receber a mesma coisa no registo:

2021.06.26 17:59:42.251 Proba (EURUSD,M15) 1.00000

E o comentário: 1.00000 e 1.00000 novamente.

Ajude-me a compreender - é adequado para criar uma EA, ou preciso de a refinar, ou talvez esteja a fazer algo de errado?


Código:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double up_buffer[],dn_buffer[],buy_buffer[],sell_buffer[];
   ArraySetAsSeries(up_buffer,true);
   ArraySetAsSeries(dn_buffer,true);
   ArraySetAsSeries(buy_buffer,true);
   ArraySetAsSeries(sell_buffer,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iCustom,0,start_pos,count,up_buffer) ||
      !iGetArray(handle_iCustom,1,start_pos,count,dn_buffer) ||
      !iGetArray(handle_iCustom,2,start_pos,count,buy_buffer) ||
      !iGetArray(handle_iCustom,3,start_pos,count,sell_buffer))
      return;
//---
   string text=" | UpBuffer | DnBuffer | BuyBuffer | SellBuffer"+"\n";
   for(int i=0; i<count; i++)
     {
      text=text+"#"+IntegerToString(i)+" | "+DoubleToString((up_buffer[i]==EMPTY_VALUE?0.0:up_buffer[i]),Digits())
           +" | "+DoubleToString((dn_buffer[i]==EMPTY_VALUE?0.0:dn_buffer[i]),Digits())
           +" | "+DoubleToString((buy_buffer[i]==EMPTY_VALUE?0.0:buy_buffer[i]),Digits())
           +" | "+DoubleToString((sell_buffer[i]==EMPTY_VALUE?0.0:sell_buffer[i]),Digits())+"\n";
     }
   Comment(text);
  }

Resultado:


Arquivos anexados:
 
Sprut 185:

Olá a todos!
Tenho um indicador - escrito em mql5 - que gostaria de utilizar para criar uma EA.

Aqui consegui - parece funcionar! (onde o amarelo é para amortecedores)

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Também preciso de uma paragem de perda(não consegui perceber porque fechou imediatamente).

BTCUSDM1 3

BTCUSDM1 4

//+------------------------------------------------------------------+
//|                                                    Sprut 185.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define    UNO_MAGIC 2344701
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
double            m_adjusted_point;             // point value adjusted for 3 or 5 points
CTrade            m_trade;                      // trading object
CSymbolInfo       m_symbol;                     // symbol info object
CPositionInfo     m_position;                   // trade position object
CAccountInfo      m_account;                    // account info wrapper
//---
enum PRICE_MODE
  {
   HighLow,     // High/Low
   CloseClose   // Close/Close
  };
//---
input group      "---- : StepMA_NRTR:  ----"
input int        Length        = 10;      // Volty Length
input double     Kv            = 1.0;     // Sensivity Factor
input int        StepSize      = 0;       // Constant Step Size (if need)
input double     Percentage    = 0;       // Percentage of Up/Down Moving
input PRICE_MODE Switch        = HighLow; // High/Low Mode Switch (more sensitive)
input int        Shift         = 0;       // Shift
input group      "---- : Parameters:  ----"
input uint       InpStopLoss   = 90;      // : Stop Loss
input uint       InpTakeProfit = 36;      // : Take Profit
input double     InpLots       = 0.1;     // : Lots
input bool       InpClOp       = true;    // : Close opposite
//---
int      price_uno;           //
double   m_stop_loss   = 0.0; // Stop Loss
double   m_take_profit = 0.0; // Take Profit
datetime m_last_open   = 0;   // "0" -> D'1970.01.01 00:00';
int StepMA_NRTR_Handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- initialize common information
   if(!m_symbol.Name(Symbol()))             // sets symbol name
      return(false);
   RefreshRates();
   m_trade.SetExpertMagicNumber(UNO_MAGIC); // magic
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(Symbol());
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;
//--- set default deviation for trading in adjusted points
   m_stop_loss   = InpStopLoss*m_adjusted_point;
   m_take_profit = InpTakeProfit*m_adjusted_point;
//--- set default deviation for trading in adjusted points
   m_trade.SetDeviationInPoints(3*digits_adjust);
//---- получение хендла индикатора StepMA_NRTR
   StepMA_NRTR_Handle=iCustom(NULL,0,"StepMA_NRTR",Length,Kv,StepSize,Percentage,Switch,Shift);
   if(StepMA_NRTR_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора StepMA_NRTR");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(void)
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return;
//---
   if(!SearchTradingSignalsOpen())
     {
      return;
     }
  }
//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
bool CheckForOpenBuy(void)
  {
   bool res=false;
//--- check for long position (BUY) possibility
   double price=m_symbol.Ask();
   double tp   =m_symbol.Bid()+m_take_profit;
   double sl   =m_symbol.Bid()-m_stop_loss;
//--- check for free money
   if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,InpLots,price)<0.0)
      printf("We have no money. Free Margin = %f",m_account.FreeMargin());
   else
     {
      //--- open position
      if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,sl,tp))
         printf("Position by %s to be opened",Symbol());
      else
        {
         printf("Error opening BUY position by %s : '%s'",Symbol(),m_trade.ResultComment());
         printf("Open parameters : price=%f,SL=%f,TP=%f",price,sl,tp);
        }
     }
//--- in any case we must exit from expert
   res=true;
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
bool CheckForOpenSell(void)
  {
   bool res=false;
//--- check for short position (SELL) possibility
   double price=m_symbol.Bid();
   double tp   =m_symbol.Ask()-m_take_profit;
   double sl   =m_symbol.Ask()+m_stop_loss;
//--- check for free money
   if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,InpLots,price)<0.0)
      printf("We have no money. Free Margin = %f",m_account.FreeMargin());
   else
     {
      //--- open position
      if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,InpLots,price,sl,tp))
         printf("Position by %s to be opened",Symbol());
      else
        {
         printf("Error opening SELL position by %s : '%s'",Symbol(),m_trade.ResultComment());
         printf("Open parameters : price=%f,SL=%f,TP=%f",price,sl,tp);
        }
     }
//--- in any case we must exit from expert
   res=true;
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for close position conditions                              |
//+------------------------------------------------------------------+
void CheckForCloseBuy(void)
  {
//--- close position
   ClosePositions(POSITION_TYPE_BUY);
//---
  }
//+------------------------------------------------------------------+
//| Check for close position conditions                              |
//+------------------------------------------------------------------+
void CheckForCloseSell(void)
  {
//--- close position
   ClosePositions(POSITION_TYPE_SELL);
//---
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
     {
      return(false);
     }
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
     {
      return(false);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Check Freeze and Stops levels                                    |
//+------------------------------------------------------------------+
void FreezeStopsLevels(double &freeze,double &stops)
  {
//--- check Freeze and Stops levels
   double coeff=(double)1;
   if(!RefreshRates() || !m_symbol.Refresh())
      return;
//--- FreezeLevel -> for pending order and modification
   double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
      if(1>0)
         freeze_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//--- StopsLevel -> for TakeProfit and StopLoss
   double stop_level=m_symbol.StopsLevel()*m_symbol.Point();
   if(stop_level==0.0)
      if(1>0)
         stop_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//---
   freeze=freeze_level;
   stops=stop_level;
//---
   return;
  }
//+------------------------------------------------------------------+
//| Close positions                                                  |
//+------------------------------------------------------------------+
void ClosePositions(const ENUM_POSITION_TYPE pos_type)
  {
   double freeze=0.0,stops=0.0;
   FreezeStopsLevels(freeze,stops);
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==UNO_MAGIC)
            if(m_position.PositionType()==pos_type)
              {
               if(m_position.PositionType()==POSITION_TYPE_BUY)
                 {
                  bool take_profit_level=((m_position.TakeProfit()!=0.0 && m_position.TakeProfit()-m_position.PriceCurrent()>=freeze) || m_position.TakeProfit()==0.0);
                  bool stop_loss_level=((m_position.StopLoss()!=0.0 && m_position.PriceCurrent()-m_position.StopLoss()>=freeze) || m_position.StopLoss()==0.0);
                  if(take_profit_level && stop_loss_level)
                     if(!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbol
                        Print(__FILE__," ",__FUNCTION__,", ERROR: ","BUY PositionClose ",m_position.Ticket(),", ",m_trade.ResultRetcodeDescription());
                 }
               if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  bool take_profit_level=((m_position.TakeProfit()!=0.0 && m_position.PriceCurrent()-m_position.TakeProfit()>=freeze) || m_position.TakeProfit()==0.0);
                  bool stop_loss_level=((m_position.StopLoss()!=0.0 && m_position.StopLoss()-m_position.PriceCurrent()>=freeze) || m_position.StopLoss()==0.0);
                  if(take_profit_level && stop_loss_level)
                     if(!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbol
                        Print(__FILE__," ",__FUNCTION__,", ERROR: ","SELL PositionClose ",m_position.Ticket(),", ",m_trade.ResultRetcodeDescription());
                 }
               PlaySound("ok.wav");
              }
  }
//+------------------------------------------------------------------+
//| Filling the indicator buffers from the indicator                 |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
//| Search trading signals                                           |
//+------------------------------------------------------------------+
bool SearchTradingSignalsOpen(void)
  {
//--- we work only at the time of the birth of new bar
   datetime time_0=iTime(Symbol(),Period(),0);
   if(time_0==m_last_open)
      return(true);
   m_last_open=time_0;
//--- we work only at the time of the birth of new bar
   double StepMA_NRTR[],StepMA_NRTRS[];
   bool StNRUp,StNRDn;
   ArraySetAsSeries(StepMA_NRTR,true);
   ArraySetAsSeries(StepMA_NRTRS,true);
   int start_pos=0,count=3;
   if(!iGetArray(StepMA_NRTR_Handle,0,start_pos,count,StepMA_NRTR)||
      !iGetArray(StepMA_NRTR_Handle,1,start_pos,count,StepMA_NRTRS))
     {
      return(false);
     }
//+------------------------------------------------------------------+
   StNRUp=StepMA_NRTR[0]<StepMA_NRTRS[0];
//---
   StNRDn=StepMA_NRTR[0]>StepMA_NRTRS[0];
//+------------------------------------------------------------------+
//--- BUY Signal
   if(StNRUp)
     {
      if(InpClOp)
         CheckForCloseSell();
      Sleep(1000);
      if(price_uno<0)
         CheckForOpenBuy();
      price_uno=+1;
      return(true);
     }
//--- SELL Signal
   if(StNRDn)
     {
      if(InpClOp)
         CheckForCloseBuy();
      Sleep(1000);
      if(price_uno>0)
         CheckForOpenSell();
      price_uno=-1;
      return(true);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+


 
Sprut 185:

Começo a suspeitar que isto requer uma função extra

É isso mesmo. Liga-se o indicador no OnInit, definem-se parâmetros lá e obtém-se a sua pega. E depois utilizar o CopyBuffer.


https://www.mql5.com/ru/docs/series/copybuffer

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
CopyBuffer - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
SanAlex:

Eu fiz isto - parece estar a funcionar! (onde o amarelo é o amortecedor)

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Acontece que também preciso de uma paragem de perda - (não consegui perceber porque fechou imediatamente) acrescentei uma paragem de perda



Muito obrigado!!!

Fez um bom trabalho, mas estou interessado num algoritmo completamente diferente para a EA. Gostaria de utilizar um Martingale simples (peneira) com estes parâmetros personalizáveis :

input group "======== МАРТИН ========"; 
input int      MMType        = 1;        // 1 - вкл. , 2 - выкл.
input double   Multiplikator = 1.667;    // множитель следующего лота
input double   Step          = 150.0;    // Расстояние между ордерами
input group "==== МАНИ МЕНЕДЖМЕНТ ====; 
input bool     LotConst      = true;     // фиксированный - true, или от  баланса - false
input group "-: фиксированный лот :--"; 
input double   Lot           = 0.01;     // первый фиксированный лот, если МАРТИН включен
input group "---: лот от баланса :---"; 
input double   RiskPercent   = 30.0;     // первый лот в процентах от баланса, если МАРТИН включен
input group "== ПРИБЫЛЬ В ПУНКТАХ ==="; 
input double   TakeProfit    = 56.0;     // параметры тейкпрофита в пунктах
input group "========= Шаг =========="; 
input double   Step          = 150.0;    // шаг в пунктах между ордерами
input group "===== ОГРАНИЧИТЕЛЬ =====";  
input int      MaxTrades     = 15;       // Максимальное количество ордеров одного направления
input group "=== ПРОСКАЛЬЗОВАНИЕ ====";  
input double   Slippage      = 5.0;      // Допустимое проскальзывание на новостях в пунктах
input group "== МАГИЧЕСКИЙ  НОМЕР ===";  
input int      Magic         = 1111111 ; // Идентификатор ордера (Магик №)

mas acrescente-lhe o indicador que coloquei - acima. E utilizá-lo como gatilho (falso - trabalhar apenas em CURTO e verdadeiro - trabalhar apenas em LONGO).

Escolhi este indicador - apenas porque funciona como MovingAverages, mas tem alguns filtros de suavização e pontos de mudança de direcção de preços, que podem ser usados como gatilho para o Expert Advisor trabalhar apenas em tendências usando definições de lucro do menu.

E assim que o take profit é fechado, abrimos a ordem seguinte na mesma direcção (na tendência), até que a tendência acabe e o nosso gatilho seja trocado. Se uma ordem aparecer fora de tendência (no momento em que a tendência muda de um estado para outro), devemos usar Martins com configurações do menu para ela.

Se quiser ajudar a escrever uma tal EA, ficar-lhe-ia muito grato.

Agora sobre o assunto:
Compreendo que no meu código do próprio indicador - não são amortecedores de indicador, mas sim conjuntos de amortecedores e você - no Expert Advisor trouxe-os para o indicador.
Por favor, digam-me se acertei?


 
Sprut 185:

Agora, para o assunto:

Compreendi que no meu código do próprio indicador - não estão localizados buffers indicadores, mas sim conjuntos de buffers e você - no Expert Advisor trouxe-os para o indicador.
Por favor aconselhe-me se entendi correctamente?


Sou autodidacta e não sou capaz de o explicar, acabei de seleccionar as funções de que preciso.

Eu basicamente copio os códigos de Vladimir Karputov, muito obrigado! - Se tiver alguma pergunta, ele dir-lhe-á.

Vladimir Karputov
Vladimir Karputov
  • 2021.06.25
  • www.mql5.com
Профиль трейдера
 
SanAlex:

Compreendo que precisa de um indicador para filtrar !

Precisa de passar o seu Expert Advisor através deste filtro

Não me acertaste bem!!!
Razão: