[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 231

 
hoz:

La situation est la suivante :

J'ai montré un morceau de code où il y a un malentendu. Toutes les variables sont déclarées globales. Dans la fonctionIsObjectFound(), je récupère les valeurs du premier et du deuxième point de prix de l'objet, le nom et la valeur du prix de l'objet sur la barre actuelle. Si l'objet est trouvé, il doit quitter la fonction en mode vrai, sinon en modefaux .


La fonction poursuit l'exécution de la fonction de démarrage. Qu'est-ce que c'est ?

Ne soyez jamais gourmand avec la sortie de débogage si quelque chose ne va pas et essayez de vérifier d'autres erreurs. Exemple d'un script fonctionnel :

//+------------------------------------------------------------------+
//|                                             Test ObjectFound.mq4 |
//|                                         Copyright © 2013, ir0407 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, ir0407"
#property link      ""

#include <stderror.mqh>
#include <stdlib.mqh>

string objName;
int isObj;
double objPrice1, objPrice2, objPriceCurr; 

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
   if (!IsObjectFound())
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }
  return(0);
}
//+------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound(int ObjType = EMPTY)
{
   int Error;
   //Eсли объектов на графике нет, то и делать нам тут больше нечего
   if(ObjectsTotal(ObjType) == 0)
   {
      Print("Объекты на графике отсутствуют.");
      return(False);
   }
   for (int obj = 0; obj < ObjectsTotal(ObjType); obj++)
   {
      objName = ObjectName(obj);
      //Нужно убедиться что в переменной objName лежит имя объекта,
      //а не какая нибудь чепуха.
      Error = GetLastError();
      if(Error == ERR_NO_ERROR)
      {
        isObj = ObjectFind(objName);
        if(isObj == -1)
        {
          Print("Объект с именем \"", objName, "\" не найден.");
          Error = GetLastError();
          Print("Функция ObjectFind() вернула код ошибки #", Error);
          return(false);
        }
        objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
        objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
        objPriceCurr = ObjectGetValueByShift(objName,0);
        Print("objPrice1 = ", objPrice1);
        Print("objPrice2 = ", objPrice2);
        Print("objPriceCurr = ", objPriceCurr);
      }
      else
      {
        Print("Функция ObjectName() вернула код ошибки #", Error);
        return(false);
      }
   }
   return (True); // Объект найден!
}
 
ir0407:

Ne soyez jamais gourmand avec la sortie de débogage si quelque chose fonctionne mal et essayez de vérifier s'il y a d'autres erreurs. Exemple d'un script fonctionnel :



Igor, merci pour ce précieux commentaire. Vous avez raison ! Je n'avais jamais travaillé avec des objets auparavant, mais je commence à m'y faire. J'ai réfléchi à la façon de l'aborder.
 
GaNDarM:


Vous avez mal compris. Je ne veux pas modifier la valeur de mon solde sur le terminal, même si ce serait bien :)

Je dois modifier la taille de mon lot en fonction du résultat d'une transaction précédente (bénéfice ou perte). Et je ne sais pas comment prescrire le changement de dépôt (perte ou bénéfice).

Le résultat de la transaction peut être contrôlé de 2 façons (il y en a peut-être d'autres, je les aime bien) :
1) Se souvenir de la valeur précédente du dépôt et la comparer avec la valeur actuelle (AccountBalance()). Mais cette méthode devra impliquer les variables globales du terminal pour que la variable ne perde pas sa valeur au redémarrage de l'EA ou du terminal (ou l'écrire dans un fichier) ;

2) Et vous pouvez vérifier le résultat d'une transaction précédente à partir de l'historique (recherchez la fonction dans le fil de discussion de Kim).

 
koSTRIKin:

Je le copie correctement dans le dossier de l'indicateur7.

Le bon dossier est celui des experts/indicateurs. Au cas où, vérifiez sa présence dans le dossier après l'écriture.

S'il existe, il apparaîtra certainement après la compilation de tout code dans l'éditeur.

 
      objName = ObjectName(obj);
      //Нужно убедиться что в переменной objName лежит имя объекта,
      //а не какая нибудь чепуха.
      Error = GetLastError();
      if(Error == ERR_NO_ERROR)
Pourquoi y aurait-il un non-sens si la fonction renvoie concrètement le nom de l'objet ?
 

GaNDarM

(функцию поищите в ветке у Кима). 

Branche
 
TarasBY:

Il y a 2 façons de contrôler le résultat des échanges (il peut y en avoir d'autres, celles-là me conviennent) :
1) Pour mémoriser la valeur précédente du dépôt et la comparer avec la valeur actuelle (AccountBalance()). Mais cette méthode doit impliquer des variables globales du terminal pour que la variable ne perde pas sa valeur lors du redémarrage de l'EA ou du terminal (ou l'écrire dans un fichier) ;

2) Et vous pouvez vérifier le résultat d'une transaction précédente à partir de l'historique (recherchez la fonction dans le fil de discussion de Kim).


Merci, je vais chercher
 

Pourquoi les variables sont-elles affectées à zéro dans INIT() ? Quelle est l'erreur ou comment affecter les prix d'achat et de vente à des variables en dehors de la fonction start() ? J'ai essayé de mettre RefreshRates() ; devant eux, mais pas de changement :(

int init()
  {
   .....
   //---
   UpL  =  Ask;     // Пик вверх изначально равен цене покупки
   DownL  =  Bid;     // Пик вниз изначально равен цене продажи
   
   return(0);
  }
//---end init--------------------------------------------------------
 

Salutations !

Expliquez comment obtenir par programme la valeur du nombre de barres entre le plus bas de la semaine dernière et le début de la semaine en cours.

 
Vit1986:

Création d'un compte de démonstration, téléchargement des cotations (SP500, RTSI, SBER etc). Création d'un conseiller expert trivial. J'ai décidé de le tester. Il fonctionne parfaitement sur le SP500 mais il ne fonctionne pas avec le SBER ou le RTSI (il ouvre un ordre puis termine son travail) et ne montre aucun message d'erreur.


1) Il ressemble plus à un script qu'à un EA.

2. Vérifiez le montant de l'argent sur la démo après avoir déplacé vingt lots.

3. Essayez OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Bid+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) ;

4. Ajouter un gestionnaire d'erreur, au moins une alerte de base (GetLastError()) ;

5. Se référer aumanuel.

Raison: