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

 
Vadim Novikov:

Buon pomeriggio a tutti quelli che ci tengono!


Sono un utente avanzato, ma non scrivo molto spesso, ecco perché. Non riesco a stare al passo con alcune innovazioni e a volte mi dimentico delle cose.


Per favore aiutatemi con una domanda, non riesco a ricordare una cosa.


Ecco la situazione: ho definito delle variabili esterne, ne ho definite molte, 20 variabili.Vengono visualizzati nel menu di input del programma, quando si collega questo programma al grafico.


Ecco la domanda: come si fa a separare i blocchi di queste variabili con dei commenti? Nel menu di inserimento, per esempio:


Questo è un blocco per cambiare le variabili MA (commento)

Periodo MA

Metodo di regolazione MA

Prezzo MA

Questo è un blocco per cambiare le variabili MACD (commento)

..........................

...........................

...........................

Questo è un blocco per cambiare le variabili BB (commento)

.........................

..............................

...........................


Sembra che prima ho inserito tali commenti con la funzione di commento del codice.Cioè, ho scritto // o /* */. Ma ora qualcosa non funziona.

   extern string     a1             = "Это  блок  по  изменению   переменных   MA (комментарий)";
   ..............
   ..............
   ..............
   extern string     a2             = "Это  блок  по  изменению  переменных   MACD (комментарий)";

Come questo

 
OrderStopLoss() produce due cifre decimali, posso forzarlo a produrre tre cifre decimali?
 
Alekseu Fedotov:

Come questo.

Grazie, questo mi ricorda!!!

 
Igor Golieniev:

Prova così:

Print("SL: ", DoubleToString(OrderStopLoss(), Digits()));

Questo è per mostrare tutte le cifre significative della citazione. Se è necessario un altro numero di cifre, sostituire Digits() con un numero specifico.

 
Buona sera, qualche consiglio per favore. Nella funzione OnInit crea due linee orizzontali, in OnTick due funzioni, una invia una notifica push e mail se Bid > prima linea, la seconda se Bid < seconda linea. Bid=line non l'ha fatto, per evitare lacune. Naturalmente, ho anche affrontato il fatto che se la condizione è soddisfatta, la notifica arriva ad ogni spunta, il che è male. Come risolvere questo problema? È possibile impostare il timeout o il numero di notifiche nelle impostazioni Standard Alert.
 
Ihor Herasko:

Prova così:

Questo è per mostrare tutte le cifre significative della citazione. Se avete bisogno di un qualsiasi altro numero di cifre, sostituite Digits() con un numero specifico.

Ora stampa correttamente 15.155, tuttavia - stoploss non valido per la funzione OrderModify

Questo problema è solo con Silver in OrderModify

void Trailing()
  {
   if(Digits==3 || Digits==5)
     {
      TrailingStep *= 10;
      TrailingOpen *= 10;
      TrailingStop *= 10;
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>OrderOpenPrice()+TrailingOpen*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),0,0))
                        Print("Oshibka =", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Ask<OrderOpenPrice()-TrailingOpen*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),0,0))
                        Print("Oshibka", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
           }
        }
     }
  }
 
Igor Golieniev:

Ora stampa correttamente 15.155 in Print, tuttavia - stoploss non valido per la funzione OrderModify

Questo problema è solo con Silver in OrderModify

In questo codice si possono notare due errori:

  1. Mancanza di controllo della dimensione minima consentita per lo stop (si chiama Stop Level).
  2. Confronto errato tra numeri reali.

Per risolvere il primo problema abbiamo bisogno di ottenere l'attuale Stop Level:

double fStopLevel = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL) * Point();

Se fStopLevel risulta essere zero e il tipo di conto non è ECN, allora fStopLevel dovrebbe essere forzato ad essere uguale a tre spread.

Prima di impostare gli stop (sia Stop Loss che Take Profit) controlla che il nuovo livello sia uguale o superiore allo Stop Level dal prezzo di chiusura dell'ordine. Per controllare lo stop per un ordine di acquisto si procede come segue:

if (Bid - fNewSL - fStopLevel < -Point() / 10)
{
  // Такой стоп ставить нельзя. Ближайший возможный уровень: Bid - fStopLevel
}

Per un ordine di vendita stop:

if (fNewSL - Ask - fStopLevel < -Point() / 10)
{
   // Stop Loss на цене fNewSL ставить нельзя. Ближайший возможный уровень: Ask + fStopLevel
}


La soluzione al secondo problema: confrontare i valori reali con una certa precisione, poiché l'uguaglianza dei numeri reali non può essere raggiunta sempre e ovunque. Ho già dato un esempio di confronto sopra nel codice della convalida del livello di stop.

 
Ihor Herasko:

Ci sono due errori in questo codice che colpiscono:

  1. Mancanza di controllo sulla dimensione minima consentita per lo stop (chiamata Stop Level).
  2. Confronto errato tra numeri reali.

Per risolvere il primo problema abbiamo bisogno di ottenere l'attuale Stop Level:

Se fStopLevel risulta essere zero e il tipo di conto non è ECN, allora fStopLevel dovrebbe essere forzato ad essere uguale a tre spread.

Prima di impostare gli stop (sia Stop Loss che Take Profit) controlla che il nuovo livello sia uguale o superiore allo Stop Level dal prezzo di chiusura dell'ordine. Per controllare lo stop per un ordine di acquisto si procede come segue:

Per un ordine di vendita stop:


La soluzione al secondo problema: confrontare i valori reali con una certa precisione, poiché l'uguaglianza dei numeri reali non può essere raggiunta sempre e ovunque. Ho già dato un esempio di confronto sopra nel codice della convalida del livello di stop.

Grazie.

Tuttavia, la questione non è chiusa. OrderModify inizia a scattare immediatamente quando un ordine viene aperto. Dov'è l'errore? (Ripeto - su tutte le valute/future funziona, sull'argento no)

 
Igor Golieniev:

Grazie.

Tuttavia, la questione non è chiusa. OrderModify inizia a scattare immediatamente quando un ordine viene aperto. Dov'è l'errore? (Ripeto - su tutte le valute/future funziona, sull'argento no)

1. Direttiva

#property strict

stai usando?

2) Questo succede con Sell e Buy, o solo con Sell?

3. lo Stop loss è impostato all'apertura della posizione o dovrebbe essere impostato dal trader se possibile?

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

Grazie.

Tuttavia, la questione non è chiusa. OrderModify inizia a lavorare immediatamente quando un ordine viene aperto. Dov'è l'errore? (Ripeto - funziona su tutte le valute/future, non funziona su Silver)

Mostra lo snippet del log (se online, la scheda Experts) dove puoi vedere l'apertura e le modifiche dell'ordine a mercato e indicare quali valori di TrailingStop e TrailingStep sono stati utilizzati.