Questions des débutants MQL5 MT5 MetaTrader 5 - page 1441

 

Bonjour et bonne humeur !

En tenant compte des critiques constructives, j'ai modifié le code de la fonction de vérification :

bool Check_Trading()
  {
//--- проверка разрешения автоматической торговли на терминале
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Print("Ошибка разрешения автоматической торговли на терминале! ",GetLastError());
      return(false);
     }
//--- проверка разрешения автоматической торговли на стороне сервера
   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
     {
      Print("Ошибка разрешения автоматической торговли на стороне сервера! ",GetLastError());
      return(false);
     }
//--- проверка синхронизированности данных по текущему символу между терминалом и сервером
   if(!SymbolIsSynchronized(_Symbol))
     {
      Print("Ошибка синхронизированности данных по текущему символу! ",GetLastError());
      return(false);
     }
//--- проверка достаточности средств для торговли
   if(!CheckMoneyForTrade(_Symbol,GetLot(),ORDER_TYPE_SELL))
     {
      Print("Ошибка проверки достаточности средств для торговли! ",GetLastError());
      return(false);
     }
//--- проверки корректности объёма сделки
   string descript;
   if(!CheckVolumeValue(GetLot(),descript))
     {
      Print("Ошибка проверки корректности объёма сделки! ",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

Les fonctions CheckMoneyForTrade() et CheckVolumeValue() ne sont pas postées, car elles sont librement disponibles et reprises ici.

Est-ce que ce minimum sera suffisant pour éviter le problème avec l'Expert Advisor que j'ai eu avant-hier?

Cordialement, Vladimir.

 
MrBrooklin #:

Bonjour et bonne humeur à tous !

En tenant compte des critiques constructives, j'ai modifié le code de la fonction de vérification :

Les fonctions CheckMoneyForTrade() et CheckVolumeValue() ne sont pas postées, car elles sont librement disponibles et reprises ici.

Est-ce que ce minimum sera suffisant pour éviter le problème avec l'Expert Advisor que j'ai eu avant-hier?

Cordialement, Vladimir.

Oui, cela semble normal, mais il est préférable de vérifier le volume et la suffisance dans une seule fonction et de changer la logique sur la suffisance. Nous vérifions si le lot de marge est plus grand ou plus petit, mais nous ne le réduisons pas, si le lot demandé est plus petit, je calcule également le lot par rapport à la marge disponible, quel lot peut être défini, et je le compare avec le lot minimum, et s'il est plus petit, alors la transaction est définitivement terminée.

 

Bonjour à tous ! J'ai un indicateur Stochastique RSI. Le problème est qu'il fonctionne très lentement. D'après ce que j'ai compris, le principal "frein" crée cette section à cause de la grande période, qui est utilisée pour rechercher le minimum et le maximum dans les tableaux :

   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;   

Idéalement, la solution pourrait être que l'indicateur passe en revue toutes les barres de l'historique lors de la première exécution, et ne mette à jour que la dernière barre lors des suivantes. Mais je ne comprends pas comment faire. Est-il possible de faire cela ? Si oui, je vous serais reconnaissant de partager un lien ou un conseil sur la façon de le faire.

Voici le code complet de l'indicateur :

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{ // OnCalculate

ArraySetAsSeries(time,true);

if( t != time[0]) { // контроль бара
t = time[0];

ArrayInitialize(Buffer_Step1_RSI,0);
CopyBuffer(RSI_Handle,0,0,rates_total,Buffer_Step1_RSI);

double lRsi, lLowestRsi, lHighestRsi;
int ZZZ = rates_total - MathMax(MathMax(RsiLength,StochLength),MathMax(SmoothK,SmoothD)) - 1; 

for (int i = ZZZ; i >= 0; i-- ) { // Цикл расчета индикатора      
                  
   // ====== Calulate Stochastic of RSI ======   
   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;            
   
   
   // ====== Рассчитываем само значение предварительное (МА1) ======
   // Расчет для всех циклов, кроме первого (МА1)                          
   Step3_MA_Sum = Step3_MA_Sum - Buffer_Step2_Calculate[i + SmoothK + 1] + Buffer_Step2_Calculate[i+1];         
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА1)
   if (i == ZZZ) {
      Step3_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothK + 1; kk++) Step3_MA_Sum = Step3_MA_Sum + Buffer_Step2_Calculate[kk];
      }      
    Buffer_Step3_MA1[i] = Step3_MA_Sum / SmoothK;

          
   // ====== Расчитываем само значение индикатора (МА2) ======        
   // Расчет для всех циклов, кроме первого (МА2)
   Step4_MA_Sum = Step4_MA_Sum - Buffer_Step3_MA1[i + SmoothD+1] + Buffer_Step3_MA1[i+1];   
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА2)   
   if (i == ZZZ) {
      Step4_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothD + 1; kk++) Step4_MA_Sum = Step4_MA_Sum + Buffer_Step3_MA1[kk];
      }            
    Buffer_Step4_MA2_IndicatorData[i] = Step4_MA_Sum / SmoothD;
              
   FirstCycle = false;         
   } // Цикл расчета индикатора


} // контроль бара
return(rates_total);

 } // OnCalculate
 
Valeriy Yastremskiy #:

Je pense que c'est bien, mais il est préférable de mettre la vérification du volume et de la suffisance dans une seule fonction et de changer la logique pour la suffisance également. Nous vérifions si le lot de marge est supérieur ou inférieur, mais nous ne le réduisons pas. Si le lot demandé est inférieur, je calcule également le lot par rapport à la marge disponible, quel lot peut être fixé, et je le compare avec le lot minimum, et s'il est inférieur, la transaction est définitivement terminée.

Merci, Valery !

Cordialement, Vladimir.

 

Et voici les premiers résultats de la fonction :

2023.02.02 14:41:05.466 Experts automated trading is disabled because the account has been changed
2023.02.02 14:41:09.990 Experts automated trading is enabled
2023.02.02 14:42:43.410 Experts automated trading is disabled because the account has been changed
2023.02.02 14:42:52.690 Experts automated trading is enabled
2023.02.02 14:43:33.882 Experts automated trading is disabled because the account has been changed
2023.02.02 14:43:44.869 Experts automated trading is enabled

Il serait intéressant de savoir ce que c'est ? Pas dans le sens d'une traduction en russe, puisque je l'ai déjà traduite :

2023.02.02 14:41:05.466 Автоматическая торговля экспертов отключена, так как аккаунт был изменен

mais de savoir comment un compte peut être modifié ? Quelqu'un peut-il me dire ce qui se passe avec mon compte et ce qu'il faut faire dans de tels cas ?

Peut-être est-ce lié au fait que je suis passé temporairement d'un compte réel à un compte démo ?

Cordialement, Vladimir.

 
Bonjour, est-il possible d'implémenter ou existe-t-il une solution prête à l'emploi pour étirer les graphiques verticalement sans limites comme dans tradingview ?
 
MrBrooklin #:

Peut-être est-ce lié au fait que je suis passé temporairement d'un compte réel à un compte de démonstration ?

Oui
 
Sergey Gridnev #:
Oui

Merci, Sergey, maintenant je vais savoir.

Bien à vous, Vladimir.

 
L'Expert Advisor utilise un indicateur sur le TF spécifié, comment puis-je trouver le TF à partir de la poignée de l'indicateur ?
 
Aleksey Vyazmikin #:
L'Expert Advisor utilise un indicateur sur la TF spécifiée, comment puis-je trouver la TF à partir de la poignée de l'indicateur ?

Je ne comprends pas, le TF spécifié devrait être connu. Vous devez préciser la situation.

Raison: