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

 
Artyom Trishkin:

Je comprends que vous devez d'une manière ou d'une autre indiquer au conseiller expert le ticket de la position ouverte manuellement, que vous voulez qu'il parcoure.

  1. Vous devriez ajouter au suivi du conseiller expert les positions nouvellement ouvertes et si elles n'ont pas de magik, cela signifie qu'elles ont été ouvertes manuellement. Le conseiller expert marque l'ouverture de cette position sur le prix et la barre de son ouverture. Le nom de l'objet doit contenir un préfixe avec le nom commun de l'objet pour tous ces objets, par exemple "manual_" et le ticket de la position doit également être présent. En conséquence, le nom de l'objet peut être le suivant : "manual_12345678". Ici : manual_ - préfixe, 12345678 - ticket de position.
  2. Ajouter à l'Expert Advisor OnChartEvent() et surveiller l'événement du clic de souris sur l'objet. Analysez le nom de l'objet et s'il contient une sous-chaîne manual_, cherchez alors un numéro après manual_. Ce numéro est le ticket de la position sur laquelle vous avez cliqué.
  3. Ensuite, vous devez enregistrer le numéro trouvé afin qu'il ne soit pas perdu lorsque vous redémarrez l'EA/le terminal/l'ordinateur/le monde... Par exemple, dans les ressources ou les variables globales du terminal.
  4. Le Conseiller Expert doit lire cette ressource et prendre le ticket de la position à traîner à partir de celle-ci
  5. Dans le cycle de chalutage, vous devez récupérer le ticket de la position sélectionnée et rechercher ce numéro dans la liste des tickets sauvegardés. Si un tel ticket est trouvé, la position avec ce ticket doit être recherchée.
  6. Si le nombre de positions est modifié, il faut vérifier le ticket de la position fermée et le retrouver dans la liste sauvegardée. Si un tel ticket existe dans la liste, il doit être supprimé de cette liste - la position n'existe plus, et il n'y a rien à faire avec son ticket dans la liste des tickets de chalutage.
Quelque chose comme ça. La logique a été écrite sur une manivelle, donc ne pouvait pas prendre en compte quelque chose...


Merci pour la clarification, maintenant je comprends ce que je veux dire.

Pour moi, les leçons de mql recommandent de mettre 3 (EURUSD), mais la liquidité des monnaies est différente et leur vitesse aussi. Quels sont les chiffres qui peuvent être utilisés comme point de référence dans des conditions normales de marché pour les paires et les croisements de dollars ?

 
Est-il possible de remplir un tampon multidimensionnel avec CopyOpen, CopyHigh, CopyLow et CopyClose ? La description indique qu'il s'agit de copier dans un tableau dynamique - mais un tableau dynamique peut être multidimensionnel MQL5.
 
Alexandr Sokolov:
Est-il possible de remplir un tampon multidimensionnel à l'aide des fonctions CopyOpen, CopyHigh, CopyLow et CopyClose ? La description indique qu'il s'agit d'une copie dans un tableau dynamique - mais un tableau dynamique peut être multidimensionnel MQL5.

Utilisez un tableau unidimensionnel...

 
Alexandr Sokolov:
Est-il possible de remplir un tampon multidimensionnel en utilisant les fonctions CopyOpen, CopyHigh, CopyLow et CopyClose ? La description indique qu'il s'agit de copier dans un tableau dynamique - mais un tableau dynamique peut être multidimensionnel.

Si vous avez des difficultés à comprendre les structures, vous pouvez utiliser ArrayCopyRates

int  ArrayCopyRates( 
   void&     dest_array[][],    // массив, переданный по ссылке 
   string    symbol=NULL,       // инструмент 
   int       timeframe=0        // таймфрейм 
   );

Si vous le comprenez bien, il vaut mieux

CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 

Bonjour. J'ai essayé de construire un EA à partir de plusieurs autres, tout fonctionne correctement dans le testeur de stratégie (je l'ai vérifié en mode visualisation). J'ai essayé d'utiliser un compte de démonstration et de temps en temps j'ai eu le problème suivant, un ordre est ouvert et ensuite supprimé, et cela se produit pendant une heure, jusqu'à ce que l'heure change. Je pensais qu'il y a une condition pour entrer et supprimer l'ordre en même temps, mais la suppression est seulement dans le temps, j'ai supprimé ce bloc entier erreur n'a pas disparu. Si quelqu'un n'est pas difficile me dire où l'erreur.

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
      
   CurrHour = TimeHour(TimeCurrent());
   
   if (CloseByTime == true && DayOfWeek() == DayEnd && CurrHour >= CloseHour)
   {
      if (CountTrades() > 0 || CountStop() > 0) CloseTrades();
   
     
   }
     

   if (DayStart == DayOfWeek() && CurrHour == StartHour && ((!SetLimits && CountStop() == 0) || (SetLimits && CountLimits() == 0)) && CountTrades() == 0)
   {
      high = iHigh(Symbol(), 0, 1);
      low  = iLow(Symbol(), 0, 1);
      spread = MarketInfo(Symbol(),MODE_SPREAD);
      
      if ((high - low)/Point <= MaxPips && spread < Maxspread)
      {
         buy  = NormalizeDouble(high + Indent*Point, Digits);
         sell = NormalizeDouble(low - Indent*Point, Digits);
        
      
         if (FixedLot > 0)
            Lots = FixedLot;
         else Lots = GetLots();

         if (UseMartingale == true)
         {
            if (AccountBalance() < abalance) 
               Lots = getlotlast();
            else abalance = AccountBalance();
         }
         
         if (!SetLimits)
         {
            tp_sell = ND(sell-spread*Point - TPP*Point);
            tp_buy  = ND(buy + spread*Point + TPP*Point);
         
            sl_sell = ND(sell + SLP*Point+spread*Point);
            sl_buy  = ND(buy-SLP*Point-spread*Point);
            
          if (iClose(NULL,1440,1) < iMA(NULL,1440,PeriodMA,0,MODE_EMA,PRICE_CLOSE,1)) 
                  OrderSendReliable(Symbol(), OP_SELLSTOP, Lots, (sell-spread*Point), Slippage, sl_sell,  tp_sell, comment, Magic, 0, Red);
                                                                         
                                                                        else
                  OrderSendReliable(Symbol(), OP_BUYSTOP,  Lots, (buy+spread*Point),  Slippage, sl_buy, tp_buy,  comment, Magic, 0, Blue);
                                                                       
         
            
         }else
         {
            tp_sell = ND(sell - MathAbs(buy-sell)*TakeProfitK);
            tp_buy  = ND(buy +  MathAbs(buy-sell)*TakeProfitK);
         
            sl_sell = ND(buy + MathAbs(buy-sell)*StopLossK);
            sl_buy  = ND(sell - MathAbs(buy-sell)*StopLossK);
         
            OrderSendReliable(Symbol(), OP_SELLLIMIT, Lots, buy,  Slippage, sl_sell, tp_sell,  comment, Magic, 0, Red);
            OrderSendReliable(Symbol(), OP_BUYLIMIT,  Lots, sell, Slippage, sl_buy,  tp_buy, comment, Magic, 0, Blue);
         }
      }
   }
   return(0);
}
 
craft11111:

Bonjour. J'ai essayé de construire un EA à partir de plusieurs autres, tout fonctionne correctement dans le testeur de stratégie (je l'ai vérifié en mode visualisation). J'ai essayé d'utiliser un compte de démonstration et de temps en temps j'ai eu le problème suivant, un ordre est ouvert et ensuite supprimé, et cela se produit pendant une heure, jusqu'à ce que l'heure change. Je pensais qu'il y a une condition pour entrer et supprimer l'ordre en même temps, mais la suppression est seulement dans le temps, j'ai supprimé ce bloc entier erreur n'a pas disparu. Veuillez indiquer où se trouve l'erreur.

Il est nécessaire de faire un débordement dans une boucle à traversOrderSelect

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
OrderOpenPrice - Торговые функции - Справочник MQL4
OrderOpenPrice - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderOpenPrice - Торговые функции - Справочник MQL4
 

D'après ce que j'ai compris, lorsqu'une condition se produit, une transition vers la fonction de modification a lieu où seule la sélection de l'ordre est utilisée. Et j'ai aussi essayé d'enlever cette pièce tout la même erreur reste, et il n'est pas toujours visible quelle condition se produit.

void ModifyLoss()
{
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderType() == OP_BUY)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() < SL && (Ask - OrderOpenPrice())/Point>= BUP)
         {
            if (SL != ND(OrderStopLoss()))
               OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      } else
      if (OrderType() == OP_SELL)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() > SL && (OrderOpenPrice()-Bid)/Point >= BUP)
         {
            if (SL != ND(OrderStopLoss()))
                OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      }
   }
}
 
craft11111:

Bonjour. J'ai essayé de construire un EA à partir de plusieurs autres, tout fonctionne correctement dans le testeur de stratégie (je l'ai vérifié en mode visualisation). J'ai essayé d'utiliser un compte de démonstration et de temps en temps j'ai eu le problème suivant, un ordre est ouvert et ensuite supprimé, et cela se produit pendant une heure, jusqu'à ce que l'heure change. Je pensais qu'il y a une condition pour entrer et supprimer l'ordre en même temps, mais la suppression est seulement dans le temps, j'ai supprimé ce bloc entier erreur n'a pas disparu. Veuillez indiquer où se trouve l'erreur.

Vous devez écrire dans la fonction Print(__FUNCTION__) ou dans Print(tel ou tel bloc, tels ou tels paramètres). Observez l'ordre dans lequel les fonctions/blocs sont déclenchés. Le premier qui s'est déclenché et qui n'aurait pas dû, c'est là que la question se pose alors. S'appuyer sur le fait que "j'ai décrit ici des conditions plutôt incompatibles pour leur déclenchement simultané" n'est pas une bonne idée. Peut-être que l'unité n'aurait pas dû se déclencher, mais que des paramètres externes ont permis son déclenchement, peut-être que quelque chose à l'intérieur de l'unité n'aurait pas dû se déclencher.

 

OnChartEvent() ne fonctionne pas dans le testeur.

Veuillez montrer le bouton qui peut fonctionner dans le testeur. Par exemple, cliquez sur qui lèvera le drapeau commerce = vrai ; cliquez à nouveau ? commerce = faux ;

 
Ghabo:

OnChartEvent() ne fonctionne pas dans le testeur.

Veuillez montrer le bouton qui peut fonctionner dans le testeur. Par exemple, cliquez sur qui lèvera le drapeau commerce = vrai ; cliquez à nouveau ? commerce = faux ;

Dans OnTick(), contrôlez la pression du bouton. Vous pouvez faire par condition, si cela fonctionne dans le testeur - contrôle dans OnTick(), mais dans le monde réel ce contrôle ne sera pas exécuté et sera contrôlé dans OnChartEvent()