[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 228

 
Voici l'annonce
int Buy[];int Sell[];       string FileBuy="FileBuy.csv",FileSell="FileSell.csv";
 
paladin80:
Quel est le meilleur endroit pour déclarer un type de variable (int, double, etc.) en termes de réduction de la consommation de ressources lors de l'exécution du programme. Par exemple, int i peut être déclaré globalement ou dans int start() ... for (int i=OrdersTotal()-1 ; i>=0 ; i--) ... J'ai l'impression que déclarer à chaque tick est plus coûteux que de déclarer une fois au niveau global, juste après les paramètres externes. Ou la différence en termes d'intensité de ressources est-elle la même ?

Toutes les variables (emplacements mémoire) sont créées une fois au début du programme et doivent ensuite être initialisées à l'endroit où elles apparaissent dans le texte(déclaration de variable), mais cela ne se produit pas toujours, donc si vous voulez que cela fonctionne correctement, n'oubliez pas de les initialiser explicitement lors de la déclaration.
 
Shurkin:

J'ai corrigé le code pour qu'il corresponde au vôtre.
Lors du test, quatre ordres se sont fermés par ordre de mise en place sur le premier tick, le cinquième s'est fermé sur le tick suivant. Il y a probablement quelque chose d'autre qui ne va pas ici, comme je l'ai testé à plusieurs reprises.
Je colle le code du programme et les journaux du testeur.
Sincèrement. Shurkin

C'est clair. Remplacer

for(i=0, int k=0; i<OrdersTotal();i++,k++)//

à .

int total=OrdersTotal();
for(i=0, int k=0; i<total;i++,k++)//
 
Bonjour, Pourriez-vous me dire comment calculer la somme des valeurs de l'indicateur dans chaque bloc d'histogramme séparé ? J'ai écrit un indicateur, mais il ne commence à fonctionner que lorsqu'il est défini. Sur les barres précédentes - rien ! Je n'arrive pas à faire un cycle "while" ! Aidez-nous, professionnels.

	          
 

La situation est la suivante :

//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound()
{
   for (int obj=0; obj<=ObjectsTotal()-1; obj++)
   {
      objName = ObjectName(obj);
      isObj = ObjectFind(objName);
      objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
      objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
      objPriceCurr = ObjectGetValueByShift(objName,0);
   }
   Print("objPriceCurr = ", objPriceCurr);
      
      if (isObj != -1)  // Если объект найден, значит выходим из функции
         return (true);
         
   return (false); // Объект не найден!
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   int signal = GetSignal();
   
   if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }

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 .

Au départ, j'ai prescrit une condition selon laquelle si l'objet n'est pas trouvé, je quitte la fonction :

if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }

Je l'ai lancé dans le testeur, je n'ai dessiné aucun objet, il n'y a rien - un graphique nu. Néanmoins, la fonction ne se termine pas et n'est pas imprimée en conséquence :

 Print("В окне отсуствуют объекты, поиск продолжается...");

La fonction de démarrage se poursuit. De quoi s'agit-il ?

 
Ce n'est pas bon du tout.
 
Qu'est-ce qu'il y a ?
 

Lesvariables globales sont des recherches globales. Que pouvez-vous dire de l'algorithme sans voir le modèle de données ?

Je retracerais exactement les données. Et isObj vraiment booléen, et tout ça ...

 
tara:

Les variables globales sont des recherches globales. Que pouvez-vous dire de l'algorithme sans voir le modèle de données ?

Je retracerais exactement les données. Et isObj vraiment booléen, et tout ça ...


//+-------------------------------------------------------------------------------------+
//|                                                TradingByLine.mq4                    |
//|                                                              hoz                    |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string ___H0 = "Параметры отклонений зоны сигнала";
extern double dernovich = 40,
              faustUs = 40;
/*extern double limitOverLine = 3,
              limitUnderLine = 20;*/

string objName;                                  // Имя объекта
int isObj;                                       // Возвращает окно, которому принадлежит
                                                 // ..наденнный объект, либо -1
double objPrice1,                                // Первая координата цены луча     
       objPrice2,                                // Вторая координата цены луча
       objPriceCurr;                             // Цена объекта на заданном баре
int pt;

#define SIGNAL_BUY         0                     // Сигнал на покупку
#define SIGNAL_SELL        1                     // Сигнал на продажу
#define SIGNAL_NO         -1                     // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   if(Digits == 2 || Digits == 4)
     pt = Point;
   if(Digits == 1 || Digits == 3 || Digits == 5)
     pt = Point*10;
   if(Digits == 6)
     pt = Point*100;
   if(Digits == 7)
     pt = Point*1000;

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сигнализатор касания о луч                                                          |
//+-------------------------------------------------------------------------------------+
bool AlertByTouching(int signal)
{
   double priceDevBefore,
          priceDevAfter;
   
   if (signal == SIGNAL_SELL)
   {
      priceDevAfter = objPriceCurr + faustUs * pt;
      priceDevBefore = objPriceCurr - dernovich * pt;

      if (Bid <= priceDevAfter && Bid >= priceDevBefore)
      {
         Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
         Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
         
         return (true);
      }
   }
   if (signal == SIGNAL_BUY)
   {
      priceDevAfter = objPriceCurr - faustUs * pt;
      priceDevBefore = objPriceCurr + dernovich * pt;
      Print("priceDevAfter = ", objPriceCurr - faustUs * pt);
      Print("priceDevBefore = ", objPriceCurr - faustUs * pt);
      Print("Ask >= priceDevAfter && Ask >= priceDevBefore ", Ask ," >= ", priceDevAfter ," && ", Ask ," >= ", priceDevBefore);
      if (Ask >= priceDevAfter && Ask >= priceDevBefore)
      {
         Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
         Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
         
         return (true);
      }
   }
   return (false);
}
//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool GetSignal()
{
   if (!IsObjectFound())
      return (SIGNAL_NO);
   if (objPrice1 > objPrice2)
      return (SIGNAL_BUY);
   if (objPrice1 < objPrice2)
      return (SIGNAL_SELL);
}
//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound()
{
   for (int obj=0; obj<=ObjectsTotal()-1; obj++)
   {
      objName = ObjectName(obj);
      isObj = ObjectFind(objName);
      objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
      objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
      objPriceCurr = ObjectGetValueByShift(objName,0);
   }
   Print("objPriceCurr = ", objPriceCurr);
      
      if (isObj != -1)  // Если объект найден, значит выходим из функции
         return (true);
         
   return (false); // Объект не найден
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   int signal = GetSignal();
   
   if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }
   
   if (signal != SIGNAL_NO)
      if (!AlertByTouching(signal))
         return (0);
   
   Print("objPrice1 = ", objPrice1, ", objPrice2 = ", objPrice2);
  // Print("objPriceCurr = ", objPriceCurr);

  return (0);
}
isObj est un int. Renvoie la fenêtre dans laquelle se trouve l'objet, s'il y en a une. S'il n'existe pas, je comprends qu'il renvoie -1. Selon la doc, la fenêtre principale commence à 0 et ensuite les sous-fenêtres... Jusqu'à présent, il s'agit de l'ébauche d'un conseiller expert en trading, purement signalétique. Mais il diffuse des messages quand il le souhaite.
 
OK, je regarde.
Raison: