Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 194

 
Qui sait - si vous fermez une partie d'une commande, son magicien ou son commentaire va-t-il disparaître ?
 
Renat Akhtyamov:
Qui sait - si vous fermez une partie de l'ordre, sa magie ou son commentaire disparaîtront ?

Le magik restera, le ticket de commande changera et le commentaire contiendra le ticket de commande parent de#xxxxxxxxxxx. La commande parent aura un ticket de commande enfant : to#xxxxxxxxxxx

 
Artyom Trishkin:

Le magik restera, le ticket de commande changera et le commentaire contiendra le ticket de commande parent de#xxxxxxxxxxx. La commande parent aura un ticket de commande enfant : to#xxxxxxxxxxx

Ok. Merci !
 
geratdc:


Oui, ce K est aussi dans lesvariables externes dans le chapeau supérieur - peut-être est-ce la valeur de retour d'une fonction...


Alexey, que pouvez-vous dire à propos de mon problème ? J'essaie d'attacher un stop suiveur aux ordres inversés. Avez-vous rencontré un tel problème ?

Et pour pouvoir répondre à quoi que ce soit sur le problème, il faut comprendre le problème lui-même. Et de ce

geratdc:

J'ai besoin d'aide - j'ai 3 ordres stop mais l'exemple de trailing stop des tutoriels vidéo :) ne concerne que les ordres non liés, dans mon cas ils sont liés par un algorithme, c'est-à-dire que le takeprofit est calculé par la somme des trois ordres ou un seul si je suis dans une tendance. Eh bien, j'ai pensé à quelque chose mais mon conseiller expert n'a pas commencé à gagner plus - il a commencé à gagner le même nombre d'ordres mais j'obtiens 2-3 fois moins de transactions par rapport à mon EA précédent sans trailing. Donc mon trailing n'est pas un trailing mais une absurdité. Comment dois-je le placer sur les commandes liées ? Quelqu'un peut-il me donner une idée ? J'ai bien peur de ne pas pouvoir penser à autre chose. Voici le résultat de mon "trailing" - il est indiqué en bleu :

Le résultat pour 1 test est joint. Y a-t-il un stop suiveur ou non ? Je ne comprends pas. Pourquoi le bénéfice pour la même période n'a-t-il pas été augmenté ? Seulement le nombre de transactions a diminué de 2 à 3 fois ?


Je ne comprends rien. La chose la plus étrange est"j'ai inventé quelque chose", mais avez-vous compris ce que vous avez inventé ? Et c'est"Comment faire sur les commandes liées". Mais il y a aussi"Je crains de ne pouvoir penser à autre chose".

 
Alexey Viktorov:

Et pour pouvoir répondre à ce problème, il faut comprendre le problème lui-même. Et de ceci.

Je ne comprends rien. La chose la plus étrange est"J'ai tout compris", mais savez-vous ce que vous avez compris ? Et puis il y a"Comment faire pour être sur les mandats liés?". Mais il y a aussi"Je crains de ne pouvoir penser à autre chose".


Si je comprends bien, les trailing stops ne peuvent pas être appliqués correctement aux ordres, nous devrions donc prêter beaucoup d'attention à cette fonction CalculateProfit, à savoir à la variable "op" selon laquelle les ordres sont fermés si la somme des profits des 3 ordres est égale à TakeProfit et essayer de parcourir cette variable. Je vais essayer de réfléchir à quelque chose dans ce sens. Je comprends qu'il soit difficile de traiter avec des tiers abracadabra)))).
 
geratdc:

Si je comprends bien, les stops suiveurs ne peuvent pas être appliqués correctement aux ordres, c'est pourquoi nous devrions regarder de plus près cette fonction CalculateProfit, en particulier, la variable "op" selon laquelle les ordres sont fermés si la somme des profits pour les 3 ordres est égale à TakeProfit et essayer de suivre à travers cette variable. Je vais essayer de réfléchir à quelque chose dans ce sens. Je comprends qu'il soit difficile de faire face à l'abracadabra d'une tierce partie))).
Pourquoi ne pouvez-vous pas l'appliquer ? Il est nécessaire de ne pas attacher ou inventer quelque chose aux fonctions d'autrui, et d'écrire les vôtres pour qu'elles réalisent tout ce que vous voulez. Quel pourrait être le problème ? Quel que soit le nombre d'ordres, calculez le prix moyen et trafiquez à partir de celui-ci. Lorsqu'une certaine condition est remplie, en passant par tous les ordres dans la boucle, réarranger leurs arrêts sur un nouveau niveau, qui est calculé à partir du prix moyen de tous les ordres existant dans une direction.
 
//+------------------------------------------------------------------+
//|                                     BLACKJACK&HOOKERS TrailX.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots           = 0.01;
extern double  TakeProfit     = 1;
extern int     Step           = 1;

extern double  TrailXStep     = 1;
extern double  TrailXStop     = 1;

extern int     MaPeriod       = 100;
extern int     MaShift        = 1;

extern int     Magic          = 123;
extern int     Slippage       = 5;

int timeprev=0;

extern double price,op,cn,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)
      //TakeProfit     *= 10;
      Step           *= 10;
      //TrailXStep     *= 10;
      //TrailXStop     *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1); 
   op=CalculateProfit();
   cn=CountTrades();
   tp=TakeProfit;
   if (tp>TakeProfit)
   {
      TakeProfit+=tp;
   }
   
 

 
   if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
   {
      if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0)
            Print("Не удалось открыть ордер на покупку");
            
   }
   
   if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
   {
      if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0)
            Print("Не удалось открыть ордер на продажу");
            
   }
   

   
   if(cn==1 && CountBuy()==1) 
   {
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на продажу");
      }
   }
   else if(cn==1 && CountSell()==1) 
   {
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
      }
   }
   
   
   
   if(cn==2 && CountBuy()==1 && CountSell()==1) 
   {
      price=FindLastSellPrice();
      if((price-Bid)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   else if(cn==2 && CountSell()==1 && CountBuy()==1) 
   {
      price=FindLastBuyPrice();
      if((Ask-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   
   Trailing();

   if (op>=tp)
   {
         CloseAll();    
   }


}    
//---------------------------------------------------------------------------------------
void Trailing()           
            {  

               if (op > (TakeProfit+TrailXStep))
               {
                  tp=(TakeProfit+TrailXStep);
               }
               if (op > (TakeProfit+TrailXStep-TrailXStop) && op < (TakeProfit+TrailXStep+TrailXStop))
               {
                  tp=(TakeProfit+TrailXStep-TrailXStop);
               }
               
            }
//---------------------------------------------------------------------------------------
double CalculateProfit()
  {
   double oprofit=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               oprofit+=OrderProfit();
              }
           }
        }
     }
   return(oprofit);
  }
//--------------------------------------------------------------------------------------
void CloseAll()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Print("Не удалось закрыть ордер на покупку");
              }
            if(OrderType()==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Print("Не удалось закрыть ордер на продажу");
              }
           }
        }
     }
  }
//---------------------------------------------------------------------------------------------------
double FindLastBuyPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//---------------------------------------------------------------------------------------------------
double FindLastSellPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//----------------------------------------------------------------------------------------------
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            count++;
        }
     }
   return(count);
  }
//----------------------------------------------------------------------------------------------
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
      {  
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  count++; 
         }
      }
      return(count);
}
//----------------------------------------------------------------------------------+
int FindLastOrderType()
{
      for(int i = OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(OrderType());
         } 
      }
      return(-1);
}
//----------------------------------------------------------------------------------+

Il s'agit d'une variante du suivi par la fonction CalculateProfit(), les deux variantes de suivi ont les mêmes indicateurs dans le trading - tant en nombre de transactions qu'en bénéfices. Les profits ne sont pas nombreux - maintenant je vais ajouter de la volatilité et des indicateurs d'entrée plus précis. Je pense qu'un seul et même indicateur peut résoudre ces problèmes, non ? Disons, qui analyse les 5 dernières mesures ou quelque chose comme ça. Comment appelle-t-on de tels indicateurs de barres ? Et quelle est la meilleure période de temps ? Partagez vos réflexions, s'il vous plaît, comment puis-je faire d'une pierre deux coups avec un seul indicateur ... Je fais d'une pierre deux coups :)

Comment voyez-vous les barres de suivi sur cet EA ?

 
Alexey Viktorov:
Pourquoi ne pouvez-vous pas l'appliquer ? Vous ne devez pas attacher ou inventer quelque chose à la fonction de quelqu'un d'autre, mais écrire la vôtre pour qu'elle fasse ce que vous voulez qu'elle fasse. Quel pourrait être le problème ? Quel que soit le nombre d'ordres, calculez le prix moyen et chaloupez à partir de celui-ci. Lorsqu'une certaine condition est remplie, en passant par tous les ordres de la boucle, réarrangez leurs arrêts sur un nouveau niveau qui est calculé à partir du prix moyen de tous les ordres d'une direction.

Je l'ai gardé, merci. Je ne le pense pas encore. Je devrais avoir une bibliothèque de codes et de fonctions dans ma tête, tandis que dans les tutoriels vidéo, nous avons passé en revue tout ce que j'ai mis en œuvre jusqu'à présent. Peut-être que je vais m'améliorer et mettre vos conseils en pratique. Ce que j'ai inventé aujourd'hui, est-ce que ça ressemble à un chalut ? Eh bien, le conseiller expert effectue un chalutage selon les rapports, mais je ne sais pas lequel est le bon - un mauvais chalutage ne fera qu'augmenter la probabilité de perte. Je dirais qu'il a une probabilité de défaillance de 0,9, soit environ )))). Je dirais qu'il a très peur du plat et l'indicateur est faible maintenant - stupidement nous rejoignons la tendance et quand nous avons 3 ordres et que le marché change soudainement de direction et nous donne un drawdown - nous perdons.
 
geratdc:

Je l'ai enregistré, merci. Je ne peux pas encore penser comme ça. Je dois avoir une bibliothèque dans ma tête de codes et de fonctions, et j'ai parcouru les tutoriels vidéo, c'est ce que j'utilise maintenant. Peut-être que je vais m'améliorer et mettre vos conseils en pratique. Ce que j'ai inventé aujourd'hui, cela ressemble-t-il à un chalut ? Eh bien, le conseiller expert effectue un chalutage selon les rapports, mais je ne sais pas lequel est le bon - un mauvais chalutage ne fera qu'augmenter la probabilité de perte. Je dirais qu'il a une probabilité de défaillance de 0,9, soit environ )))). Je dirais qu'il a très peur du plat et l'indicateur est faible maintenant - stupidement nous rejoignons la tendance et quand nous avons 3 ordres et que le marché change soudainement de direction et nous donne un drawdown - nous perdons.

Eh bien, je vais essayer de faire ma part pour vous éduquer davantage.

Je vous appellerai "vous" quand je l'enverrai. J'ai un instantané du pointeur...

Dites-moi, n'est-ce pas une erreur d'appeler la même fonction 5 fois sur le même tick ? Mais c'est la moitié du problème. Cette fonction passe en revue tous les ordres. Et tout ça 5 fois en une seule fois... Et je compte 4 fonctions de ce type. Nous pouvons facilement intégrer 3 fonctions supplémentaires à la boucle pour rechercher toutes les commandes sans nous creuser la tête.

En voici deux.

if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
if(cn==1 && CountBuy()==1)


else if(cn==1 && CountSell()==1) 
if(cn==2 && CountBuy()==1 && CountSell()==1) 


else if(cn==2 && CountSell()==1 && CountBuy()==1)

Il s'agit de .

Trailing();


}    
//---------------------------------------------------------------------------------------
void Trailing()           
            {  

               if (op > (TakeProfit+TrailXStep))
               {
                  tp=(TakeProfit+TrailXStep);
               }
               if (op > (TakeProfit+TrailXStep-TrailXStop) && op < (TakeProfit+TrailXStep+TrailXStop))
               {
                  tp=(TakeProfit+TrailXStep-TrailXStop);
               }
               
            }


Il est loin d'être à la traîne.

Pour comprendre cela, il faut bien comprendre la définition du terme "traînage". Je ne me souviens plus du mot à mot, mais on peut le décrire de la manière suivante : "Déplacer le niveau de StopLoss en suivant le prix afin de diminuer les pertes possibles ou d'augmenter le profit "garanti".


Et ceci

extern double price,op,cn,tp;

à quoi cela ressemble-t-il lorsque vous exécutez le conseiller expert ? Probablement quatre lignes... sont-ils nécessaires ?


Une dernière chose pour aujourd'hui : vous n'avez pas besoin d'avoir une bibliothèque dans votre tête. Il suffit d'avoir de la documentation et de savoir comment l'utiliser. Je ne me souviens toujours pas de tous les paramètres de iMA(_Symbole, _Période, ,,,,,) et je n'écris plus qu'après avoir consulté la documentation. Et donc presque toutes les fonctions. Heureusement, il n'y a pas si longtemps, ils ont créé des infobulles qui ne sont pas d'une grande aide. Je n'essaie pas de mémoriser la façon d'écrire ces enums. Je dois donc consulter la documentation à chaque fois.

 

Pouvez-vous me dire quelle fonction vérifie le statut de cette case à cocher ?


Raison: