Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 569

 
Bonjour ! En étudiant le MQL4, une petite question s'est posée. Le problème est signalé dans le tutoriel sur ce site. Voici la condition : Tâche 25. Créez un programme qui réalise les conditions suivantes : si le taux de change a dépassé le niveau spécifié, alors donnez un message, dans lequel les mots indiquent que le taux a dépassé le niveau (jusqu'à 100 points) ; dans les autres cas, donnez un message indiquant que le taux ne dépasse pas le niveau spécifié.
Et voici la solution proposée :
//--------------------------------------------------------------------
extern double Level=1.3200;                     // Заданный уровень 
string Text[101];                               // Объявление массива
//--------------------------------------------------------------------
int init()                                      // Спец. ф-ия init()
  {                                             // Присвоение значений
   Text[1]="один ";            Text[15]="пятнадцать ";
   Text[2]="два ";             Text[16]="шестнадцать ";
   Text[3]="три ";             Text[17]="семнадцать ";
   Text[4]="четыре ";          Text[18]="восемнадцать ";
   Text[5]="пять ";            Text[19]="девятнадцать ";
   Text[6]="шесть ";           Text[20]="двадцать ";
   Text[7]="семь ";            Text[30]="тридцать ";
   Text[8]="восемь ";          Text[40]="сорок ";
   Text[9]="девять ";          Text[50]="пятьдесят ";
   Text[10]="десять ";         Text[60]="шестьдесят";
   Text[11]="одиннадцать ";    Text[70]="семьдесят ";
   Text[12]="двенадцать ";     Text[80]="восемьдесят ";
   Text[13]="тринадцать ";     Text[90]="девяносто";
   Text[14]="четырнадцать ";   Text[100]= "сто";
   // Вычисление значений
   for(int i=20; i<=90; i=i+10)                // Цикл по десяткам
     {
      for(int j=1; j<=9; j++)                  // Цикл по единицам
         Text[i+j]=Text[i] + Text[j];          // Вычисление значения   
     }
   return;                                     // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. ф-ия start()
  {
   int Delta=NormalizeDouble((Bid-Level)/Point,0);// Превышение 
//--------------------------------------------------------------------
   if (Delta>=0)                                // Цена не выше уровня
     {
      Alert("Цена ниже уровня");                // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   if (Delta<100)                               // Цена более 100
     {
      Alert("Более ста пунктов");               // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   Alert("Плюс ",Text[Delta],"pt.");            // Вывод на экран
   return;                                      // Выход из start()
  }
//---------------------------------------------------------------------
По-моему в условных операторах неправильно проставлены знаки сравнения. Они должны быть с точностью до наоборот. Скажите прав ли я? И если нет, то почему так?  
 
Step:
Bonjour, j'ai une petite question en étudiant MQL4. Le problème se trouve dans le tutoriel de ce site. Voici la condition : Problème 25. Créez un programme dans lequel les conditions suivantes sont réalisées : si le taux dépasse le niveau spécifié, il produira un message, dans lequel des mots indiqueront que le taux dépasse le niveau (jusqu'à 100 points) ; dans les autres cas, le message informera que le taux ne dépasse pas le niveau spécifié.
Et voici la solution proposée :


Montre les solutions possibles. Utile pour la formation.

Il existe d'autres options. Il y a d'autres erreurs.

Faites-vous davantage confiance. Expérimentation.

 
Step:
Bonjour ! En étudiant MQL4, j'ai une petite question. La tâche se trouve dans le tutoriel sur ce site. Voici la condition : Problème 25. Créez un programme qui réalise les conditions suivantes : si le taux dépasse le niveau spécifié, il émet un message disant que le taux dépasse le niveau (jusqu'à 100 points) ; dans les autres cas, le message disant que le taux ne dépasse pas le niveau spécifié.
Et voici la solution proposée :


P.S.

Plus précisément, l'utilité de cet exemple pour traiter un tableau,

la représentation possible des données en mots,

l'utilisation de la fonction NormalizeDouble et de la variable Point prédéfinie.

Possibilité de choisir un passe-temps plus facile.

 

Apparemment, il n'y a aucun moyen de déclarer des variables externes directement dans la classe. Alors quelles sont les options ? Si je ne veux pas déclarer dans l'Expert Advisor lui-même ou ailleurs ces variables externes spécifiques, qui ne sont nécessaires que lors de l'utilisation de cette classe. Je pense que la seule option est de faire un inluder, qui déclarera ces variables externes. Et puis la classe devrait être incluse dedans, non ?

Ensuite, afin d'appeler la classe, vous devez inclure la classe elle-même. C'est vrai ? Ou bien il peut y avoir d'autres variantes ?

Ça ne me semble pas bon. Beaucoup de fichiers d'inclusion imbriqués à créer... C'est pourquoi j'ai une telle question.

Ou est-il encore possible, comme dans une bibliothèque habituelle, de déclarer des variables externes et d'importer les bibliothèques nécessaires avant de déclarer la classe ? Je veux dire quelque chose comme ça :

// Объявляем внешние переменные
extern type Var1;
extern type Var2;
extern type Var3;

// Подключаем требуемые библиотеки
//#include <LBase.mqh>
//+---
//#include <Logging.mqh>
#import "user32.dll"
     int GetAncestor;
     int PostMessageA;
#import
//
class CLogging
{
   protected:
 // защищенные данные
   public:
 // открытые данные
};
Je n'ai jamais vu ça avant. Alors je me demande si je vais dans la bonne direction...
 
Lors du transfert du code de l'indicateur vers le conseiller expert, une erreur se produit. Je les ai sortis comme variables globales dans l'écran du terminal via Commentaire.

if(BullBear!="")
{
retXB=(zz[A4]-zz[B4])/(zz[A4]-zz[X4]+0.000001);
retAC=(zz[C4]-zz[B4])/(zz[A4]-zz[B4]+0.000001);



Les sortir en tant que variables globales sur l'écran du terminal par le biais de Commentaire. Il n'y avait pas de zéros, seulement des nombres négatifs. Puis j'ai changé

//---- indicator buffers
double zz[1500];
à

//---- indicator buffers
double zz[300];
tout s'est mis en place, je l'ai remis en place. Pas d'erreur ! Quelle était la raison ? J'ai aussi éteint l'internet.
 
semargl988:

Lors du transfert du code de l'indicateur vers le conseiller expert, une erreur se produit. Division par zéro dans la partie code

...

Les sortir en tant que variables globales sur l'écran du terminal via Commentaire. Il n'y avait pas de zéros, seulement des nombres négatifs. Puis j'ai changé

...

à .

...

tout est tombé en place, remettez-le en place. Pas d'erreur du tout ! Quelle en était la cause ? J'ai éteint internet à nouveau.

J'ai également obtenu l'erreur "zero divide" où le zéro ne pouvait pas être passé dans le dénominateur de la fraction. Maintenant, avant de diviser, je fais une vérification formelle comme :

if(znamenatel==0)
{
 какое-то действие;
}

Et l'erreur a disparu. C'est-à-dire qu'il faut indiquer au compilateur ce qu'il doit faire si le dénominateur=0, même si le programmeur est sûr à 100% qu'il n'y a pas de 0.

 

Bonjour, pouvez-vous m'aider avec le code ? J'ai besoin que l'EA fasse la chose élémentaire - ouvrir des positions lorsqu'il s'approche de la ligne verticale (c'est-à-dire strictement le temps, pas le prix), à savoir pour un intervalle shi spécifié, que j'ai ici 120 c'est-à-dire comme je comprends - 2 minutes. La couleur de la ligne doit déterminer s'il s'agit d'un achat ou d'une vente. J'ai cherché sur Internet et l'ai réécrit, et j'ai obtenu ce qui suit :

void OnTick()
{
int AllObject = ObjectsTotal();
for ( int i = 0; i < AllObject; i++)
{

string NameObj = ObjectName(i);
Colorrr = ObjectGet(NameObj, OBJPROP_COLOR);
Vremyaaa = (ObjectGet(NameObj, OBJPROP_TIME) - shi);
if(Vremyaaa == TimeLocal())
break;
}

int kolpos = 0;

if((Colorrr == Green)||(Colorrr == Aqua)){operacia = "OP_BUY";}
if((Colorrr == Red)||(Colorrr == Purple)){operacia = "OP_SELL";}
for (int pos = 0; pos < OrdersTotal(); pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
kolpos++;
}
}
}
if(kolpos == 0)
{
if (iTime(NULL,0,1) == Vremyaaa)
{
int ticket = OrderSend(Symbol(), operacia, Lot, Bid, 10, 0, 0, "5", Magic, 0, col);
}

}

}

Il ne s'échange pas pour une raison quelconque. Il n'écrit pas d'erreurs dans le journal...
 
dmitriyriy666:

Bonjour, pouvez-vous m'aider avec le code ? J'ai besoin que l'EA fasse la chose élémentaire - ouvrir des positions lorsqu'il s'approche de la ligne verticale (c'est-à-dire strictement le temps, pas le prix), à savoir pour un intervalle shi spécifié, que j'ai ici 120 c'est-à-dire comme je comprends - 2 minutes. La couleur de la ligne doit déterminer s'il s'agit d'un achat ou d'une vente. J'ai cherché sur Internet et je l'ai réécrit :

void OnTick()
{
int AllObject = ObjectsTotal();
for ( int i = 0; i < AllObject; i++)
{

string NameObj = ObjectName(i);
Colorrr = ObjectGet(NameObj, OBJPROP_COLOR);
Vremyaaa = (ObjectGet(NameObj, OBJPROP_TIME) - shi);
if(Vremyaaa == TimeLocal())
break;
}

int kolpos = 0;

if((Colorrr == Green)||(Colorrr == Aqua)){operacia = "OP_BUY";}
if((Colorrr == Red)||(Colorrr == Purple)){operacia = "OP_SELL";}
for (int pos = 0; pos < OrdersTotal(); pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
kolpos++;
}
}
}
if(kolpos == 0)
{
if (iTime(NULL,0,1) == Vremyaaa)
{
int ticket = OrderSend(Symbol(), operacia, Lot, Bid, 10, 0, 0, "5", Magic, 0, col);
}

}

}

Le code ne s'échange pas pour une raison quelconque. Il n'enregistre aucune erreur...

Si votre heure coïncide avec l'heure du terminal, vous pouvez utiliser TimeLocal(), mais TimeCurrent() est plus fiable .

Changer le type de variable operacia en int et supprimer les guillemets OP_BUY et OP_SELL

 
AlexeyVik:

Si vous avez la même heure que celle du terminal, vous pouvez utiliser TimeLocal(), mais TimeCurrent() est plus fiable .

Changer le type de variable operacia en int et supprimer les guillemets OP_BUY et OP_SELL



Merci. A propos de TimeCurrent c'est vrai, mon heure ne correspond pas à l'heure du serveur. Je l'ai réparé, mais ça ne marche toujours pas... N'écrit pas d'erreurs dans le journal.


P.S. Dans mon message précédent, du code sans espace a été inséré. Mais je pense avoir mis toutes les accolades correctement.

 

MT4 - 625, message du testeur lorsqu'il essaie de tester les hiboux avec la bibliothèque :

2014.03.29 18:38:48.753 'C:\Program Files\Admiral1\MQL4\Libraries\ingLib094.mq4' n'est pas une version 32 bits.

Avant, cette chouette a compilé sans problème, et la bibliothèque n'a pas eu un seul mot non plus. En fait, je ne le comprends pas du tout.

Mon système (je veux dire Windows) est en 32 bits, je n'en ai jamais eu d'autre. Septièmement.

La bibliothèque est mon lieu d'origine, j'y vais à fond. Fonctionne bien en temps réel sur une nouvelle construction. Y compris avec d'autres hiboux. Et dans le testeur dans les versions antérieures sans problèmes.

Mais il ne veut pas s'ouvrir dans le testeur, et la raison est même aspirée de vos doigts.

Et il n'y a pas un mot sur les cas 32 bits dans tous les manuels.