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

 
borilunad:

Sergey Dubakin a gentiment proposé la fonction CloseBy, mais malheureusement elle ne remplit pas une condition importante pour moi, à savoir fermer une position avec une perte maximale par une position opposée avec un profit maximal.

Bonjour, cette fonction ferme une position avec une perte maximale avec la position opposée avec un profit maximal. Voici une EA de test pour le testeur :

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
 {
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
   SL=NormalizeDouble(Price-300*Point,Digits);    
   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
   SL=NormalizeDouble(Price+300*Point,Digits);    
   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
 }

bool LockOFF(int EA_Magic) {
 double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие!"); return(false); }
 
 return(true); }

Il ouvre alternativement des positions d'achat et de vente lorsqu'une nouvelle barre de 4 heures apparaît et effectue une fermeture opposée lorsqu'un nouveau jour s'ouvre.

 
Diubakin:

Bonjour, la fonction ferme la position avec la perte maximale avec la position opposée avec le profit maximal. Voici une EA de test pour le testeur :

Il ouvre alternativement des positions d'achat et de vente lorsqu'une nouvelle barre de 4 heures apparaît et effectue une fermeture opposée lorsqu'un nouveau jour s'ouvre.

Bonjour Sergey, j'ai un algorithme différent ! Le problème est que cette fonction ferme ce qu'elle a, et j'ai besoin qu'elle ferme le maximum, pas n'importe quoi ! Eh bien, rien, je vais le finir moi-même si personne ne m'aide ! Votre version est seulement bonne pour le testeur, donc ajoutée à l'en-tête selon les règles. Fonctionne sans erreur, mais ne sélectionne pas le maximum ! Dans tous les cas, merci pour votre aide !
 
alsu:

OK, je l'ai maintenant. Si le prix de la barre actuelle atteint Open[0] + 30, alors nous ouvrons. Si la barre s'est terminée, Open[0] a été modifié et le niveau d'ouverture est décalé en conséquence. Il ne devrait y avoir qu'une seule transaction sur le marché, non ?

Alors c'est comme ça :

Il n'est pas nécessaire de suivre la nouvelle barre, car lorsqu'elle se forme, le système ajoute automatiquement une nouvelle valeur à Open[0] et cela signifie que le nouveau niveau sera calculé correctement. Veuillez noter que l'opération d'achat est ouverte au cours vendeur actuel, tandis qu'elle est fermée (TP et SL) au cours acheteur. En outre, les valeurs des prix doivent être normalisées.


Merci beaucoup pour votre aide.

Mais ouvre des trades dans le testeur sur chaque bougie minute. L'information est dans ce lien http://clip2net.com/s/2T98Y

Je veux qu'il ouvre un ordre sur un chandelier de cinq minutes, mais pas sur chaque chandelier.

Mais seulement si le chandelier actuel de cinq minutes est > ou = 30 pips (du prix ouvert à son maximum).

C'est-à-dire, ouvrir un ordre au marché sur le trentième point à partir du prix d'ouverture de la bougie de cinq minutes zéro=actuelle.

Et si la période actuelle de cinq minutes entre le prix d'ouverture et son maximum est inférieure à 30 points, nous ne devons pas ouvrir un ordre de marché.

C'est-à-dire que les ordres seront un peu, j'ai compté dans Excel, depuis 1999 - un peu plus de 3000 sur euro-dollar dans les deux sens.

Nous passons à la période de cinq minutes suivante et si celle-ci, c'est-à-dire la période de cinq minutes en cours > ou = 30 pips, alors nous ouvrons au trentième pips, si moins, nous passons à la période de cinq minutes suivante ... et ainsi de suite jusqu'à la fin du graphique.

Mais le fait est que, selon une estimation approximative, la plupart des pentaminos qui > ou = 30 pips dépassent 15 pips plus souvent qu'ils ne sont fermés par un stop de 30 pips.

Votre condition est "aucun ordre ouvert".

Mais dans mon système, deux périodes de cinq minutes avec les paramètres décrits ci-dessus peuvent être formées à la suite et si l'ordre de la période de cinq minutes précédente n'est pas fermé, alors aucun ordre ne sera ouvert à la deuxième période de cinq minutes.

J'ai besoin qu'un ordre soit ouvert à chaque période de cinq minutes avec les paramètres décrits ci-dessus, qu'il y ait ou non des ordres dans la transaction.

 
if (OrdesTotal()==0 && Close[0]>=Price)  
 
alsu:

C'est ça, je l'ai maintenant. Si le prix de la barre actuelle atteint Open[0] + 30, alors nous ouvrons. Si la barre s'est terminée, Open[0] a été modifié et le niveau d'ouverture est décalé en conséquence. Il ne devrait y avoir qu'une seule transaction sur le marché, non ?

Alors c'est comme ça :

Il n'est pas nécessaire de suivre la nouvelle barre, car lorsqu'elle se forme, le système ajoute automatiquement une nouvelle valeur à Open[0] et cela signifie que le nouveau niveau sera calculé correctement. Veuillez noter que l'opération d'achat est ouverte au cours vendeur actuel, tandis qu'elle est fermée (TP et SL) au cours acheteur. En outre, les valeurs des prix doivent être normalisées.


Et vous avez également une deuxième condition - si le prix de clôture des cinq minutes en cours >= prix d'ouverture de l'ordre.

Mais dans mon idée, le prix de clôture de la période de 5 minutes en cours peut être n'importe quel prix, tant que son High est > ou = 30 pips.


Close[0]>=Price

 
borilunad:
Bonjour Sergei, j'ai un algorithme différent ! C'est le problème, cette fonction ferme ce qu'elle a et je veux qu'elle ferme les maximums, pas n'importe lesquels ! Eh bien, rien, je vais le finir moi-même si personne ne m'aide ! Votre version est seulement bonne pour le testeur, donc ajoutée à l'en-tête selon les règles. Fonctionne sans erreur, mais ne sélectionne pas le maximum ! Dans tous les cas, merci pour votre aide !

Comment le voulez-vous ? Celle que j'ai postée détermine la position la moins rentable dans la devise de dépôt(en argent), puis détermine la position opposée la plus rentable également dans la devise de dépôt et effectue une contre-fermeture.

borilunad:

J'ai implémenté des fonctions déterminant le maxloss GetMaxLoss() et le maxprofit GetMaxProfit() mais je n'arrive pas à faire en sorte que la fonction LockOFF() sélectionne une paire spécifiée par moi et pas n'importe laquelle. S'il vous plaît, montrez-moi à quel endroit mettre mes maxima, et peut-être ai-je besoin de plus de fonctions pour déterminer le ticket ou l'index de ces positions, alors ce n'est pas un problème pour moi, mais où mettre tout cela dans ce LockOFF() ? Merci !

La fonction a tout : elle définit la perte maximale, le profit maximal, le ticket est également défini.

 
Diubakin:

Comment le voulez-vous ? Celui que j'ai posté, détermine la position la moins rentable dans la devise de dépôt (en argent), puis détermine la position opposée la plus rentable également dans la devise de dépôt et effectue une contre-fermeture.

La fonction a tout : définition de la perte maximale, du profit maximal, le ticket est également défini.

Vous avez tort ! Probablement que vous avez la seule paire de positions opposées, alors que j'en ai peut-être plus. C'est pourquoi je mets toutes les données dans les commentaires et je vois que cela ne ferme pas maxiLoss maxiProfit, mais n'importe laquelle des premières que je rencontre. Et mes fonctions montrent clairement les indices de position avec les pertes et les profits maximaux. Il ne reste plus qu'à ajouter ces vérifications à LockOFF() !
 
borilunad:
Vous vous trompez ! Vous avez probablement la seule paire de positions opposées, alors que j'en ai peut-être plus, car j'ai affiché toutes les données dans les commentaires et je vois qu'elle ne ferme pas maxiLoss maxiProfit, mais l'une des premières qui apparaissent dans la recherche. Et mes fonctions montrent clairement les indices de position avec les pertes et les profits maximaux. Il me suffit d'ajouter ces vérifications à LockOFF() !
Avez-vous vu l'EA de test pour cette fonction dans le testeur ? Il clôture exactement la perte maximale avec le profit maximal, quel que soit le nombre d'ordres - deux ou vingt.
 
Vinin:

https://www.mql5.com/ru/code/7835 Il ne s'agit que d'un indicateur. Vous devez utiliser des objets dans un EA.
C'est le conseiller expert qui m'intéresse, les objets - dois-je dessiner une bougie moi-même ?
 
Diubakin:
Avez-vous regardé l'EA de test pour la fonction dans le testeur ? Il clôture exactement la perte maximale avec le profit maximal, quel que soit le nombre d'ordres - deux ou vingt.
Bien sûr, je l'ai fait ! C'est vrai, je n'en ai pas plus de trois. J'ai cherché partout, dans le testeur dans les résultats et dans le journal, sur la démo et sur le tableau aussi ! Quand je le ferai, je vous montrerai !
 
solnce600:

Merci beaucoup pour votre aide.

Mais ouvre des trades dans le testeur sur chaque bougie minute. Info. dans ce lien http://clip2net.com/s/2T98Y

Je veux qu'il ouvre un ordre sur la bougie de 5 minutes, mais pas sur chaque bougie.

Et seulement si le chandelier actuel de cinq minutes est > ou = 30 points (du prix d'ouverture à son maximum)

C'est-à-dire, ouvrir un ordre au marché au trentième pip du prix d'ouverture de la période de cinq minutes zéro=actuelle.

Si le chandelier actuel de cinq minutes est à moins de 30 pips du prix d'ouverture à son maximum, alors n'ouvrez pas d'ordre de marché.

Il suffit de déposer l'EA sur le graphique de cinq minutes, il sera comme vous l'avez écrit.

Ou substituez partout dans le code Open[0] pour iOpen(Symbol (), PERIOD_M5, 0), alors cela fonctionnera à partir de n'importe quel graphique.

La deuxième condition dans votre code est que le prix de clôture de la période de cinq minutes en cours >= prix d'ouverture de l'ordre.

Non, Close[0] est le prix de clôture actuel de la barre 0, c'est-à-dire uniquement le prix actuel. Vous auriez pu simplement écrire Bid, le résultat est le même.


C'est-à-dire qu'il n'y aura pas beaucoup d'ordres, j'ai calculé dans Excel, depuis 1999 - un peu plus de 3000 ordres pour l'euro dans les deux sens.

On passe au cinq minutes suivant et si celui-ci, c'est-à-dire le cinq minutes actuel > ou = 30 pips, on ouvre au trentième pips, si moins, on passe au cinq minutes suivant ... et ainsi de suite jusqu'à la fin du graphique.

Mais le fait est que, selon une estimation approximative, la plupart des plans de cinq minutes qui > ou = 30 pips ont beaucoup plus de chances de dépasser 15 pips que d'être fermés par un stop de 30 pips.

Vous avez une condition - s'il n'y a pas d'ordres ouverts

Mais dans mon système, deux périodes de cinq minutes avec les paramètres décrits ci-dessus peuvent être formées à la suite et si l'ordre de la période de cinq minutes précédente n'est pas fermé, alors aucun ordre ne sera ouvert à la deuxième période de cinq minutes.

J'ai besoin qu'un ordre soit ouvert à chaque période de cinq minutes avec les paramètres décrits ci-dessus, qu'il y ait ou non des ordres dans la transaction.

Ok, alors changeons la condition. Alors ça sort :

int start()

{

 double Price=iOpen (Symbol (),PERIOD_M5,0)+300*Point;        
 double SL=NormalizeDouble (Price-300*Point, Digits);         
 double TP=NormalizeDouble (Price+150*Point, Digits);    
 
 int last_order_bar = 0;
 int ot = OrdersTotal();

 if (ot>0) //если есть ордера в рынке
 {
   if (OrderSelect (ot-1,SELECT_BY_POS)) //выбрали последний ордер
      if (OrderType ()==OP_BUY || OrderType ()==OP_SELL) //проверили тип
         last_order_bar = iBarShift (Symbol (),PERIOD_M5,OrderOpenTime ()); //запомнили, на каком 5-минутном баре открыт последний ордер (если он есть)
 }
 
 if (OrdesTotal()==0 || last_order_bar>0) //если ордеров нет либо последний открыт не на текущем баре
    if (Bid>=Price)                       //если текущая цена доползла до цены открытия
       int Ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP );

}