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

 
Motzaart:

Après-midi.

Dans un Expert Advisor multi-devises, j'ai besoin de fermer un ordre en attente placé contre un profit lorsqu'une position ouverte se déclenche.

Actuellement, lorsque je ferme un ordre en suspens avec profit, tous les ordres en suspens pour toutes les devises sont fermés.

Comment modifier le code pour que seul l'ordre en attente lié à une paire de devises se ferme et que les autres restent ouverts ?

Que dois-je changer dans ce code ?

Mn dans ce code est un numéro magique d'un ordre en attente BUY_STOP ou SELL_STOP.

La logique est que lorsqu'une position ouverte est fermée au niveau du Take Profit, ce nombre magique est laissé et la commande pour le supprimer est censée être exécutée.

Cela fonctionne en testant chaque paire. Cependant, lorsque vous travaillez avec d'autres devises, tous les ordres placés sur toutes les paires sont supprimés.

Aidez-nous, s'il vous plaît, qui est capable de le faire.

Je comprends que personne ne devrait s'embêter avec ce problème, mais peut-être que quelqu'un a un modèle prêt à l'emploi ?

Je vous en serais très reconnaissant.

J'ai dû copier le code dans l'éditeur et faire de la stylisation normale (Ctrl+<) pour comprendre ce que vous avez fait.

Donc : j'ai commenté dans le code ce qui était en désordre ici :

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   operation=0; // неиспользуемая переменная
     { // лишняя скобка
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         OrderSelect(i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибки
         int  type   = OrderType();
         bool result = false;
         switch(type)
           { // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДА
            case OP_BUYSTOP   : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red);  //break;
            case OP_SELLSTOP  : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);   //break;
               // Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
               result = OrderDelete(OrderTicket());  //break;
           }
        }
     } // лишняя скобка
  }
//+------------------------------------------------------------------+

Par conséquent, votre code fait ceci, c'est-à-dire qu'il est équivalent à ce code :

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   bool result=false;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS)) {}
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, clrRed);
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, clrRed);
      result = OrderDelete(OrderTicket());
     }
  }
//+------------------------------------------------------------------+

Maintenant, demandez-vous : qu'est-ce que vous vouliez en retirer ?

 
Artyom Trishkin:

Pour comprendre ce que vous avez raté, j'ai dû copier le code dans l'éditeur et le styliser correctement (Ctrl+<).

Donc : commenté dans le code ce que vous avez raté là :

En conséquence, votre code fait ceci, c'est-à-dire qu'il est égal à ce code :

Maintenant, demandez-vous : qu'est-ce que vous vouliez en retirer ?

OK.

if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?

ici :

extern int mn;//магический номер открытой позиции
int Mn=10*mn; //магический номер отложенного ордера
int TimFr1=72,TimFr2=24,TimFr3=24;

int start()
 {if(Symbol()=="EURUSD")mn=1;if(Symbol()=="GBPUSD")mn=2;if(Symbol()=="USDCHF")mn=3;if(Symbol()=="USDJPY")mn=4;
  if(Symbol()=="USDCAD")mn=5;if(Symbol()=="EURGBP")mn=6;if(Symbol()=="AUDUSD")mn=7;if(Symbol()=="NZDUSD")mn=8;
  if(Symbol()=="EURJPY")mn=9;if(Symbol()=="EURCHF")mn=10;

Lorsqu'une position est ouverte (OP_BUY ou OP_SELL ), nous plaçons simultanément des ordres en attente (OP_SELLSTOP et OP_BUYSTOP), respectivement.

Lors de la fermeture d'une position ouverte avec prise de profit, l'ordre en attente correspondant doit être annulé. Cet algorithme est appliqué à toutes les paires de devises.

Les autres ordres en attente placés sur d'autres devises doivent rester.

 

Bonne journée à vous tous !

Il y a un indicateur MTF_RSI qui commute.

input ENUM_TIMEFRAMES      TimeFrame   =  0;

Pouvez-vous me dire s'il est possible de configurer le changement automatique de TimeFrame lors du changement de graphique ?

Quelque chose comme

if(TimeFrame=Period())
   TimeFrame="Следующий период";        
 
MakarFX:

Bonne journée à vous tous !

Il y a un indicateur MTF_RSI qui commute.

Pouvez-vous me dire s'il est possible de configurer le changement automatique de TimeFrame lors du changement de graphique ?

Quelque chose comme ça

Créez une structure ou un tableau multidimensionnel et laissez-le fonctionner sur la dimension souhaitée, si le critère est rempli, travaillez avec une colonne (chaque colonne est responsable de son propre délai), sinon avec une autre colonne, et c'est tout. Le programme lui-même a accès à toutes les échéances à la fois, donc ce que vous écrivez est possible, mais la mise en œuvre est très étendue et vous ne pouvez pas voir cette quantité de travail sur le forum, parce qu'elle est très étendue.

 
Seric29:

Créer une structure ou un tableau multidimensionnel

Merci.

 

Pourquoi ce code ne fonctionne-t-il pas ?

typedef double(*CenBr)(string,int,int);CenBr cn_br[4];//глобально
//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[0]=iOpen;

Il fonctionne avec des fonctions simples, mais il y a quelque chose de bizarre.

 
MakarFX:

Merci.

создаём массив double BarOCLH[1000][2][4]
далее сохраняем цену открытия 0 вого бара дневного таймфрейма
BarOCLH[0,0,0]=iOpen ();
далее сохраняем цену открытия 0 вого бара часового таймфрейма
BarOCLH[0,1,0]=iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
 
Seric29:
C'est à moi que tu parles ?
 
MakarFX:
C'est à moi que tu parles ?

Oui à vous. Vous devrez travailler tout au long du jeu avec des délais sur chaque détail dans chaque boucle et dans chaque fonction. C'est pourquoi je recommande d'utiliser des tableaux multidimensionnels.

 
Seric29:

Oui à vous. Vous devrez travailler tout au long du jeu avec des délais sur chaque détail dans chaque boucle et dans chaque fonction. C'est pourquoi je recommande d'utiliser des tableaux multidimensionnels.

Ce problème est résolu plus facilement :

   switch(period)
     {
      case PERIOD_M1  : TimeFrame = PERIOD_M5;  break;
      case PERIOD_M5  : TimeFrame = PERIOD_M15; break;
      case PERIOD_M15 : TimeFrame = PERIOD_M30; break;
      case PERIOD_M30 : TimeFrame = PERIOD_H1;  break;
      case PERIOD_H1  : TimeFrame = PERIOD_H4;  break;
      case PERIOD_H4  : TimeFrame = PERIOD_D1;  break;
      case PERIOD_D1  : TimeFrame = PERIOD_W1;  break;
      case PERIOD_W1  : TimeFrame = PERIOD_MN1; break;
      case PERIOD_MN1 : TimeFrame = PERIOD_MN1; break;
      default :        return(INIT_FAILED);
     }
Raison: