Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1119

 
Roman:

Parce que les cadres temporels minute sous H1 renvoient les valeurs correctes.
Comme décrit dans l'aide, ils renvoient la valeur du délai, et non une constante prête à l'emploi.

Quelle absurdité ?

Essuyez vos yeux, je vous ai montré la représentation interne de ENUM_TIMEFRAMES

Le bit 16, qui est activé, détermine la période hebdomadaire et mensuelle.

le bit 15 est activé pour déterminer le TF horaire et TF D1 = 1000000011000 --> 11000 --> 24, c'est-à-dire que les développeurs ont comparé D1 à 24 heures et les TF horaires restants correspondent à la conversion décimale

les délais en minutes sont les mêmes que ceux en heures, mais les bits de poids fort sont remis à zéro.


un autre problème est que vous pensiez que les fonctions retournant ENUM_TIMEFRAMES retournent le temps de la TF en minutes - ce n'est pas vrai, ces fonctions retournent l'énumération ENUM_TIMEFRAMES - ni plus ni moins, juste ENUM_TIMEFRAMES

voir l'exemple de l'aide à l'adresse https://www.mql5.com/ru/docs/basis/types/integer/enumeration.

les enums peuvent également être avec l'affectation de n'importe quelle valeur constante à un membre de l'enum

Vous pouvez créer votre propre énumération en fonction de vos besoins.

 

Merci beaucoup ! C'estwchar_t qui a aidé ! J'ai lu à son sujet qu'il stocke 2 octets par caractère, contrairement à char.


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

{

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

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

}


Mais le paramètre de la fonction "str" ne renvoie toujours pas la valeur qui lui a été attribuée... Je me demande pourquoi...

 

Bonjour, pourriez-vous me dire comment résoudre un problème ? Je veux écrire un EA pour un indicateur (lié au fer) qui construit beaucoup de niveaux (lignes) sur le graphique, le nombre de lignes peut être jusqu'à 500.

Tout ce que je veux mettre en œuvre est d'ouvrir un ordre ou tout autre événement (comme une alerte ou un message) lorsque le prix traverse les lignes sur le graphique. Mais le problème est que l'indicateur ne renvoie aucune valeur et ne fait que dessiner des lignes horizontales (objets avec des noms) - il n'y a rien d'autre sur le graphique.

J'ai essayé de trouver une solution à travers la fonction iCustom qui récupère les niveaux de prix via la variable "_price", mais l'EA n'ouvre pas de trades lorsque les lignes sont touchées. Je ne sais pas ce que j'ai fait de mal.

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. un ordre est ouvert sur la ligne que j'ai spécifiée dans les paramètres, il fonctionne et ouvre des transactions au niveau que j'ai spécifié dans les paramètres de l'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);}       

    } 
Dossiers :
we3s6_kgeqx.jpg  151 kb
 
Fib0 RU:

Bonjour, pourriez-vous me dire comment résoudre un problème ? Je veux écrire un EA basé sur un indicateur (lié au fer) qui construit beaucoup de niveaux (lignes) sur le graphique, le nombre de lignes peut atteindre 500.

Tout ce que je veux mettre en œuvre est d'ouvrir un ordre ou tout autre événement (comme une alerte ou un message) lorsque le prix traverse les lignes sur le graphique. Mais le problème est que l'indicateur ne renvoie aucune valeur et ne fait que dessiner des lignes horizontales (objets avec des noms) - il n'y a rien d'autre sur le graphique.

J'ai essayé de trouver une solution à travers la fonction iCustom qui récupère les niveaux de prix via la variable "_price", mais l'EA n'ouvre pas de trades lorsque les lignes sont touchées. Je ne sais pas ce que j'ai fait de mal.

OPTION 2, un ordre est ouvert à la ligne que j'ai spécifiée dans les paramètres ; il fonctionne et ouvre des transactions à ce niveau, que j'ai spécifié dans les paramètres de l'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) {

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

        }
}


MAIS, que se passe-t-il si l'offre, pour une raison quelconque, saute la ligne, et n'est pas égale au prix de la ligne, alors quoi ? Fournir alors au moins une variable qui stocke le tick précédent, et si c'était un nouveau tick a traversé votre ligne - alors faire une certaine action ... Mais dans ce cas, n'oubliez pas de prévoir des croisements "admissibles", car si le marché ouvre avec un grand écart, ou s'il y a un grand saut de prix, vous ouvrirez sur plusieurs lignes en une seule fois et probablement pas à l'endroit que vous voulez. Si le passage est plus grand que celui autorisé - seul un message sera donné...

 
Vadim Lin:



MAIS, que se passe-t-il si l'offre, pour une raison ou une autre, franchit la ligne, et n'est pas égale au prix de la ligne, alors que... ? Fournissez alors au moins une variable, dans laquelle le tick précédent est stocké, et si un nouveau tick traverse votre ligne - alors faites quelque chose... Mais dans ce cas, n'oubliez pas de prévoir un franchissement "admissible", car si le marché s'ouvre avec un Gap important, ou simplement un grand saut de prix, vous ouvrirez sur de nombreuses lignes en une seule fois et probablement pas là où vous le souhaitez. Si le passage est plus grand que celui autorisé - seul un message sera donné...

Code de problème.

 
Igor Makanu:

Quelle absurdité ?

Essuyez vos yeux, je vous ai montré la représentation interne de ENUM_TIMEFRAMES

Le bit 16, qui est activé, détermine la période hebdomadaire et mensuelle.

le bit 15 est activé pour déterminer le TF horaire et TF D1 = 1000000011000 --> 11000 --> 24, c'est-à-dire que les développeurs ont comparé D1 à 24 heures et les TF horaires restants correspondent à la conversion décimale

les délais en minutes sont les mêmes que ceux en heures, mais les bits de poids fort sont remis à zéro.


un autre problème est que vous pensiez que les fonctions retournant ENUM_TIMEFRAMES retournent le temps de la TF en minutes - ce n'est pas vrai, ces fonctions retournent l'énumération ENUM_TIMEFRAMES - ni plus ni moins, juste ENUM_TIMEFRAMES

voir l'exemple de l'aide à l'adresse https://www.mql5.com/ru/docs/basis/types/integer/enumeration.

Les enums peuvent également être avec l'affectation de n'importe quelle valeur constante à un membre de l'enum.

Vous pouvez créer votre propre énumération en fonction de vos besoins.

Igor, les valeurs constantes sont claires depuis longtemps.
C'est ce dont je parle, quelle est la signification de 15 et 16 bits comme valeur de retour. C'est tout simplement absurde.
Pour une raison quelconque, avant M30, les constantes ENUM correspondaient aux valeursTIMFRAME ! !!!.
De plus, il correspond déjà aux valeurs de certains bits
. Où est la logique dans les gars.
C'est une erreur grossière. Si elle a été faite intentionnellement, c'est une diversion).
La variable _Period contient déjà toutes ces valeurs de délai de l'énumération ENUM, elles ne nécessitent pas de conversion supplémentaire.
Par conséquent, ces valeurs constantes doivent correspondre aux valeurs temporelles indiquées dans l'aide. Pas de BITS !

 
Roman:

C'est définitivement l'heure de la quarantaine. Recherchez tout ce qui a été dit à son sujet et lisez-le à loisir. Pourquoi pensez-vous que les gens qui vous entourent doivent répéter tout ce que vous avez écrit ?

 
Alexey Viktorov:

Il est vraiment temps de le mettre en quarantaine. Recherchez tout ce qui a été dit à son sujet et lisez-le à votre guise. Pourquoi pensez-vous que les personnes qui vous entourent doivent répéter tout ce que vous avez écrit ?

Et pourquoi supportez-vous les mauvaises solutions ? J'ai fourni une explication logique des valeurs des constantes, pas ce que le développeur a inventé.

 
Roman:

Et pourquoi supportez-vous les mauvaises solutions ? J'ai fourni une explication logique des valeurs des constantes, pas ce que le développeur a inventé.

Apparemment, pour vous, il n'y a que deux opinions : la vôtre et la mauvaise. Vous pourrez peut-être trouver une explication qui vous convient.
 
Alexey Viktorov:
Apparemment, pour vous, il n'y a que deux opinions : la vôtre et la mauvaise. Vous pourrez peut-être trouver une explication qui vous convient.

Essayez d'utiliser la valeur renvoyée par la variable _Period pour les périodes supérieures à H1 dans vos calculs mathématiques.
Et vous comprendrez immédiatement qui a tort.