[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 842

 
Vous avez la modification d'ordre dans le même bloc que l'ouverture, et sa condition est aucun ordre. Il s'avère que vous venez d'ouvrir un ordre et que vous essayez immédiatement de le modifier - mais d'où viendra le bénéfice de 5 pips ?
 

Bonjour à tous, je m'intéresse depuis peu aux moyennes mobiles. J'ai trouvé une certaine combinaison de moyennes mobiles et de conditions de trading et j'ai décidé de vérifier mon TS, s'il est rentable ou non, et de l'optimiser, le cas échéant. Mais mon conseiller expert n'a pas ouvert de transactions pendant le test. J'ai passé toute la soirée à essayer de trouver la solution et j'ai décidé de vous demander, chers programmeurs. Pour comprendre comment l'EA fonctionne, je vais brièvement expliquer mon TS : sur le graphique avec EMA(13) et EMA(55), si une barre a traversé EMA(13) et que toutes les barres suivantes étaient au-dessus/au-dessous de EMA(13), alors en touchant le prix avec MA(13) nous ouvrons une position dans la direction des barres précédentes (après avoir traversé + au moins 9 et pas plus de 23). Take Profit 60 points, Stop Loss = EMA(55) plus moins cinq points. C'est en fait toute la stratégie. Pour une meilleure illustration, j'ai posté un exemple :

Et voici le code de l'Expert Advisor :

//+------------------------------------------------------------------+
//|                                                          DWM.mq4 |
//|                                 Copyright © 2010, Bobkov Vasiliy |
//|                                          http://www.forex4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Bobkov Vasiliy"
#property link      "http://mql4.com"
extern double Lot=0.1;
extern int FastMA=13;         //Быстрая МА
extern int SlowMA=54;         //МедленнаяМА
extern int TP=60;             //Тейк профит
extern int MinBars=8;         //Минимальное кол-во баров вне МА
extern int MaxBars=25;        //Максимальное кол-во баров вне МА
extern int slippage=3;        //Слипадж
extern int Magic=347586;      //Магическое число
extern int Space=10;          //Отступ от МА при тралле ордеров

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if (OrderCheck()==true)                                        //Проверяем, есть ли ордер...
   {                                                           //...если ордер есть...
   Trall();                                                    //Траллим
   return (0);
   }
else                                                           //...если нет открытых позиций то...
   {
   double FMA=MA(0);
   double SMA=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
   for (int x=1;;x++)                                          //Вычесляем сколько баров вне МА...
      {
      if (MA(x)<High[x]&& MA(x)>Low[x]) break;
      }
   if (Bid==FMA && x>MinBars && x<MaxBars)                     //Если условия выполняются, то...
      {
      if (FMA>SMA ) OrdOpen(0,SMA);                            //...открывем сделку на покупку
      if (FMA<SMA) OrdOpen(1,SMA);                             //...или на продажу
      }
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+

bool OrderCheck()                                              //Функция проверки позиций
   {
   for(int i=1;i<=OrdersTotal();i++)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) return(true);
         }
      else
         Print("OrderSelect() вернул ошибку - ",GetLastError());
          
      }
    return(false);
   }

void OrdOpen(int type,double SO)                               //Функция открытия позиций
   {
   if (type==0) 
      {
      if (OrderSend(Symbol(),0,Lot,Ask,slippage,SO-Space*Point,Ask+TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   else 
      {
      if (OrderSend(Symbol(),0,Lot,Bid,slippage,SO+Space*Point,Bid-TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   return;
   }
   
void Trall()                                                    //Трейллинг стоп
   {
   if (OrderSelect(Magic,SELECT_BY_TICKET)==true)
      {
      double SL=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
      if (Bid<iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0)) SL=SL+Space*Point;
      else SL=SL-Space*Point;
      if (OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Blue)==true) return;
      else Print("OrderModify() вернул ошибку - ",GetLastError());
      }
   return;
   }
double MA(int m)                                                  //Функция возвращающая значение МА
   {
   return(iMA(NULL,0,FastMA,m,MODE_EMA,PRICE_CLOSE,0));
   }

Si quelqu'un peut m'aider, je vous en prie. Je vous donnerai également l'EA elle-même

Dossiers :
dwm.mq4  5 kb
 

De nombreuses fonctions peuvent être regroupées en un seul cycle pour ouvrir, modifier, fermer des positions, etc.

Voici un exemple simple :

            bool Ans=OrderModify(Ticket,Price,SL,TP,0);
            if (Ans==true) {
               Alert ("Ордер ",Text,Ticket," модифицирован:)");
               break;                           // Из цикла модифи.
            }

- Question : est-il correct d'utiliser "break" plutôt que "return" ici ? Y a-t-il une différence ?

 
chief2000:

De nombreuses fonctions peuvent être regroupées en un seul cycle pour ouvrir, modifier, fermer des positions, etc.

Voici un exemple simple :

- Question : est-il correct d'utiliser "break" plutôt que "return" ici ? Y a-t-il une différence ?

Sur https://docs.mql4.com/ru/basis/operators/break :
"L'instruction break arrête l'exécution de l'instruction switch, while ou for externe imbriquée la plus proche. Le contrôle est donné à l'opérateur qui suit celui qui termine."

Sur https://docs.mql4.com/ru/basis/operators/return :
"L'instruction return met fin à la fonction en cours et rend le contrôle au programme appelant."

Réponse : Il est correct d'utiliser "break" ici.

 
abolk:

De https://docs.mql4.com/ru/basis/operators/break :
"L'opérateur break met fin à l'exécution du commutateur externe imbriqué le plus proche, de l'opérateur while ou for. Le contrôle est donné à l'opérateur qui suit celui qui termine."

De https://docs.mql4.com/ru/basis/operators/return :
"L'opérateur return met fin à la fonction en cours et rend le contrôle au programme appelant."

Réponse : il est correct d'utiliser "break" ici.

En fait, j'utilise moi-même break, mais je pensais que return signifiait un changement de tick (et que break ne le faisait pas).

En réalité, tant que l'ordre ne change pas, il y aura un changement de tick, donc pour que le testeur puisse simuler correctement la situation

vous devez utiliser le retour. N'est-ce pas ?

Je me trompe peut-être, mais j'aimerais le comprendre.

 
chief2000:

En fait, j'utilise moi-même break, mais je pensais que return signifiait un changement de tick ( alors que break ne le fait pas).

En réalité, tant que l'ordre ne change pas, le changement de tick se produira et le testeur doit donc utiliser le retour pour simuler correctement la situation.

vous devez utiliser le retour. N'est-ce pas ?

Je me trompe peut-être, mais je veux le comprendre.

Lisons la documentation : "L'opérateur de retour arrête l'exécution de la fonction en cours et rend le contrôle au programme appelant."

Si la fonction start() actuelle, lisez à nouveau la documentation :

https://docs.mql4.com/ru/runtime/start
"Lorsqu'une nouvelle cotation arrive, la fonction start() des Expert Advisors et indicateurs personnalisés attachés est exécutée. Si à l'arrivée d'une nouvelle cotation, la fonction start(), exécutée sur la cotation précédente, est exécutée, alors la cotation entrante sera ignorée par le Conseiller Expert. Toutes les nouvelles citations, arrivant pendant l'exécution du programme, sont ignorées jusqu'à la fin de l'exécution suivante de la fonction start(). Ensuite, la fonction start() ne sera lancée qu'après l'arrivée de la nouvelle cotation suivante.

 
abolk:

Lire dans la documentation : "L'instruction return met fin à la fonction en cours et rend le contrôle au programme appelant."

Si la fonction courante est start(), lisez à nouveau la documentation :

https://docs.mql4.com/ru/runtime/start
" Lorsque de nouvelles cotations arrivent, la fonction start() est exécutée pour les Expert Advisors attachés et les indicateurs personnalisés. Si à l'arrivée d'une nouvelle cotation, la fonction start(), exécutée sur la cotation précédente, est exécutée, alors la cotation entrante sera ignorée par le Conseiller Expert. Toutes les nouvelles citations, arrivant pendant l'exécution du programme, sont ignorées jusqu'à la fin de l'exécution suivante de la fonction start(). Ensuite, la fonction start() ne sera lancée qu'après l'arrivée de la nouvelle cotation suivante.

J'aurais aimé que tu le dises avec tes propres mots. Je ne comprends pas ce que vous voulez dire.

Dans le testeur, si for est terminé par break et qu'une autre fonction le suit, elle sera exécutée sur le même tick. Mais en réalité, plusieurs ticks peuvent changer pendant ce temps (pendant que l'ordre est modifié). C'est pourquoi je pense que le retour est plus réaliste. N'est-ce pas ?

 
chief2000:

J'aurais aimé que tu le dises avec tes propres mots. Je ne comprends pas ce que vous voulez dire.

Si for est terminé par break et suivi d'une autre fonction, il sera exécuté sur le même tick. Mais en réalité, plusieurs ticks peuvent changer pendant ce temps (pendant que l'ordre est modifié). C'est pourquoi je pense que le retour est plus réaliste. N'est-ce pas ?


start() commence au début d'un tick et peut ne pas être terminé au début du tick suivant.

break termine pour, et return termine la fonction. S'il n'y a pas d'opérateurs après for, il n'y a aucune différence dans l'utilisation de for et de return pour cet algorithme.

Mais chaque opérateur a son utilité. Et l'utilisation involontaire d'un opérateur est comme un fusil de chasse non chargé.

Encore une fois, dans l'algorithme de la boucle for, si pour une raison quelconque, il n'est pas nécessaire de poursuivre l'exécution de la fonction, nous pouvons utiliser return.

En d'autres termes, si l'algorithme nécessite une pause dans la boucle, alors la pause est utilisée, même si la fonction se termine toujours après la boucle.

 
abolk:


start() commence à travailler au début d'un tick et son travail peut ne pas se terminer au début du tick suivant.

break termine pour, return termine la fonction. S'il n'y a pas d'opérateurs après for, il n'y a pas de différence entre l'utilisation de for et de return pour cet algorithme.

Mais chaque opérateur a son utilité. Et l'utilisation involontaire d'un opérateur est comme un fusil de chasse non chargé.

Encore une fois, dans l'algorithme de la boucle for, si pour une raison quelconque, il n'est pas nécessaire de poursuivre l'exécution de la fonction, nous pouvons utiliser return.

En d'autres termes, si l'algorithme nous demande de rompre la boucle, nous mettons break, même si la fonction se termine de toute façon après la boucle.

Une pensée m'a traversé l'esprit, puisque tout ceci n'était destiné qu'au testeur, nous pouvons (si nécessaire) faire ce qui suit :

if(IsTesting()==true   ||   IsOptimization()==true) {
   return;
}

break;

Merci !

 
chief2000:

Une idée m'est venue - puisque ce projet n'a été lancé que pour un testeur, vous pourriez (le cas échéant) faire ce qui suit :

Merci !


vous pouvez