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

 
Valeriy Yastremskiy:

différence entre les modules. Sans module, seule la zone supérieure entre dans la condition. | OpenPrice - Bid |> Condition d'ouverture de 10*_Point

C'est ainsi que la condition devrait être, l 'offre est inférieure au prix ouvert et aucun module.

Sinon, nous obtiendrons un résultat correct si l'offre est supérieure au prix ouvert.

 
Valeriy Yastremskiy:

différence entre les modules. Sans le module, seule la zone supérieure entre dans la condition. | OpenPrice - Bid |> 10*_Point condition d'ouverture

Je ne comprends pas bien...

Pouvez-vous s'il vous plaît le rendre plus clair... pour un débutant)

 
MakarFX:

Vous me surprenez.


Avec quoi ?
 
Alexey Viktorov:
Comment ?
Alexey Viktorov:

Sur l'image, vous pouvez voir que le rapport OpenPrice - Bid ne doit pas être supérieur à 10*_Point.

mais peut être inférieure, y compris négative

 
MakarFX:

mais peut être inférieure, y compris négative

Ouais... et tu obtiens la condition avec "&& > 0"

Quelle est la question ? Juste comme ça, ou pour quelque chose ?

 
Alexey Viktorov:

Ouais... et tu obtiens la condition avec "&& > 0"

Quelle est la question ? Juste comme ça, ou pour quelque chose ?

J'utilise actuellement cette définition du moment pour entrer sur le marché.

if(Bid < OpenPrice && Bid > OpenPrice-Х*Point)
if(Ask > OpenPrice && Ask < OpenPrice+Х*Point)

J'ai pensé qu'il pourrait y avoir un moyen de le simplifier).

 

Aidez à optimiser un morceau de code pour Martin

La tâche est la suivante :

-Après l'arrêt, un Martin va multiplier les lots ;

-Le nombre de multiplications peut être ajusté avec la fonction OrdersClose, et lorsqu'il atteint une valeur spécifiée, le lot est remis à zéro ;

- le volume du lot ne doit pas être remis au volume de départ, mais doit être diminué séquentiellement dans l'ordre inverse ;

par exemple OrdersClose=5, Martin=2, lot=0.01 :

nous avons la séquence : 0.01 ; 0.02 ; 0.04 ; 0.08 ; 0.16 (remise à zéro) 0.01 ; 0.01 ;,,,,

besoin : 0,01 ; 0,02 ; 0,04 ; 0,08 ; 0,16 (remise à zéro) 0,16 ; 0,08 ; 0,04 ; .... 0,01.

Je n'ai pas assez de connaissances pour résoudre le problème moi-même.

J'ai essayé de saisir différentes combinaisons, mais je n'ai pas obtenu l'effet désiré.

double LOT()
{
   int n=0;
   double OL=dLots;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == iMagic)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++;
               if (n>=OrdersClose) {Comment("1");return(dLots);}
            }
            else
            {
               if (n==0) {Comment("2");return(dLots);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}
 
MakarFX:

J'utilise actuellement cette définition du point d'entrée sur le marché

J'ai pensé qu'il pourrait y avoir un moyen de le simplifier).

if(Bid < OpenPrice && Bid > OpenPrice-Х*Point)
if(Ask > OpenPrice && Ask < OpenPrice+Х*Point) // цену в середину диапазона ставим

OpenPriceS=OpenPrice-X*Point/2;
if(fabs(Bid-OpenPriceS)>Х*Point){ ....   }

Et Alexey a raison))

Alexey Viktorov:

C'est ainsi que cela devrait être par condition, enchérir en dessous du prix ouvert et aucun module.

Sinon, nous obtenons un résultat correct si l'offre est supérieure au prix ouvert.

Fixe)

Oui, c'est ça. N'a pas changé la condition. Par habitude. Il est confus dans l'image que Bid est au milieu))))

Mais là deuxième condition, l'entrée est la même en nombre de conditions.

 
законопослушный гражданин:

Aidez à optimiser un morceau de code pour Martin

La tâche est la suivante :

-Après l'arrêt, un Martin va multiplier les lots ;

-Le nombre de multiplications peut être ajusté avec la fonction OrdersClose, et lorsqu'il atteint une valeur spécifiée, le lot est remis à zéro ;

- le volume du lot ne doit pas être remis au volume de départ, mais doit être diminué séquentiellement dans l'ordre inverse ;

par exemple OrdersClose=5, Martin=2, lot=0.01 :

nous avons la séquence : 0.01 ; 0.02 ; 0.04 ; 0.08 ; 0.16 (remise à zéro) 0.01 ; 0.01 ;,,,,

besoin : 0,01 ; 0,02 ; 0,04 ; 0,08 ; 0,16 (remise à zéro) 0,16 ; 0,08 ; 0,04 ; .... 0,01.

Je n'ai pas assez de connaissances pour résoudre le problème moi-même.

J'ai essayé de saisir différentes combinaisons, mais je n'ai pas obtenu l'effet désiré.

//+------------------------------------------------------------------+
//| Расчет лота                                                      |
//+------------------------------------------------------------------+
double Lots()
  {
   double L=0;
   // если последняя закрытая сделка убыточная и лот равен стартовому
   // включаем Мартин
   if(GetInfoLastPos(2)<0&&GetInfoLastPos(1)==Lot) 
     {
      Martin=true;
     }
   // если последняя закрытая сделка убыточная и лот больше или равен максимальному
   // выключаем Мартин
   if(GetInfoLastPos(2)<0&&GetInfoLastPos(1)>=MaxMartinLot)
     {
      Martin=false;
     }
   // если последняя закрытая сделка убыточная и Мартин включен, умножаем лот
   if(Martin==true)
     {
      L=NormalizeDouble(GetInfoLastPos(1)*K_Martin,DigitsLot);
     }
   // если последняя закрытая сделка убыточная и Мартин выключен, делим лот
   if(Martin==false)
     {
      L=NormalizeDouble(GetInfoLastPos(1)/K_Martin,DigitsLot);
     }

   if(L>MAXLOT) L = MAXLOT;
   if(L<MINLOT) L = MINLOT;
   return(L);
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                                    |
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos(int a=1)
  {
   datetime t=0;
   double result=0,l=0,p=0,f=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if(a==1) {result=l;} else
   if(a==2) {result=p;} else
   if(a==3) {result=(double)t;}
   else     {result=0;}
   return(result);
  }
 
Valeriy Yastremskiy:

Et Alexei a raison))

Oui, c'est vrai. Ça n'a pas changé la situation. Par habitude. C'est déroutant sur la photo que Bid soit au milieu))))

Merci, mais cela ne simplifie en rien mon code)