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

 
a196012a:

J'ai complété votre code avec un bloc pour ouvrir un ordre avec un volume de 0,1 (juste après la fonction void start()).

Mais pour une raison quelconque, le programme n'ouvre aucun ordre de volume accru (0,3 lot chacun) en réponse à la fermeture de ces ordres.

LES CHOSES QUE JE NE COMPRENDS PAS DANS VOTRE CODE

1. Si j'ai bien compris, vous attribuez МН=123 uniquement aux ordres ayant un volume de 0,3 lot.

Dans la fonction datetime SearTim (int s), vous recherchez un ordre avec MH=123 mais avec un volume de 0.1.

Mais l'ordre avec le volume 0.1 ne peut pas avoir МН=123, parce que ce MM est assigné seulement aux ordres avec le volume 0.1

Dans les corps des fonctions datetime SearTim(int s) et int sear(), et plus précisément dans les commentaires, il est nécessaire d'ouvrir un ordre avec un volume de 0.3

Je ne comprends pas pourquoi je dois ouvrir plusieurs fois un ordre avec un volume plus important dans les mêmes conditions.

Vous avez déjà ouvert des ordres avec un volume accru dans le premier bloc.



Je vous serais très reconnaissant si vous pouviez écrire un code qui ouvrirait un ordre avec un volume de 0,3 après avoir fermé chaque ordre de 0,1 et conserverait la valeur de 0,1.

Dans ce cas, je ferai de mon mieux pour trouver toutes les réponses à mes questions dans votre code à l'aide de la fonction Print (), de mes modestes connaissances et des livres de référence.

NOTE :

J'ai le même type d'ordres avec un volume de 0,1 et 0,3 - uniquement SEL. C'est pourquoi, si je ne me trompe pas, nous ne devons pas calculer le type d'ordre (BAY ou SEL) dans la fonction int sear().

Je voudrais vous rappeler une fois de plus que le but final de mon programme est de mémoriser la valeur horaire (pas une minute, pas une seconde, mais seulement une heure) de l'ouverture de l'ordre 0.1 après qu'il ait été clôturé à son prix de clôture par un ordre 0.3 qui a clôturé au SL


Je m'excuse de ne pas pouvoir vous expliquer grand-chose, car vous devez connaître le langage de programmation. Je pense que vous êtes déjà un programmeur et je comptais sur quelqu'un qui connaît la programmation.

Vous devez d'abord apprendre la programmation. Si je vous explique quoi et comment, ce sera l'apprentissage d'un langage de programmation.

Regardez des exemples d'évaluations environnementales, comment elles sont écrites et essayez d'écrire des programmes dès le début. Et vous essayez d'écrire un programme qui est déjà compliqué.

Consultez le tutoriel et les exemples d'écriture de commandes et de modules d'exemple.

Dossiers :
MQL4.zip  2226 kb
 

Je réponds à cette question simple, voici le bloc final.

Lorsque le profit d'un ordre devient positif, il ferme cet ordre et sur ce profit total, il est possible de perdre une position. Si Perekr est activé.


Nous devons le modifier pour qu'il ne ferme les deux positions que lorsque le bénéfice d'une position rentable couvre TOUTE la perte d'une position perdante, c'est-à-dire pour que le bénéfice d'un ordre soit égal ou supérieur à la perte de l'autre.

if(Mas_Tip[1]>0)

     {

      if(Bidt-step*Point>=NormalizeDouble(Bid,Digits))

        {

         Profit=AccountBalance()-StartProfit;

         Askt=NormalizeDouble(Ask,Digits);

         Bidt=NormalizeDouble(Bid,Digits);

         for(int i=1; i<=OrdersTotal(); i++)

           {

            if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderType()==OP_SELL && 

               OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

              {

               if(Razn<2)

                 {


                  if(Perekr && OrderProfit()>0 && max_lot>=Lots_per) //перекрытие

                    {

                     double profit=OrderProfit();

                     Print("закрываю по перекрытию");


                     ClosePosBySelect(OrderLots());

                     for(int f=OrdersTotal()-1;f>=0;f--)

                       {

                        if(OrderSelect(f,SELECT_BY_POS)==true && OrderType()==OP_BUY && 

                           OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

                          {

                           if(OrderProfit()<0)

                             {

                              if(profit>=MathAbs(OrderProfit()))

                                {

                                 Print("закрываю по перекрытию");


                                 ClosePosBySelect(OrderLots());

                                }

 

Mes amis, bonjour. J'ai besoin de l'aide d'un débutant.

Je veux être informé par email du croisement d'un indicateur avec un prix. J'ai compris comment faire, mais dès que le croisement des prix se produit, je reçois des centaines d'e-mails, et ils continuent à en envoyer indéfiniment jusqu'à la fermeture de la bougie actuelle. Que faire pour n'envoyer qu'un seul message ? Voici un exemple :

if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))){

bool res = SendMail("Buy Signal", "Buy Signal") ;

}


if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2))){

SendMail("Sell Signal", "Sell Signal") ;

}

 
ev85:

Mes amis, bonjour. J'ai besoin de l'aide d'un débutant.

Je veux être informé par email du croisement d'un indicateur avec un prix. J'ai compris comment faire, mais dès que le croisement des prix se produit, je reçois des centaines d'e-mails, et ils continuent à en envoyer indéfiniment jusqu'à la fermeture de la bougie actuelle. Que faire pour n'envoyer qu'un seul message ? Voici un exemple :

if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))){

bool res = SendMail("Buy Signal", "Buy Signal") ;

}


if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2))){

SendMail("Sell Signal", "Sell Signal") ;

}

C'est simple avec le parabolique, mettez un drapeau dans la condition. Ou une simple variable de type int dont la valeur change à chaque signal.

static bool flag;
 if(flag && iSAR(NULL, 0,Step,Maximum, 1) < iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) > iClose(NULL,0,2)){

 bool res = SendMail("Сигнал на покупку",  "Сигнал на покупку");
 flag = false;
 }


 if(!flag && iSAR(NULL, 0,Step,Maximum, 1) > iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) < iClose(NULL,0,2)){

 SendMail("Сигнал на продаж",  "Сигнал на продажу");
 flag = true;
 }
 

Bonjour à tous, pourriez-vous m'aider avec le Trailing Stop. J'ai écrit un Trailing Stop à la condition que j'aie initialement SL = 100 et que le Trailing Stop soit déclenché lorsque le prix est 30 pips au-dessus de l'ouverture de la position. Mais il modifie immédiatement après l'ouverture de la position et change le SL standard en 30, puis le déplace.

void Trailing()

{

int SLoss = 1 ;

double StopL = NormalizeDouble (OrderOpenPrice() + SLoss*Point, Digits) ;

double StopL2 = NormalizeDouble (OrderOpenPrice() - SLoss*Point, Digits) ;

for (int i=OrdersTotal() - 1 ; i>=0 ; i--)

{

si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

si (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

si (OrderType() == OP_BUY && OrderStopLoss() >= StopL)

{

si (Bid - StopL > TrailingStop*Point)

{

si (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point, Digits), 0, 0))

Print("Erreur de modification de commande !") ;

}

}

}

si (OrderType() == OP_SELL && OrderStopLoss() <= StopL2)

{

si (StopL2 - Ask > TrailingStop*Point)

{

si (OrderStopLoss() > Ask+(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point, Digits), 0, 0))

Print("Erreur de modification de commande !") ;

}

}

}

}

}

}

}

 
Alexey Viktorov:

Avec le parabolique, c'est simple, il suffit de mettre un drapeau dans la condition. Ou une simple variable de type int dont la valeur change à chaque signal.

Oubliez juste else - sinon la variable statique reste vraie après le premier signal.
 
AlGuru:

Bonjour à tous, pourriez-vous m'aider avec le Trailing Stop. J'ai écrit un Trailing Stop à la condition que j'aie initialement SL = 100 et que le Trailing Stop soit déclenché lorsque le prix est 30 pips au-dessus de l'ouverture de la position. Il le modifiera juste après l'ouverture de la position et changera le SL standard en 30, puis le déplacera.

...
En quoi cela peut-il aider? J'y ai posté un modèle, à partir duquel vous pouvez faire vous-même ce que vous voulez.
 
Artyom Trishkin:
J'ai juste oublié else - sinon la variable statique reste vraie après le premier signal.

Quel est l'intérêt de l'elza là-dedans ? Je pense que flag == true ; ou flag == false ; ce qui est dans le code

if(flag && ****

if(! flag && ****

S'il y a une intersection d'un côté, on attend une intersection de l'autre... Et ainsi la boucle est bouclée. Mais comment le connecter correctement au début, laissez-le réfléchir par lui-même. Ou lui demander plus tard...

 
Alexey Viktorov:

Quel est l'intérêt de l'elza là-dedans ? Je pense que flag == true ; ou flag == false ; ce qui est dans le code

Quand on traverse d'un côté, on attend la traversée de l'autre côté... ...et ainsi le cycle est fermé. Mais comment le connecter correctement au premier démarrage, laissez-le réfléchir par lui-même. Ou lui demander plus tard...

S'il y a deux signaux sur des barres différentes dans une direction ?

Vous n'avez que le swing.

Mais les signaux doivent toujours être envoyés lorsqu'il y a un signal, mais la décision de signaler est prise séparément.

Il me semble que pour chaque direction, il serait optimal d'avoir son propre drapeau, et de l'échanger entre les deux. Mais pas de manière à ce que les signaux d'une direction dépendent des signaux de la direction opposée.

 
Artyom Trishkin:

Si les deux signaux sont sur des barres différentes dans la même direction ?

Tu n'as droit qu'à un swing.

Mais les signaux doivent toujours être envoyés lorsqu'il y a un signal, mais la décision de signaler est prise séparément.

Il me semble que pour chaque direction, il est optimal d'avoir son propre drapeau, et de l'alterner. Mais pas de manière à ce que les signaux d'une direction dépendent des signaux de la direction opposée.

Artem, j'ai commencé ma réponse par les mots suivants

Le parabolique a une alternance stricte, deux signaux dans une même direction, même sur des barres différentes, sont impossibles. Et il n'y a pas besoin d'inventer quoi que ce soit pour cela, il ne cliquette pas même sur des barres à zéro comme la MA.

Raison: