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

 

J'ai besoin d'aide - j'ai des arrêts suiveurs - 3 ordres, mais l'exemple de suivi dans les tutoriels vidéo :) seulement pour des ordres non liés, dans mon cas ils sont liés par un algorithme, c'est-à-dire que le takeprofit est calculé par la somme des trois ordres, ou un seul si je suis dans une tendance. Eh bien, j'ai pensé à quelque chose mais mon conseiller expert n'a pas commencé à gagner plus - il a commencé à gagner le même nombre d'ordres mais j'obtiens 2-3 fois moins de transactions par rapport à mon EA précédent sans trailing. Donc mon trailing n'est pas un trailing mais une absurdité. Comment dois-je le placer sur les commandes liées ? Quelqu'un peut-il me donner une idée ? J'ai bien peur de ne pouvoir penser à autre chose. Voici le résultat de mon "trailing" - il est indiqué en bleu :

Le résultat pour 1 test est joint. Y a-t-il un stop suiveur ou non ? Je ne comprends pas. Pourquoi le bénéfice pour la même période n'a-t-il pas été augmenté ? Seulement le nombre de transactions a diminué de 2 à 3 fois ?

//+------------------------------------------------------------------+
//|                                     BLACKJACK&HOOKERS TrailX.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots           = 0.01;
extern int     TakeProfit     = 5;
extern int     Step           = 2;

extern int     TrailingStep   = 3;
extern int     TrailingStop   = 1;

extern int     MaPeriod       = 200;
extern int     MaShift        = 1;

extern int     Magic          = 123;
extern int     Slippage       = 5;

int timeprev=0;

extern double price,op,cn,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

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

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{  if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
   op=CalculateProfit();
   cn=CountTrades();
   tp=TakeProfit;
   if(tp>TakeProfit)
   {
      TakeProfit+=tp;
   }

   
 

 
   if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
   {
      if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0)
            Print("Не удалось открыть ордер на покупку");
            
   }
   
   if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
   {
      if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0)
            Print("Не удалось открыть ордер на продажу");
            
   }
   

   
   if(cn==1 && CountBuy()==1)//CountBuy()==1 && 
   {
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на продажу");
      }
   }
   else if(cn==1 && CountSell()==1)//CountSell()==1 && 
   {
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
      }
   }
   
   
   
   if(cn==2 && CountBuy()==1 && CountSell()==1)//CountBuy() + CountSell()==2 && 
   {
      price=FindLastSellPrice();
      if((price-Bid)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   else if(cn==2 && CountSell()==1 && CountBuy()==1)//CountSell() + CountBuy()==2 && 
   {
      price=FindLastBuyPrice();
      if((Ask-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   
   Trailing();

   

   if (op>=tp)
   {
         CloseAll();    
   }
   
   

 
   
   
   
   
   
   
   






}    
//---------------------------------------------------------------------------------------
//   double Equity() //или OrderProfit() - эти идеи в работе и задуманы как автоподбор лота (без мартингейла) для снижения рисков от контрдвижения (интервенций) рынка 
//   {
//      double eqv=0;
//      eqv+=AccountEquity();
//      return(eqv);     
//   }
//---------------------------------------------------------------------------------------
void Trailing()

{
   for (int i=OrdersTotal() -1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderType() == OP_BUY)
            
            {
               price=FindLastBuyPrice();   
               if (Bid - price > (TakeProfit+TrailingStep)*Point)
               {
                  {
                     tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits);
                  }
               }
               if (price - (TakeProfit-TrailingStop)*Point < Bid - (TakeProfit+TrailingStep)*Point)
               {
                  {
                     tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits);
                  }
               }
            }
            
            if (OrderType() == OP_SELL)
            {
               price=FindLastSellPrice();
               if (price - Ask > (TakeProfit+TrailingStep)*Point)
               {  
                  {
                     tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits);
                  }
               }
               if (price - (TakeProfit-TrailingStop)*Point > Ask + (TakeProfit+TrailingStep)*Point)
               {  
                  {
                     tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits);
                  }
               }
            }
         }
      }
   }
}
//---------------------------------------------------------------------------------------
double CalculateProfit()
  {
   double oprofit=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               oprofit+=OrderProfit();
              }
           }
        }
     }
   return(oprofit);
  }
//--------------------------------------------------------------------------------------
void CloseAll()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Print("Не удалось закрыть ордер на покупку");
              }
            if(OrderType()==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Print("Не удалось закрыть ордер на продажу");
              }
           }
        }
     }
  }
//---------------------------------------------------------------------------------------------------
double FindLastBuyPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//---------------------------------------------------------------------------------------------------
double FindLastSellPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//----------------------------------------------------------------------------------------------
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            count++;
        }
     }
   return(count);
  }
//----------------------------------------------------------------------------------------------
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
      {  
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  count++; 
         }
      }
      return(count);
}
//----------------------------------------------------------------------------------+
int FindLastOrderType()
{
      for(int i = OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(OrderType());
         } 
      }
      return(-1);
}
//----------------------------------------------------------------------------------+



Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

J'ai besoin d'aide - j'ai des stop flips - 3 ordres, mais l'exemple du trailing uniquement pour les ordres non liés, dans mon cas ils sont liés par un algorithme, c'est-à-dire que le takeprofit est basé sur la somme de trois ordres, ou un si vous êtes dans une tendance. Eh bien, j'ai pensé à quelque chose mais mon conseiller expert n'a pas commencé à gagner plus - il a commencé à gagner le même nombre d'ordres mais j'obtiens 2-3 fois moins de transactions par rapport à mon EA précédent sans trailing. Donc mon trailing n'est pas un trailing mais une absurdité. Comment dois-je le placer sur les commandes liées ? Quelqu'un peut-il me donner une idée ? J'ai bien peur de ne pas pouvoir trouver autre chose, voici le résultat de mon "trailing" - surligné en rouge :


Pensez-vous que quelqu'un comprendra votre code comme un gribouillage ?
 
Vitaly Muzichenko:
Pensez-vous que quelqu'un va comprendre votre code griffonné ?

Comment doit-il être affiché ? Eh bien, je ne peux pas ajouter un morceau de code, sinon on ne saurait pas ce qui est quoi.
 
geratdc:

Comment le montrer ? Eh bien, je ne peux pas ajouter un morceau de code, sinon on ne saurait pas ce qui est quoi.

Au moins comme ça :


 
Vitaly Muzichenko:

Du moins, c'est comme ça :



Quelqu'un l'a refait. C'est certainement mieux, merci.
 


Amis, j'étudie MQL4 et j'ai décidé d'écrire un EA pour le système Lazy Trader.
L'EA est écrit, mais il ne fonctionne pas correctement. L'erreur que je constate est que les ordres ne sont pas fermés par heure. Il se peut qu'il y ait d'autres erreurs.


Veuillez m'aider à trouver ces erreurs et me faire part de vos commentaires sur le code que vous voyez.

Voici les règles du système pour lequel j'ai écrit le conseiller expert :

1/ En début de semaine, attendez la fermeture de la première bougie de quatre heures.
2/ Nous mettons en attente des ordres Stop d'achat et Stop de vente 20 pips au-dessus du High et 20 pips en dessous du Low de ce chandelier.
3/ Le Stop Loss doit être fixé au niveau de l'ordre opposé. Le Take Profit n'est pas placé.
4/ Lorsque l'ordre atteint un profit, égal au stop loss, nous transférons le stop au Breakeven (nous transférons le stop loss de la position à son prix d'ouverture).
5/ La deuxième commande après l'activation de la première, NE PAS ENLEVER !
6/ A la fin de la semaine, nous supprimons / fermons tous les ordres, indépendamment de leur profit / perte.

Merci pour votre aide :)

Je joins un fichier avec le code EA

Dossiers :
 
ivan-baaton:


Amis, j'étudie MQL4 et j'ai décidé d'écrire un EA pour le système Lazy Trader.
L'EA est écrit, mais il ne fonctionne pas correctement. L'erreur que je constate est que les ordres ne sont pas fermés par heure. Il se peut qu'il y ait d'autres erreurs.


Veuillez m'aider à trouver ces erreurs et me faire part de vos commentaires sur le code que vous voyez.

Voici les règles du système pour lequel j'ai écrit le conseiller expert :

1/ En début de semaine, attendez la fermeture de la première bougie de quatre heures.
2/ Nous mettons en attente des ordres Stop d'achat et Stop de vente 20 pips au-dessus du High et 20 pips en dessous du Low de ce chandelier.
3/ Le Stop Loss doit être fixé au niveau de l'ordre opposé. Le Take Profit n'est pas placé.
4/ Lorsque l'ordre atteint un profit, égal au stop loss, nous transférons le stop au Breakeven (nous transférons le stop loss de la position à son prix d'ouverture).
5/ La deuxième commande après l'activation de la première, NE PAS ENLEVER !
6/ A la fin de la semaine, nous supprimons / fermons tous les ordres, indépendamment de leur profit / perte.

Merci pour votre aide :)

Je joins le fichier avec le code du conseiller.

TimeHour(TimeCurrent()) == DayTimeClose

Une telle égalité absolue peut être très rare et si vous clôturez la semaine à 23, il serait préférable de fermer les ordres un peu plus tôt, au moins pendant 15 minutes. Je n'ai pas cherché d'autres erreurs. À première vue, il semble être écrit de manière assez précise.

 
Alexey Viktorov:

Cette égalité absolue peut être très rare et si vous clôturez la semaine à 23, vous feriez mieux de clôturer les ordres un peu plus tôt, au moins de 15 minutes. Je n'ai pas cherché d'autres erreurs. À première vue, il semble être écrit de façon très soignée.

La clôture de la semaine est à 00:00, c'est-à-dire que je ferme les ordres 1 heure plus tôt.


Quel est le problème dans ce code :TimeHour(TimeCurrent()) == DayTimeClose ?


Je pense qu'il y a une erreur quelque part dans ce code :


for (int i = OrdersTotal() ; i>=0 ; i--)
{
si (OrderSelect(k, SELECT_BY_POS, MODE_TRADES) == true && TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5 && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) && OrderMagicNumber() == Magic)
{
ticket_sell = OrderClose(ticket_sell, Lots, Bid, 3, Red) ;
si (ticket_sell == false)
Print("Ordre de vente non fermé") ;
}

}


Merci.

 
ivan-baaton:

La clôture de la semaine est à 00:00, c'est-à-dire que je clôture les ordres 1 heure plus tôt.


Quel est le problème dans ce code :TimeHour(TimeCurrent()) == DayTimeClose ?


Je pense qu'il y a une erreur quelque part dans ce code :


for(int i = OrdersTotal() ; i>=0 ; i--)
{
si (OrderSelect(k, SELECT_BY_POS, MODE_TRADES) == true && TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5 && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) && OrderMagicNumber() == Magic)
{
ticket_sell = OrderClose(ticket_sell, Lots, Bid, 3, Red) ;
si (ticket_sell == false)
Print("Ordre de vente non fermé") ;
}

}


Merci

C'est exactement ce que j'ai fait remarquer. Bien que je vois maintenant que j'étais inattentif. Je n'ai vu que TimeHour(TimeCurrent()) mis en évidence. == DayTimeClose.

Mais le fait que le compteur de la boucle soit i et que l'ordre k soit sélectionné, je ne l'ai pas vu tout de suite.

 
Alexey Viktorov:

C'est exactement ce que j'ai fait remarquer. Bien que je vois maintenant que j'étais inattentif. Je n'ai vu que la mise en évidence de TimeHour(TimeCurrent()) == DayTimeClose.

Mais le fait que le compteur de la boucle soit i et que l'ordre k soit sélectionné, je ne l'ai pas vu tout de suite.


Oui, ce K est aussi écrit dans lesvariables externes dans l'en-tête supérieur... Peut-être que c'est la valeur de retour d'une fonction...


Alexey, que pouvez-vous dire à propos de mon problème ? J'essaie d'attacher un stop suiveur aux ordres inversés. Avez-vous déjà rencontré un tel problème ?

Raison: