Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1117

 
MrBrooklin:

¡Buenos días a todos!

Aquí está parte del código del script para Metatrader5:


Tienes preguntas:

1. Se supone que el script debe establecer órdenes limitadas pendientes a una determinada distancia de la oferta y la demanda, o bien órdenes stop. Las órdenes pendientes de límite se fijan sin problemas pero las de stop no. Por favor, ayúdenme a averiguar por qué no se establecen las órdenes pendientes de Buy Stop y Sell Stop.

2. ¿Hay alguna posibilidad de probar el script cuando el mercado está cerrado (por ejemplo, los fines de semana)?

Sinceramente, Vladimir.

Referencia:Principios generales - Operaciones comerciales

Tipos de órdenes pendientes

Estado actual del mercado

- estado actual del mercado

Previsión

- previsión

Precio actual

- precio actual

Precio del pedido

- precio del pedido

Precio al que se colocará la orden pendiente

- precio al que se colocará la orden pendiente

Crecimiento previsto

- crecimiento previsto

Caída esperada

- disminución prevista


Su error está en la formación del precio de salida:

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

Recomiendo hacer un precio inicial separado para las órdenes pendientes de Stop y Límite.

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

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

FAQ de principiantes MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.08.31 08:16


Y su error está en la formación del precio de salida:

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

Recomiendo hacer el precio de salida por separado para las órdenes pendientes de Stop y por separado para las de Límite.

Gracias, Vladimir, por el consejo.

¿Qué opinas de la posibilidad de probar el script cuando el mercado está cerrado (por ejemplo, los fines de semana)?

Sinceramente, Vladimir.

 

¿Qué opinas de la posibilidad de probar el script cuando el mercado está cerrado (por ejemplo, los fines de semana)?



Se elimina la pregunta, ya que la respuesta parece haberse dado en otro hilo.

Respetuosamente, Vladimir.

 
MrBrooklin:

Pregunta retirada ya que la respuesta parece haberse dado en otro hilo.

Respetuosamente, Vladimir.

Así que has repartido una pregunta por todo el foro... Tú eres el que está confundido.

 
MrBrooklin:

Gracias, Vladimir, por el consejo.

¿Qué opinas de la posibilidad de probar el script cuando el mercado está cerrado (por ejemplo, los fines de semana)?

Respetuosamente, Vladimir.

No se puede ejecutar el script de trading los fines de semana. Sin embargo, si convierte el script en un Asesor Experto, puede probarlo.

Poner OnTick en lugar de OnStart , y poner las funciones de comercio en OnInit. No es muy bonito, pero te permite probar el script los fines de semana.
 
MrBrooklin:

Gracias, Vladimir, por el consejo.

¿Qué opinas de la posibilidad de probar el script cuando el mercado está cerrado (por ejemplo, los fines de semana)?

Respetuosamente, Vladimir.

Así es como se verá el Asesor Experto:

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

Vladimir Karputov, 2019.08.31 13:20

Este es el aspecto de un experto:



¡Genial!

Gracias, Vladimir, me has ayudado, o habría sufrido hasta el lunes.

Saludos, Vladimir.

 
MrBrooklin:

¡Genial!

Gracias, Vladimir, me has ayudado, o habría tenido que sufrir hasta el lunes.

Saludos cordiales, Vladimir.

De nada.

Observe la variable m_first_start declarada en el nivel global del programa

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

al final de OnTick, a esta variable se le asignará el valor "true"

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

y el EA dejará de colocar órdenes pendientes hasta su próximo reinicio

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

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

FAQ de principiantes MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.08.31 14:38

Por favor.

Observe la variable m_first_start declarada a nivel global del programa

Sí, Vladimir, me di cuenta de inmediato que el EA funciona como un script cuando se prueba. Gracias una vez más.

Sinceramente, Vladimir.

 

¿Por qué no funciona la salida de la vela?


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