[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 229

 
veuillez me dire pourquoi les transactions ne s'ouvrent pas.... Le code semble logique, mais il ne s'ouvre pas.
 
//+------------------------------------------------------------------+ 
  //| MACD ^^^.mq4 | 
  //| Copyright © 2011, MetaQuotes Software Corp. | 
  //| http://www.metaquotes.net | 
  //+------------------------------------------------------------------+ 
  #property copyright "Copyright © 2011, MetaQuotes Software Corp." 
  #property link "http://www.metaquotes.net" 

  extern int TP = 100; 
  extern int TS = 100; 
  extern int TF = 1; 
  extern double lots = 0.1; 
  int fast_ema = 5; 
  int slow_ema = 34; 
  int signal_period = 5; 
  int slip = 3; 
  int Magic = 1; 

 int total; 
 int ticket; //объявил тотал и тикет 

 //+------------------------------------------------------------------+ 
  //| expert initialization function | 
  //+------------------------------------------------------------------+ 
  int init() 
    { 
  //---- 

 //---- 
     return(0); 
    } 
  //+------------------------------------------------------------------+ 
  //| expert deinitialization function | 
  //+------------------------------------------------------------------+ 
  int deinit() 
    { 
  //---- 

 //---- 
     return(0); 
    } 
  //+------------------------------------------------------------------+ 
  //| expert start function | 
  //+------------------------------------------------------------------+ 
  int start() 
    { 
  //---- 
  
 CheckTicket();
 bool signal = signal_MACD(); 
 AnalyzeSignal(signal); 

 //---- 
     return(0); 
    } 
  //+------------------------------------------------------------------+ 

 bool signal_MACD() 
  { 
    bool signal_MACD = false; 
    double tmp = iMACD(Symbol(),TF,fast_ema,slow_ema,signal_period,PRICE_CLOSE,MODE_MAIN,0); 
    for(int i=1;i<=5;i++) 
    { 
       if(NormalizeDouble(iMACD(Symbol(),TF,fast_ema,slow_ema,signal_period,PRICE_CLOSE,MODE_MAIN,0)*tmp,4)<0.0) 
       { 
          signal_MACD = true; 
          break; 
       } 
    } 
  } 

 void AnalyzeSignal(bool signal) 
  { 
    double MACD = iMACD(Symbol(),TF,fast_ema,slow_ema,signal_period,PRICE_CLOSE,MODE_MAIN,0);
    total = OrdersTotal();
    if(total < 0)
    {
      if(signal == true)
      {
         if(MACD > 0)
         {
                ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,slip,Bid-TS*Point,Bid+TP*Point,"покупаем",Magic,0,Green); 
                if(ticket>0) 
                { 
                    OrderSelect(ticket,SELECT_BY_TICKET); 
                    Print("открылись на покупку по цене:", OrderOpenPrice()); 
                } 
                else 
                { 
                    Print("открыться не удалось по причине:", GetLastError()); 
                    return(0); 
                } 
         }
         if(MACD < 0)
         {
               ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,slip,Ask+TS*Point,Ask-TP*Point,"Продаем",Magic,0,Green); 
               if(ticket>0) 
               { 
                   OrderSelect(ticket,SELECT_BY_TICKET); 
                   Print("открылись на продажу по цене:", OrderOpenPrice()); 
               } 
               else 
               { 
                   Print("открыться не удалось по причине:", GetLastError()); 
                   return(0); 
               } 
         }
         else
            return(0);
      }
    }
  }
  
void CheckTicket()
{
   if(OrderSelect(ticket,SELECT_BY_TICKET))
   {
      if(OrderCloseTime()>0)
      {
         ticket = 0;
      }
   }   
}
 

C'est un point que je n'arrive pas à rassembler, aidez-moi à le créer :

J'ai besoin de définir un point de profit zéro pour deux ou plusieurs ordres ouverts dans une direction, par exemple l'achat.

et ajoutez le take profit à ce point et assignez-le à tous les ordres d'achat ouverts.

Et le take profit doit apparaître sur le graphique, c'est-à-dire qu'il doit être visible.

Par exemple, au prix de 1500 nous ouvrons le premier ordre d'Achat

à 1600 nous ouvrons le deuxième ordre d'achat.

leur point zéro est à 1550 + (Take Profit = 20)

et ici le premier et le second ordre ont un take profit de 1570, quand le prix atteint ce niveau, les deux ordres seront fermés,

et si le prix passe (saute) ce niveau, il suivra et fermera les ordres.

Il est très important d'enregistrer les ordres d'achat et de vente simultanément et de ne pas interférer les uns avec les autres. Vous devez définir la prise de profit séparément pour l'achat et la prise de profit séparément pour la vente, et seulement lorsque deux ordres ou plus sont ouverts dans une direction en même temps.

 
CLAIN:
veuillez me dire pourquoi les transactions ne s'ouvrent pas.... Le code semble logique, mais il ne s'ouvre pas.
Parce que OrdesTotal() ne renvoie jamais une valeur négative.
 
Merci, bon point.... corrigé... mais les transactions ne s'ouvrent toujours pas.... que faire ?
 
CLAIN:
Merci, bon point.... corrigé... mais les transactions ne s'ouvrent toujours pas.... que faire ?


Probablement corriger la fonction signal_MACD().

Eh bien, qu'elle donnerait toujours quelque chose en retour.

 

Bonjour.

Pouvez-vous me dire si j'ai écrit les conditions correctement ? ( Les paramètres Fractal_point_up_buy et Fractal_point_down_buy sont normalisés).

Merci d'avance.

      Fractal_point_up_buy=TF1B;
      Flow_differential_buy=Fractal_point_up_buy-Bid;
      if (timf1s>timf2b && timf2s>timf2b && timf3s>timf2b && timf3s<timf1b)
       {
        Fractal_point_down_buy=TF3S;   
       }
      else
       {
        if (timf1s>timf2b && timf2s>timf2b && timf3s<timf2b && timf2s<timf1b)
         {
          Fractal_point_down_buy=TF2S;   
         }
        else
         {
          if (timf1s>timf2b && timf2s<timf2b && timf3s<timf2b && timf1s<timf1b)
          Fractal_point_down_buy=TF1S; 
         }     
       }
      Fractal_fibo_buy=100*Flow_differential_buy/(Fractal_point_up_buy-Fractal_point_down_buy);
 
belck:

C'est un point que je n'arrive pas à rassembler, aidez-moi à le créer :

J'ai besoin de définir un point zéro sur le profit de deux ou plusieurs ordres ouverts dans une direction, par exemple pour acheter.

et ajoutez le take profit à ce point et assignez-le à tous les ordres d'achat ouverts.

Et le take profit doit apparaître sur le graphique, c'est-à-dire qu'il doit être visible.

Par exemple, au prix de 1500 nous ouvrons le premier ordre d'Achat

à 1600 nous ouvrons le deuxième ordre d'achat.

leur point zéro est à 1550 + (Take Profit = 20)

et ici le premier et le second ordre ont un take profit de 1570, quand le prix atteint ce niveau, les deux ordres seront fermés,

et si le prix passe (saute) ce niveau, il suivra et fermera les ordres.

Il est très important d'enregistrer les ordres d'achat et de vente simultanément et de ne pas interférer les uns avec les autres. Vous devez définir la prise de profit séparément pour l'achat et la prise de profit séparément pour la vente, et seulement lorsque deux ordres ou plus sont ouverts dans une direction en même temps.


Pour une position ouverte à 1500, un Take à 1570 serait correct (si vous ne tenez pas compte de StopLevel), mais pour une position ouverte à 1600, un Take à 1570 provoquerait une erreur 130 - mauvais stops. Après tout, un Take ne peut pas être inférieur au prix d'ouverture d'un Buy. Il s'agit déjà d'un StopLoss.
Pour deux postes, vous avez défini votre seuil de rentabilité, mais pour trois-quatre-cinq ?
Vous devez d'abord déterminer la formule du seuil de rentabilité pour les positions unidirectionnelles, puis vous pouvez créer une logique.
 
nemo811:

Bonjour.

Pouvez-vous me dire si j'ai écrit les conditions correctement ? (Les paramètres Fractal_point_up_buy et Fractal_point_down_buy sont normalisés).

Merci d'avance.

Bonjour.

Si toutes les variables sont déclarées, je ne vois pas d'erreurs dans la syntaxe MQL4...

Quel est le problème ?

 
,
artmedia70:
Pour une position ouverte à 1500, une prise à 1570 serait correcte (si vous ne tenez pas compte de StopLevel), mais pour une position ouverte à 1600, une prise à 1570 provoquerait une erreur de 130 - mauvais stops. Après tout, un Take ne peut pas être inférieur au prix d'ouverture d'un Buy. Il s'agit déjà d'un StopLoss.
Pour deux postes, vous avez défini votre seuil de rentabilité, mais pour trois-quatre-cinq ?
Vous devez d'abord définir la formule du seuil de rentabilité pour les positions unidirectionnelles, puis vous pourrez élaborer la logique.

Tout dépend du moment où nous fixons ou modifions le Take Profit. Il est basé sur le prix actuel.
Raison: