Et faisons-en un "dessin animé" (multidevises) - page 7

 
Swan >> :

C'était

Lorsque StopLoss est vrai, la nouvelle valeur est attribuée,

sinon l'ordre est modifié.

pas d'erreur, mais vous devez enlever une croix ou mettre un pantalon).

Je ne l'ai pas compris tout de suite))... la condition pourrait ne pas provoquer un arrêt !

Peut-être qu'on devrait enlever autre chose ? Il semble que la logique ne souffre pas... Pourquoi ai-je besoin de la deuxième condition si une seule suffit ?

StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

Ou alors...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);


Cygne >> :

voir la comparaison des nombres réels.

Je vais le lire... Alors, est-ce absolument nécessaire ? Je ne l'ai simplement jamais fait).

 
ALex2008 >> :

Je n'ai pas compris tout de suite... La condition peut ne pas provoquer un arrêt !

On ne peut pas enlever autre chose ? On dirait que la logique ne souffre pas...

Peut-être) que la bougie de 4h est généralement plus grande que le StopLevel...


ALex2008 >> :

Je vais le lire... Je veux dire, est-ce vraiment nécessaire ? Je ne l'ai jamais fait de cette façon).

toutes sortes de choses bizarres se produisent lorsque les valeurs comparées sont presque égales)

lors de la vérification de l'égalité d'un nombre de type double - obligatoire.


 StopLoss-Ask< StopLevel-0.5*Point

En russe : StopLoss moins Ask est inférieur à StopLevel avec une précision de 0,5*Point.

(StopLoss,Ask,StopLevel sont normalisés)

 
StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
//StopLoss может присвоиться новое значение, желательно и его проверить на StopLevel
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
C'est un peu le bordel, mais il faut y penser).
 

Alors, qu'en est-il de cette option ? Il semble raisonnable de le garder...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

Nous devrions également vérifier le contexte commercial, sinon nous recevons des erreurs indiquant qu'il est occupé - TradeDispatcher : trade context is busy ... Il s'avère que s'il y a beaucoup de copies de l'EA, toutes ferment simultanément l'ordre courant sur leurs symboles et en fixent de nouveaux... un embouteillage se formera)

c'est probablement comme ça que ça marche...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Ask< Enter- StopLevel+0.5*Point){
               OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }
void DownTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Bid> Enter+ StopLevel-0.5*Point){
               OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }

C'est-à-dire qu'avant de fermer l'ordre en cours et d'établir un nouvel ordre en attente, nous vérifions le flux commercial... Si c'est occupé, faites une pause d'une seconde.

 
ALex2008 >> :

Alors, qu'en est-il de cette option ? Il semble raisonnable de le garder...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

Nah, c'est comme ça que ça marche. Nous devons nous décider.)

trois options :

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=Ask+ StopLevel;//+x*Point
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask> StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

ALex2008 a écrit >>

De plus, nous devons vérifier le fil de discussion sur le commerce, sinon il peut recevoir des erreurs d'être occupé... Parce que s'il y a beaucoup de graphiques, ils ferment tous les ordres en cours en même temps...
int start() {
   if(!IsTradeAllowed()) return(0);

si cela n'aide pas, avant tous les OrderSend,OrderModify,OrderClose,OrderDelete vérifiez IsTradeContextBusy()


ALex2008 >>:
Seulement où le placer correctement je pense... Je veux dire, par exemple, que les anciens ordres ne sont pas supprimés parce que le fil est occupé, mais le programme doit en placer de nouveaux... Et le programme ne doit en placer de nouveaux que lorsque tous les anciens ordres ont été supprimés.

réécrire plus facilement. dans les fonctions UpTrend() et DownTrend() vérifier les conditions, les ordres sont retirés et mis,

trop de choses différentes)

 
Swan >> :

Non, c'est comme ça que ça marche. >> tu dois te décider.)

Je ne comprends pas, ça va ou ça ne va pas ?).

 
ALex2008 >> :

Je ne comprends pas - cela va-t-il fonctionner ou non ?))

* ça ne marchera pas.

Dans votre dernière variante.

         if( Type==0){
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

dans le premier if() StopLoss n'est pas défini.

 
Swan >> :

*Cela n'arrivera pas.

Dans votre dernière variante.

dans le premier if() StopLoss n'est pas défini.


Alors, qu'est-ce que c'est ?

dans le premier cas, le stop prend le minimum (au prix) bas de 2 chandeliers... c'est à dire loin de l'ordre

StopLoss=MathMin(b0,b1); 

dans le second si le stop reçoit le maximum (au prix) bas de 2 chandeliers, c'est-à-dire qu'il est proche de l'ordre.


StopLoss=MathMax(b0,b1);
 
ALex2008 >> :
         if( Type==0){
//здесь StopLoss нипанятно какой)
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
 

//здесь StopLoss нипанятно какой)

Qu'est-ce qui n'est pas clair exactement ? Il est égal à zéro lors de l'entrée dans la fonction. Peut-être que je ne comprends pas quelque chose.....


Au-dessus il y a une condition - Si l'ordre est ouvert et son stop = 0, alors placez un stop.

if ((Type<=1)&&(Stop==0))SetStop();

et la fonction elle-même pour fixer un arrêt


//-------Вычисление стопа и установка
void SetStop(){
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
            
         if( Type==0){
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
   }
Raison: