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

 
Kira27:

S'il vous plaît, dites-moi de quelle classe vous devez hériter pour utiliser toutes les méthodes de ces classes.

d'utiliser toutes les méthodes de ces classes à l'intérieur de votre classe, sans création d'objets à l'intérieur de votre classe ?

L'héritage consiste à créer une classe.

 

Bonjour à tous !
J'ai un indicateur - écrit en mql5 que je voudrais utiliser pour créer un EA.
Lorsque je crée un EA, je ne trouve pas les tampons dont j'ai besoin, c'est comme si je ne les avais pas du tout.
C'est comme ça que je fais :

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

Quelle que soit la façon dont je modifie ou ajoute une ligne iCustom, j'obtiens toujours la même chose dans le journal :

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

Et le commentaire : 1.00000 et encore 1.00000.

Aidez-moi à comprendre - est-il adapté à la création d'une EA, ou dois-je l'affiner, ou peut-être fais-je quelque chose de mal ?


Dossiers :
StepMA_NRTR.mq5  13 kb
 

Dans MT5, il est utilisé différemment. Consultez l'exemple dans l'aide.

iCustom

Renvoie le handle de l'indicateur personnalisé spécifié.

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

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

Dans MT5, il est utilisé différemment. Consultez l'exemple dans l'aide.

iCustom

Renvoie le handle de l'indicateur personnalisé spécifié.

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

J'ai déjà lu cette documentation, mais je ne sais pas vraiment où..... ou comment mettre le numéro du tampon et de la fiche ?

Je commence tout juste à programmer et je vous demande d'être indulgent avec moi.

Je commence à soupçonner que cela nécessite une fonction supplémentaire

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

Veuillez expliquer.... où .... et comment.... ?

 
Sprut 185:

Bonjour à tous !
J'ai un indicateur - écrit en mql5 que je voudrais utiliser pour créer un EA.
Lorsque je crée un EA, je ne trouve pas les tampons dont j'ai besoin, c'est comme si je ne les avais pas du tout.
C'est comme ça que je fais :

Quelle que soit la façon dont je modifie ou ajoute une ligne iCustom, j'obtiens toujours la même chose dans le journal :

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

Et le commentaire : 1.00000 et encore 1.00000.

Aidez-moi à comprendre - est-il adapté à la création d'une EA, ou dois-je l'affiner, ou peut-être fais-je quelque chose de mal ?


Code :

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

Résultat :


Dossiers :
 
Sprut 185:

Bonjour à tous !
J'ai un indicateur - écrit en mql5 - que je voudrais utiliser pour créer un EA.

Je l'ai fait ici - cela semble fonctionner ! (où le jaune est pour les tampons)

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

J'ai également besoin d'un stop loss(je n'ai pas réussi à comprendre pourquoi il a fermé immédiatement).

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:

Je commence à soupçonner que cela nécessite une fonction supplémentaire

C'est vrai. Vous connectez l'indicateur dans OnInit, y définissez les paramètres et obtenez son handle. Et ensuite utiliser le CopyBuffer.


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

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

Je l'ai fait - il semble que cela fonctionne ! (où le jaune représente les tampons)

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

Il s'avère que j'ai besoin d'un stop loss - (je ne pouvais pas comprendre pourquoi il a fermé immédiatement) j'ai ajouté un stop loss.



Merci beaucoup ! !!

Vous avez fait un bon travail, mais je suis intéressé par un algorithme complètement différent pour l'EA. Je voudrais utiliser une simple Martingale (tamis) avec ces paramètres personnalisables :

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 ; // Идентификатор ордера (Магик №)

mais ajoutez-y l'indicateur que j'ai mis - ci-dessus. Et utilisez-le comme un déclencheur (false - fonctionne uniquement en SHORT et true - fonctionne uniquement en LONG).

J'ai choisi cet indicateur - seulement parce qu'il fonctionne comme les Moyennes Mobiles, mais il a quelques filtres de lissage et des points de changement de direction de prix, qui peuvent être utilisés comme un déclencheur pour que l'EA travaille seulement sur la tendance en utilisant les paramètres de profit du menu.

Et dès que le take profit est fermé, nous ouvrons l'ordre suivant dans la même direction (dans la tendance), jusqu'à ce que la tendance soit terminée et que notre déclencheur soit inversé. Si un ordre apparaît hors tendance (au moment où la tendance passe d'un état à un autre), nous devons utiliser Martins avec les paramètres du menu correspondant.

Si vous souhaitez contribuer à la rédaction d'une telle évaluation, je vous en serais très reconnaissant.

Maintenant sur le sujet :
Je comprends que dans mon code de l'indicateur lui-même - ce ne sont pas des tampons d'indicateur, mais des tableaux de tampons et vous - dans le Conseiller Expert les avez amenés dans l'indicateur.
S'il vous plaît, dites-moi si j'ai bien compris ?


 
Sprut 185:

Passons maintenant au sujet :

J'ai compris que dans mon code de l'indicateur lui-même - les tampons de l'indicateur ne sont pas situés, mais des tableaux de tampons et vous - dans le Conseiller Expert les avez amenés à l'indicateur.
Veuillez me dire si j'ai bien compris.


Je suis autodidacte et je ne suis pas en mesure de l'expliquer, j'ai juste sélectionné les fonctions dont j'ai besoin.

Je copie essentiellement les codes de Vladimir Karputov, merci beaucoup ! - Si vous avez des questions, il vous les posera.

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

Je comprends que vous ayez besoin d'un indicateur pour filtrer !

Vous devez faire passer votre conseiller expert par ce filtre.

Vous ne m'avez pas bien compris ! !!
Raison: