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

 
MrBrooklin:

Bonjour à tous !

Voici une partie du code du script pour Metatrader5 :


Vous avez des questions :

1. Le script est censé définir soit des ordres à cours limité à une certaine distance du ask et du bid, soit des ordres stop. Les ordres limités en attente sont définis sans problème, mais pas les ordres stop. Veuillez m'aider à comprendre pourquoi les ordres d'achat stop et de vente stop en attente ne sont pas définis.

2. Est-il possible de tester le script lorsque le marché est fermé (par exemple, le week-end) ?

Sincèrement, Vladimir.

Référence :Principes généraux - Opérations de trading

Types d'ordres en attente

État actuel du marché

- état actuel du marché

Prévision

- prévisions

Prix actuel

- prix actuel

Prix de la commande

- prix de la commande

Prix auquel l'ordre en attente sera placé

- le prix auquel l'ordre en attente sera placé

Croissance attendue

- croissance attendue

Baisse attendue

- baisse attendue


Votre erreur se situe au niveau de la formation du prix de départ :

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

Je recommande de créer un prix de départ distinct pour les ordres Stop et Limit en attente.

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégie

FAQ des débutants MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.08.31 08:16


Et votre erreur est dans la formation du prix de départ :

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

Je recommande de définir le prix de départ séparément pour les ordres Stop et séparément pour les ordres Limit en attente.

Merci, Vladimir, pour le tuyau.

Que pensez-vous de la possibilité de tester le script lorsque le marché est fermé (par exemple, le week-end) ?

Sincèrement, Vladimir.

 

Que pensez-vous de la possibilité de tester le script lorsque le marché est fermé (par exemple, le week-end) ?



La question est supprimée, car la réponse semble avoir été donnée dans un autre fil.

Respectueusement, Vladimir.

 
MrBrooklin:

Question retirée car la réponse semble avoir été donnée dans un autre fil.

Respectueusement, Vladimir.

Vous avez donc diffusé une question sur tout le forum... C'est vous qui êtes confus.

 
MrBrooklin:

Merci, Vladimir, pour le tuyau.

Que pensez-vous de la possibilité de tester le script lorsque le marché est fermé (par exemple, le week-end) ?

Respectueusement, Vladimir.

Vous ne pouvez pas exécuter le script de trading le week-end. Toutefois, si vous transformez le script en un conseiller expert, vous pouvez le tester.

Mettez OnTick au lieu de OnStart , et mettez les fonctions de commerce dans OnInit. Ce n'est pas très joli, mais cela vous permet de tester le script pendant les week-ends.
 
MrBrooklin:

Merci, Vladimir, pour le tuyau.

Que pensez-vous de la possibilité de tester le script lorsque le marché est fermé (par exemple, le week-end) ?

Respectueusement, Vladimir.

Voici à quoi ressemblera le conseiller expert :

//+------------------------------------------------------------------+
//|                                               Stop and Limit.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Enum Stop or Limit                                               |
//+------------------------------------------------------------------+
enum ENUM_STOP_OR_LIMIT
  {
   stop=0,     // Buy stop and Sell stop
   limit=1     // Buy limit and Sell limit
  };
//--- input parameters
input ushort               InpUpGap          = 15;    // Gap for pending orders UP from the current price (in points)
input ushort               InpUpStep         = 30;    // Step between orders UP (in points)
input ushort               InpDownGap        = 15;    // Gap for pending orders DOWN from the current price (in points)
input ushort               InpDownStep       = 30;    // Step between orders DOWN (in points)
input ENUM_STOP_OR_LIMIT   InpPending        = stop;  // Type of pending orders
input uchar                InpUpQuantity     = 1;     // UP quantity orders
input uchar                InpDownQuantity   = 1;     // DOWN quantity orders
input double               InpLots           = 0.01;  // Lots
input ushort               InpStopLoss       = 50;    // Stop Loss (in points)
input ushort               InpTakeProfit     = 50;    // Take Profit (in points)
//---
ulong       m_slippage     = 30;    // slippage

double      ExtUpGap       = 0.0;
double      ExtUpStep      = 0.0;
double      ExtDownGap     = 0.0;
double      ExtDownStep    = 0.0;
double      ExtStopLoss    = 0.0;
double      ExtTakeProfit  = 0.0;
double      m_adjusted_point;       // point value adjusted for 3 or 5 points
bool        m_first_start  = false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!m_symbol.Name(Symbol())) // sets symbol name
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");
      return(INIT_FAILED);
     }
   RefreshRates();
//--- 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;

   ExtUpGap       =  InpUpGap       * m_adjusted_point;
   ExtUpStep      =  InpUpStep      * m_adjusted_point;
   ExtDownGap     =  InpDownGap     * m_adjusted_point;
   ExtDownStep    =  InpDownStep    * m_adjusted_point;
   ExtStopLoss    =  InpStopLoss    * m_adjusted_point;
   ExtTakeProfit  =  InpTakeProfit  * m_adjusted_point;
//--- check the input parameter "Lots"
   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      //--- when testing, we will only output to the log about incorrect input parameters
      if(MQLInfoInteger(MQL_TESTER))
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_FAILED);
        }
      else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_PARAMETERS_INCORRECT);
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(m_first_start)
      return;
//---
   if(!RefreshRates())
      return;
//--- start work
   double start_price_ask=0.0;
   double start_price_bid=0.0;
   if(InpPending==stop)
     {
      start_price_ask=m_symbol.Ask()+ExtUpGap;
      start_price_bid=m_symbol.Bid()-ExtDownGap;
     }
   else
      if(InpPending==limit)
        {
         start_price_ask=m_symbol.Ask()-ExtUpGap;
         start_price_bid=m_symbol.Bid()+ExtDownGap;
        }
//--- set pending orders
   for(int i=0; i<InpUpQuantity; i++)
     {
      double price_ask = start_price_ask+i*ExtUpStep;
      double price_bid = start_price_bid+i*ExtUpStep;
      if(InpPending==stop)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyStop(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                         m_symbol.NormalizePrice(sl),
                         m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellLimit(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                           m_symbol.NormalizePrice(sl),
                           m_symbol.NormalizePrice(tp));
        }
     }

//--- set pending orders
   for(int i=0; i<InpDownQuantity; i++)
     {
      double price_ask = start_price_ask-i*ExtDownStep;
      double price_bid = start_price_bid-i*ExtDownStep;
      if(InpPending==limit)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
//---
   m_first_start=true;
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: ","RefreshRates error");
      return(false);
     }
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: ","Ask == 0.0 OR Bid == 0.0");
      return(false);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Check the correctness of the position volume                     |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &error_description)
  {
//--- minimal allowed volume for trade operations
   double min_volume=m_symbol.LotsMin();
   if(volume<min_volume)
     {
      if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")
         error_description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      else
         error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }
//--- maximal allowed volume of trade operations
   double max_volume=m_symbol.LotsMax();
   if(volume>max_volume)
     {
      if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")
         error_description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      else
         error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }
//--- get minimal step of volume changing
   double volume_step=m_symbol.LotsStep();
   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")
         error_description=StringFormat("Объем не кратен минимальному шагу SYMBOL_VOLUME_STEP=%.2f, ближайший правильный объем %.2f",
                                        volume_step,ratio*volume_step);
      else
         error_description=StringFormat("Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f",
                                        volume_step,ratio*volume_step);
      return(false);
     }
   error_description="Correct volume value";
   return(true);
  }
//+------------------------------------------------------------------+
Dossiers :
 

Vladimir Karputov, 2019.08.31 13:20

Voici à quoi ressemblerait un expert :



Super !

Merci, Vladimir, tu m'as aidé, sinon j'aurais souffert jusqu'à lundi.

Salutations, Vladimir.

 
MrBrooklin:

Super !

Merci, Vladimir, vous m'avez aidé, sinon j'aurais dû souffrir jusqu'à lundi.

Meilleures salutations, Vladimir.

Vous êtes les bienvenus.

Notez la variable m_first_start déclarée dans le niveau global du programme

bool        m_first_start  = false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()

à la fin de OnTick, cette variable recevra la valeur "true".

//---
   m_first_start=true;
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {

et l'EA ne placera plus d'ordres en attente jusqu'à son prochain redémarrage.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(m_first_start)
      return;
 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégie

FAQ des débutants MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.08.31 14:38

S'il vous plaît.

Notez la variable m_first_start déclarée au niveau du programme global.

Oui, Vladimir, j'ai tout de suite remarqué que l'EA fonctionne comme un script lorsqu'il est testé. Merci encore une fois !

Sincèrement, Vladimir.

 

Pourquoi la sortie de la bougie ne fonctionne-t-elle pas ?


#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   1

#property indicator_label1  "SecondInstrument"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrBlack, clrGreen, clrRed
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 

double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

string symbol = "GBPJPY.m";
int barsToBuid = 100;
int deviation = 0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,OBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,HBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,LBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,CBuffer,INDICATOR_DATA);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); 
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close"); 
   IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_CANDLES("+symbol+")");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]){
                
   for(int i=0;i<barsToBuid;i++){
      OBuffer[i] = iOpen(symbol, PERIOD_CURRENT, i) + deviation*_Point;
      HBuffer[i] = iHigh(symbol, PERIOD_CURRENT, i) + deviation*_Point;
      LBuffer[i] = iLow(symbol, PERIOD_CURRENT, i) + deviation*_Point;
      CBuffer[i] = iClose(symbol, PERIOD_CURRENT, i) + deviation*_Point;
      
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
Raison: