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

 

Pour un testeur, cela

OrderSend

fera l'affaire et fonctionnera même sur des serveurs rapides, mais si vous n'êtes pas testeur, il est préférable de le faire selon la documentation :)

 
Les gars, j'ai besoin d'aide, cela fait quelques jours que je n'arrive pas à faire les modifications nécessaires au code suivant :
void start()
{
   StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); 
   
   // Определение направления пересечения мувингов
   if (Init) InitMetod(); 
   
   // Трейлинг стоп открытых позиций
   if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber);
   
   // Ожидание нового бара на графике
   if(timeprev == Time[0]) return;
   timeprev = Time[0];
   
   // Открытие ордера по методу Пуриа
   CheckForOpen();
}
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() // Открытие ордера по методу Пуриа
{
   double malw,mas1,mas2,macd;
   int    res;  
   // Считывание параметров индикаторов
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0);
  
   // Проверяем положение мувмнгов
   if(malw>mas1 && malw>mas2  && OrderSell)
     {
     OrderBuy=true;
     OrderSell=false;
     Order=true;
     }
   
   if(malw<mas1 && malw<mas2  && OrderBuy)
     {
     OrderBuy=false;
     OrderSell=true;
     Order=true;
     }

   // Открываем ордер Buy
   if(macd>0 && OrderBuy && Order)
     {
     res=OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue);
     Order=false;
     return;
     }     
   // Открываем ордер Sell   
   if(macd<0 && OrderSell && Order)
     {
     res=OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red);
     Order=false;
     return;
     }
 
}  
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lots()  // Расчет объема лота
{
   double Lots;
   if (Lot > 0) return(Lot);
   Lots=AccountFreeMargin()/5000;
   Lots=MathMin(15,MathMax(0.01,Lots));
   if(Lots<0.1) Lots=NormalizeDouble(Lots,2);
   else 
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);
     else       Lots=NormalizeDouble(Lots,0);
     }
   return(Lots);
}
//+------------------------------------------------------------------+
//| Init metod Puria function                                        |
//+------------------------------------------------------------------+
void InitMetod()  // Опредеоение начального пересечения мувингов
{
   double malw,mas1,mas2;
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);

   if((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2))
     {
     Init=false;
     OrderBuy=true;
     OrderSell=true;
     }   
   return;
}

En fait, ce que j'ai essayé mais que je n'ai pas pu ajouter ici : faire en sorte que l'EA attende 4 prix d'ouverture de bougie d'affilée après que tous les indicateurs ( prix d'ouverture de bougie) coïncident :


  1. 1. le prix d'ouverture de la 1ère bougie - (5) sur (75) et (85) + barre MACD ouverte au-dessus de 0 - 1 confirmation sur 4 est;
    2. le prix d'ouverture de la 2ème bougie - (5) sur (75) et (85) + barre MACD ouverte au-dessus de 0- 2 confirmations sur 4 est;
    3. le prix d'ouverture de la 2ème bougie - (5) sur (75) et (85) + barre MAC D ouverte au-dessus de 0 - 2 confirmations sur 4 est ; Le prix d'ouverture de la 3ème bougie - (5) au-dessus de (75) et (85) + barre MACD ouverte au-dessus de 0- 3 confirmations sur 4 oui ;
    4. Le prix d'ouverture de la 4ème bougie - (5) au-dessus de (75) et (85) + barre MACD ouverte au-dessus de 0- 4 confirmations sur 4 oui- Ouvrir un trade pour acheter sur la même bougie (4ème).

La même situation avec les ordres de vente, mais dans l'autre sens, les indicateurs doivent s'ouvrir. Et il y a un point important - si à n'importe quel stade de la 1ère bougie à la 4ème, les indicateurs changent de position(par exemple, sur la 3ème bougie d'ouverture, la barre MACD s'ouvre soit en dessous de 0, soit = 0) - alors tout se réinitialise, car les signaux n'ont pas été vérifiés à l'ouverture de la 4ème bougie d'affilée.

Veuillez conseiller les programmeurs expérimentés, ce qui doit être changé dans le code pour que ces conditions fonctionnent ? J'ai essayé beaucoup de choses, et je ne sais pas...

 
   if(malw>mas1 && malw>mas2  && OrderSell)

Comme on dit, ne nous croyez pas sur parole.

OrderSell

Je ne sais pas ce qu'il y a dedans, je partage la logique de décision dans le code.

 

artem artem #:

Le prix d'ouverture de la 1ère bougie - (5) sur (75) et (85) + barre MACD ouverte au-dessus de 0 - 1 confirmation sur 4 oui;

2 Le prix d'ouverture de la 2ème bougie - (5) au-dessus de (75) et (85) + barre MACD ouverte au-dessus de 0- 2 confirmations sur 4 oui ;

3 Le prix d'ouverture de la 3ème bougie - (5) sur (75) et (85) + barre MACD ouverte au-dessus de 0- 3 confirmations sur 4 est ;

4 Le prix d'ouverture de la 4ème bougie - (5) au-dessus de (75) et (85) + barre MACD ouverte au-dessus de 0- 4 confirmations sur 4 oui- Ouvrir un trade pour acheter sur la même bougie (4ème).

    //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    void OnTick()
      {
    //---
       if(CheckForOpen()==0)
         {
          if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue)) Print("BUY OK");
         }
       if(CheckForOpen()==1)
         {
          if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) Print("SELL OK");
         }
      }
    //+------------------------------------------------------------------+
    //| Check for open order conditions                                  |
    //+------------------------------------------------------------------+
    int CheckForOpen() // Открытие ордера по методу Пуриа
      {
       double malw,mas1,mas2,macd;
       int    res=-1, buy=0, sell=0;
       // Считывание параметров индикаторов 3 свечи
       malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3);
       mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3);
       mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3);
       macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3);
       if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
       if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
       // Считывание параметров индикаторов 2 свечи
       malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2);
       mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2);
       mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2);
       macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2);
       if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
       if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
       // Считывание параметров индикаторов 1 свечи
       malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1);
       mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1);
       mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1);
       macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1);
       if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
       if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
       // Считывание параметров индикаторов 0 свечи
       malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
       mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
       mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
       macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0);
       if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
       if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
       
       if(buy ==4) res=0;
       if(sell==4) res=1;
       return(res);
      }
     
    malw

    Évaluer une valeur par rapport à une autre, rien ? Diviser le premier bloc = solution, le deuxième bloc = solution, comparer les blocs.

     
    Volodymyr Zubov #:

    Évaluer une valeur par rapport à une autre, rien ? Diviser le premier bloc = solution, le deuxième bloc = solution, comparer les blocs.

    Est-ce que c'est écrit à qui ? ou à quoi ?
     
    Il s'avère que vous avez
    malw
    dans le code et qu'une erreur logique en découle.
     
    Volodymyr Zubov #:
    Il s'avère que vous avez, dans le code, une erreur logique.
    Vérifiez avant d'écrire
     

    OK, mais les variables se bloqueront si vous les utilisez de cette façon et vous ne saurez pas ce que sont les "miracles".

     
    Volodymyr Zubov #:

    D'accord, mais les variables se planteront si vous les utilisez de cette façon et vous ne saurez pas ce que sont les "miracles".

    Si vous connaissez une autre option, écrivez-la...

    Vous pouvez aider les gens).