Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 100

 
alexey1979621:
Ciao a tutti! La domanda è questa. Come misurare la distanza tra High e Low della prima, seconda, terza candela e prescrivere la condizione che questa distanza di ogni candela non deve essere inferiore, diciamo, a 10 punti. Grazie in anticipo.

Ecco le variabili dell'ambiente di mercato per aiutarvi https://docs.mql4.com/ru/predefined/variables
 
artmedia70:
Rivolta dei robot... :)


Aha ha ha. yosuf, Cyborg ti ha mandato... )))))))
 
artmedia70:

Ecco un EA per testare la funzione. Contiene la funzione stessa e la sua chiamata. Prima di chiamarlo, dovete preparare un messaggio, che può essere fino a quattro righe. La lunghezza di ogni linea, se ricordo bene, non dovrebbe superare i 64 caratteri. Ecco perché ho diviso un messaggio in più righe. Ogni linea di un messaggio può essere emessa in un colore diverso. È abbastanza chiaro nel codice - prima prepariamo le linee dei messaggi, poi chiamiamo la funzione. Non ho commentato molto lì - l'ho scritto tutto d'un fiato molto tempo fa. Ora ho già dimenticato a cosa serve. Se avrò delle domande, me ne ricorderò, ma ora ricordo solo le cose necessarie.

E un tacchino:

È così che va... Spero che tu riesca a capire come funziona.

Naturalmente, posso fare un underlay invece di emettere sul grafico principale nella finestra dell'indicatore, ma sono troppo pigro ... :)



Artem, ho guardato il tuo codice, il tacchino è una bomba: )))). In sostanza, tutto è chiaro con più, anche se ho visto un paio di punti nella realizzazione, un po' diverso da quello che avrei fatto io, ma è solo una piccola cosa.

Ecco la cosa interessante. Solo quello che c'è nell'esperto viene stampato nel tacchino. Ma come si fa ad usarlo a proprio vantaggio?

 
hoz:


Artem, ho guardato il tuo codice, il tacchino è una bomba: )))). In sostanza, tutto è chiaro con più, anche se ho visto un paio di punti nell'implementazione, un po 'diverso da quello che avrei fatto, ma questo è solo inezie.

Ecco cosa è interessante. Solo quello che c'è nell'Expert Advisor viene stampato nel giradischi. Ma come posso usarlo a mio vantaggio?

Non capisco la domanda. Sostituisce la funzione Print(). Emette tutti i messaggi nella finestra dell'indicatore. È possibile impostare il colore per ogni riga di un messaggio (come la priorità del messaggio). Più conveniente della stampa. Questa è tutta l'utilità.
 

È una funzione. Questo esperto serve solo a mostrare cosa fa la funzione. Usate quindi questa funzione per visualizzare i vostri messaggi dal vostro EA.

Quell'esperto mostra solo come usarlo.

 
artmedia70:

È una funzione. Questo esperto serve solo a mostrare cosa fa la funzione. Usate quindi questa funzione per visualizzare i vostri messaggi dal vostro EA.

Quell'esperto mostra solo come usarlo.


Anche se sì... È una funzione... Ho perso la cosa più importante mentre lo stavo capendo :(
 

C'è un nuovo mal di testa. Ecco cosa serve per farlo accadere:

1. C'è un certo numero di ordini nel mercato, cioè ci sono ordini di mercato e ordini pendenti nel mercato tutto il tempo.

2. Ad un certo momento, quando l'ultimo ordine aperto fino a quel momento viene chiuso da un TP, dobbiamo chiudere tutti gli ordini che sono stati aperti e cancellare anche tutti quelli in sospeso.

L'ho fatto in questo modo (l'ho messo nella funzione start() ):

for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)              
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

La funzione GetLastOrderState() controlla se l'ultimo ordine è chiuso:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
            lastOrderOpenTime = -1;                    // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
          lastOrderOpenTime = OrderOpenTime();
   }
   Comment("Время открытия последнего открытого ордера = ", lastOrderOpenTime);
   for (int h=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(h, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      
      if (OrderOpenPrice() == lastOrderOpenTime)
          lastOrderCloseTime = OrderCloseTime();
   }
  // Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}

E poi funzioni che cancellano gli ordini di mercato pendenti e di chiusura. Vedo che in qualche modo non funziona correttamente. La mia funzione va bene?

Capisco che la funzione è in ordine di idea. Ma la logica non va bene qui. Avete qualche idea su questo argomento? Risulta che, in ogni caso, anche quando nessuno degli ordini dell'EA è stato chiuso dal TP, tutto viene chiuso in un lampo dopo che è stato aperto dal segnale...

 
hoz:

Aha ha ha. yosuf, Cyborg ti ha mandato... )))))))
Comunque, un buon proger reattivo. Come se tutti i problemi fossero suoi, perché quel destino ripagherà, indiscutibilmente, o, incontrare il graal.
 
yosuf:
Comunque, un buon proger simpatico. Come se tutti i problemi fossero suoi, per questo il destino premierà, indiscutibilmente, o, imbattersi nel graal.


Ma non c'era nessuna specificità, e quindi nessuna domanda. Non so cosa rispondere.... Devi cercare di spiegare la situazione nel modo più chiaro possibile per ottenere una risposta.
 
hoz:

C'è un nuovo mal di testa. Ecco cosa serve per farlo accadere:

1. C'è un certo numero di ordini nel mercato, cioè ci sono ordini di mercato e ordini pendenti nel mercato tutto il tempo.

2. Ad un certo momento, quando l'ultimo ordine aperto fino a quel momento viene chiuso da un TP, dobbiamo chiudere tutti gli ordini che sono stati aperti e cancellare anche tutti quelli in sospeso.

L'ho fatto in questo modo (l'ho messo nella funzione start() ):

La funzione GetLastOrderState() controlla se l'ultimo ordine è chiuso:

E poi funzioni che cancellano gli ordini di mercato pendenti e di chiusura. Vedo che in qualche modo non funziona correttamente. La mia funzione va bene?

Capisco che la funzione è in ordine di idea. Ma la logica non va bene qui. Avete qualche idea su questo argomento? Risulta che, in ogni caso, anche se nessuno degli ordini dell'EA ha chiuso al TP, tutto viene chiuso in un lampo dopo che è stato aperto dal segnale...

Victor, prendi la collaudata funzione di Kim che controlla se una posizione è chiusa da TP:

isCloseLastPosByTake - Restituisce una bandiera per chiudere l'ultima posizione sulla presa. Trova in Solo funzioni utili
E poi chiudere tutto.

Motivazione: