[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 285

 
rid >> :

La fonction https://www.mql5.com/ru/forum/107476/page21 peut peut-être vous aider.

Fonction isCloseLastPosByTake().
Cette fonction renvoie un drapeau pour fermer la dernière position sur la prise.

Flag up - True - TakeProfit a été déclenché.

Drapeau abaissé - Faux - le poste a été fermé pour une autre raison.


La fonction elle-même doit être placée à la toute fin du code. J'ajoute aussi à la condition de vendre :


Bonne journée, soirée ou matinée à vous tous.

J'ai tout fait comme je l'ai écrit. J'ai mis la fonction à la toute fin du code et je l'ai ajoutée à mes conditions de vente.

if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем

Je viens d'y penser et je l'ai ajouté pour l'achat. Les ordres seront fermés non seulement par BUY, mais aussi par SHELL.

J'ai inséré la fonction isCloseLasPosByTake() à la fin.

2;116;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;104:33;'(' - function definition unexpected
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:7;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:14;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:27;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:33;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:15;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:37;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:17;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:46;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;116:19;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;117:17;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;127:19;'sy' - variable not defined

Voici une telle tarte, ou comme on disait une peinture à l'huile du PFC Gotsman. aidez le mannequin à sortir.... ne sait rien.......

le code lui-même (c'est-à-dire juste le début)

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {//покупаем
     if( CheckOrders(OP_SELL))
      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;
        else
         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;
        else
         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
       }
    
    // Открытие позиции Sell продажа  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем
     if( CheckOrders(OP_BUY))
      {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;
        else
         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;
        else
         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
       }
       bool isCloseLastPosByTake(string sy=NULL, int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy==NULL) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}
//----
   return(0);
  }//+------------------------------------------------------------------+
 
igrok2008 >> :


J'ai spécifiquement écrit dans mon post. Que cette fonction isCloseLastPosByTake() - doit être placée à la toute fin du code, AVANT la FONCTION START!

Et où l'avez-vous mis ?

Et faites attention aux parenthèses dans les conditions d'achat et de vente. Il est clair qu'il en manque à cet endroit (vérifiez que le nombre de parenthèses ouvertes est égal au nombre de parenthèses fermées). Voici corrigé la vente :

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
 

Bonne journée ! !!


J'ai besoin d'aide ! Je m'excuse de ne pas être modeste.

Mais voici mon problème, j'ai un EA qui est basé sur un Martin, il place le premier ordre VENDRE ou ACHETER, comme je veux, mais je veux pouvoir choisir ACHETER ou VENDRE dans les propriétés de l'EA. C'est-à-dire que je mets par exemple BUY dans ses propriétés et il ouvre un ordre BUY uniquement, ou l'inverse.

J'ai bien peur de ne pas avoir encore appris à programmer en MQL4 .


Je joins le conseiller lui-même.


Merci d'avance à ceux qui répondront !

 
rid >> :

J'ai spécifiquement écrit dans mon post. Que cette fonction isCloseLastPosByTake() - doit être placée à la toute fin du code, AVANT la FONCTION START!

Et où l'avez-vous mis ?

Et faites attention aux parenthèses dans les conditions d'achat et de vente. Il est clair qu'il en manque à cet endroit (vérifiez que le nombre de parenthèses ouvertes est égal au nombre de parenthèses fermées). Voici la solution pour la vente :


Je l'ai mis après le départ fi, je comprends......

Je me suis trompé alors, merci pour le coup de pouce :-))

Si j'ai bien compris, il doit être placé après } à la fin du bloc de fonction expert de désinitialisation ? ?????? ou après return(0) ; à la toute fin de start- ???????.

Merci d'avance pour votre patience !!!!!!!!!

 
igrok2008 >> :

Je l'ai mis après la fonction de démarrage, donc je comprends......

Je me suis trompé, merci pour le coup de pouce :-))

Si j'ai bien compris, il faut le mettre après } à la fin du bloc de fonction expert de désinitialisation ? ?????? ou après return(0) ; à la toute fin du start- ???????.

Merci d'avance pour votre patience !!!!!!!!!

Il doit être placé à l'extérieur. Pas à l'intérieur d'une fonction, - mais comme une fonction indépendante distincte.

Comme ça :

int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {
     if( CheckOrders(OP_SELL))                                      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;        else         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;        else         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
                }
               }
              }
//-------------------Конец покупки -----------------------

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
    
//----
   return(0);
  }//+----------КОНЕЦ ФУНКЦИИ СТАРТ -------------------+


//ЖЖЖЖЖЖЖ Другие вызываемые пользовательские функции ЖЖЖЖЖЖ

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия           |
//|  последней позиции по тейку.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }} }}}}}

  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}


Je ne suis pas sûr que dans ces conditions, le conseiller expert fonctionnera. Parce que la toute première position ne pourra pas s'ouvrir...

La fonction isCloseLastPosByTake() doit être supprimée d'une condition d'achat ou de vente.

Alors le conseiller travaillera.

 
Rover82 >> :

Bonjour ! !!

Mais voici mon problème, j'ai un EA qui est basé sur un Martin, il place le premier ordre VENDRE ou ACHETER, comme je veux, mais je veux pouvoir choisir ACHETER ou VENDRE dans les propriétés de l'EA. C'est-à-dire que je mets par exemple BUY dans ses propriétés et il ouvre un ordre BUY uniquement, ou vice versa.

Je joins l'EA elle-même.

Merci d'avance à tous ceux qui répondent à cette question !


Il est peu probable que quelqu'un y réponde. L'EA est décompilé (hacké) et de tels fichiers ne sont pas les bienvenus ici...

 
WinExec("C:\\Program Files\\Opera\\opera.exe http://www.mail.ru",2);
Bonjour à tous, ceci lance le lien avec un navigateur spécifique, mais comment puis-je lancer le même lien par défaut ?
 
C'est-à-dire avec le navigateur par défaut
 
Dimoncheg >> :
C'est-à-dire le navigateur par défaut

ShellExecute, la commande "ouverte", en quelque sorte.

 

J'ai décidé d'étudier MQL 4 car tout ce que j'ai trouvé ne répond pas à mes attentes. En ce moment, j'étudie le site afin de comprendre le fonctionnement des professionnels et de l'améliorer pour mon idée. Il existe une fonction personnalisée (simple et petite, une page), dont le code est joint. En raison de mon amateurisme, je n'arrive pas à comprendre pendant deux jours - ce que cette fonction renvoie comme résultat, et quelle sous-condition est l'Else ?

Quelqu'un voudrait-il planter une étincelle de connaissance dans ma grisaille ?

Voici ce que je reçois :

L'objectif de la fonction est de déterminer s'il existe déjà un ordre passé pour cette paire et, si c'est le cas, de déterminer son type.

La fonction qui a appelé cette fonction attend la présence de l'un des ordres sélectionnés dans la procédure interrupteur, La fonction doit retourner "1", en présence de deux ordres - "2", et en l'absence d'ordres "-1".

Le cycle est lancé si l_pos_16= 0. Supposons que nous ayons un total de quatre ordres en attente sur plusieurs paires, dont deux sur la paire où l'EA fonctionne et qui ne sont pas les premiers.

Cependant, à la première itération de la boucle, la fonction if(OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) vérifier la position avec le numéro "0" dans la liste des ordres, mais il n'y a pas une telle position (parce que je comprends que la numérotation est à partir de la position 1) et puis il va passer à la prochaine. sinon avec une sortie complète de fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12) avec retour de la valeur Retour(-1).

Le sens de la fonction dans son ensemble est perdu, puisque le résultat devrait être le même indépendamment de la présence ou de l'absence d'ordres au symbole donné .

Cependant, lorsque l'EA fonctionne, cette fonction définit et vous donne ce que la fonction appelée attend d'elle, qui travaille ensuite en fonction du résultat obtenu .

Je ne comprends pas non plus ce que sinon Retour(-1) fonctionnera dans

if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {

Ou même dans if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

Le code de la fonction :

int fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12)

a_count_0= 0 ;

a_count_4 = 0 ;

a_count_8 = 0 ;

a_count_12 = 0 ;

gi_252 = 0 ;

for (int l_pos_16 = 0 ; l_pos_16 < OrdersTotal() ; l_pos_16++) {

if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

switch (OrderType()) case OP_BUY :

a_count_0++ ;

gi_252 = 1 ;

g_ticket_268 = OrderTicket() ;

gs_272 = OrderComment() ;

g_ord_open_price_256 = OrderOpenPrice() ;

g_ord_stoploss_288 = OrderStopLoss() ;

g_ord_takeprofit_296 = OrderTakeProfit() ;

pause ;

cas OP_SELL :

a_count_4++ ;

gi_252 = -1 ;

g_ticket_268 = OrderTicket() ;

gs_272 = OrderComment() ;

g_ord_open_price_256 = OrderOpenPrice() ;

g_ord_stoploss_288 = OrderStopLoss() ;

g_ord_takeprofit_296 = OrderTakeProfit() ;

pause ;

cas OP_BUYSTOP :

a_count_8++ ;

pause ;

cas OP_SELLSTOP :

a_count_12++ ;

}

}

} else return (-1) ;

}

retourner (a_count_0 + a_count_4 + a_count_8 + a_count_12) ;

/* l'exécution normale du f-i retournera un dans la variable dans l'un des cas suivants cas et "0" dans tous les autres, ce qui indique qu'il y a un de

des types de commande, et le numéro de cette commande est disponible pour la fonction appelante,

commentaire, prix d'ouverture, stop loss et take profit */

}