[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 511

 
hoz:


Oui, j'ai eu tort. En général. Si cela est clair ici, l'ordre en attente est fixé uniquement par le prix.

Voici le code :

La question est essentiellement simple. J'ai passé des paramètres formels priceForBuy et priceForSell à la fonction Trade(int signal, double& priceForBuy, double& priceForSell). Les paramètres sont passés par les liens. Ce n'est pas comme ça que ça se passe ? Les fonctions sont locales et non globales.

Une erreur s'est produite pendant la compilation :

D'où vient l'erreur ? J'ai déjà défini ces paramètres dans la fonctionGetPriceToInput().

Les variables priceForBuy et priceForSell n'ont pas été trouvées - le compilateur dit. Vous devez trouver comment transmettre les valeurs des variables par référence.
 
hoz:

Comment pourrait-il en être autrement ? Devez-vous calculer la même chose encore et encore 100 fois ?

Faites en sorte que le signal fasse partie de l'expert, comme dans le manuel, et vous serez heureux !

Je vous ai donné tous les liens dans le fil plus tôt...


 
hoz:

Comment pourrait-il en être autrement ? Faut-il calculer 100 fois la même chose ?
L'idée est JUSTE, la mise en œuvre est FAUSSE ! :)))
 

Il n'y a pas d'exemples concrets ici :

https://docs.mql4.com/ru/basis/variables/formal

Il est écrit en haut, là où les paramètres de la fonction sont comme les miens, c'est-à-dire & après le type de données.

 
hoz:

Il n'y a pas d'exemples concrets ici :

https://docs.mql4.com/ru/basis/variables/formal

C'est écrit en haut, là où les paramètres de la fonction sont comme les miens, c'est-à-dire & après le type de données.

Peut-être que ça compilera de cette façon :

//+-------------------------------------------------------------------------------------+
//| Получение цены входа в покупку или в продажу                                        |
//+-------------------------------------------------------------------------------------+
bool GetPriceToInput (int signal)
{
  firstBarClosed = iClose(Symbol(),1440,2);
  secondBarClosed = iClose(Symbol(),1440,1);

    double deltaForSell = (firstBarClosed - secondBarClosed)/2;
    double priceForSell = secondBarClosed - deltaForSell;


    double deltaForBuy = (secondBarClosed - firstBarClosed)/2;
    double priceForBuy = secondBarClosed + deltaForBuy;  
    return (Trade (signal, priceForBuy, priceForSell));
}
//+-------------------------------------------------------------------------------------+
//| Функция Start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
  int signal = GetSignal();
    
    if (signal != SIGNAL_NO)
      if(!GetPriceToInput (signal))
      return(0);

  return(0);
}

bien que la structure du code soit un peu "gauche"...

 
TarasBY:

Peut-être que ça compilera de cette façon :

bien que la structure du code soit un peu "gauchère"...


Eh bien... c'est moi qui l'ai écrit. Chantez le premier scoop. :)
 

J'ai réécrit un peu de l'expert. C'est ce qui est sorti :

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

extern string    A1 = "Объем сделки. Если i_lots = 0, то считается в процентах";
extern double    i_lots = 0.1;
extern string    A2 = "Управление рисками";
extern double    i_sl = 15,
                 i_tp = 10;
extern int  slippage,
            price_b,
            price_a;

extern string    Z1 = "=== Прочие настройки ===";
extern string    i_openOrderSound = "ok.wav";
extern int       i_magicNumber = 400021;

double firstBarClosed,
       secondBarClosed;
 
// Идентификаторы типов сигналов
#define SIGNAL_BUY              1                     // Сигнал на покупку
#define SIGNAL_SELL            -1                     // Сигнал на продажу
#define SIGNAL_NO               0                     // Нет сигнала

#include <stderror.mqh>

//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации эксперта                                                     |
//+-------------------------------------------------------------------------------------+
int init()
{
   
   return(0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации эксперта                                                     |
//+-------------------------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal, double& priceForBuy, double& priceForSell)
{
 // FindOrders();
  priceForBuy = NormalizeDouble(priceForBuy,Digits);
  priceForSell = NormalizeDouble(priceForSell,Digits);
  
  if (signal == SIGNAL_BUY)
     if (!OrderSend(Symbol(),OP_BUYLIMIT, i_lots,priceForBuy,slippage,i_sl,i_tp,"",i_magicNumber,3))
     return(false);
     
  if (signal == SIGNAL_SELL)
     if (!OrderSend(Symbol(),OP_SELLLIMIT,i_lots,priceForSell,slippage,i_sl,i_tp,"",i_magicNumber,3))
     return(false);
     
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Получение цены входа в покупку или в продажу                                        |
//+-------------------------------------------------------------------------------------+
double GetPriceToInput(int signal)
{
  firstBarClosed = iClose(Symbol(),1440,2);
  secondBarClosed = iClose(Symbol(),1440,1);
    
  double deltaForSell = (firstBarClosed - secondBarClosed)/2;
  double priceForSell = secondBarClosed - deltaForSell;
    
//  return(priceForSell);

  
  double deltaForBuy = (secondBarClosed - firstBarClosed)/2;
  double priceForBuy = secondBarClosed + deltaForBuy;  
  return(Trade(signal, priceForBuy, priceForSell));
}
//+-------------------------------------------------------------------------------------+
//| Генерация сигнала закрытия, покупки или продажи                                     |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
  if(firstBarClosed > secondBarClosed)
  return(SIGNAL_BUY);

  if(firstBarClosed < secondBarClosed)
  return(SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция Start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
  int signal = GetSignal();
    
    if (signal != SIGNAL_NO)
      if(!Trade(signal, priceForBuy, priceForSell))
      return(0);

  return(0);
}

 

Au fait, l'erreur :

'priceForBuy' - variable not defined    E:\Insall'd soft's\Forex\Admiral Markets\experts\2 Days.mq4 (103, 25)
'priceForSell' - variable not defined   E:\Insall'd soft's\Forex\Admiral Markets\experts\2 Days.mq4 (103, 38)

se produit exactement dans la fonction dedépart, ces variables ne sont pas définies, pas ailleurs. Il faut donc ajouter quelque chose pour commencer?

 
hoz:

Au fait, l'erreur :

se produit exactement dans la fonction dedépart, ces variables ne sont pas définies, pas ailleurs. Il faut donc ajouter quelque chose pour commencer?

Ils doivent être définis dans start() et passés à la fonction appelée par référence.
 
Reshetov:
Ils doivent être définis dans start() et passés par référence à la fonction que nous appelons.


C'est le moyen le plus simple. Mais je regarde des articles écrits par un programmeur et il n'y a rien de défini dans la fonction start() du tout.

Voici un lien vers son conseiller :

http://www.forextrade.ru/media/Image/MQLabs/181_ag/ChannelByMACross_Expert.mq4

En particulier, je suis très intéressé par la façon dont il écrit le code intelligemment. Je veux donc apprendre à tout écrire dans des fonctions séparées, et à n'ajouter que l'essentiel pourcommencer sans y déclarer de variables.

Si nous passons une variable par référence dans une fonction, nous travaillons avec un tampon de la variable originale, et non avec son double séparé. Cela signifie que la fonction dans laquelle nous l'avons précédemment déclaré n'a pas d'importance. N'est-ce pas ?

 
hoz:


Il s'agit de la variante la plus simple. Mais j'observe des articles écrits par un programmeur et rien n'est déclaré dans sa fonction de démarrage.

Vous pouvez déclarer une variable statique en dehors des fonctions et vous n'aurez plus besoin de passer quoi que ce soit par référence.

hoz:

Si nous passons une variable par référence dans une fonction, nous travaillons avec un tampon de la variable initiale elle-même que nous passons au lieu de son double séparé. Cela signifie que la fonction dans laquelle nous l'avons précédemment déclaré n'a pas d'importance. N'est-ce pas ?

Vous ne pensez pas correctement. Si vous passez une variable en tant qu'argument à une fonction, vous n'avez pas besoin de la déclarer au corps de la fonction - elle est déjà déclarée dans l'argument. Vous devez déclarer la fonction d'où il est passé.