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

 
novichok2018:

Le message apparaît toujours à la 12e minute.

Insérer Print, au début de la fonction où le tableau est rempli

Print("Range = ", ArrayRange(NewsArr,1));

et montrer le nombre de valeurs dans la deuxième dimension

 
Ilya Prozumentov:

Je peux dire que NomNews entre dans la boucle While déjà dans un état supérieur à 999. Vous devez alors trouver pourquoi cela se produit et réinitialiser cette variable quelque part.

Pour le vérifier, écrivez-le au début de la boucle :

Oui, à la 11ème minute, l'empreinte est de 1000.

 
Alekseu Fedotov:

Insérer Print, au début de la fonction où le tableau est rempli

et montrer le nombre de valeurs dans la deuxième dimension

Je l'ai inséré au débutde la boucle While et j'ai obtenu l'infiniRange = 1000. L'ai-je inséré au mauvais endroit ?

Quel est ce nombre (ou cette fonction ?): datetime TimeNewsFunck(int nomf)

{

chaîne de caractères s=NewsArr[0][nomf] ;

string time=StringConcatenate(StringSubstr(s,0,4), ".",StringSubstr(s,5,2), ".",StringSubstr(s,8,2), " ",StringSubstr(s,11,2), " :",StringSubstr(s,14,4)) ;

return((datetime)(StringToTime(time) + GMTplus*3600))

}

Et où prend-il la valeur de l'int nomf ? Je n'ai pas pu le trouver.

 
novichok2018:

Je l'ai inséré au débutde Whileloop et j'ai obtenu infiniteRange = 1000. L'ai-je mis au mauvais endroit ?

Et quel est ce nombre (ou cette fonction ?): datetime TimeNewsFunck(int nomf)

{

chaîne de caractères s=NewsArr[0][nomf] ;

string time=StringConcatenate(StringSubstr(s,0,4), ".",StringSubstr(s,5,2), ".",StringSubstr(s,8,2), " ",StringSubstr(s,11,2), " :",StringSubstr(s,14,4)) ;

return((datetime)(StringToTime(time) + GMTplus*3600))

}

Et où prend-il la valeur de l'int nomf ? Je ne l'ai pas trouvé.

Et puis il y a la fonction que j'ai essayé de découvrir sans succès. Peut-elle être la source du problème ?

bool CheckInvestingNews(int &pwr,datetime &mintime)
  {

   bool CheckNews=false; pwr=0; int maxPower=0;
   if(MidleNews || HighNews)
     {
      if(TimeCurrent()-LastUpd>=Upd){Print("Investing.com News Loading...");UpdateNews();LastUpd=TimeCurrent();Comment("");}
      WindowRedraw();
      //---Draw a line on the chart news--------------------------------------------
      if(DrawNewsLines)
        {
         for(int i=0;i<NomNews;i++)
           {
            string Name=StringSubstr("NS_"+TimeToStr(TimeNewsFunck(i),TIME_MINUTES)+"_"+NewsArr[1][i]+"_"+NewsArr[3][i],0,63);
            if(NewsArr[3][i]!="")if(ObjectFind(Name)==0)continue;
            if(OnlySymbolNews && StringFind(ValStr,NewsArr[1][i])<0)continue;
            if(TimeNewsFunck(i)<TimeCurrent() && Next)continue;

            color clrf=clrNONE;
            if(HighNews && StringFind(NewsArr[2][i],"High")>=0)clrf=HighColor;
            if(MidleNews && StringFind(NewsArr[2][i],"Moderate")>=0)clrf=MidleColor;
   //         if(LowNews && StringFind(NewsArr[2][i],"Low")>=0)clrf=LowColor;

            if(clrf==clrNONE)continue;

            if(NewsArr[3][i]!="")
              {
               ObjectCreate(0,Name,OBJ_VLINE,0,TimeNewsFunck(i),0);
               ObjectSet(Name,OBJPROP_COLOR,clrf);
               ObjectSet(Name,OBJPROP_STYLE,LineStyle);
               ObjectSetInteger(0,Name,OBJPROP_WIDTH,LineWidth);
               ObjectSetInteger(0,Name,OBJPROP_BACK,true);
              }
           }
        }
      //---------------event Processing------------------------------------
      int ii;
      for(ii=0;ii<NomNews;ii++)
        {
         int power=0;
         if(HighNews && StringFind(NewsArr[2][ii],"High")>=0){ power=3; MinBefore=HighIndentBefore; MinAfter=HighIndentAfter; }
         if(MidleNews && StringFind(NewsArr[2][ii],"Moderate")>=0){ power=2; MinBefore=MidleIndentBefore; MinAfter=MidleIndentAfter; }
 //        if(LowNews && StringFind(NewsArr[2][ii],"Low")>=0){ power=1; MinBefore=LowIndentBefore; MinAfter=LowIndentAfter; }
         if(NFPNews && StringFind(NewsArr[3][ii],"Nonfarm Payrolls")>=0){ power=4; MinBefore=NFPIndentBefore; MinAfter=NFPIndentAfter; }
         if(power==0)continue;

         if(TimeCurrent()+MinBefore*60>TimeNewsFunck(ii) && TimeCurrent()-MinAfter*60<TimeNewsFunck(ii) && (!OnlySymbolNews || (OnlySymbolNews && StringFind(ValStr,NewsArr[1][ii])>=0)))
           {
            if(power>maxPower){   maxPower=power; mintime=TimeNewsFunck(ii); }
              }else{
            CheckNews=false;
           }
        }
      if(maxPower>0){ CheckNews=true; oppoz=true; }
     }
   pwr=maxPower; 
   return(CheckNews);
  }
 
novichok2018:

Et puis il y a une fonction que je n'ai pas réussi à comprendre, malgré tous mes efforts. C'est peut-être là que réside le problème ?

Seul l'auteur pourra le découvrir lui-même. Vous feriez mieux d'envoyer le code de OnTick()

 
novichok2018:

Oui, à la 11ème minute, il a donné l'empreinte 1000.

Essayez de remplacer

while(!IsStopped())

avec cette ligne.

while(NomNews<300 && !IsStopped())
 
Ilya Prozumentov:

Excès((2*psd*usd)*((2*psd*usd)-C))/(C-1)) dans la formule.

Pour exponentialiser : ^0,5 n'est pas *0,5

S'il n'y a pas une seule transaction sur le symbole et le majik regardés, ou s'il n'y a pas un seul profit ou une seule perte, ou s'il n'y a qu'une seule paire (C=1), nous obtiendrons la division par 0.

Avant la formule elle-même, vous devez vérifier que psd et usd sont > 0, et C !=1

Les paires rentables sont calculées avec un bénéfice > 1, une perte < 1, avec un bénéfice=1 ne sont pas analysées, c'est-à-dire que 1 doit aussi être inclus quelque part dans tel ou tel groupe.

Dans votre fonction, il serait préférable de sélectionner d'abord les numéros de transaction correspondant au symbole et au numéro magique, puis de vérifier si leur numéro a changé, si c'est le cas - recalculer zn, sinon - retourner zn (dans ce cas, zn n'est pas remis à zéro et la vérification != 0 ne sera pas nécessaire lors de l'impression).

Le hibou cesse de fonctionner, car il s'appuie sur les variables ww et nn, et lorsque votre fonction fonctionne, elles changent et brisent l'algorithme du hibou.

Rien n'aurait été compilé s'il y avait eu une erreur de conception du code.

Je ne peux que vous remercier. C'est le seul endroit de Runet où ils m'ont aidé.

L'imprimante génère maintenant le message suivant "Stop_Ma_v_5.1 EURUSD,M15 : == Z-count equals = -nan(ind)" . Pouvez-vous m'indiquer ce que cela signifie et le code qui doit renvoyer le numéro ?

Code :

//+------------------------------------------------------------------+
//| Подсчёт z-вероятности. @axe44 Алексей Корольков                  |
//+------------------------------------------------------------------+
  
double Z()
  {
    zn=0;          // z-число
    psd=0;         // кол. положительных сделок
    usd=0;         // количество отрицательных сделок 
    www=0;         // боол переменная 
    nnn=0;         // боол переменная
    kolichestvo=0; // подсчёт закрытых ордеров открытых роботом
    C=0;          // C = количество чередований между отрицательными и положительными сделками
    index=OrdersHistoryTotal(); 
      if(OrdersHistoryTotal()>302) index=301; // берём не более 301 сделки
    //if(index<30) return(0);                 // берём не менее 30
    count=OrdersHistoryTotal();             // считаем от скольки 
    prom=count-index;                       // выделяем только последние сделки
    if (prom<0) prom=0;                     // исключаем ошибки
  
   for( i=prom;i<=count;i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {// далее магия
           pribul=OrderProfit(); 
           if (ww==0&&pribul>1){C++;www=1;nnn=0;}// подсчитываем смену тенденции
           if (nn==0&&pribul<1){C++;www=0;nnn=1;}// подсчитываем смену тенденции 
           if (pribul>1){psd++;}//прибыльные сделки
           if (pribul<1){usd++;}// убыточные сделки
           kolichestvo++;
           }
        }
     }
    /*
Величина Z = (A * (C — 0.5) — B)/   ((B*(B — C))/(C -1))^(1/2), где:
A = количество анализируемых сделок;
B = 2*количество прибыльных сделок * количество убыточных сделок;
C = количество чередований в выборке (чередованием считается каждая пара сделок, 
когда прибыльная сделка сменяет убыточную либо наоборот).
          */ 
            
            if(kolichestvo>30&&psd>0&&usd>0&&C!=1)
            zn=(index*(C-0.5)-2*psd*usd)  /  pow(((2*psd*usd*(2*psd*usd-C))/(C-1)),0.5);
      
     
     
   return(zn);
  }
Merci.
 
aleksandr bebishev:

Mql5 les gars, pouvez-vous m'aider à faire une demande pour fermer une position dans un compte de couverture ? Situation : nous avons ouvert une position BUY, nous devons la fermer avec une limite de vente. Question : Comment puis-je écrire correctement une demande, pour fermer exactement la position choisie, et ne pas ouvrir de nouveaux SELL verrouillant BUY ? Veuillez écrire un morceau de code avec des commentaires ! Merci d'avance !

Clôture par un ordre ouvert d'un autre ordre ouvert pour le même symbole mais en sens inverse.

boolOrderCloseBy(
intticket,// numéro de la commande à clôturer
intopposite,// numéro de l'ordre opposé
couleurarrow_color// couleur
) ;

Paramètres

billet

[Numéro d'ordre unique de l'ordre à clôturer.

en face de

[Un numéro de séquence unique de l'ordre opposé.

couleur de la flèche

[La couleur de la flèche de fermeture sur le graphique. Si ce paramètre est absent ou si sa valeur est CLR_NONE, la flèche n'apparaît pas dans le graphique.

Valeur retournée

Retourne vrai si la fonction a réussi ou faux s'il y a eu une erreur. Pour obtenir les informations sur les erreurs, appelez GetLastError().

Exemple :

si(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderCloseBy(order_id,opposite_id;)
retour(0);
}

P.S. Ce fil de discussion n'analyse que MQL4

 
Aliaksei Karalkou:

Je ne peux que vous remercier. C'est le seul endroit dans Runet, où ils ont aidé.

L'imprimante génère maintenant le message suivant : "Stop_Ma_v_5.1 EURUSD,M15 : == Z-Account Equals = -nan(ind)". Pouvez-vous m'indiquer ce que cela signifie et le code qui doit renvoyer le numéro ?

Code :

Merci.
Nan - NaN - Pas un nombre - Pas un nombre. Essayez de normaliser les nombres dans le calcul Z.
 
Aliaksei Karalkou:

La fermeture d'un ordre ouvert par un autre ordre ouvert pour le même instrument, mais dans la direction opposée.

boolOrderCloseBy(
intticket,// numéro de la commande à clôturer
intopposite,// numéro de l'ordre opposé
couleurarrow_color// couleur
) ;

Paramètres

billet

[Un numéro séquentiel unique de l'ordre en cours de clôture.

en face de

[Un numéro de séquence unique de l'ordre opposé.

couleur de la flèche

[La couleur de la flèche de fermeture sur le graphique. Si le paramètre est absent ou si sa valeur est CLR_NONE, la flèche n'apparaît pas dans le graphique.

Valeur retournée

Retourne vrai si la fonction a réussi ou faux s'il y a eu une erreur. Pour obtenir les informations sur les erreurs, appelez GetLastError().

Exemple :

si(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderCloseBy(order_id,opposite_id;)
retour(0);
}

P.S. Ce fil de discussion n'analyse que MQL4.

Non. Toutes les questions sur mql4 ainsi que sur mal5 sont traitées ici dans ce fil, car le but principal était d'aider non seulement avec les algorithmes et les codes, mais aussi de faciliter la migration de mql4 à mql5.