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

 
Dans mt5, lorsque vous testez sur des ticks réels, la commission compte-t-elle, ou seulement le spread ?
 

L'expert multi-devises dans la boucle demande les données par symbole. Il existe un tel fragment :

      int gtc1 = GetTickCount();
      res_copy_buf = CopyBuffer(handle, 0, 0, bars_calc, Buf_01); 
      int gtc2 = GetTickCount();

Tous les symboles passent normalement. Pendant le premier passage, le temps est d'environ 120 ms, car les tampons des indicateurs se remplissent. A partir du deuxième passage, le temps de calcul sur la barre courante est inférieur à 1 ms.

La particularité est qu'un courtier bien connu a le symbole EURRUR, pour lequel il n'y a pas de données ("Wait for update"). Le calcul est donc bloqué sur cette ligne pendant 51 secondes. Erreur 4806. 51 secondes, c'est inacceptable, même pour une (première) fois, et encore moins pour un cycle.

Question. Comment puis-je savoir rapidement qu'il n'y a pas de données pour un caractère donné ? Je le mémorisais ensuite et, lors des itérations suivantes, je le dépassais et continuais sans perdre le rythme.

 

Chers collègues, veuillez m'indiquer comment convertir un tableau de type double en chaîne de caractères. Je dois l'écrire dans un fichier. Voici un code de formation général.

void OnStart()
{

double ar[];               // Массив
ArrayResize(ar,2);         // Подготовка массива
int i, Size=ArraySize(ar); // стартовое количество элементов

ar[0]=1;                   // Установка значений 2-х элементов массива
ar[1]=2; 

ArrayResize(ar,3); // Увеличение размера массива
ar[2]=3;           // Установка значения новому элементу массива
ArrayResize(ar,4); // Увеличение размера массива
ar[3]=4;           // Установка значения новому элементу массива
ArrayResize(ar,5); // Увеличение размера массива
ar[4]=5;           // Установка значения новому элементу массива
ArrayResize(ar,6); // Увеличение размера массива
ar[5]=6;           // Установка значения новому элементу массив
ArrayResize(ar,7); // Увеличение размера массива
ar[6]=7;           // Установка значения новому элементу массив
Size=ArraySize(ar);// новое количество элементов
ArraySetAsSeries(ar,true); // Смена направления индексации


//--- запись в файл


SaveArrayToFile ("s_ar", ar);
return;
}


bool SaveArrayToFile(string FileName, string  &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_TXT);
   if(h==-1){Alert(" ошибка открытия файла в ф-ии "); return(false);} // Ошибка открытия файла
   
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
 

Informations tirées de l'article

Sauvegarde et chargement de tableaux à partir d'un fichier

Lors de la sauvegarde et du chargement d'un tableau à partir d'un fichier, nous devons tenir compte de la différence entre la première dimension de la taille du tableau et le nombre total de ses éléments. Lorsque vous enregistrez un tableau, vous devez d'abord écrire la taille du tableau (le nombre total d'éléments déterminé par ArraySize()) dans le fichier, puis le tableau entier :

bool SaveArrayToFile(string FileName,string &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_TXT|FILE_WRITE);
   if(h==-1) return(false); // Ошибка открытия файла
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
  }
 

Bonjour, je suis confronté au problème suivant.

J'ai deux EAs pour le même instrument avec des magies différentes respectivement. Je règle ma magie par CTrade et ouvre une position par CTrade aussi. Lorsque j'ai une position ouverte du premier EA, son magik est assigné au second EA (je l'ai vérifié après avoir ouvert une position, voir ci-dessous), donc la vérification des positions ouvertes ne voit pas mon magik et j'ouvre plusieurs positions dans une direction. Le compte est sur une démo, cela ne peut pas être détecté dans le testeur. Si la valeur du magik est sauvegardée dans la classe, peut-être devrait-elle être remise à zéro, mais je ne sais pas comment.

int OnInit()
  {    
  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
}
открываю позицию соответственно тоже через CTrade:
 if(SellCount()>0 || BuyCount()>0)
           {
            Print("Уже есть позиция на продажу !!!");
            return; // не добавлять к открытой позиции на покупку
           }
         SL=NormalizeDouble(latest_price.bid + STP*_Point,_Digits);
         TP=NormalizeDouble(latest_price.bid - TKP*_Point,_Digits);
         
         m_trade.Sell(lots1,_Symbol,0,SL,TP,"LaquerreOSC_MA_2.5.6.7 + 2");
         m_position.Select(_Symbol);
           {
            ulong myMagic=m_position.Magic();
            Print(" Открыта поза Селл с магиком № ",myMagic,", И спредом ",SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
           }
//+------------------------------------------------------------------+
int SellCount()//проверка рыночных ордеров на продажу
  {
   int count=0;
   for(int i=PositionsTotal()-1; i>=0;i--)
     {
      if(PositionSelect(_Symbol)==true)
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

 
Pavel Nikiforov:

Bonjour, je suis confronté au problème suivant.

J'ai deux EAs pour le même instrument avec des magies différentes respectivement. Je règle ma magie par CTrade et ouvre une position par CTrade aussi. Lorsque j'ai une position ouverte du premier EA, son magik est assigné au second EA (je l'ai vérifié après avoir ouvert une position, voir ci-dessous), donc la vérification des positions ouvertes ne voit pas mon magik et j'ouvre plusieurs positions dans une direction. Le compte est sur une démo, cela ne peut pas être détecté dans le testeur. Si la valeur du magik est sauvegardée dans la classe, il faut peut-être la remettre à zéro, mais je ne sais pas comment.

Veuillezcoller le code correctement, pas comme une feuille de texte.


En ce qui concerne le code : définissez les paramètres d'entrée de chaque EA avec sa propre magie. Disons que vous avez réglé le premier sur 10001, puis le second sur 10002.

 
Vladimir Karputov:

Veuillezinsérer le code correctement, pas comme une feuille de texte.


En ce qui concerne le code : définissez les paramètres d'entrée pour chaque EA avec sa propre magie. Supposons que vous fixiez le premier à 10001, puis le second à 10002.

Merci pour cette réponse si courte. Mais c'est le but, les magies sont différentes. Ainsi, j'ai déterminé que le second robot ouvre des positions avec le premier magicien. Je ne sais pas comment cela se passe et où il enregistre le numéro magique du premier EA mais j'aimerais le découvrir.

 
Pavel Nikiforov:

Merci pour cette réponse rapide. Mais c'est ça le truc, les magiciens sont différents. J'ai donc découvert que le deuxième robot ouvre des positions avec le numéro magique du premier. Je ne sais pas comment cela se passe et où il enregistre le premier numéro de magicien mais j'aimerais le découvrir.

Dans ce cas, il est préférable de définir le magik

  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
avant chaque ouverture de position /ordre au lieu de dans OnInit.
 
Alexey Viktorov:

Dans ce cas, il est préférable de spécifier un magik

avant chaque ouverture de position, et non dans OnInit.

Dans ce cas, ce n'est pas "mieux", c'est exactement ce dont vous avez besoin - c'est une classe enveloppante pour les fonctions commerciales standard. Il ne permet pas de stocker des magies multiples. C'est pourquoi il faut définir un magik à chaque fois avant et quand on veut ouvrir une position avec un nouveau magik.

En général, la séquence est la suivante :

  • les positions doivent être ouvertes avec magic 1 - nous définissons magic 1 et les positions suivantes auront magic 1,
  • il est nécessaire d'ouvrir des positions avec un Magicien 2 - nous mettons en place le Magicien 2 et toutes les positions suivantes auront un Magicien 2,
  • il est nécessaire d'ouvrir des positions avec la magie 3 - nous allons mettre en place la magie 3 et chaque prochaine position aura la magie 3,

etc...

 
Alexey Viktorov:

Dans ce cas, il est préférable de définir une magik

Avant chaque ouverture d'une position/ordre, et non dans OnInit.

A l'origine, c'était comme ça, ça n'aide pas. Mais dans les exemples, il est généralement dans OnInit et a donc été déplacé. Cela fait longtemps que je m'amuse avec ça, les hiboux sur le test semblent fonctionner sans problème, puis soudain j'ouvre le serveur et il y a 20 positions dans une direction. Le fait que la vérification des postes ouverts ne se fait pas par le biais des classes peut-il être considéré comme un problème ?

 
Pavel Nikiforov:

Merci pour cette réponse rapide. Mais c'est ça le truc, les magiciens sont différents. J'ai donc découvert que le deuxième robot ouvre des positions avec le numéro magique du premier. Je ne sais pas comment cela se passe et où il sauve le premier numéro magique d'EA mais je veux le découvrir.

Comme il n'y a pas de méthodeGetExpertMagicNumber dans la classe CTrade, veuillez imprimer ce code après l'opération de transaction:

Print("Expert name: ",__FILE__,", magic: ",IntegerToString(m_trade.RequestMagic());

De cette façon, vous pouvez vérifier si les deux EAs ont des magies différentes.

Raison: