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

 
Roman:

Perché i timeframe minuti sotto H1 restituiscono i valori corretti.
Come descritto nell'aiuto, essi restituiscono un valore di timeframe, non una costante out-of-the-box.

Quali sciocchezze?

Asciugatevi gli occhi, vi ho mostrato la rappresentazione interna di ENUM_TIMEFRAMES

il bit 16 che è impostato determina il timeframe settimanale e mensile

il bit 15 è impostato per determinare il tempo orario TF e TF D1 = 1000000011000 --> 11000 --> 24, cioè gli sviluppatori hanno confrontato D1 a 24 ore e i TF orari rimanenti corrispondono alla conversione decimale

i timeframe dei minuti sono gli stessi di quelli delle ore, ma i bit alti sono azzerati


un'altra questione è che avete pensato che le funzioni che restituiscono ENUM_TIMEFRAMES restituiscano il tempo del TF in minuti - non è vero, queste funzioni restituiscono l'enumerazione ENUM_TIMEFRAMES - né più né meno, solo ENUM_TIMEFRAMES

vedere l'esempio dall'aiutosu https://www.mql5.com/ru/docs/basis/types/integer/enumeration.

Gli enum possono anche essere con l'assegnazione di qualsiasi valore costante a un membro dell'enum

Potete creare la vostra enumerazione per soddisfare le vostre esigenze

 

Grazie mille! È statowchar_t che ha aiutato! Ho letto che memorizza 2 byte per carattere, a differenza del char.


extern "C" __declspec(dllexport) wchar_t* __stdcall ToString(wchar_t* str)

{

        str = L" - 889 - dsa - просто!";

        return L"--- Привет! ---";

}


Ma il parametro della funzione "str" non restituisce ancora il valore assegnatogli... Mi chiedo perché...

 

Ciao, potresti dirmi come risolvere un problema? Voglio scrivere un EA basato su un indicatore (legato al ferro) che costruisce un sacco di livelli (linee) sul grafico, il numero di linee può raggiungere 500.

Tutto quello che voglio implementare è aprire un ordine o qualsiasi altro evento (come un allarme o un messaggio) quando il prezzo attraversa le linee sul grafico. Ma il problema è che l'indicatore non restituisce alcun valore e disegna solo linee orizzontali (oggetti con nomi) - non c'è altro sul grafico.

Ho provato a trovare una soluzione attraverso la funzione iCustom che recupera i livelli di prezzo tramite la variabile "_price", ma l'EA non apre i trade quando le linee vengono toccate. Non so cosa ho fatto di male.

void OnTick()
  {
  
ENUM_OBJECT typeObj = OBJ_HLINE;
string   ArrLines[];
  
  double 
  Price;
  Price=Bid;
  
//ВАРИАНТ 1 (не получился). Я хотел, чтобы ордер открывался при пересечении любой из линий на графике   
  
//вызовем индикатор: (пара, таймфрейм, индикатор...)
iCustom(Symbol(), 0, "ITS-Level Gun", 0, 0); 

int i, k = ObjectsTotal();

ArrayResize(ArrLines, 0);

//в цикле перебираем все объекты на графике
for (i=k-1; i>=0; i--) {
  
  //узнаем имя объекта на графике
  string _name = ObjectName(i);

{

    //узнаем координату цены линии
    double _price = NormalizeDouble(ObjectGetDouble(0, _name, OBJPROP_PRICE), Digits);
  } 
}

if(Price==_price)
{OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);}

    // И ВСЁ, дальше не знаю, что делать


     
    } 
 
  }

OPZIONE 2. Si apre un ordine sulla linea che ho specificato nelle impostazioni, funziona e apre trade al livello che ho specificato nei parametri dell'EA


extern string h="@Line_week_open-0"; //ИЗМЕНЕНИЕ ННАЗВАНИЯ ЛИНИИ В СВОЙСТВАХ СОВЕТНИКА.ВАРИАНТ 2.

if(ObjectFind(h)>-1)

    {

     double prise = ObjectGet(h, OBJPROP_PRICE1);

     if (Price==prise)

      {OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);}       

    } 
File:
we3s6_kgeqx.jpg  151 kb
 
Fib0 RU:

Ciao, potresti dirmi come risolvere un problema? Voglio scrivere un EA basato su un indicatore (legato al ferro) che costruisce un sacco di livelli (linee) sul grafico, il numero di linee può raggiungere 500.

Tutto quello che voglio implementare è aprire un ordine o qualsiasi altro evento (come un allarme o un messaggio) quando il prezzo attraversa le linee sul grafico. Ma il problema è che l'indicatore non restituisce alcun valore e disegna solo linee orizzontali (oggetti con nomi) - non c'è altro sul grafico.

Ho provato a trovare una soluzione attraverso la funzione iCustom che recupera i livelli di prezzo tramite la variabile "_price", ma l'EA non apre i trade quando le linee vengono toccate. Non so cosa ho fatto di male.

OPZIONE 2, si apre un ordine alla linea che ho specificato nelle impostazioni; funziona e apre operazioni a quel livello, che ho specificato nei parametri dell'EA



for(int i = ObjectsTotal() - 1; i >=0; i--) {

        // все что не горизонтальные линии - игнорируем

        if(ObjectType(ObjectName(i)) != OBJ_HLINE) continue; 

        double PriceLine = NormalizeDouble(ObjectGet(ObjectName(i), OBJPROP_PRICE1), Digits());
	
	// измените условие Bid == PriceLine
        
	 if(Bid == PriceLine) {

                // ..... тут что-то происходит ... 

        }
}


MA, e se l'offerta per qualche motivo saltasse la linea, e non fosse uguale al prezzo della linea, allora cosa? Fornire poi almeno una variabile che memorizza il tick precedente, e se era un nuovo tick ha attraversato la linea - poi fare qualche azione ... Ma in questo caso non dimenticate di fornire un incrocio "ammissibile", perché se il mercato si apre con un grande Gap, o c'è un grande salto di prezzo, si aprirà su molte linee in una sola volta e probabilmente non sul posto che si desidera. Se l'attraversamento è più grande del consentito - verrà dato solo un messaggio...

 
Vadim Lin:



MA, cosa succede se l'offerta per qualche motivo ha superato la linea, e non era uguale al prezzo della linea, allora cosa...? Fornisci allora almeno una variabile, in cui il tick precedente è memorizzato, e se c'è un nuovo tick che attraversa la tua linea - allora fai qualche azione... Ma in questo caso non dimenticare di fornire "ammissibile" attraversamento, perché se il mercato si aprirà con un Gap grande, o solo un grande salto di prezzo, si aprirà su molte linee in una sola volta e probabilmente non lì dove si desidera. Se l'attraversamento è più grande del consentito - verrà dato solo un messaggio...

Codice del problema.

 
Igor Makanu:

Quali sciocchezze?

Pulitevi gli occhi, vi ho mostrato la rappresentazione interna di ENUM_TIMEFRAMES

il bit 16 che è impostato determina il timeframe settimanale e mensile

il bit 15 è impostato per determinare il tempo orario TF e TF D1 = 1000000011000 --> 11000 --> 24, cioè gli sviluppatori hanno confrontato D1 a 24 ore e i TF orari rimanenti corrispondono alla conversione decimale

i timeframe dei minuti sono gli stessi di quelli delle ore, ma i bit alti sono azzerati


un'altra questione è che avete pensato che le funzioni che restituiscono ENUM_TIMEFRAMES restituiscano il tempo del TF in minuti - non è vero, queste funzioni restituiscono l'enumerazione ENUM_TIMEFRAMES - né più né meno, solo ENUM_TIMEFRAMES

vedere l'esempio dall'aiutosu https://www.mql5.com/ru/docs/basis/types/integer/enumeration.

Gli enum possono anche essere con l'assegnazione di qualsiasi valore costante a un membro dell'enum

Potete creare la vostra enumerazione per soddisfare le vostre esigenze

Igor, è chiaro da molto tempo sui valori costanti.
È di questo che sto parlando, qual è il significato di 15 e 16 bit come valore di ritorno. Sono solo sciocchezze.
Per qualche ragione prima di M30 le costanti ENUM corrispondevano ai valoriTIMFRAME !!!!.
E inoltre corrisponde già ai valori di alcuni bit
. Dove diavolo è la logica nei ragazzi.
Questo è un errore grossolano, se è stato fatto intenzionalmente è un diversivo).
La variabile _Period contiene già tutti questi valori temporali dall'enumerazione di ENUM, non abbiamo bisogno di convertirli ulteriormente.
Pertanto, questi valori costanti, dovrebbero corrispondere ai valori di tempo come indicato nell'aiuto. Non BITS!

 
Roman:

È sicuramente il momento della quarantena. Cerca tutto quello che è stato detto su di esso e leggilo a tuo piacimento. Perché pensi che le persone intorno a te debbano ripetere tutto quello che hai scritto?

 
Alexey Viktorov:

È sicuramente il momento di metterlo in quarantena. Cercate tutto ciò che è stato detto in proposito e leggetelo a vostro piacimento. Perché pensa che le persone intorno a lei debbano ripetere tutto quello che ha scritto?

E perché sopporti le soluzioni sbagliate? Ho fornito una spiegazione logica dei valori delle costanti, non quello che lo sviluppatore ha inventato.

 
Roman:

E perché sopporti le soluzioni sbagliate? Ho fornito una spiegazione logica dei valori delle costanti, non quello che lo sviluppatore ha inventato.

A quanto pare per te ci sono solo due opinioni: la tua e quella sbagliata. Potresti essere in grado di trovare una spiegazione che ti soddisfa.
 
Alexey Viktorov:
A quanto pare per te ci sono solo due opinioni: la tua e quella sbagliata. Potresti essere in grado di trovare una spiegazione che ti soddisfa.

Cercate di utilizzare il valore restituito dalla variabile _Period per i periodi superiori a H1 nei vostri calcoli matematici.
E capirete immediatamente chi ha torto.

Motivazione: