Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1119

 
Roman:

Denn minütliche Zeitrahmen unter H1 liefern die richtigen Werte.
Wie in der Hilfe beschrieben, geben sie den Wert des Zeitrahmens zurück, nicht eine sofort einsetzbare Konstante.

Was für ein Blödsinn?

Wischen Sie sich die Augen ab, ich habe Ihnen die interne Darstellung von ENUM_TIMEFRAMES gezeigt

Bit 16, das gesetzt ist, bestimmt den wöchentlichen und monatlichen Zeitrahmen

Bit 15 wird gesetzt, um die stündliche Zeit TF zu bestimmen und TF D1 = 1000000011000 --> 11000 --> 24, d.h. die Entwickler haben D1 mit 24 Stunden verglichen und die verbleibenden stündlichen Zeit-TFs entsprechen der dezimalen Umrechnung

die Minutenzeitrahmen sind die gleichen wie die Stundenzeitrahmen, aber die hohen Bits werden zurückgesetzt


ein weiteres Problem ist, dass Sie dachten, dass die Funktionen, die ENUM_TIMEFRAMES zurückgeben, die Zeit der TF in Minuten zurückgeben - das ist nicht wahr, diese Funktionen geben die ENUM_TIMEFRAMES Aufzählung zurück - nicht mehr oder weniger, nur ENUM_TIMEFRAMES

siehe das Beispiel in der Hilfeunter https://www.mql5.com/ru/docs/basis/types/integer/enumeration.

Enums können auch mit der Zuweisung eines beliebigen konstanten Wertes an ein Mitglied des Enums sein

Sie können Ihre eigene Aufzählung erstellen, um Ihren Bedürfnissen gerecht zu werden

 

Ich danke Ihnen vielmals! Es warwchar_t, das geholfen hat! Ich habe gelesen, dass es 2 Bytes pro Zeichen speichert, im Gegensatz zu char.


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

{

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

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

}


Aber der Funktionsparameter "str" gibt immer noch nicht den ihm zugewiesenen Wert zurück... Ich frage mich, warum...

 

Hallo, können Sie mir sagen, wie ich ein Problem lösen kann? Ich möchte einen EA schreiben, der auf einem Indikator basiert (der an das Eisen gebunden ist), der viele Ebenen (Linien) auf dem Diagramm bildet, die Anzahl der Linien kann 500 erreichen.

Alles, was ich implementieren möchte, ist das Eröffnen eines Auftrags oder eines anderen Ereignisses (wie z. B. eine Warnung oder Nachricht), wenn der Preis die Linien im Diagramm kreuzt. Das Problem ist jedoch, dass der Indikator keine Werte zurückgibt und nur horizontale Linien (Objekte mit Namen) zeichnet - es gibt nichts anderes auf dem Diagramm.

Ich habe versucht, eine Lösung über die iCustom-Funktion zu finden, die Preisniveaus über die Variable "_price" abruft, aber der EA eröffnet keine Geschäfte, wenn Linien berührt werden. Ich weiß nicht, was ich falsch gemacht habe.

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

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


     
    } 
 
  }

OPTION 2: Eine Order wird auf der Linie geöffnet, die ich in den Einstellungen angegeben habe, sie funktioniert und öffnet den Handel auf dem Niveau, das ich in den EA-Parametern angegeben habe


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

    } 
Dateien:
we3s6_kgeqx.jpg  151 kb
 
Fib0 RU:

Hallo, können Sie mir sagen, wie ich ein Problem lösen kann? Ich möchte einen EA schreiben, der auf einem Indikator basiert (der an das Eisen gebunden ist), der viele Ebenen (Linien) auf dem Diagramm bildet, die Anzahl der Linien kann 500 erreichen.

Alles, was ich implementieren möchte, ist das Eröffnen eines Auftrags oder eines anderen Ereignisses (wie z. B. eine Warnung oder Nachricht), wenn der Preis die Linien im Diagramm kreuzt. Das Problem ist jedoch, dass der Indikator keine Werte zurückgibt und nur horizontale Linien (Objekte mit Namen) zeichnet - es gibt nichts anderes auf dem Diagramm.

Ich habe versucht, eine Lösung über die iCustom-Funktion zu finden, die Preisniveaus über die Variable "_price" abruft, aber der EA eröffnet keine Geschäfte, wenn Linien berührt werden. Ich weiß nicht, was ich falsch gemacht habe.

OPTION 2, ein Auftrag wird auf der Linie geöffnet, die ich in den Einstellungen angegeben habe; es funktioniert und öffnet Geschäfte auf dieser Ebene, die ich in den EA-Parametern angegeben habe



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) {

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

        }
}


ABER, was ist, wenn das Gebot aus irgendeinem Grund die Linie überspringt und nicht dem Preis der Linie entspricht, was dann? Geben Sie dann zumindest eine Variable, die den vorherigen Tick speichert, und wenn es ein neuer Tick war, der Ihre Linie überquerte - dann machen Sie irgendeine Aktion ... Aber in diesem Fall nicht vergessen, "zulässige" Kreuzung, denn wenn der Markt öffnet mit einem großen Gap, oder es gibt einen großen Sprung im Preis, werden Sie auf vielen Linien in einem Rutsch zu öffnen und wahrscheinlich nicht auf dem Platz, den Sie wollen. Wenn die Überquerung größer als erlaubt ist, wird nur eine Meldung ausgegeben...

 
Vadim Lin:



ABER, was ist, wenn das Gebot aus irgendeinem Grund die Grenze überschreitet und nicht dem Preis der Grenze entspricht, was dann? Geben Sie dann zumindest eine Variable an, in der der vorherige Tick gespeichert wird, und wenn ein neuer Tick Ihre Linie kreuzt - dann machen Sie irgendeine Aktion... Aber in diesem Fall nicht vergessen, "zulässige" Kreuzung, denn wenn der Markt mit einem Gap groß, oder einfach nur einen großen Sprung im Preis zu öffnen, werden Sie auf vielen Linien in einem Rutsch zu öffnen und wahrscheinlich nicht dort, wo Sie wollen. Wenn die Überquerung größer als erlaubt ist, wird nur eine Meldung ausgegeben...

Problem-Code.

 
Igor Makanu:

Was für ein Blödsinn?

Wischen Sie sich die Augen ab, ich habe Ihnen die interne Darstellung von ENUM_TIMEFRAMES gezeigt

Bit 16, das gesetzt ist, bestimmt den wöchentlichen und monatlichen Zeitrahmen

Bit 15 wird gesetzt, um die stündliche Zeit TF zu bestimmen und TF D1 = 1000000011000 --> 11000 --> 24, d.h. die Entwickler haben D1 mit 24 Stunden verglichen und die verbleibenden stündlichen Zeit-TFs entsprechen der dezimalen Umrechnung

die Minutenzeitrahmen sind die gleichen wie die Stundenzeitrahmen, aber die hohen Bits werden zurückgesetzt


ein weiteres Problem ist, dass Sie dachten, dass die Funktionen, die ENUM_TIMEFRAMES zurückgeben, die Zeit der TF in Minuten zurückgeben - das ist nicht wahr, diese Funktionen geben die ENUM_TIMEFRAMES Aufzählung zurück - nicht mehr oder weniger, nur ENUM_TIMEFRAMES

siehe das Beispiel in der Hilfeunter https://www.mql5.com/ru/docs/basis/types/integer/enumeration.

Enums können auch mit der Zuweisung eines beliebigen konstanten Wertes an ein Mitglied des Enums sein

Sie können Ihre eigene Aufzählung erstellen, um Ihren Bedürfnissen gerecht zu werden

Igor, es ist seit langem klar, dass es sich um konstante Werte handelt.
Das ist es, worüber ich spreche, was ist die Bedeutung von 15 und 16 Bits als Rückgabewert. Das ist einfach Unsinn.
Aus irgendeinem Grund entsprachen vor M30 die ENUM-Konstanten denTIMFRAME-Werten !!!!.
Und weiter entspricht es bereits Werten einiger Bits
. Wo zur Hölle ist die Logik in Jungs.
Dies ist ein grober Fehler, und wenn es absichtlich so gemacht wurde, ist es ein Ablenkungsmanöver).
Die Variable _Period enthält bereits alle diese Zeitrahmenwerte aus der Aufzählung ENUM, sie müssen nicht zusätzlich konvertiert werden.
Daher sollten diese konstanten Werte den in der Hilfe angegebenen Zeitrahmenwerten entsprechen. Nicht BITS!

 
Roman:

Es ist definitiv Zeit für eine Quarantäne. Suchen Sie nach allem, was darüber gesagt wurde, und lesen Sie es in aller Ruhe. Warum glauben Sie, dass die Leute um Sie herum alles wiederholen müssen, was Sie geschrieben haben?

 
Alexey Viktorov:

Es ist definitiv an der Zeit, ihn unter Quarantäne zu stellen. Suchen Sie alles, was darüber gesagt wurde, und lesen Sie es in aller Ruhe. Warum glauben Sie, dass die Menschen um Sie herum alles wiederholen sollten, was Sie geschrieben haben?

Und warum geben Sie sich mit den falschen Lösungen zufrieden? Ich habe eine logische Erklärung für die Werte der Konstanten geliefert, nicht das, was sich der Entwickler ausgedacht hat.

 
Roman:

Und warum geben Sie sich mit den falschen Lösungen zufrieden? Ich habe eine logische Erklärung für die Werte der Konstanten geliefert, nicht das, was sich der Entwickler ausgedacht hat.

Offenbar gibt es für Sie nur zwei Meinungen: Ihre und die falsche. Vielleicht finden Sie eine Erklärung, die Ihnen zusagt.
 
Alexey Viktorov:
Offenbar gibt es für Sie nur zwei Meinungen: Ihre und die falsche. Vielleicht finden Sie eine Erklärung, die Ihnen zusagt.

Versuchen Sie, den von der Variablen _Period zurückgegebenen Wert für Zeiträume über H1 in Ihren mathematischen Berechnungen zu verwenden.
Und Sie werden sofort verstehen, wer im Unrecht ist.