Je rédigerai un conseiller gratuitement - page 18

 

J'ai besoin d'aide.

http://forum.mql4.com/ru/67309#1011467

Помогите добавить к текущему советник пирамидинг. - MQL4 форум
  • www.mql5.com
Помогите добавить к текущему советник пирамидинг. - MQL4 форум
 

Veuillez me conseiller : les ordres ne sont pas ouverts tous les jours ; le trawling ne fonctionne pas et les ordres ouverts ne sont pas fermés en fonction du TP. Qu'est-ce que je fais de mal ?


input int    StartHour    = 23;    // Время ачало торговли
input int    TakeProfit   = 40;    // TakeProfit
input int    StopLoss     = 40;    // StopLoss
input int    Lots         = 0.1;   // Лот для торговли
input int    Magic        = 22;    // Магическое число
input int    Trals        = 20;    // Дистанция тралинга в пунктах
input int    _Step        = 1;     // Шаг
input bool   _StepUse     = true;  // Использовать шаг или нет

void OnTick()
{
   static bool IsFirstTick = false;
   static int ticket = 0;
  
   double lot=Lot_Normalize(Symbol(),Lots,1);
   double sl= Dist_Normalize(Symbol(),Trals);
   double step= Dist_Normalize(Symbol(),_Step);
  
   int h= TimeHour(TimeCurrent());
   if(h == StartHour)
   {
    Alert("TimeHor: ", h);
    if (IsFirstTick == true)
      IsFirstTick = false;
     
      bool res;
      res= OrderSelect(ticket, SELECT_BY_TICKET);
      if(res == true)
      {
         if(OrderCloseTime() == 0)
         {
            bool res2;
            res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
           
            if(res2 == false)
            {
               Alert("Error Closing Order #", ticket);
               } Alert("Closing Order #", ticket);
         }  
      }
       if(Open[0] < Open[StartHour])
      {
         ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
         Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
         if(ticket < 0)
         {
           Alert("Error Sending Order!");
         } Alert("Sending Order! BUY_LIMIT");
       }
       else
       {
         ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
         Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
         if(ticket < 0)
         {
           Alert("Error Sending Order!");
         } Alert("Sending Order! SEL_LLIMIT");
    }  
}
 
}  

double Dist_Normalize(string Smv, int _Distancia)
{
 int Dig= int(MarketInfo(Smv,MODE_DIGITS));
 double Pip=MarketInfo(Smv,MODE_POINT);
 if(Dig==3 || Dig==5)
   return NormalizeDouble(_Distancia*10*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
 } 


double Lot_Normalize(string Smv, double _lot, double _mult)
{
 double minlot=MarketInfo(Smv,MODE_MINLOT);
 double maxlot=MarketInfo(Smv,MODE_MAXLOT);
 double steplot=MarketInfo(Smv,MODE_LOTSTEP);
 double lot= _lot*_mult;
 if(lot<=minlot) lot+minlot;
 else if(lot>=maxlot) lot=minlot;
 else if(lot>minlot && lot<maxlot)
  {
    int k=int((lot-minlot)/steplot);
    lot=NormalizeDouble(minlot+k*steplot,2);
  }
  return(lot);




void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
  int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
  for(int pos=OrdersTotal()-1; pos>=0;pos--)
    {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
      OrderMagicNumber()==_Magic && OrderType()<2)
        {
          double SLPrice;
          if(OrderType()==OP_BUY)
            {
              if(_Step_Use)
              {
                RefreshRates();
                if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
                {
                  SLPrice=NormalizeDouble(Ask-_Tral,Dig);
                  if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
                   Alert("Error modifi Order!: ",GetLastError());
                  }
                 }
               else
                 {
                  RefreshRates();
                  if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
                    {
                     SLPrice=NormalizeDouble(Bid+_Tral,Dig);
                     if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
                     Alert("Error modifi Order!: ",GetLastError());
                 }
             }
          }
       }
    }
 }            

 
MIR_KAZAN:

Veuillez me conseiller : les ordres ne sont pas ouverts tous les jours ; le trawling ne fonctionne pas et les ordres ouverts ne sont pas fermés en fonction du TP. Qu'est-ce que je fais de mal ?


input int    StartHour    = 23;    // Время ачало торговли
input int    TakeProfit   = 40;    // TakeProfit
input int    StopLoss     = 40;    // StopLoss
input int    Lots         = 0.1;   // Лот для торговли
input int    Magic        = 22;    // Магическое число
input int    Trals        = 20;    // Дистанция тралинга в пунктах
input int    _Step        = 1;     // Шаг
input bool   _StepUse     = true;  // Использовать шаг или нет

void OnTick()
{
 ......
 

si (IsFirstTick == true)

IsFirstTick = false;

Je remplacerais cette pièce par

if (TM!=Time[0])
{
   TM = Time[0];
......
}

Où la variable TM est déclarée comme DateTime en dehors de la fonction OnTick(), c'est-à-dire qu'elle est globale pour ce module.

Je ne comprends pas ce code : if(Open[0] < Open[StartHour])

Le StartHour est égal à 23 et il suggère que le prix ouvert de la barre zéro sera comparé au prix ouvert de la 23ème barre qui la précède. Bon, ok, peut-être que c'est une astuce de l'Expert Advisor.

Mais cette conception n'est pas du tout appropriée.

      res= OrderSelect(ticket, SELECT_BY_TICKET);
      if(res == true)
      { 
         if(OrderCloseTime() == 0)
         {
            bool res2;
            res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
            
            if(res2 == false)
            {
               Alert("Error Closing Order #", ticket);
               } Alert("Closing Order #", ticket);
         }   
      }

Que se passe-t-il si la variable ticket est égale à zéro, ou si l'EA a été réinitialisée et que cette variable a été réinitialisée par défaut ?

 
StartHour est l'heure à laquelle l'EA doit s'exécuter. Il devrait être une heure du matin. Pourquoi le chalutage ne fonctionne-t-il pas ?
 
MIR_KAZAN:
StartHour est l'heure à laquelle l'EA doit fonctionner. Il devrait être 1 heure du matin. Pourquoi le chalutage ne fonctionne-t-il pas ?

Vous devez analyser le code pour comprendre pourquoi il ne fonctionne pas.

Essayez d'insérerla fonction Print("Tralling_Stop") dans la fonctionTralling_Stop(), et voyez si ce message (Tralling_Stop) apparaît dans le journal, si non, alors cette fonction n'est pas appelée. Si vous l'avez, analysez la fonction Tralling_Stop() elle-même, elle contient peut-être quelques erreurs logiques.

En général, lorsqu'il y a des conditions logiques de type "si", insérez Print(" condition 1" ), Print(" condition 2" ), etc. Exécutez le conseiller expert dans le testeur de stratégie et dans le journal, vous pouvez suivre la logique de votre EA.

 
vitales:

Vous devez analyser le code pour comprendre pourquoi il ne fonctionne pas.

Essayez d'insérerla fonction Print("Tralling_Stop") dans la fonctionTralling_Stop(), et voyez si ce message (Tralling_Stop) apparaît dans le journal, si non, alors cette fonction n'est pas appelée. Si oui, analysez la fonction Tralling_Stop() elle-même - elle contient peut-être des erreurs logiques.

En général, lorsqu'il y a des conditions logiques de type "si", insérez Print(" condition 1" ), Print(" condition 2" ), etc. Exécutez le conseiller expert dans le testeur de stratégie et dans le journal, vous pourrez suivre la logique de votre conseiller expert.


J'ai essayé de le réécrire mais il ne fonctionne toujours pas comme je le souhaite. Les commandes ne sont pas ouvertes quand je veux qu'elles le soient, puis elles ne trillent pas. Selon cette idée, le conseiller expert devrait fonctionner de la manière suivante : à la clôture de la dernière bougie d'une journée (à 00:00), il devrait ouvrir deux ordres en attente : High (pour l'achat) et Low (pour la vente), puis les exécuter.

input int     StartHour    = 1;     // Начало торговли
input int     TakeProfit   = 40;    // TakeProfit
input int     StopLoss     = 10;    // StopLoss
extern double Lots         = 0.1;   // Лот для торговли
input int     Magic        = 22;    // Магическое число
input int     Trals        = 5;     // Дистанция тралинга в пунктах
input int     _Step        = 1;     // Шаг
input bool    _StepUse     = false; // Использовать шаг или неT

void OnTick()
{
   static bool IsFirstTick = false;
  
   Trailing();
  
   if (StartHour != Hour()) { return;}
   if (OrdersTotal()>0)
   {
    OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);                    
   }
}           

//+------------------------------------------------------------------+ 
void Trailing()
{
  if (_StepUse)
{
  for (int trall=0; trall<OrdersTotal(); trall++) {
    if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;      
 
    if (OrderType() == OP_BUY ) {
      if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
        if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
 
    if (OrderType() == OP_SELL) {
     if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
        if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
        }
     }
    }
  }
 }
}
//+------------------------------------------------------------------+

 
MIR_KAZAN:

Essayez

if (StartHour != Hour()) { return;} 

Remplacer par :

if (StartHour != TimeHour(Time[0])) { return;}//Если час текущей свечи не равен StartHour то выход из функции и тогда ниже написанный код выполнятся не будет, в том числе и трейлинг стоп. 
 if (OrdersTotal()>0)
{
....
}

Remplacer par :

if (OrdersTotal()==0) 
{
    bool rezult = false;
    rezult=OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    if (!rezult) Print("Ошибка открытия ордера BUY LIMIT");
    rezult = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    if (!rezult) Print("Ошибка открытия ордера SELL LIMIT"); 
//для работы в реале надо сделать более детальную проверку ошибок 

} else Trailing();

En outre, les prix doivent être normalisés à l'aide de NormalizeDouble(). Autrement dit, au lieu deLow[1]-StopLoss*Point, vous devez écrire NormalizeDouble(Low[1]-StopLoss*Point,Digits()).

De plus, selon votre code, si la variable _StepUse est égale à false, votre trailing stop ne fonctionnera pas. Regardez attentivement le code de la fonction Trailing()

void Trailing()
{
  if (_StepUse)//если false то код внутри скобок выполнятся не будет.
  {
   ......

  }
}// Скорее всего вы этот код просто бездумно скопировали от куда нибудь, даже не понимая как он работает.
 
vitales:

Essayez

Remplacer par :

Remplacer par :

En outre, les prix doivent être normalisés à l'aide de NormalizeDouble(). Autrement dit, au lieu deLow[1]-StopLoss*Point, vous devez écrire NormalizeDouble(Low[1]-StopLoss*Point,Digits()).

De plus, selon votre code, si la variable _StepUse est égale à false, votre trailing stop ne fonctionnera pas. Regardez attentivement le code de la fonction Trailing().

Vous êtes en contact ? Envoyez-moi un message à http://vk.com/computerwizard116. Je ne sais plus comment résoudre le problème de l'EA. Sur mon compte de démonstration, je travaille sur cette stratégie depuis une semaine.

Et ça marche. Et en testant, ce coquin ne ferme même pas l'ordre au point d'enlèvement(((((( Sur la photo, vous pouvez voir que le prix a dépassé le point d'enlèvement et est revenu en arrière, mais il a clôturé en perte, bon sang !((((

Pourquoi fait-il ça ?

Dossiers :
 
MIR_KAZAN:

Vous êtes en contact ? Envoyez-moi un courriel à http://vk.com/computerwizard116. Je ne sais plus comment résoudre le problème de l'EA. J'utilise cette stratégie depuis une semaine sur un compte de démonstration.

et ça marche. Mais lors des tests, ce coquin ne ferme même pas l'ordre à emporter. (((((( Sur la photo, vous pouvez voir que le prix a dépassé l'ordre à emporter et est revenu en arrière, mais il a clôturé en perte.

Pourquoi fait-il ça ?

Je ne suis pas en contact.

Lesordres Take profit et Stop loss ne dépendent pas du conseiller, ils sont exécutés sur le serveur du courtier. L'EA ne fait que définir le take profit et le stop loss, il ne les exécute pas. Vérifiez si le take profit a déjà été fixé après que le prix ait atteint cette valeur. En d'autres termes, l'ordre a d'abord été ouvert, puis le prix a évolué dans un sens et dans l'autre, et enfin le take profit a été fixé.

 
vitales:

Je ne suis pas en contact.

L'exécution des ordres take profit et stop loss ne dépend pas de l'EA, ils sont exécutés sur le serveur du courtier. L'EA se contente de définir les ordres d'achat et d'arrêt, il ne les exécute pas. Vérifiez si le take profit a déjà été fixé après que le prix ait atteint cette valeur. En d'autres termes, l'ordre a d'abord été ouvert, puis le prix a fait des allers-retours, et enfin le take profit a été fixé.

Comment coller TP, Sl dans OrderSend, de sorte que SL soit le haut de la bougie précédente et TP le bas de la bougie précédente + TakeProfit ?