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

 

> err=StringToInteger((string)err)

cela devrait rester dans les annales ;-)

à l'origine dans err vous avez manifestement obtenu int de GetLastError(). Convertir le code d'erreur en description lisible ErrorDescription(err) ; à condition que #include <stdlib.mqh> soit activé.

mais la façon dont c'est écrit est une déception.

PS/ Et n'apprenez pas la programmation MQL. MQL 4 et 5 sont des langages cibles pour une plateforme particulière.

 

Pouvez-vous me dire si vous pouvez l'écrire de cette façon. il ne veut pas ouvrir les transactions. peut-être que le format des nombres calculés est mauvais ? ou d'autres défauts dans le code ?


double TakeLong(double shp)

{

int CurrentDayRange=0, fiveDayATR=0, take=0 ;

double TP_ATR=0 ;

//////Pivots

double P, S1, R1, S2, R2, S3, R3 ;

double LastHigh, LastLow, x ;

int counted_bars = IndicatorCounted() ;

int limite, i ;

shp=iHigh(Symbol(),PERIOD_D1,0) ;


//---- Calcul de l'indicateur de pivotement

si(barres comptées == 0)

{

x = Période() ;

si(x > 240)

retour(-1) ;

}

si(barres comptées < 0)

retour(-1) ;

limite = (Bars - counted_bars) - 1 ;

//----

for(i = limite ; i >= 0 ; i--)

{

si(High[i+1] > LastHigh)

LastHigh = High[i+1] ;

//----

si(Low[i+1] < LastLow)

LastLow=Low[i+1] ;

if(TimeDay(Time[i]) != TimeDay(Time[i+1])

{

P = (LastHigh + LastLow + Close[i+1]) / 3 ;

R1 = (2*P) - LastLow ;

S1 = (2*P) - LastHigh ;

R2 = P + (LastHigh - LastLow) ;

S2 = P - (LastHigh - LastLow) ;

R3 = (2*P) + (LastHigh - (2*LastLow)) ;

S3 = (2*P) - ((2* LastHigh) - LastLow) ;

LastLow = Open[i] ;

LastHigh = Open[i] ;

}

}

////ATR calcul

pour (i=1;i<6;i++)

{ if(iHigh(NULL, PERIOD_D1, i)-iLow(NULL, PERIOD_D1, i)>0) FiveDayATR += (iHigh(NULL, PERIOD_D1, i)-iLow(NULL, PERIOD_D1, i));}

FiveDayATR = NormalizeDouble(FiveDayATR/5,Digits()) ;

CurrentDayRange = (iHigh(NULL, PERIOD_D1, i)-iLow(NULL, PERIOD_D1, i)) ;

si(FiveDayATR-CurrentDayRange>0) TP_ATR=Ask+FiveDayATR-CurrentDayRange ; sinon TP_ATR=0 ;


si (Bid>R1 && TP_ATR==0) take=shp ;

sinon si (Bid<R1 && R1<TP_ATR) take=R1 ;

sinon, take=TP_ATR ;

retour (prise) ;

}

 
forexpipsrunner: s'il vous plaît dites-moi si vous pouvez l'écrire comme ça. il ne veut pas ouvrir les métiers

Le code proposé ressemble à un indicateur. Les transactions sont ouvertes par un conseiller expert ou un script. L'appel de la fonction OrderSend n' est pas autorisé dans l'indicateur. L'indicateur peut s'alarmer - insérez l'appel de la fonction Alerte ou le son à l'endroit approprié

 
STARIJ:

Le code proposé est similaire à l'indicateur. Les transactions sont ouvertes par un conseiller expert ou un script. L'appel de la fonction OrderSend est interdit dans l'indicateur. L'indicateur peut signaler - insérer l'appel ou le son de la fonction d'alerte à l'endroit approprié


C'est le code de définition du TP, qui envoie le résultat à OrderSend. Sans cet algorithme complexe, les transactions sont envoyées, mais il n'y a aucun moyen de les envoyer. J'appelle la fonction TP = TakeLong(SHP) ;

 
forexpipsrunner: c'est le code de définition du TP qui donne le résultat à OrderSend. sans cet algorithme, les transactions sont envoyées, il n'y a aucun moyen de le faire.

Il existe de nombreuses façons de déboguer - le processus qui consiste à trouver une erreur lorsqu'il est établi qu'il y en a une. La première est F5 - démarrer le débogage dans MetsEditor. 2) utiliser Alerts pour tracer l'exécution. 3 et 4) produisent des informations de débogage dans les étiquettes de texte et la fonction Commentaire. Choisissez le moyen le plus pratique et déboguez cette fonction simple - vous deviendrez alors un programmeur. Un programme comportant des milliers de lignes est considéré comme complexe.

 
forexpipsrunner:

Pouvez-vous me dire si vous pouvez l'écrire de cette façon. il ne veut pas ouvrir les transactions. peut-être que le format des nombres calculés est mauvais ? ou un autre défaut dans le code ?


int take=0 - vous retournez un entier, cette variable ne devrait-elle pas être un double ?
 
Bonjour ! Je veux faire un motif "rail", mais je n'arrive pas à déterminer la taille du corps du chandelier.....

Je calcule la taille du corps du chandelier comme suit :
MathAbs( Close1[i] - Open1[i] ) / Point + 1
MathAbs( Close2[i] - Open2[i] ) / Point + 1

Dans le code complet, cela ressemble à cela

double Close1 = iClose(Symbol(), 0, i) ;
double Open1 = iOpen(Symbol(), 0, i) ;
double Close2 = iClose(Symbol(), 0, i+1) ;
double Open2 = iOpen(Symbol(), 0, i+1) ;

MathAbs( Close1[i] - Open1[i] ) / Point + 1
MathAbs( Close2[i] - Open2[i] ) / Point + 1

if (Close1 < Open1 && Close2 > Open2){
BUY() ;
}
if (Close1 > Open1 && Close2 < Open2){
SELL() ;
}

Est-ce correct ? Comment faire pour que ça marche ?
 
sviter-pro:   Bonjour, je veux faire un motif "rail", mais je n'arrive pas à déterminer la taille du corps de la bougie.....

L'avez-vous essayé sur le compte de démonstration M1 ? Qu'est-ce que vous obtenez ?

 
STARIJ:

L'avez-vous essayé sur un compte de démonstration M1 ? Comment ça se passe ?

Rien ne fonctionne....(((
 
void trailing(string symbol,string comment,int magic,int trail_p)
  {
   if(symbol==NULL) symbol=Symbol();
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==symbol && OrderComment()==comment && OrderMagicNumber()==magic)
           {
            switch(OrderType())
              {
               case OP_BUY:
                  if(OrderOpenPrice()+(trail_p*Point)<Ask && OrderStopLoss()+(trail_p*Point)<Ask)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+(trail_p*Point),OrderTakeProfit(),OrderExpiration(),clrNONE))
                       {
                        Print("OrderModify завершилась с ошибкой #",GetLastError());
                       }
                    }
                  break;
               case OP_SELL:
                  if(OrderOpenPrice()-(trail_p*Point)>Bid && OrderStopLoss()-(trail_p*Point)>Bid)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()-(trail_p*Point),OrderTakeProfit(),OrderExpiration(),clrNONE))
                       {
                        Print("OrderModify завершилась с ошибкой #",GetLastError());
                       }
                    }
                  break;
              }
           }
        }
        Comment("StopLoss=",OrderStopLoss());
     }
  }

Pouvez-vous me dire pourquoi le chalut est déclenché à chaque tick?

Raison: