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

 
Pouvez-vous me dire comment calculer le dépôt à terme ?
 
Roman.:

"Je veux le faire afin de ne pas obtenir les mêmes données dans différentes f-fonctions. Je ne pense pas qu'il soit raisonnable de calculer les mêmes masques dans 2 ou plusieurs fonctions. Il est plus facile de le calculer une fois et c'est tout. Pourquoi gaspiller des ressources supplémentaires à ce sujet ?

Faites ce qui est indiqué dans la documentation et ne réinventez pas la roue.

Qu'est-ce que ce cycle a à voir avec quoi que ce soit ?

 for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }

Passez par les étapes vous-même, que se passe-t-il lorsque vous en sortez et qu'en faites-vous ensuite ? C'est absurde.

Vous procédez comme dans le didacticiel - tous les signaux commerciaux dans cette définition des critères commerciaux - en série (vous pouvez les envelopper dans différentes fonctions et ensuite travailler avec elles lorsque vous vérifiez si ces critères commerciaux fonctionnent), puis les conditions de leur fonctionnement.

En ce qui concerne le cycle, c'est parce que je vais vérifier l'intersection des paramètres des indicateurs. Tout est élémentaire ici. Je l'ai lu et il est écrit de la façon dont je le pense.

Dans le manuel, à l'adresse https://book.mql4.com/ru/build/conditions, tout est regroupé. J'ai le MACD et le stochastique dans une seule fonction, je n'en ai pas besoin.

En fait, toutes les valeurs de l'indicateur dans le lien doivent être transférées aux fonctions appropriées. Pourquoi pas ? C'est logique.

 
TarasBY:
Ce qu'on raconte et ce qu'on "dessine" - DEUX GRANDES DIFFÉRENCES ! !! :))

Je suis déjà un peu perdu. Voici 3 fonctions, dont chacune reçoit un signal spécifique pour un indicateur spécifique.

//+---------------------------------------------------------------------------------------+
//| Проверка пересечения скользящих средних                                               |
//+---------------------------------------------------------------------------------------+
int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)
{
      if ((i_maFast2<i_maSlow2) && (i_maFast1>i_maSlow1))             // Если быстрая скользящая пересекла медленную снизу вверх..
      return(CROSSINGTOUP);                                           //.. значит, - пересечение вверх
                                                 
      if ((i_maFast2>i_maSlow2) && (i_maFast1<i_maSlow1))             // Если быстрая скользящая средняя пересекла медленную сверху вниз..
      return(CROSSINGTODOWN);                                         //..значит, - пересечение вниз
 
   return(CROSSINGWAIT);                                              // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Стохастика                                                       |
//+---------------------------------------------------------------------------------------+
int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)
{
      if((stochD2<stochK2) && (stochD1>stochK1))                     // Если сигнальная линия пересекла главную снизу вверх..
      return(CROSSINGTOUP);                                          //..значит, - пересечение вверх
      if((stochD2>stochK2) && (stochD1<stochK1))                     // Если сигнальная линия пересекла главную сверху вниз..
      return(CROSSINGTODOWN);                                        // ..значит, - пересечение вниз
   return(CROSSINGWAIT);                                             // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Моментума                                                        |
//+---------------------------------------------------------------------------------------+
void GetMomentumSignal()
{
   double momentum = iMomentum(Symbol(),i_TF,i_momPeriod,0,0);
}

Cette fonction reçoit le signal général de tous les indices et prend la décision d'ACHETER ou de VENDRE.

//+---------------------------------------------------------------------------------------+
//| Получение общего сигнала для входа в рынок                                            |
//+---------------------------------------------------------------------------------------+
int GetSignal()
{
   for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }
      if( GetCrossingMa(i_maFast1, i_maFast2, i_maSlow1, i_maSlow2)==CROSSINGTOUP || i_maFast1>i_maSlow1 )
      return(SIGNAL_BUY);
}

C'est la fonction principale qui reçoit le signal général ; ici nous obtenons les valeurs des indices à travers la boucle pour passer par toutes les barres, bien sûr... Et ensuite, les valeurs obtenues sont transmises par référence aux fonctions appropriées où ces valeurs sont nécessaires, c'est-à-dire aux fonctions :

int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)

int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)

void GetMomentumSignal() , en principe, peut également être placé à cet endroit.

Ainsi, tous les calculs des indices seront dans une fonction principale d'obtention du signal. Tout ici est logique.

 

Immédiatement après l'attachement à la carte, le programme lance la fonction init(). La fonction init() du conseiller ou de l'indicateur personnalisé attaché démarre immédiatement après le démarrage du terminal client et le chargement (cela ne concerne que les conseillers et non les indicateurs) des données historiques, après un changement de symbole et/ou de période graphique, après la recompilation du programme dans MetaEditor, après un changement des paramètres d'entrée de la fenêtre de paramétrage de l'EA ou de l'indicateur personnalisé. Le conseiller expert est également initialisé après un changement de compte.

Pouvez-vous expliquer comment cela fonctionne ? En arrière-plan, ou cela peut-il être suivi d'une manière ou d'une autre ? Ou la fonction init dans l'indicateur, lorsque je démarre le terminal après une longue période d'inactivité ne démarrera pas du tout ?

 
fore-x:

Immédiatement après l'attachement à la carte, le programme lance la fonction init(). La fonction init() du conseiller ou de l'indicateur personnalisé attaché démarre immédiatement après le démarrage du terminal client et le chargement (cela ne concerne que les conseillers et non les indicateurs) des données historiques, après un changement de symbole et/ou de période graphique, après la recompilation du programme dans MetaEditor, après un changement des paramètres d'entrée depuis la fenêtre de paramétrage de l'EA ou de l'indicateur personnalisé. Le conseiller expert est également initialisé après un changement de compte.

Pouvez-vous expliquer comment cela fonctionne ? En arrière-plan, ou cela peut-il être suivi d'une manière ou d'une autre ? Ou la fonction init en indicateur au début du terminal ne démarre pas après une longue période d'inactivité ?

La fonction init est destinée à stocker des données qui ne seront pas modifiées pendant toute l'exécution de l'EA. Il peut s'agir de données qui ne seront calculées qu'une seule fois après le chargement du programme, sans qu'il soit nécessaire de les recalculer. C'est ainsi que je le comprends.

Et si les valeurs des variables doivent être recalculées, par exemple, à chaque arrivée d'une nouvelle barre, alors nous ne devrions pas déclarer ces variables dans la fonction init, puisqu'elles n'y seront pas recalculées.

Pour faciliter la compréhension, voici ce qui peut et doit être déclaré dans init:

   Tick = MarketInfo(Symbol(), MODE_TICKSIZE);                         // минимальный тик    
   Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);                 // текущий спрэд
   StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);  // текущий уровень стопов
   MinLot = MarketInfo(Symbol(), MODE_MINLOT);    // минимальный разрешенный объем сделки
   MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);   // максимальный разрешенный объем сделки
   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);          // шаг приращения объема сделки

Il s'agit d'une collecte de données sur le marché et ces données ne sont pas modifiées. Bien qu'il s'agisse d'une question relative à la variable Spread... si l'écart n'est pas fixe, il est préférable de le mettre dans des fonctions séparées.

 
hoz:

Lafonction init est utilisée pour stocker des données qui ne seront pas modifiées pendant toute la durée de l'EA...

Vous répondez hors sujet, une fois de plus - la fonction init()est lancée après lechargement desdonnées historiques (cela ne s'applique qu'aux Expert Advisors, pas aux indicateurs) - comment comprenez-vous cela (je veux le sentir) ?


Prendre un pion sur une passe - je sais qu'il existe une telle règle, mais je ne sais pas comment l'appliquer (c'est plus clair) ?

 
J'ai répondu ci-dessus comme je le comprends. Je n'ai pas vraiment compris votre point de vue. Peut-être que quelqu'un d'autre le fera.
 

J'ai une combinaison de chandeliers et j'aimerais qu'ils fonctionnent sur différentes échelles de temps. À titre d'exemple

si(iHigh("EURUSD",PERIOD_M5,1)>iLow("EURUSD",PERIOD_M5,1)+8*kio*Point)

{

go_s=true ;

}

Je pensais pouvoir lier ma combinaison en utilisant iHigh, iLow, iOpen, etc. Mais lorsque je l'ai testée sur M5, elle a donné un résultat, mais sur d'autres périodes, un autre résultat. Aidez-moi à comprendre ce que je fais mal. Merci !

 
hoz:

...

Le manuel scolaire https://book.mql4.com/ru/build/conditions est tout emmêlé. Il a MACD et stochastique dans une seule fonction, et je n'en ai pas besoin de cette façon.

Et en fait, toutes les valeurs des indicateurs par le lien doivent être transmises aux fonctions appropriées. Pourquoi pas ? C'est logique.

Ainsi, il s'avère que tous les calculs d'indices seront dans une seule et même f-fonction principale pour obtenir le signal. Tout a un sens.

Désolé, mais il semble que vous soyez encore au tout début de la chaîne alimentaire, c'est exactement là où "tout est logique". :-)

Faites-le comme un LIVRE D'ÉTUDE et un DOCI, puis intégrez-le dans des fonctions distinctes et obtenez un critère de négociation dans le résultat.

Dans le tutoriel - tout est enregistré en une fois dans la résultante, vous pouvez enregistrer vos f-i-tions - séparément, et le RÉSULTAT est dessiné comme dans le tutoriel ! Aucun transfert de boucle ou de valeur de paramètre par référence n'est nécessaire ici !

P.S. Et en général, tout d'abord, démontez les codes d'expositions - tous dans le tutorial et quelques-uns dans kodobase - tout se met en place.

 
fore-x:

Immédiatement après l'attachement à la carte, le programme lance la fonction init().La fonction init() du conseiller ou de l'indicateur personnalisé attachédémarre immédiatement après le démarrage du terminal client et lechargement (cela ne concerne que les conseillers et non les indicateurs)des données historiques, après un changement de symbole et/ou de période graphique, après la recompilation du programme dans MetaEditor, après un changement des paramètres d'entrée depuis la fenêtre de paramétrage de l'EA ou de l'indicateur personnalisé. Le conseiller expert est également initialisé après un changement de compte.

Pouvez-vous expliquer comment cela fonctionne ? En arrière-plan, ou cela peut-il être suivi d'une manière ou d'une autre ? Ou la fonction init de l'indicateur, lorsque vous démarrez le terminal après une longue période d'inactivité, il ne démarre pas du tout ?

Je ne suis pas sûr de ce que vous voulez. Dans votre description de init(), il y a quelques "points" pas tout à fait corrects surlignés en rouge. Par exemple, le démarrage du terminal client s'accompagne du chargement des données historiques et il est incorrect de mettre en évidence le mot "chargement" - ce n'est pas le processus qui lance l'initialisation.

Et tout dans la vie ne peut pas être touché : tout au plus - à contempler. :)))) Vous voulez fixer le processus d'initialisation, c'est-à-dire lancer la fonction init() - imprimez une ligne de notification à l'intérieur de cette fonction.