Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 386

 
alexey1979621:
Merci, j'ai démonté votre code. Il y a effectivement une erreur à l'ouverture (mon œil est déjà trempé). J'ai mis l'EA modifié sur une démo où il y a déjà des positions ouvertes sur notre Meijic avec un profit total positif. Cependant, le poste n'a pas été fermé.

Je vois que dans le nouveau code (qui est en dessous dans le post) le paramètre par défaut passé à la fonction a changé :

int NumberOfPositions(string sy="", int op=-1, int mn=1114)

La version originale avait un Magik différent. J'ai corrigé la référence à cette fonction dans mon code. Regardez quels ordres Magik sont ouverts maintenant et définissez ce numéro Magik dans votre EA.

P.S. Et utiliser des encodages différents pour nommer les variables n'est pas un signe de bonne forme... Je veux dire :

extern string Сomment           = "KVAZ_EURUSD_GBPUSD";
 
Roger:


Regardez cette ligne

autre si (order_type = OP_SELL()

Et celui-là.

if (order_type = OP_BUY)
 
TarasBY:

Je vois que dans le nouveau code (qui est en dessous dans le post) le paramètre par défaut passé à la fonction a changé :

La version originale avait un Magik différent. J'ai corrigé la référence à cette fonction dans mon code. Regardez sous quel Magik les ordres sont ouverts maintenant et mettez ce numéro de Magik dans votre EA.


Non, la magik est correcte, celle pour EURAUDUSD est 1111 et celle pour EURUSD_GBPUSD est 1114 (une autre personne m'a aidé à la corriger). Les deux transactions ne se ferment pas. Je surveille les bénéfices totaux de l'EURUSD_GBPUSD, mais mon conseiller expert ne parvient pas à le clôturer. J'ai révisé votre version pour EURAUD_AUDUSD - 1111 pour EURUSD_GBPUSD - 1114, elle ne ferme toujours pas les transactions. La caractéristique du hibou est que vous ne pouvez pas le tester dans le testeur (parce que deux paires sont échangées) - seulement sur une démo.
 
alexey1979621:

Non, le mage est correct, celui pour EURAUD_AUDUSD est 1111 et celui pour EURUSD_GBPUSD est 1114 (une autre personne m'a aidé à le corriger). Les deux transactions ne se ferment pas. Je surveille les bénéfices totaux de l'EURUSD_GBPUSD, mais mon conseiller expert ne parvient pas à le clôturer. J'ai révisé votre version pour EURAUD_AUDUSD - 1111 pour EURUSD_GBPUSD - 1114, elle ne ferme toujours pas les transactions. La caractéristique du hibou est que vous ne pouvez pas le tester dans le testeur (parce que deux paires sont échangées) - seulement sur une démo.


Faisons quelques changements. Au lieu de

if(prof>=Profit)
   {
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;

       OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
         }
      }   
   }

mettre

Comment("Profit = ",prof);
if(prof>=Profit)
   {
Print("Profit is good!");
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;
       Print("OrderTicket - ",OrderTicket()," price - ",price);
       if(!OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE))Print ("Error - ",GetLastError());
         }
      }   
   }
Exécutez l'EA, mettez le profit à zéro et voyez ce qui est sorti et ce qui est dans les logs.
 
Roger:


Regardez cette ligne

autre si (order_type = OP_SELL()


merci !)
 
alexey1979621:

Non selon la majik tout est correct, celui pour EURAUD_AUDUSD est 1111 et celui pour EURUSD_GBPUSD est 1114 (une autre personne a aidé à le corriger). Les deux transactions ne se ferment pas. Je surveille les bénéfices totaux de l'EURUSD_GBPUSD, mais mon conseiller expert ne parvient pas à le clôturer. J'ai révisé votre version pour EURAUD_AUDUSD - 1111 pour EURUSD_GBPUSD - 1114, elle ne ferme toujours pas les transactions. La caractéristique du hibou est que je ne peux pas le tester dans le testeur (parce que deux paires sont échangées) - seulement sur une démo.

Tout d'abord, vous ne vous adressez pas correctement à l'indicateur. Cet indicateur comporte de nombreux paramètres externes :

extern string Symbol1.Name      = "EURUSD";// Название инструмента 1
extern bool   Symbol1.Reverse   = false;   // Является ли инструмент 1 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string Symbol2.Name      = "USDCHF";// Название инструмента 2
extern bool   Symbol2.Reverse   = false;   // Является ли инструмент 2 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string  ___MISC___       = " == Прочие настройки ==========";
extern bool   UseVolatility     = True ;   //отрисовка с учетом волатильности
extern bool   Triangle          = True ;   // Рисовать треугольник?
extern color  Triangle.Color    = DarkSalmon; // Цвет треугольника
extern double Alert.ChannelMore = EMPTY;   // Если ширина канала больше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern double Alert.ChannelLess = EMPTY;   // Если ширина канала меньше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern string  __VOL___         = " == Расчет объемов ====";
extern int VOL.Mode             = 3;       // Режим расчета объемов для торговли
                                           //   1 - по ценам открытия
                                           //   2 - по волатильности, а если невозможно - по ценам открытия
                                           //   3 - по волатильности (если возможно) и ценам открытия
extern int VOL.PeriodATR        = 144;            // Период усреднения ATR 
extern string  ___MA___         = " == Параметры МА ценовых линий ====";

extern int MA.Slow              = 21;      // Период медленной МА
extern int MA.Fast              = 8;       // Период быстрой МА
extern int MA.Method            = 2;       // Метод аппроксимации
                                           // - MODE_SMA=0 Простое скользящее среднее 
                                           // - MODE_EMA=1 Экспоненциальное скользящее среднее 
                                           // - MODE_SMMA=2 Сглаженное скользящее среднее 
                                           // - MODE_LWMA=3 Линейно-взвешенное скользящее среднее 
extern int MA.Price             = 6;       // Расчетная цена:
                                           // - PRICE_CLOSE=0 Цена закрытия 
                                           // - PRICE_OPEN=1 Цена открытия 
                                           // - PRICE_HIGH=2 Максимальная цена 
                                           // - PRICE_LOW=3 Минимальная цена 
                                           // - PRICE_MEDIAN=4 Средняя цена, (high+low)/2 
                                           // - PRICE_TYPICAL=5 Типичная цена, (high+low+close)/3 
                                           // - PRICE_WEIGHTED=6 Взвешенная цена закрытия, (high+low+close+close)/4 

et ils doivent être listés lorsque vous appelez l'indicateur. Si vous les omettez, les paramètres seront pris par défaut, et comme vous voulez l'utiliser pour différentes paires de devises, cette option ne convient pas. Et tout le reste peut être fait en tenant compte des changements de paramètres au début de l'EA :

extern string Symbol_1 = "EURAUD";
extern string Symbol_2 = "AUDUSD";
extern double Lot_1=0.01;
extern double Lot_2=0.01;
extern double Profit=10;
extern string EXP_Comment           = "KVAZ_";
extern int    Magic                 = 1111;

string gsa_SMB[2];
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  gsa_SMB[0] = Symbol_1;
  gsa_SMB[1] = Symbol_2;
  EXP_Comment = StringConcatenate (EXP_Comment, Symbol_1, "_", Symbol_2);
   return (0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
    int    li_N;
    double prof = 0., ld_Price = 0.;

    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        OrderSelect (i, SELECT_BY_POS);
        li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
        if (li_N < 0) continue;
        if (OrderMagicNumber() != Magic) continue;
        prof += OrderProfit();
        Print ("Profit=", prof);
    }
    if (prof >= Profit)
    {
        for (i = OrdersTotal() - 1; i >= 0; i--)
        {
            OrderSelect (i, SELECT_BY_POS);
            li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
            if (li_N < 0) continue;
            if (OrderMagicNumber() != Magic) continue;
            if (OrderType() == OP_BUY) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_BID);
            else if (OrderType() == OP_SELL) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_ASK);
            OrderClose (OrderTicket(), OrderLots(), ld_Price, 5);
        }
    }
    double lda_Price[2],
           Line_1 = iCustom (Symbol(), 0, "Ind_2 Line+1", 0, 1), // Первый инструмент
           Line_2 = iCustom (Symbol(), 0, "Ind_2 Line+1", 1, 1); // Второй инструмент

    if (NumberOfPositions (gsa_SMB[0], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[0], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[0], MODE_ASK);
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[0], OP_SELL, Lot_1, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[0], OP_BUY, Lot_1, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
    }
    if (NumberOfPositions (gsa_SMB[1], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[1], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[1], MODE_ASK);
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[1], OP_BUY, Lot_2, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[1], OP_SELL, Lot_2, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
    }
    return (0);
}
//+------------------------------------------------------------------+
int fGet_NumSymbol (string fs_Symbol, string ar_SMB[])
{
    for (int li_IND = 0; li_IND < 2; li_IND++)
    {if (fs_Symbol == ar_SMB[li_IND]) return (li_IND);}
    return (-1);
}
//+------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=1111)
{
  int i, k=OrdersTotal(), kp=0;
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
//+------------------------------------------------------------------+

Lisez l'appel d'indicateurs ici.

 
Roger:


Faisons quelques changements. Au lieu de

mettre

Exécutez l'EA, mettez le profit à zéro et voyez ce qui est sorti et ce qui est dans les logs.


Le résultat est laid. Avec vos modifications et un profit égal à 0, le Conseiller Expert a fermé toutes les positions sur Meijic 1111, 1112, 1113, 1114, 1115. Puis, après 5 secondes, de nouveaux ordres pour ces symboles Meijic ont été ouverts et après 10 secondes, ils ont tous été fermés et la même chose s'est produite à nouveau. Les postes n'ont pas été ouverts par paires, mais de manière chaotique.
 
alexey1979621:

Cela s'est avéré être effrayant. Avec vos modifications et un profit égal à 0, l'EA a fermé toutes les positions sur les Majic 1111, 1112, 1113, 1114, 1115 du tout. Puis, après 5 secondes, de nouveaux ordres pour ces symboles Meijic ont été ouverts et après 10 secondes, ils ont tous été fermés et la même chose s'est produite à nouveau. Les postes n'ont pas été ouverts par paires, mais de manière chaotique.


Ma question principale est la suivante : combien d'EAs avez-vous sur ce compte ?

Et vous aviez une condition - fermer tous les ordres sur le profit.

PS Vous avez vu le piège que vous avez avec cet EA - il continuera à ouvrir des ordres après la fermeture, ce qui conduira finalement à une perte. Vous devez donc mettre un drapeau interdisant le placement de nouveaux ordres jusqu'à ce que les conditions passent et se présentent à nouveau.

 
TarasBY:

Tout d'abord, vous ne vous adressez pas correctement à l'indicateur. Cet indicateur comporte de nombreux paramètres externes :

et ils doivent être listés lorsque vous appelez l'indicateur. Si vous les omettez, les paramètres seront pris par défaut, et comme vous voulez l'utiliser pour différentes paires de devises, cette option ne convient pas. Et tout le reste peut être fait en tenant compte des changements de paramètres au début de l'EA :

Vous pouvez lire comment appeler l'indicateur ici.

Merci. Je sais pour l'appel de l'indicateur. Mais les paramètres ajustables de l'indicateur devraient être listés lorsque nous les appliquons en test ou en opération. Comme cet EA ne peut pas être testé dans le testeur (parce que deux paires sont échangées), il est impossible de trouver ces paramètres sur l'historique. Votre dernière variante a déjà été implémentée dans une démo. Je vais voir comment les transactions se concluent. Une autre petite question, pour deux instruments, les transactions s'ouvrent soit à l'achat soit à la vente. Si nous avons besoin qu'une transaction s'ouvre à la vente pour un instrument et à l'achat pour un autre, que devons-nous faire ? J'ai cherché, sans succès ..... Encore une fois, merci beaucoup pour votre travail.
 
Roger:


Une question directrice - combien d'EAs avez-vous sur ce compte ?

Et vous aviez une condition - fermer tous les ordres sur le profit.

PS Vous avez vu le piège que vous avez avec cet EA - il continuera à ouvrir des ordres après la fermeture, ce qui conduira finalement à une perte. Vous devez donc mettre un drapeau interdisant le placement de nouveaux ordres jusqu'à ce que les conditions passent et se présentent à nouveau.


Les Expert Advisors ont fonctionné pour 5 (frères jumeaux - pour différentes paires), bien sûr avec différents Meijic.


Oui, nous avions la condition de profit pour fermer les ordres mais les ordres étaient liés à un certain EA, par exemple, avec MAJIC 1114. J'ai écrit à ce sujet dès le début et je croyais que le hibou ne voyait pas ses propres ordres à la clôture ; il s'avère qu'il voit tous les ordres et souhaite vivement les clôturer mais nous n'avons pas besoin de tous les ordres mais de certains spécifiques.

Si nous prenons la période H4, lorsque les lignes de l'indicateur sont supérieures à 0,1 et inférieures à -0,1, la condition est satisfaite et les transactions sont ouvertes, c'est-à-dire qu'il est possible de prendre plusieurs profits à un signal (bien qu'il existe une option pour fermer les transactions lorsque les lignes de l'indicateur convergent).