Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 950

 
Rustam Bikbulatov:

Esta función escribe un número en cada pedido, o más bien lote*100.

Ahora necesitamos una función inversa que muestre cuál fue el último número

Pruébalo:

double value = StringToDouble(ObjectGetString(0,object_name,OBJPROP_TEXT)); 

Si el objeto contiene texto (no numérico), hay que añadir StringSubstr():

double value = StringToDouble( StringSubstr(ObjectGetString(0,object_name,OBJPROP_TEXT),begin_index,length));

begin_index - índice del carácter en la cadena, empezando por cero, length - longitud del valor numérico (cuántos caracteres ocupa el número)... Yo creo que sí

 
Yevhenii Levchenko:

Prueba esto:

Si el objeto tiene texto (no numérico), añada StringSubstr():

begin_index - índice del carácter en la cadena, empezando por cero, length - longitud del valor numérico (cuántos caracteres ocupa el número)... Creo que sí

Bueno, inicialmente habría que buscar todos estos números en el gráfico. Simplemente no funcionará así. Ese es el problema. Ya lo he comprobado.

 
Yevhenii Levchenko:

Prueba esto:

Si el objeto tiene texto (no numérico), añada StringSubstr():

begin_index - índice del carácter en la cadena, empezando por cero, length - longitud del valor numérico (cuántos caracteres ocupa el número)... Yo creo que sí

   bool name;
        for(int i=0; i<ObjectsTotal(0,"LOTB"+OrderTicket(),OBJ_TEXT); i++)
     {
      name = ObjectSetString(0,"LOTB"+OrderTicket(),OBJ_TEXT,0);
      Comment("   ",name); 
   }

Similar a este, pero no funciona, muestra cero.

 
Rustam Bikbulatov:

Como este, pero no funciona. Muestra cero.

¿Quiere fijar un valor o tomar un valor? La función ObjectSetString() establece un valor de texto y devuelve un valor bool. Esto no es así. Y en la cabeza del bucle creo que no es la correcta... Donde ObjectsTotal()... Me guío por la referencia de mt4. ¿O es un código mt5?

 
Yevhenii Levchenko:

¿Necesita fijar un valor o tomar un valor? La función ObjectSetString() establece un valor de texto y devuelve un valor bool. Esto no es así. Y en la cabeza del bucle creo que no está encuadrado correctamente, donde está ObjectsTotal(). Me guío por la referencia de mt4. ¿O es un código mt5?

Esto es MT4.

 

Una vez más, ¡buenos días a todos!

Todavía no estoy satisfecho con la pregunta que he planteado arriba, pero pido ayuda con el código.

Este es el foro para el comercio, los sistemas automatizados de comercio y las pruebas de estrategia.

Cualquier pregunta de novato en MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos

MrBrooklin, 2019.08.30 14:15

¡¡¡Buenos días a todos!!!

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

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---- показывать входные параметры
#property script_show_inputs
//---
#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;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(InpLots<=0.0)
     {
      Print("The \"Lots\" can't be smaller or equal to zero");
      return;
     }
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      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);

//---
   ExtUpGap = m_symbol.Point() * InpUpGap;
   ExtUpStep = m_symbol.Point() * InpUpStep;

   ExtDownGap = m_symbol.Point() * InpDownGap;
   ExtDownStep = m_symbol.Point() * InpDownStep;

   ExtStopLoss = m_symbol.Point() * InpStopLoss;
   ExtTakeProfit = m_symbol.Point() * InpTakeProfit;

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double 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));
        }
     }

   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(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));
        }
     }
  }

El script debe colocar ó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 entender por qué las órdenes pendientes de Buy Stop y Sell Stop no se establecen.

Atentamente, Vladimir.

Sólo para seguir con otra pregunta: ¿hay alguna manera de probar el script cuando el mercado está cerrado (por ejemplo, los fines de semana)?

Sinceramente, Vladimir.

 
Artyom Trishkin:

¿De qué lista?

Y por favor, utilice el estilizador en el editor (Ctrl+<):

¿Qué hay que sacar de dónde?

¿Puedes darme una pista?

 
MrBrooklin:

Una vez más, ¡buenos días a todos!

Nadie ha respondido a la pregunta que planteé antes, pero sigo pidiendo ayuda con el código.

Una pregunta más: ¿hay alguna forma de probar el script cuando el mercado está cerrado (por ejemplo, los fines de semana)?

Sinceramente, Vladimir.

No, el script no funcionará en un mercado cerrado - no colocará órdenes.

Para entender los errores, intente imprimir en el registro el valor del precio contra el que está calculando los niveles de configuración y los valores de todos los niveles de precio que está enviando a la orden de operación.

 
Hola chicos. Hecho de escribir un lote junto a una orden abierta.
for(int no1=0; no1<OrdersTotal(); no1++)
  {
   if(OrderSelect(no1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderType()== OP_BUY)
        {
         ObjectCreate("LOTB"+OrderTicket(),OBJ_TEXT,0,TimeCurrent(),OrderOpenPrice());
         ObjectSetText("LOTB"+OrderTicket(),OrderLots()*100,20,"Arial",clrWheat);
         ObjectSetInteger(0,"LOTB"+OrderTicket(),OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
        }
     }
  } 
¿Puedes decirme cómo tomar el último texto de esta lista en otra parte del código?
 
Rustam Bikbulatov:

¿Puedes darme una pista?

Tienes que encontrar el último pedido que se abrió. Encuentra su billete. A continuación, utilice la lista de nombres de objetos para encontrar la aparición de una subcadena con la entrada encontrada de la última orden en la línea de nombres de objetos. En cuanto el ticket de la última orden se encuentra en el nombre del objeto, éste es el objeto gráfico necesario. Lo único que queda es extraer lo que se necesita de este objeto gráfico.

Razón de la queja: