Questions des débutants MQL4 MT4 MetaTrader 4 - page 128

 
Anatoliy Ryzhakov:

L'ordre de vente se ferme au prix de l'offre

Je suis un peu confus ! Pointez du doigt l'endroit où se trouve le bug dans le code ! !!(le journal indique ORDER CLOSE ERROR 4108) Merci d'avance !

 

Bon après-midi Connaisseurs ! Avez-vous épuisé le jour le plus difficile de l'année ? On peut passer aux choses sérieuses ? ;=).

J'ai dessiné un EA, tout est bon, mais MQL tel que je le comprends fonctionne dans l'environnement MT4. Je veux qu'il fonctionne avec un logiciel qui travaille directement avec l'échange. Existe-t-il d'autres compilateurs MQL ? Si non, quel langage dois-je utiliser pour réécrire MQL?

 
STARIJ:

Vous avez fait une pause et vous devez continuer.

Je n'ai pas de pause. Quelle est la raison pour laquelle l'EA peut ne pas "voir" ses ordres ? J'ai des temps de serveur et d'ordinateur différents, peut-être à cause de cela ?

 
Anatoliy Ryzhakov: Je n'ai pas de pause. Quelle est la raison pour laquelle l'EA ne peut pas "voir" ses ordres ? L'heure de mon serveur et celle de mon ordinateur sont différentes.

Le temps de chacun est différent. Commencez sans vous précipiter de loin. 1. Vérifiez ce que la fonction OrdersTotal vous donne. Sa valeur dépend des paramètres de l'historique : Aujourd'hui, 3 derniers jours, semaine dernière, ... Ajustez-la comme vous le souhaitez. 2. Créez ensuite un cycle et éditez tous les ordres avec Alerte. C'est ce qu'on appelle le débogage - c'est une partie très importante du travail d'un programmeur. Plus important que d'écrire du code.

 
Veuillez m'indiquer comment corriger l'erreur de quantité de lots invalides pour la fonction FreeMarginCheck dans l'EA, lorsque la valeur du volume (lot) est accidentellement négative. Pour avoir un message sur le mauvais lot, sans message d'erreur, dans le testeur .

 
STARIJ:

Le temps de chacun est différent. Commencez sans vous précipiter de loin. 1. Vérifiez ce que la fonction OrdersTotal vous donne. Sa valeur dépend des paramètres de l'historique : Aujourd'hui, 3 derniers jours, semaine dernière, ... Ajustez-la comme vous le souhaitez. 2. Créez ensuite un cycle et sortez tous les ordres en utilisant Alert. C'est ce qu'on appelle le débogage - c'est une partie très importante du travail d'un programmeur. Plus important que d'écrire du code.

Merci !

 

Pouvez-vous me dire comment écrire dans le code de l'Expert Advisor pour ouvrir 3 trades en même temps avec la possibilité de régler le SL ?

Voici ma condition

if(MA_1>MA_2)
ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);

On m'a conseillé d'utiliser la fonction (OrdersTotal()), mais elle ne convient pas dans mon cas. Je l'ai comme ceci

void OnTick()
  {
//---
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   int ticket=0;
   if(OrdersTotal()<=3)
     {
      if(MA_1>MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
      if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
     }
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Il compile bien, sans erreur, mais il n'est pas adapté à mon cas.

J'ai trouvé le code suivant

#property copyright "Влад Сергеев для mmgp" 
#property version   "1.00" 
#property strict 
#property script_show_inputs 

input int      orders = 4;      //всего ордеров в серии 
input bool     buy = true;      //флаг разрешающий/запрещающий покупки 
input bool     sell = false;    //флаг разрешающий/запрещающий продажи 
input int      magic = 100500;  //уникальный номер для ордеров, открываемых этим скриптом 
input double   lot = 0.01;      //объем каждого ордера серии 
input int      tp = 100;        //тейк профит, в пунктах 
input int      sl = 100;        //стоп лосс, в пунктах 
input int      slip = 2;        //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=0;  // для чего эта переменная
   int ticket=0;
   if(buy) 
     {
      while(i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего
        {
         RefreshRates(); // если убрать эту функцию коду хуже не становится
         ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //здесь понятно
         if(ticket!=-1) // эта строчка тоже не понятна
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  // функция для выбора ордера это логично но тоже не понятно как ей пользоваться
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue);
               // эту строчку тоже хотел бы чтобы объяснили
              }
           }
         i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера
        }
     }
   i=0;
   if(sell) // прошлая запись была для покупак эта для продаж 
     {
      while(i<orders) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed);
         if(ticket!=-1) 
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed);
              }
           }
         i++;
        }
     }
  }  
//+------------------------------------------------------------------+

On peut peut-être l'utiliser, mais je ne comprends pas la signification des chaînes. Ce code peut-il être utilisé lorsqu'il est réécrit pour s'adapter à ma situation ?

 
Seric29:

Pouvez-vous me dire comment écrire dans le code de l'Expert Advisor pour ouvrir 3 trades en même temps avec la possibilité de régler le SL ?

Voici ma condition

On m'a conseillé d'utiliser la fonction (OrdersTotal()), mais elle ne convient pas dans mon cas. Je l'ai comme ceci

Il compile bien, sans erreur, mais il n'est pas adapté à mon cas.

J'ai trouvé le code suivant

On peut peut-être l'utiliser, mais je ne comprends pas la signification des chaînes. Puis-je utiliser ce code si je le réécris pour l'adapter à ma situation ?

Essayez de cette façon

pos=0 ; //compteur d'ordre

for(int i=OrdersTotal()-1;i>=0;i--) //lire les ordres du marché

{

if ( !OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;//sélectionner parmi les ordres du marché

{

if (OrderSymbol()!=Symbol()&&OrderMagicNumber()!=Magic) continue;//sélectionne uniquement les ordres EA (s'il y a Magic et qu'il négocie sur une paire de devises)

pos++ ; //si nous avons sélectionné, alors augmentez pos de un

}

}

 if(MA_1>MA_2&&pos<3)
 OrderSend(_Symbol(),OP_BUY,Lots,Ask,0,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,clrGreen);
 if(MA_1<MA_2&&pos<3)
 OrderSend(_Symbol(),OP_SELL,Lots,Bid,0,Bid+SL*Point,Bid-TP*Point,NULL,Magic,0,clrRed);

 
Un forum très intéressant. Beaucoup de choses instructives).
 
Seric29:

Pouvez-vous me dire comment écrire dans le code de l'EA pour ouvrir 3 trades en même temps avec la possibilité de régler le SL ?

if(MA_1>MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-(i==0?SL_1:i==1?SL_2:SL_3)*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+(i==0?SL_1:i==1?SL_2:SL_3)*Point,Ask-TP*Point,NULL,0,0,clrRed);