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

 
Konstantin Seredkin:

Sólo estaba dando un ejemplo, hay un montón de otros algoritmos que sería bueno poner en este botón, se amplió la propagación, el botón fue presionado, un mensaje de texto llegó a mi teléfono diciendo que el robot se detiene o 4 robots están negociando en la cuenta, el 5 º controla el margen de la cuenta, cuando el margen cae al valor establecido, cortamos auto-trading y todos los robots chupar hasta que venga y ver lo que y donde va en un drawdown.El botón es una solución compleja que permite matar a todos los robots mediante un algoritmo predeterminado.

He visto una solución para mql5 en algún sitio, pero no la encuentro.

Eso es lo que he dicho: es una solución radical. La solución correcta es cambiar el código del Asesor Experto para que en el caso de ciertas circunstancias, no realice acciones de comercio y todo lo relacionado con ellas. Por ejemplo, el control de la propagación es elemental:

void OnTick()
{
    double fPoint = Point();
    if (fPoint <= 0.0)
      return;

    int nSpread = int(MathRound((Ask - Bid) / fPoint));
    if (nSpread > 50)
      return;

   ... Действия советника при нормальном спреде
}
 

Bueno, el botón de AutoTrade puede ser presionado/desactivado emulando Ctrl+E. Pero, como he dicho antes, esto es por medio de WinAPI:

#include <WinUser32.mqh>

#define  VK_CONTROL 0x11 
#define  KEY_CODE   'E'


void PressOrReleaseAutotrade()
{
   keybd_event(VK_CONTROL, 0, 0, 0);
   keybd_event(KEY_CODE, 0, 0, 0);
   keybd_event(KEY_CODE, 0, 2, 0);
   keybd_event(VK_CONTROL, 0, 2, 0);   
}
 
Ihor Herasko:

Bueno, el botón de AutoTrade puede ser presionado/desactivado emulando Ctrl+E. Pero, como he dicho, esto ya está usando WinAPI:

¡Gracias! ¿Y cómo puedes hacer que una cara sonriente esté triste?)

 
Ihor Herasko:

Bueno, el botón de AutoTrade puede ser presionado/desactivado emulando Ctrl+E. Pero, como he dicho, esto es con WinAPI:

Exactamente, y pensé que es un método dolorosamente simple y me olvidé de esta biblioteca. Gracias, ahora podemos hacer lo que queremos

 

Hecho MQL4 secuencia de comandos (código de abajo) que dibuja rectángulos (pic abajo), pero aquí está el problema. Para la línea discontinua STYLE_DOT sólo funciona el ancho 1, y con 2 o más se dibuja una línea sólida. ¿Puede decirme dónde está mi error o hay algo que se nos oculta?

#property strict
void OnStart()
  {
//---
   RectCreate("rect1",Time[1],Low[1],Time[10],High[10],clrYellow,STYLE_DOT,  1,  false);
   RectCreate("rect2",Time[11],Low[11],Time[20],High[20],clrRed, STYLE_DOT,  2,  false);
//---
   Sleep(20*1000);
   ObjectsDeleteAll(0);
  }
//--- Function creates rectangle
void RectCreate(const string           f_name,     // rectangle name
                datetime               f_time1,    // first point time
                double                 f_price1,   // first point price
                datetime               f_time2,    // second point time
                double                 f_price2,   // second point price
                const color            f_color,    // rectangle color
                const ENUM_LINE_STYLE  f_style,    // style of rectangle lines
                const int              f_width,    // width of rectangle lines
                const bool             f_fill)     // filling rectangle with color

  {
   if(ObjectCreate(0,f_name,OBJ_RECTANGLE,0,f_time1,f_price1,f_time2,f_price2))
     {
      ObjectSetInteger(0,f_name,OBJPROP_COLOR,f_color);
      ObjectSetInteger(0,f_name,OBJPROP_STYLE,f_style);
      ObjectSetInteger(0,f_name,OBJPROP_WIDTH,f_width);
      ObjectSetInteger(0,f_name,OBJPROP_FILL,f_fill);
      ObjectSetInteger(0,f_name,OBJPROP_BACK,false);
      ObjectSetInteger(0,f_name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,f_name,OBJPROP_SELECTED,false);
     }
  }

 
Maxim Khrolenko:

Hecho MQL4 secuencia de comandos (código de abajo) que dibuja rectángulos (pic abajo), pero aquí está el problema. Para la línea discontinua STYLE_DOT sólo funciona el ancho 1, y con 2 o más se dibuja una línea sólida. ¿Puede decirme dónde está mi error o hay algo que se nos oculta?

¿Y dibujar manualmente y cambiar el estilo y el grosor intentado? ¿Y qué conclusión se puede sacar de estos experimentos?
 
Artyom Trishkin:
¿Has probado a dibujar manualmente y cambiar el estilo y el grosor? ¿Y qué conclusión se puede sacar de estos experimentos?

Creo que he encontrado la respuesta. Aquí dice que "Estilo de línea. Sólo se utiliza cuando el grosor de la línea es 0 o 1". Esta debe ser la razón por la que las líneas de ancho 2 y más no funcionan con líneas que no sean sólidas.

 
Maxim Khrolenko:

Creo que he encontrado la respuesta. Aquí dice que "Estilo de línea. Sólo se utiliza cuando el grosor de la línea es 0 o 1". Esta debe ser la razón por la que las líneas que no son sólidas no funcionan con un grosor de 2 o más.

Exactamente. Yo también he pasado por eso.

 

Señores, por favor aconsejen, tomé una función de Kim que devuelve el número de barra de la última posición abierta o -1.

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot;
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime();
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, True));
  }

Llamo a esta función y escribo una condición

if(Open[2]>Close[2] && Open[1]>Close[1] && Close[1]<Low[2])
     {

      Comment("цена входа = ",DoubleToStr(Low[2],Digits));
      if(NumberOfBarOpenLastPos("",0,-1,-1)!=0)//вызвал здесь

         ticket=OrderSend(Symbol(),OP_SELLLIMIT,0.1,Low[2],2,0,0,magic,0);
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

         TP=NormalizeDouble(OrderOpenPrice()-tp*Point,Digits);
      SL=NormalizeDouble(OrderOpenPrice()+sl*Point,Digits);
      modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
      }

He mirado a través de Print y veo que esta función devuelve -1, al principio pensé que no había orden pero al cabo de un rato volvió a aparecer la orden y en la misma barra se abrió una operación después del stop.

 
Buenas tardes. ¿Saben si es posible en MT4 y MT5 superponer los gráficos de un instrumento con diferentes TF, así como los indicadores para estos TF? Por ejemplo, quiero mostrar en una ventana 3 gráficos del par EUR/USD con TFs: día, 4 horas y hora, y también superponer los indicadores deslizantes de estos TFs. ¿Es posible? Estaré encantado de recibir cualquier ayuda.
Razón de la queja: