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

 
d1w4m3:


Merci pour la réponse, mais je viens juste de commencer à apprendre depuis quelques semaines, comment implémenter ceci en code, ou dites-moi où lire s'il vous plaît. Ou selon Igor Kim ?

Et pourtant il ouvrira une position, non conforme au système, alors qu'il vient de commencer son travail, votre condition n'évite pas ce problème.

Et si vous y réfléchissez ? Pourquoi n'évite-t-elle pas le problème ?

Quand il commence à travailler, et s'il n'a pas travaillé auparavant (en général la première manche), alors il n'y a pas encore eu sa position, et la logique montrera que la dernière position fermée n'existe tout simplement pas encore. Cela signifie qu'il n'aurait pas pu être fermé au niveau du stop ou du take, ce qui permet d'ouvrir une position sur le signal.

N'est-ce pas ?

 
Artyom Trishkin:

Et si vous y réfléchissez ? Pourquoi n'évite-t-elle pas le problème ?

Lorsqu'il commence à fonctionner, et s'il n'a pas fonctionné auparavant (première exécution du tout), il n'y a pas encore eu de position, et la logique montrera que la dernière position fermée n'existe tout simplement pas encore. Cela signifie qu'il n'aurait pas pu être fermé au niveau du stop ou du take, ce qui permet d'ouvrir une position sur le signal.

N'est-ce pas ?


C'est ça le truc : par un signal ! Mais la condition peut être remplie non pas sur la barre 2 (dès que l'indicateur a changé le tampon) mais sur n'importe quelle deuxième barre (après quoi tout fonctionne par le système bien sûr). Le problème est dans la condition d'ouverture des ordres, comment le fixer mais sur la 2ème barre après le changement de tampon de l'indicateur ?

void OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4) ;
dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4) ;
si(DN_Trend()==true)
{
if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red) ;
si (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits) ;
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits) ;
if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Erreur de vente") ;
}

}


 
d1w4m3:


Le fait est qu'il est basé sur le signal ! Mais la condition peut être satisfaite non pas sur la deuxième barre (dès que l'indicateur a changé le tampon) mais sur n'importe quelle deuxième barre (après quoi tout fonctionne avec le système bien sûr). Le problème est dans la condition d'ouverture des ordres, comment le fixer mais sur la 2ème barre après le changement de tampon de l'indicateur ?

void OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4) ;
dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4) ;
si(DN_Trend()==true)
{
if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red) ;
si (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits) ;
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits) ;
if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Erreur de vente") ;
}

}


Insérez le code correctement. Il existe un bouton SRC dans le menu de l'éditeur de messages.
Je n'ai rien compris à vos explications.
 
d1w4m3:


C'est le but ! Mais la condition peut être remplie non pas sur la barre 2 (dès que l'indicateur a changé le tampon), mais sur n'importe quelle deuxième barre (après quoi tout fonctionne avec le système bien sûr). Le problème est dans la condition d'ouverture des ordres, comment le fixer mais sur la 2ème barre après le changement de tampon de l'indicateur ?

void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }

  }


1. Voici à quoi ressemblerait le code s'il était inséré correctement. Il y a une raison pour laquelle les développeurs l'ont inventé...

2. un indice subtil : où sont Open[4] et Close[4] par rapport aux valeurs de l'indicateur ?

 
extern int TakeProfit  = 200;
extern double Lots     = 0.1;
extern int StopLoss    = 52;
extern int Magic       = 1111;
extern int Slippage    = 3;
extern int n           = 3; // На какую свечу открывать ордер
//------------------------------------------------------------------
extern int  LevelWLoss  = 1;      // Уровень безубытка
extern int  LevelProfit = 30;     // Уровень профита
//------------------------------------------------------------------
extern string    Slope  = "Параметры Slope";
extern int       period = 163; 
extern int       method = 3;                         
extern int       price  = 0;    
//------------------------------------------------------------------
double uptr, SL, TP, dntr;
int    ticket, nd;
bool   fm;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit  *=10;
       StopLoss    *=10;
       Slippage    *=10;
       LevelWLoss  *=10;
       LevelProfit *=10;
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }
  }
}//if(DN_Trend()==true)

if(UP_Trend()==true)
{
   if( CountBuy() == 0  && Ask > uptr && Open[3] > uptr && Close[3] > uptr  )
  {
   ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
      if (ticket>0)
      {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
               Print("Ошибка на покупку");
       }
    }
}//if(UP_Trend()==true)

      if ( CountSell()>0  && Open[3] > uptr && Close[3] > uptr && UP_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
            if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      if ( CountBuy()>0 && Open[3] < dntr && Close[3] < dntr && DN_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
            if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      //+переход в безубыток+
   for( int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
        if(OrderSymbol()== Symbol() && OrderMagicNumber()==Magic)
          {
            if(OrderType()==OP_BUY) 
              {
                if(OrderStopLoss()-OrderOpenPrice()<LevelWLoss*Point) 
                 {
                   if(Bid-OrderOpenPrice()>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
            }
           }
         if(OrderType()==OP_SELL) 
           {
            if(OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*Point) 
              {
               if(OrderOpenPrice()-Ask>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
           }
       
        }
     }
     
//------------  комментарии -----------------+     
  if(UP_Trend()) Comment("Восходящий тренд ", uptr);
  if(DN_Trend()) Comment("Нисходящий тренд ", dntr);
 
 }
//+------------------------------------------------------------------+
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 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);
}
//+------------------------------------------------------------------+
bool UP_Trend()
{
  if(uptr > 0 && uptr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
bool DN_Trend()
{
  if(dntr > 0 && dntr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
 

Si nous insérons votre condition " Cela signifie qu'il n'a pas pu être fermé à l'arrêt ou à la prise, ce qui permet d'ouvrir une position sur le signal. "

Et mon signal est"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)" (ainsi que le décalage de l'indicateur n=3),

Il s'avère que s'il est placé immédiatement sur le graphique, il s'ouvrira sur une tendance baissière, dès le début sur la 3ème bougie, et ensuite, s'il y a un signal, il s'ouvrira selon les besoins.

 
d1w4m3:

Si nous insérons votre condition " Cela signifie qu'il n'a pas pu être fermé à l'arrêt ou à la prise, ce qui permet d'ouvrir une position sur le signal. "

Et mon signal est"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)" (ainsi que le décalage de l'indicateur n=3),

Il s'avère que s'il est placé immédiatement sur le graphique, il s'ouvre sur une tendance baissière au moment du démarrage sur la 3ème bougie, et ensuite, s'il y a un signal, il s'ouvre comme il faut.

Je ne comprends rien. Que possédez-vous que vous ne comprenez pas ? Vous ne pouvez pas déterminer que la dernière position a été fermée au stop ou à la prise ? Vous ne trouvez pas d'endroit dans votre code où vérifier cette condition ?

Ou qu'est-ce que tu ne peux pas faire ?

Comment peut-il s'ouvrir sur la troisième bougie ? ou expliquez ce que signifie "il s'ouvrira sur la troisième bougie"? Qu'est-ce que ça veut dire ?
 

chaque fois qu'un ordre s'ouvre sur un signal d'indicateur, comment puis-je stocker le type de ce signal dans une variable ?

Il y a un bug (quand je lance l'EA), l'ordre ne s'ouvre pas au début d'une tendance (pas en fonction d'un changement de couleur de l'indicateur), parce que ma condition ne se réfère pas à des bougies spécifiques, mais dit que si la tendance est à la hausse ou à la baisse, elle s'ouvre au début de 3 bougies.


 

Bon après-midi à tous.

Je me demande comment analyser les statistiques de travail dans EXCEl.

Qui peut me dire ce qui peut être extrait via DDE de mt4 et où puis-je obtenir toutes les fonctions autorisées pour le transfert vers excel ?

Je vous serais très reconnaissant pour votre aide

 
Maxim Shershnev:

Bon après-midi à tous.

Je me demande comment analyser les statistiques de travail dans EXCEl.

Qui peut me dire ce qui peut être extrait via DDE de mt4 et où puis-je obtenir toutes les fonctions autorisées pour le transfert vers excel ?

Je vous serais très reconnaissant pour votre aide

Il y a tout ce dont vous avez besoin. Le format d'enregistrement .csv permet d'écrire dans Excel.
Файловые операции - Справочник MQL4
Файловые операции - Справочник MQL4
  • docs.mql4.com
Файловые операции - Справочник MQL4