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

 
Igor Zakharov:

Corrigé... Mais il en reste un pour une raison quelconque.



Et je ne peux pas le reproduire dans le testeur. Je ne l'ai juste pas à la même date.


 

Pourquoi je ne peux pas connecter la bibliothèque dans mql4 à partir de c++ ? Voici mon code en Visual Studio 2012 C++. Fichier main. avec extension cpp (main.csr)

#define  MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

Ensuite j'ai créé un fichier avec l'extension def (main.def), qui a une liste de fonctions exportées, le code ressemble à ceci :

LIBRARY "dllmt42"
EXPORTS
add

Puis je l'ai importé dans le compilateur

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

Aucun problème après la compilation, mais lorsque vous laissez l'EA sur le graphique, je suis confus.

Unresolved import function call, find '_add' in 'dllmt42.dll'. Total Comander voit la fonction ainsi que le compilateur lui-même lorsqu'il fait glisser le fichier.

Qui peut aider ?

 
Alexandr Sokolov:

Corrigé... Mais il en reste un pour une raison quelconque.

Et je ne peux pas le reproduire dans le testeur. Je n'ai pas cette erreur à la même date.

Cette erreur montre que vous essayez de modifier une position/un ordre au prix auquel vous avez effectué la modification précédemment...

 

J'essaie de récupérer les données d'un indicateur dans MT5 à l'aide d'une fonction :

//************************************************************************************************/
double Envelopes(string symb, ENUM_TIMEFRAMES TF_1, int period, int method, int shift, int price,double Deviation(ENUM_TIMEFRAMES TF_2, int kanal), int buff, int index)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TF_1, period, method, shift, price, Deviation(TF_2, kanal), buff);
   if(handle<0)
   {
    Print("Failed to create handle ATR, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,0,index,1,buf)<0)
    {
     Print("Failed to copy data from the indicator ATR, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

Je reçois une erreur :


Veuillez indiquer comment corriger le code pour MT5

 
Vladimir Pastushak:

Cette erreur indique que vous essayez de modifier une position/un ordre au prix auquel vous l'avez déjà modifié...

Non, je l'ai déjà vérifié plusieurs fois, le problème résidait dans le caractère aléatoire de la sélection des paramètres d'entrée de MQL lors du test des produits, qui ne sont pas toujours compatibles - j'ai corrigé cela aussi. Mais maintenant je reçois un message disant qu'il n'y a pas d'ordre ouvert.


Bien que je les ai sur les mêmes paires et les mêmes délais.

 
Alexandr Sokolov:

Non, je l'ai déjà vérifié plusieurs fois. Le problème venait du caractère aléatoire de la sélection des paramètres d'entrée de MQL lors du test des produits, qui ne sont pas toujours compatibles - j'ai déjà corrigé cela aussi. Mais maintenant je reçois un message disant qu'il n'y a pas d'ordre ouvert.


Mais je les ai sur les mêmes paires et délais.

Je ne sais pas pourquoi mon EA ne fonctionne pas.

 
Vladimir Pastushak:

Découvrez pourquoi l'EA ne fonctionne pas.

Il peut ne pas fonctionner si les paramètres d'entrée sont choisis au hasard de sorte que les signaux ne se produisent tout simplement pas. Mais vous ne devez pas non plus le limiter

 

Qu'entend-on par"distance de gel des échanges" ? Reçu par

SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL)

MQL4

 

J'ai à nouveau l'erreur n°1 lors de la modification. Dans cette EA, les niveaux SL ou TP ne sont modifiés que dans quatre blocs


1 bloc

if(OrderMagicNumber() == id_number && OrderStopLoss() != NormalizeDouble(0,_Digits) && BMod(OrderTicket()) == true)
           {
            if(OrderType() == OP_BUY)
              {
               if(OrderComment() == "1" && Bid - OrderOpenPrice() >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && Bid - OrderOpenPrice() >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              }
            else
              {
               if(OrderComment() == "1" && OrderOpenPrice() - Ask >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && OrderOpenPrice() - Ask >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              };


2 blocs

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() - sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


3 blocs

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


4 blocs

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && OrderTakeProfit() == NormalizeDouble(0,_Digits))
              {
               if(MyOrders() == 1)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
                 }
               else if(OrderTakeProfit() == 0)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + (OrderComment() == "1" ? t1 : t2) : OrderOpenPrice() - (OrderComment() == "1" ? t1 : t2)),0,clrNONE);
                 };


J'ai déjà tout vérifié plusieurs fois mais je ne trouve aucune erreur.

 
Alexandr Sokolov:

J'ai à nouveau l'erreur n°1 lors de la modification. Dans cette EA, les niveaux SL ou TP ne sont modifiés que dans quatre blocs



OrderStopLoss() != NormalizeDouble(0,_Digits)


Ce n'est pas correct, même dans d'autres exemples

Si vous mettez un stop à 1.2356 et que sur un nouveau tick vous mettez à nouveau un stop à 1.2356, vous obtiendrez l'erreur 1.