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

 
trader781:
Je ne sais pas comment l'expliquer. Mais c'est définitivement un chef-d'œuvre.
Je vous le dis, ils aiment être sarcastiques ici.) Et Trishkin s'en est offensé. Il a dit qu'il aurait un code pour aider.
 
Movlat Baghiyev:
Je te dis qu'ils aiment être sarcastiques ici.) Trishkin s'est également offusqué. Il a dit que le code sera utile.

Je suis aussi nouveau que vous, mais j'ai aussi beaucoup de questions.

for(int i=0; i<OrdersTotal() ; i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol() !=Symbol() ||OrderMagicNumber() !=Magic) continue;
if(OrderType()==OP_BUY||OrderType()==OP_SELL) p++;
if(OrderType()==OP_BUYSTOP)
if(signal_bue)OrderDelete(OrderTicket());
sinon b++;
si(OrderType()==OP_SELLSTOP)
if(signal_sell)OrderDelete(OrderTicket());
sinon s++ ;
}

}

1) où avez-vous obtenu b++

2) Où avez-vous obtenu les++?

3)if(signal_bue) est quoi d'autre ?

Et le reste du code. Désolé si je vous ai offensé.

 
C'est probablement la bonne façon de faire
//+------------------------------------------------------------------+
//|                                                      ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if (TrailingStop!=0) Trailing();
  
   //ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
  
   int b = 0, s = 0, p = 0, res = 0;

   double BuyPrice=Ask+Delta*Point;
   double SellPrice=Bid-Delta*Point;
  
   for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
        if (OrderType()==OP_BUYSTOP)
        {
           if(RSI0<50&&RSI1>50)
                OrderDelete(OrderTicket());
            else
                b++;
        }
        if (OrderType()==OP_SELLSTOP)
        {
           if(RSI0>50&&RSI1<50)
                OrderDelete(OrderTicket());
              else
                s++;
        }
      }
    }

   double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить

//---- buy stop
   if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----
   return(0);
}
 
Movlat Baghiyev:
Je vous le dis, ils aiment être sarcastiques ici.) Et Trishkin s'en est offensé. Il a dit qu'il m'aiderait avec le code.

C'est plus simple comme ça :

void OrderDelete_(int Type)
  {
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
            OrderDelete(OrderTicket());
        }
     }
  }

C'est quelque part en dehors de la fonction void OnTick().

if (сигнал_bue) OrderDelete_(OP_SELLSTOP);

if (сигнал_sell)OrderDelete_(OP_BUYSTOP);

Et ceci est dans le corps de la fonction void OnTick().

 
Alekseu Fedotov:


Et ceci est dans le corps de la fonction void OnTick()

Veuillez apporter des corrections dans le code
 
trader781:

Ok.

J'ai en quelque sorte fini ce que je pouvais. La description est faite. Le but est de comprendre pourquoi il ne fonctionne pas comme je le souhaite.

Il y a autre chose à l'intérieur du bloc if(). C'était vraiment prévu comme ça ?

Plus loin. La fonction Counts() accepte une variable globale non initialisée count qui, par ailleurs, est définie à nouveau à l'intérieur de la fonction.

La fonction Counts() compte les ordres mais les compare à un certain ticket qui change plusieurs fois dans la fonction principale. Mais la valeur du ticket est la même pendant l'opération de la fonction. Alors, combien de commandes la fonction va-t-elle calculer ? Y en a-t-il plus d'un ?

Sous cette forme, cette fonction n'a pas besoin d'arguments, il suffit de l'appeler et de la laisser renvoyer le résultat.

Suivant. La fonction FindLastOType() est à nouveau une comparaison avec le ticket. Pouvez-vous garantir qu'il est comparé à un billet valide ? N'est-il pas plus simple d'interrompre la boucle lorsque le premier ordre comportant le numéro magique et le symbole nécessaires est trouvé, puis de renvoyer le type d'ordre ?

Idem avec FindLastOrderOpenPrice() et FindLastLot().

La fonction ModifyOrders() m'a tellement horrifié que je n'ai pas voulu y jeter un œil pendant longtemps pour dormir sans cauchemars...

 
Movlat Baghiyev:
Veuillez apporter des corrections dans le code

Essayez-le ^_~

extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer


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


  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  int  res = 0;

//ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);

   double BuyPrice=Ask+Delta*Point;
   double SellPrice=Bid-Delta*Point;
  
//---- buy stop
   if(RSI0>50&&RSI1<50 && Number(OP_BUYSTOP)<0 && Number(OP_BUY)<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && Number(OP_SELLSTOP)<0 && Number(OP_SELL)<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----  
  
  
if (RSI0>50&&RSI1<50) OrderDelete_(OP_SELLSTOP);

if (RSI0<50&&RSI1>50)OrderDelete_(OP_BUYSTOP);

  }

//+------------------------------------------------------------------+
void OrderDelete_(int Type)
  {
  bool  r;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
          r = OrderDelete(OrderTicket());
        }
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number(int Type)
  {
  int kp=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
            kp++;
        }
     }
  return(kp);  
  }
//+------------------------------------------------------------------+
 
Alekseu Fedotov, merci. Que Dieu vous bénisse.
 
Vitalie Postolache:

Il y a autre chose à l'intérieur du bloc if(). C'était vraiment censé être comme ça ?

Plus loin. La fonction Counts() accepte une variable globale non initialisée count qui est également déclarée une fois de plus dans la fonction elle-même.

La fonction Counts() compte les ordres mais les compare à un certain ticket qui change plusieurs fois dans la fonction principale. Mais la valeur du ticket est la même pendant l'opération de la fonction. Alors, combien de commandes la fonction va-t-elle calculer ? Y en a-t-il plus d'un ?

Sous cette forme, cette fonction n'a pas besoin d'arguments, il suffit de l'appeler et de la laisser renvoyer le résultat.

Suivant. La fonction FindLastOType() est à nouveau une comparaison avec le ticket. Pouvez-vous garantir qu'il est comparé à un billet valide ? N'est-il pas plus simple d'interrompre la boucle lorsque le premier ordre comportant le numéro magique et le symbole nécessaires est trouvé, puis de renvoyer le type d'ordre ?

Idem avec FindLastOrderOpenPrice() et FindLastLot().

La fonction ModifyOrders() m'a tellement terrifié que je n'y ai pas jeté un œil pendant longtemps pour éviter les cauchemars nocturnes...

Correction

Il n'y a pas d'autre moyen de le dire ailleurs, ce serait des paramètres erronés.

Elle doit prendre en compte les plus récentes

Je vais essayer de le changer.

J'ai essayé d'utiliser la méthode standard OrderModify(), mais elle est interdite si je déplace un grand nombre d'ordres simultanément et constamment.

Merci pour la critique.

 
spoiltboy:
Oui, c'est une erreur d'impression sur le support. Le reste de la question est valable.

bool condition;

if(condition) {}

équivalent à

if(condition==true) {}

и

if(!condition) {}

est égal à

if(condition==false) {}

C'est juste plus court et plus familier.