Erreurs, bugs, questions - page 1141

 
Alvin1976:

Bonjour à tous !

Un tel problème.

J'ai réussi à obtenir la valeur des indicateurs Bands et MA.

Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0];  

Puis imprimer : B_up_s = 1.264249475876921 M_av_s = 1.2595

J'essaie ensuite d'effectuer une opération d'accouplement B_up_s-M_av_s et j'obtiens 0,00000000 comme résultat.

Qu'est-ce qui est si étrange ?

1) Comment insérer le code.

2) Dans quel type de variable stockez-vous le résultat de l'opération ? Ou mieux encore, donnez-moi la partie du code où la sortie est produite.

 
MigVRN:

1) Comment insérer le code.

2) Dans quel type de variable stockez-vous le résultat de l'opération ? Mieux encore, donnez la partie du code où la sortie est produite.

Toutes les variables sont de type double.

Je ne comprends pas pourquoi Bands a de nombreux chiffres alors que MA n'a que 4 décimales. Il ne devrait pas y avoir de résultat nul du tout. C'est pourquoi l'algorithme ne fonctionne pas.

Tout était si simple dans MQL4. Vous avez maintenant besoin d'une vitesse d'optimisation plus élevée et d'une vérification multidevises. Maintenant, je dois tout transférer vers MQL5 (et merde)).

 double q=B_up_s-M_av_s;
 Print( B_up_s-M_av_s=", DoubleToString(q));
 
Alvin1976:

Toutes les variables sont de type double.

Il n'est pas clair pourquoi Bands a de nombreux chiffres et MA seulement 4 décimales. Et le résultat zéro ne devrait pas être là du tout. C'est la raison pour laquelle l'algorithme ne fonctionne pas.

Tout était si simple dans MQL4. Vous avez maintenant besoin d'une vitesse d'optimisation plus élevée et d'une vérification multidevises. Je dois tout transférer vers MQL5 (et merde)).

Cela devrait fonctionner. Vous trouverez ci-dessous un script basé sur votre code et son résultat :

void OnStart()
  {
  
  double Base[1];
  double Upper[1];
  double Lower[1];  
  
  int BP_var_s = 20;
  int BDev_var_s = 30;
  int MA_var_b = 10;
  
  double M_av_s = 0;
  double MAv[1];
  
  double B_med_s, B_up_s, B_low_s;
  
  
   //---Далее Ваш код
   int Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   int MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
   
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0]; 
   
    double q = B_up_s - M_av_s;
    
    Print("B_up_s-M_av_s=", DoubleToString(q));
   
  }

 
Alvin1976:

Toutes les variables sont de type double.

Il n'est pas clair pourquoi Bands a de nombreux chiffres et MA seulement 4 décimales. Le résultat de zéro ne devrait pas être là du tout. C'est pourquoi l'algorithme ne fonctionne pas.

Tout était si simple dans MQL4. Vous avez maintenant besoin d'une vitesse d'optimisation plus élevée et d'une vérification multidevises. Maintenant, je dois tout transférer vers MQL5 (et merde)).

Avant l'opération "soustraire" , imprimez les valeurs des variables pour voir ce qui se trouve dans les tampons :
Print("B_up_s= ",B_up_s,"; M_av_s=",M_av_s);
double q=B_up_s-M_av_s;
 
MigVRN:

Cela devrait fonctionner. Voici le script selon votre code et son résultat :

Oui, le script fonctionne.

Même l'EA avec cet exemple fonctionne.

Mon EA, par contre, s'entête à donner zéro. Cherchons une erreur ......

 

Bonjour à tous !

Question, comment faire pour qu'une valeur variable soit mise à jour à chaque tick dans une minute, et ensuite cette somme est écrite dans une valeur séparée, quand la minute suivante se ferme, la valeur de la somme est remplacée par la nouvelle ?

int t = TimeSeconds() ;

alors que (t !=0)

double b - la variable, qui est mise à jour pour chaque minute à chaque tick.

double b1 - valeur de la variable b au tick précédent.

double s - montant sur tous les ticks dans une minute.

double s1 - montant sur tous les ticks de la minute précédente.

b1=b ;

s=b1+b ;

si (t=0) s1=s ;

Comment faire pour que les données soient résumées à chaque tick et comment écrire tout cela correctement en général ?

 
Alvin1976:

Oui, le script fonctionne.

Même l'EA avec cet exemple fonctionne.

Mais mon conseiller expert donne zéro. Cherchons l'erreur ......

Voici ce qui a été détecté.

Si vous exécutez simplement l'EA, il fonctionne bien mais dans le testeur de stratégie, il produit des zéros au tout début. Mais à la ligne suivante, les zéros deviennent comme par magie des données indicatrices normales. Je ne comprends pas ce qui se passe. .....

Voici le code.

C'est ce que rapporte le testeur.

CJ 0 19:40:47.022 Core 1 EURUSD,M15 (Alpari-Ltd-Demo) : Génération des états des barres OHLC. Exécution OnTick au début de la barre seulement
IJ 0 19:40:47.022 Core 1 EURUSD,M15 : début du test de experts\tmp.ex5 du 2004.01.07 00:00 au 2004.02.02 00:00
LK 0 19:40:47.022 Core 1 2004.01.07 00:00:00 B_up_s=0.0 M_av_s=0.0
IM 0 19:40:47.022 Core 1 2004.01.07 00:00:00 sbl_top=true B_up_s=0.0 M_av_s=0.0 B_up_s-M_av_s=0.00000000
OQ 0 19:40:47.022 Core 1 2004.01.07 00:15:00 B_up_s=1.279208140152992 M_av_s=1.2718
OI 0 19:40:47.022 Core 1 2004.01.07 00:15:00 sel=true B_up_s=1.279208140152992 M_av_s=1.2718 B_up_s-M_av_s=0.00740814
CJ 0 19:40:47.022 Core 1 2004.01.07 00:30:00 B_up_s=1.279239651523307 M_av_s=1.2721
LN 0 19:40:47.022 Core 1 2004.01.07 00:45:00 B_up_s=1.279382808470771 M_av_s=1.2714
DS 0 19:40:47.022 Core 1 2004.01.07 01:00:00 B_up_s=1.279407737043184 M_av_s=1.2719
OD 0 19:40:47.022 Core 1 2004.01.07 01:15:00 B_up_s=1.279398917431485 M_av_s=1.2727
NI 0 19:40:47.022 Core 1 2004.01.07 01:30:00 B_up_s=1.279380702214008 M_av_s=1.2731
IM 0 19:40:47.022 Core 1 2004.01.07 01:45:00 B_up_s=1.279440208228416 M_av_s=1.2723
LE 0 19:40:47.022 Core 1 2004.01.07 02:00:00 B_up_s=1.279473515350084 M_av_s=1.272
DK 0 19:40:47.022 Core 1 2004.01.07 02:15:00 B_up_s=1.279515146590278 M_av_s=1.2715
FL 0 19:40:47.022 Core 1 2004.01.07 02:30:00 B_up_s=1.279601656250741 M_av_s=1.2709
IQ 0 19:40:47.022 Core 1 2004.01.07 02:45:00 B_up_s=1.279656914787522 M_av_s=1.2709
CE 0 19:40:47.022 Core 1 2004.01.07 03:00:00 B_up_s=1.279579626541548 M_av_s=1.2707

//#property link      "http://www.mql5.com"
//#property version   "1.00"

//+------------------------------------------------------------------+

 double
   BDev_var_b=2,       
   BDev_var_s=2,       
   B_up_s=0, 
   B_low_s=0,
   B_med_s=0,
   M_av_s=0, 
   Base[1],
   Upper[1],
   Lower[1],
   MAv[1],   
   Dist_c=0.0015,
   Dist_d=0.002;
   
  bool 
    selord=false,  
    baiord=false,
    New_Bar=false, 
    sbl_top=false,    
    sbl_bot=false, 
    bai=false,  
    sel=false;
   
   int
    Bands_handle,    
    MA_handle,   
    MA_var_s=1,   
    BP_var_s=50;  

    
//=============================================================================================================
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {


   Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   MA_handle=iMA(NULL,0,MA_var_s,0,MODE_SMA,PRICE_TYPICAL);
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0];
   
   
  Print(" B_up_s=",B_up_s, "   M_av_s=", M_av_s);  

   
   // установка флагов
  if (sbl_top==false && (B_up_s-M_av_s)<Dist_c) 
     {
       sbl_top=true;
       Print("sbl_top=true   ","  B_up_s=",B_up_s, "  M_av_s=", M_av_s, "  B_up_s-M_av_s=", DoubleToString(B_up_s-M_av_s));
     }
  if (sbl_top==true && (B_up_s-M_av_s)>Dist_d)
       {
       sbl_top=false;
       Print("sel=true  ","  B_up_s=",B_up_s, "  M_av_s=", M_av_s, "  B_up_s-M_av_s=", DoubleToString(B_up_s-M_av_s));
       }
    


    return;                                   
   }


 
Alvin1976:

Voici ce qui a été découvert.

1) Ne créez pas d'indicateurs sur chaque tick !

2) Vérifiez si l'indicateur a été créé ou non, avant d'accéder à ses valeurs.

3) Vérifier si les valeurs demandées sont copiées à partir de l'indicateur.

4) Supprimez toujours la partie calcul de l'indicateur après l'achèvement de l'expert, sinon vous risquez à un moment donné de manquer de RAM.

Le problème est dû au fait que vous avez essayé de copier les valeurs de l'indicateur qui n'a pas encore été créé. Faites-en une règle - vérifiez le résultat des fonctions que vous appelez.

Dossiers :
 

Veuillez indiquer où se situe l'erreur.

Ekpert fonctionne sur la démo, 3 paires. Voici le journal :

PUSD,M15)       AUDUSD Request executed: delete buy Ticket: #729600  Price = 0.94794 Lots = 0.1 StopLoss = 0 TakeProfit = 0 Comment = BuyTP(4)
LH      0       08:45:05.881    Serendipity5.0 (GBPUSD,M15)     AUDUSD Request executed: delete buy Ticket: #729598  Price = 0.94514 Lots = 0.42 StopLoss = 0 TakeProfit = 0 Comment = BuyTP(4)
KM      0       08:45:06.053    Serendipity5.0 (GBPUSD,M15)     Error: AUDUSD Action: delete buy : Requested Volume: 0.42, Requested StopLoss:0, Requested TakeProfit:0, Requested Price:0.94514 Error:10013
OE      0       08:45:06.053    Serendipity5.0 (GBPUSD,M15)     Sleep() for 1 second, retry
LO      0       08:45:07.145    Serendipity5.0 (GBPUSD,M15)     DeletePendings(): AUDUSD Error deleting pending order: Error Code: 4756
CQ      0       08:45:07.145    Serendipity5.0 (GBPUSD,M15)     SendOrder(); OrderCheck() Error = 10013 Sleep() for 1 second, retry
GP      0       08:45:08.237    Serendipity5.0 (GBPUSD,M15)     DeletePendings(): AUDUSD Error deleting pending order: Error Code: 4756
PL      0       08:45:08.237    Serendipity5.0 (GBPUSD,M15)     SendOrder(); OrderCheck() Error = 10013 Sleep() for 1 second, retry

Voici le code.

bool SendTradeRequest(string symb,ENUM_ORDER_TYPE type,ENUM_TRADE_REQUEST_ACTIONS tradeAction,double price, 
   double lot,double stopLoss,double takeProfit,long const magic, string comment,ulong ticket){
//--- prepare a request
   MqlTradeRequest request={0};
   //ZeroMemory(request);
   
   request.action=tradeAction;        
   request.magic=magic;              
   request.symbol=symb;                 
   request.volume=lot;                         
   request.sl=stopLoss;                             
   request.tp=takeProfit;                                 
   request.type=type;              
   request.price=price;
   request.comment=comment;
   if(tradeAction==TRADE_ACTION_MODIFY || tradeAction==TRADE_ACTION_REMOVE)request.order=ticket;
      
//--- send a trade request
   MqlTradeResult result={0};
   MqlTradeCheckResult checkresult={0};
   //ZeroMemory(result);
   //ZeroMemory(checkresult);
   bool isSuccessful;
   isSuccessful=OrderCheck(request,checkresult);
   if(checkresult.retcode!=0 && checkresult.retcode!=10009 && checkresult.retcode!=10008){
      Print("SendOrder(); OrderCheck() Error = ",checkresult.retcode, " Sleep() for 1 second, retry"); 
      Sleep(1000); return(0);                                      
      }       
      
   isSuccessful=OrderSend(request,result);        
   if( (result.retcode == 10009 || result.retcode == 10008 || result.retcode == 0) ){
      //--- write the server reply to log  
      //Print(__FUNCTION__,":",result.comment);
      Print(symb," "+result.comment+": "+ConvertTradeActionToString(request.action)+" ",(string)ConvertOrderTypeToString(request.type)," Ticket: #",(string)result.order," Price = ",(string)request.price," Lots = ",(string)request.volume,
         " stopLoss = ",(string)request.sl," takeProfit = ",(string)request.tp," Comment = ",(string)request.comment);
      
      if(tradeAction==TRADE_ACTION_PENDING)   
         arrow_cntr=CreateSignalArrow("Open "+(string)ConvertOrderTypeToString(request.type)+" "+request.comment+" Ticket "+(string)result.order+
            " Lots "+DoubleToString(request.volume,2)+" Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,request.price,216,clrDarkViolet,symb);
      
      if(tradeAction==TRADE_ACTION_MODIFY)   
         arrow_cntr=CreateSignalArrow("OrderModify "+request.comment+" Ticket "+(string)request.order+" Lots "+DoubleToString(request.volume,2)+
            " Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,request.price,251,clrSilver,symb); 
      
      if(tradeAction==TRADE_ACTION_REMOVE)
         arrow_cntr=CreateSignalArrow("OrderDelete "+request.comment+" Ticket "+(string)request.order+" Lots "+DoubleToString(request.volume,2)+
            " Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,Close(1,symb),158,Red,symb);      
      
      CheckErrorMessage("SendTradeRequest():");
      return(1);  
      }  

L'expert essaie d'exécuter OrderDelete(), il donne une erreur, SendTradeRequest() est dans une boucle while, ekspert fait donc des boucles. Peut-être que le prix a changé lorsque j'ai soumis la commande ? Ai-je besoin de RefreshRates() et comment l'utiliser correctement ? J'ai cherché dans le forum mais je n'ai trouvé aucun exemple...

Merci d'avance à tous

 
ierehon:

Bonjour à tous !

Question, comment faire en sorte que la valeur d'une variable soit mise à jour à chaque tick pendant une minute, puis que cette somme soit écrite dans une valeur séparée, à la fermeture de la minute suivante, la valeur de la somme est remplacée par la nouvelle ?

Lisez l'article ! Et d'autres aussi.

Comme exemple pour votre algorithme, j'ai esquissé un indicateur "compteur de tics". Si vous attribuez la valeur nécessaire à la variable b à chaque tic, vous obtiendrez ce que vous avez demandé.

Dossiers :
TickSum.mq5  4 kb