Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 500

 
Konstantin Seredkin:

Stavo solo facendo un esempio, ci sono un sacco di altri algoritmi che sarebbe bene mettere su questo pulsante, lo spread si è allargato, il pulsante è stato premuto, un messaggio di testo è arrivato al mio telefono dicendo che il robot è fermo o 4 robot stanno facendo trading sul conto, il 5° controlla il margine del conto, quando il margine scende al valore impostato, si taglia l'auto-trading e tutti i robot fanno schifo fino a quando non vengo a vedere cosa e dove sta andando il drawdown.Ma la rimozione di un robot dal grafico è un cannone contro un coniglio... Il pulsante è una soluzione complessa che permette di uccidere tutti i robot con un algoritmo predeterminato.

Ho visto una soluzione per mql5 da qualche parte, ma non riesco a trovarla.

È quello che ho detto - è una soluzione radicale. La soluzione corretta è quella di cambiare il codice dell'Expert Advisor in modo che, nel caso di determinate circostanze, non esegua le azioni di trading e tutto ciò che è collegato ad esse. Per esempio, il controllo della diffusione è elementare:

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

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

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

Beh, il pulsante AutoTrade può essere premuto/sbloccato emulando Ctrl+E. Ma, come ho detto, questo è con l'aiuto di 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:

Beh, il pulsante AutoTrade può essere premuto/sbloccato emulando Ctrl+E. Ma, come ho detto, questo sta già usando WinAPI:

Grazie! E come si può rendere triste una faccia sorridente)?

 
Ihor Herasko:

Beh, il pulsante AutoTrade può essere premuto/sbloccato emulando Ctrl+E. Ma, come ho detto, questo è con WinAPI:

Esattamente, e pensavo che fosse un metodo dolorosamente semplice e mi sono completamente dimenticato di questa libreria. Grazie, ora possiamo fare quello che vogliamo

 

Fatto script MQL4 (codice sotto) che disegna rettangoli (foto sotto), ma ecco il problema. Per la linea tratteggiata STYLE_DOT funziona solo la larghezza 1, e con 2 o più viene disegnata una linea continua. Potete dirmi dov'è il mio errore o c'è qualcosa che ci viene nascosto?

#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:

Fatto script MQL4 (codice sotto) che disegna rettangoli (foto sotto), ma ecco il problema. Per la linea tratteggiata STYLE_DOT funziona solo la larghezza 1, e con 2 o più viene disegnata una linea continua. Potete dirmi dov'è il mio errore o c'è qualcosa che ci viene nascosto?

E disegnare manualmente e cambiare lo stile e lo spessore provato? E quale conclusione si può trarre da questi esperimenti?
 
Artyom Trishkin:
Hai provato a disegnare manualmente e a cambiare lo stile e lo spessore? E quale conclusione si può trarre da questi esperimenti?

Credo di aver trovato la risposta. Qui dice che "Stile di linea. Si usa solo quando lo spessore della linea è 0 o 1". Questo deve essere il motivo per cui le linee di larghezza 2 e più non funzionano con linee che non siano solide.

 
Maxim Khrolenko:

Credo di aver trovato la risposta. Qui dice che "Stile di linea. Usato solo quando lo spessore della linea è 0 o 1". Questo deve essere il motivo per cui le linee diverse da quelle solide non funzionano con uno spessore di 2 o più.

Esattamente giusto. Ci sono stato anch'io.

 

Signori, per favore consigliatemi, ho preso una funzione da Kim che restituisce il numero di barra dell'ultima posizione aperta 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));
  }

Chiamo questa funzione e scrivo una condizione

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

Ho dato un'occhiata a Print e vedo che questa funzione restituisce -1, all'inizio pensavo che non ci fosse nessun ordine ma dopo un po' l'ordine è riapparso e sulla stessa barra è stata aperta un'operazione dopo lo stop.

 
Buon pomeriggio. Sapete se è possibile in MT4 e MT5 sovrapporre i grafici di uno strumento con diversi TF, così come gli indicatori per questi TF? Per esempio, voglio visualizzare in una finestra 3 grafici della coppia EUR/USD con TF: giorno, 4 ore e ora, e anche sovrapporre gli indicatori scorrevoli di questi TF. È possibile? Sarò felice per qualsiasi aiuto.
Motivazione: