Scripts: Pending orders DOWN - página 3

 
Михаил Рымарь:

Hola, el script es realmente grande y el único en MQ5, pero me gustaría tener en mi arsenal de la misma, pero con un lote, digamos 1 o 0,5.

Gracias por su trabajo y felices fiestas.

En esta serie fue originalmente la idea de utilizar el lote mínimo. Por lo tanto, por ahora sólo hasta ahora.

 
Hola Señor. Me puede ayudar un poco. ¿Cómo puedo ajustar el código a mi tamaño de lote deseado. He intentado varias veces cambiando los inplots: 5 pero todavia el valor del lote cuando lo ejecuto se convierte en 0.01, soy novato, espero que haya una manera de cambiarlo. Gracias
//+------------------------------------------------------------------+
//|Órdenes pendientes ABAJO.mq5
//|Copyright © 2017, Vladimir Karputov ||
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.002"
#property description "The script sets the pending orders down from the price"
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CTrade         m_trade;                      // objeto comercial
CSymbolInfo    m_symbol;                     // objeto de información de símbolos
//+------------------------------------------------------------------+
//| Enum órdenes pendientes DOWN|
//+------------------------------------------------------------------+
enum ENUM_PENDING_ORDERS_DOWN
  {
   buy_limit         =0,   // Límite de compra
   sell_stop         =3    // Tope de venta
  };
//--- parámetros de entrada
input ushort                     InpDownGep        = 10;             // Gap para órdenes pendientes hacia ABAJO desde el precio actual (en pips)
input ushort                     InpDownStep       = 3;             // Paso entre órdenes ABAJO (en pips)
input ENUM_PENDING_ORDERS_DOWN   InpDownOrders     = buy_limit;      // Tipo de órdenes pendientes DOWN
input uchar                      InpDownQuantity   = 33;              // Cantidad ABAJO
input double                     InpLots           = 5;            // Lotes
input ushort                     InpStopLoss       = 100;             // Stop Loss (en pips)
input ushort                     InpTakeProfit     = 100;             // Take Profit (en pips)
//---
ulong                            m_slippage=1;                      // deslizamiento
double                           m_adjusted_point;                   // valor del punto ajustado a 3 ó 5 puntos
double                           ExtDownGep=0.0;
double                           ExtDownStep=0.0;
double                           ExtStopLoss=0.0;
double                           ExtTakeProfit=0.0;
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(InpLots<=0.0)
     {
      Print("The \"Lots\" can't be smaller or equal to zero");
      return;
     }
//---
   if(!m_symbol.Name(Symbol())) // establece el nombre del símbolo
      return;
   if(!RefreshRates())
      return;

   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      Print(err_text);
      return;
     }
//---
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---
   m_trade.SetDeviationInPoints(m_slippage);
   m_trade.SetAsyncMode(true);
//--- sintonización para 3 o 5 dígitos
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtDownGep     = m_adjusted_point * InpDownGep;
   ExtDownStep    = m_adjusted_point * InpDownStep;
   ExtStopLoss    = m_adjusted_point * InpStopLoss;
   ExtTakeProfit  = m_adjusted_point * InpTakeProfit;
//--- empezar a trabajar
   double start_price_ask=m_symbol.Ask()-ExtDownGep;
   double start_price_bid=m_symbol.Bid()-ExtDownGep;
//--- ordenes pendientes ABAJO
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMax(),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(m_symbol.LotsMax(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }
//+------------------------------------------------------------------+
//| Actualiza los datos de las cotizaciones de los símbolos|
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- frecuencias de actualización
   if(!m_symbol.RefreshRates())
      return(false);
//--- protección contra el valor de retorno de "cero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Comprobar la corrección del volumen de pedidos |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &error_description)
  {
//--- volumen mínimo permitido para operaciones comerciales
   double min_volume=m_symbol.LotsMin();
   if(volume<min_volume)
     {
      error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- volumen máximo permitido de operaciones comerciales
   double max_volume=m_symbol.LotsMax();
   if(volume>max_volume)
     {
      error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- obtener el paso mínimo de cambio de volumen
   double volume_step=m_symbol.LotsStep();

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      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);
  }
//+------------------------------------------------------------------+ 
//| Comprueba si el modo de llenado especificado está permitido || 
//+------------------------------------------------------------------+ 
bool IsFillingTypeAllowed(int fill_type)
  {
//--- Obtener el valor de la propiedad que describe los modos de llenado permitidos 
   int filling=m_symbol.TradeFillFlags();
//--- Devuelve true, si el modo fill_type está permitido 
   return((filling & fill_type)==fill_type);
  }
//+------------------------------------------------------------------+

 
Mjame116 :
Hola Señor. Me puede ayudar un poco. ¿Cómo puedo ajustar el código a mi tamaño de lote deseado. He intentado varias veces cambiando los inplots: 5 pero aún así el valor de los lotes cuando lo ejecute se convierten en 0,01, soy novato, hopefull hay una manera para mí para cambiarlo. Gracias

Es necesario en lugar del lote mínimo poner el parámetro de entrada Lots

//--- ordenes pendientes ABAJO
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),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(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }

es necesario hacer esto:

//--- ordenes pendientes ABAJO
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_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));
        }
     }
  }
 
Vladimir Karputov:

Es necesario en lugar del lote mínimo poner el parámetro de entrada Lots

es necesario:

Muchas gracias señor, realmente lo aprecio
 

Hola, el script es genial y funciona bien.

Estoy usando el mismo para colocar la red, y me gustaría preguntarte: ¿podrías combinarlos en uno solo? Me refiero a un script que coloque las redes de orden ascendente y descendente al mismo tiempo, con los mismos parámetros para las redes largas y cortas.

 
mason_one:

Hola, el script es genial y funciona bien.

Estoy usando el mismo para colocar la red, y me gustaría preguntarte: ¿podrías combinarlos en uno solo? Me refiero a un script que coloque las redes de orden ascendente y descendente al mismo tiempo, con los mismos parámetros para las redes largas y cortas.

Gracias por su interés. Estoy publicando un script (no un Asesor Experto) que coloca una red de órdenes pendientes tanto al alza como a la baja - Pending orders UP DOWN.

 
Hola Vladimir, muy interesante tu script. funciona muy bien pero espero me puedas ayudar diciéndome como le cambio el lotaje de 0,01 a 0,03. Quedo atento y de antemano muchas gracias amigo
 
Carlos Devia :
Hola Vladimir, muy interesante tu script. funciona muy bien pero espero me puedas ayudar diciéndome como le cambio el lotaje de 0,01 a 0,03. Quedo atento y de antemano muchas gracias amigo

En este código, en lugar de "m_symbol.LotsMin()" pon "InpLots":

//--- pending orders DOWN
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),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(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
 

Querido Vladimir, en este momento eres como un dios para mi. No sabes cuanto he buscado esto, agradezco mucho que hayas te hayas tomado el tiempo para responderme. Soy una persona apasionada por el trading y lo poco que se lo he aprendido de personas como tu. 

Quiero hacerte la ultima pregunta si es posible. programe un hotkey en mi teclado

para que se activara mi orden de sell stop, pero antes de activarse se me abre una ventana, la cual me gustaría no se abriera, sino que simplemente se ejecutara mi orden inmediatamente.

adjunto imagen de la ventana que se abre.

Agradecería tu amable ayuda Vladimir para que no me apareciera esa ventana. ya que cuando se abre debo "aceptar"los parámetros y pierdo tiempo en ese proceso.

Archivos adjuntos:
 
Carlos Devia :

Querido Vladimir, en este momento eres como un dios para mi. No sabes cuanto he buscado esto, agradezco mucho que hayas te hayas tomado el tiempo para responderme. Soy una persona apasionada por el trading y lo poco que se lo he aprendido de personas como tu. 

Quiero hacerte la ultima pregunta si es posible. programe un hotkey en mi teclado

para que se activara mi orden de sell stop, pero antes de activarse se me abre una ventana, la cual me gustaría no se abriera, sino que simplemente se ejecutara mi orden inmediatamente.

adjunto imagen de la ventana que se abre.

Agradecería tu amable ayuda Vladimir para que no me apareciera esa ventana. ya que cuando se abre debo "aceptar"los parámetros y pierdo tiempo en ese proceso.

Una tecla de acceso directo no es una opción: de todos modos, al inicio, los parámetros de entrada serán visibles.

Sugeriría otra forma:

  • escribe un asesor - un panel, en el panel de todo lo que tiene un botón "Inicio"
  • cuando inicia el asesor, una vez que establece los parámetros de entrada
  • después del lanzamiento, se cuelga un pequeño panel en el gráfico: cuando hace clic en el botón "Inicio" en este panel, se realizarán los pedidos pendientes (todos los parámetros se tomarán de los parámetros de entrada.

Ejemplo de panel:

  


Puede buscar dicho panel en Market o pedirlo en el servicio Freelance.