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

 

Bon après-midi. Ma question peut sembler incroyablement stupide à beaucoup de gens, je m'en excuse, je suis encore un débutant dans ce domaine, je n'arrive pas à comprendre ce qui ne va pas.

J'ai créé un fichier texte dans MQL5\Files\date.txt et je ne peux pas l'ouvrir. L'erreur 5004 est écrite. Veuillez m'aider si vous le pouvez.

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

int OnInit()
  {
   return(0);
  }
  
void OnDeinit(const int reason)
  {
   return;
  }
  
void OnTick()
  {
   ResetLastError();
   int Handle=FileOpen("date.txt",FILE_CSV|FILE_READ|FILE_WRITE|FILE_COMMON,';');
   if(Handle==-1)   
     { 
     Print("Файл не открыт, ошибка: ", GetLastError());     
     }
   return;
  }
 
olegin038:

Bon après-midi. Ma question peut sembler incroyablement stupide à beaucoup de gens, je m'en excuse, je suis encore un débutant dans ce domaine, je n'arrive pas à comprendre ce qui ne va pas.

J'ai créé un fichier texte dans MQL5\Files\date.txt et je ne peux pas l'ouvrir. L'erreur 5004 est écrite. Aidez-nous si vous le pouvez.

Si votre fichier n'est pas dans le dossier partagé des terminaux clients MT5 (et dans votre cas, il l'est),

Vous devez supprimer le drapeau FILE_COMMON:

void OnTick()
  {
   ResetLastError();
   int Handle=FileOpen("date.txt",FILE_CSV|FILE_READ|FILE_WRITE,';');
   if(Handle==-1)   
     { 
     Print("Файл не открыт, ошибка: ", GetLastError());     
     }
   return;
  }
 
Fleder:

Si votre fichier n'est pas dans le dossier partagé des terminaux clients MT5 (et dans votre cas, il l'est),

L'indicateur FILE_COMMON doit être supprimé :

Merci pour l'aide, mais malheureusement ça n'a rien donné. J'ai essayé de nombreuses variantes avec les drapeaux. Aussi, écrit l'erreur 5004. Y a-t-il autre chose que je devrais essayer ?
 
olegin038:
Merci pour l'aide, mais malheureusement ça n'a rien donné. J'ai essayé beaucoup d'options avec les drapeaux. Aussi, écrit l'erreur 5004. Y a-t-il autre chose que je puisse essayer ?

Essayez de l'ouvrir simplement comme un fichier texte :

void OnTick()
  {
   ResetLastError();
   int Handle=FileOpen("date.txt",FILE_TXT|FILE_READ|FILE_WRITE);
   if(Handle==-1)   
     { 
     Print("Файл не открыт, ошибка: ", GetLastError());     
     }
   return;
  }
 
Fleder:

Essayez de l'ouvrir simplement comme un fichier texte :

Ça n'a pas marché non plus. Je n'ai jamais travaillé avec des fichiers avant. Vous n'avez pas besoin de prescrire quelque chose de plus ici ?
 
olegin038:
Ça n'a pas marché non plus. Je n'ai jamais travaillé avec des fichiers auparavant. Vous n'avez pas besoin de faire quelque chose de plus ici ?

Oui, vous devez être sûr de fermer le fichier:

void OnTick()
  {
   ResetLastError();
   int Handle=FileOpen("date.txt",FILE_CSV|FILE_READ|FILE_WRITE,';');
   if(Handle==-1)   
     { 
     Print("Файл не открыт, ошибка: ", GetLastError());     
     }
   FileClose(Handle);
   return;
  }
 
Fleder:

Oui, vous devez toujours fermer le fichier:

Merci beaucoup ! Ça a vraiment aidé. L'erreur n'est plus affichée.
 
Je vais partager les cours d'éminents auteurs de ma bibliothèque personnelle.
Yerin, Bazhenov, Strmzh, Lukyanov, Cheryomushkin, Herchik, Alex Million, etc.
La quasi-totalité des cours de ces auteurs.

 
Abramboss:
Partage de cours d'auteurs renommés issus de ma bibliothèque personnelle.
Yerin, Bazhenov, Strmzh, Lukyanov, Cheryomushkin, Herchik, Alex Million, etc.
La quasi-totalité des cours de ces auteurs.
Demandez.

Partager gratuitement ? Intéressé par Gerchik.
 

Bonjour à tous, j'ai besoin d'aide avec le fameux indicateur CrossArbitr. Le code n'est bien sûr pas le mien. Il avait besoin de certaines informations, qu'il ne fournit pas. Donc, dans l'ordre.

J'ai ajouté les variablesdouble n, m ;

"\nDifférence BID Synthétique et Réel =", n=(CalcBid-Bid),

"\, Différence ASK Synthétique et Réel =", m=(CalcAsk-Ask),

"\nTotal =" (m - n) <----

Il finit par jurer sur le moins dans cette parenthèse (on s'attend à un certain opératisme). Qui peut me dire ce que je fais de mal ?

//+------------------------------------------------------------------+
//|                                                  CrossArbitr.mq4 |
//|                                                        Scriptong |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Scriptong"
#property link      ""

#property indicator_chart_window
//---- input parameters
extern bool      ShowBid=false;
extern bool      ShowAsk=false;
extern color     BidColor = Lime;
extern color     AskColor = Yellow;
extern int       AlarmIfPointDifference = 10;
extern string    AlarmFile = "wait.wav"; 


bool Activate = False;
string FP, SP;
double Tick;
int WayForCross;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   string S = Symbol();
   if(StringFind(S, "USD", 0) != -1)
     {
      Comment("Индикатор работает только с кроссовыми парами (GBPJPY, EURJPY, EURGBP и т. д)!");
      return(0);
     }

   if(StringLen(S) != 6)
     {
      Comment("Индикатор работает только с валютными парами, у которых название состоит из шести символов!");
      return(0);
     }
     
   // Поиск первой валютной пары кросса
   FP = StringSubstr(S, 0, 3)+"USD";
   MarketInfo(FP, MODE_BID);
   if(GetLastError() > 0)
     {
      FP = "USD"+StringSubstr(S, 0, 3);
      MarketInfo(FP, MODE_BID);
      if(GetLastError() > 0)
        {
         Comment("Невозможно найти инструмент ", FP, " или ", StringSubstr(S, 0, 3)+"USD. Необходимо добавить его в Обзоре рынка и перезапустить индикатор.");
         return(0);
        } 
     } 
   // --------------------------------------  
     
   // "Создание" второй валютной пары кросса
   SP = "USD"+StringSubstr(S, 3, 3);
   MarketInfo(SP, MODE_BID);
   if(GetLastError() > 0)
     {
      SP = StringSubstr(S, 3, 3)+"USD";
      MarketInfo(SP, MODE_BID);
      if(GetLastError() > 0)
        {
         Comment("Невозможно найти инструмент ", SP, " или ", StringSubstr(S, 3, 3)+"USD. Необходимо добавить его в Обзоре рынка и перезапустить индикатор.");
         return(0);
        } 
     } 
   // --------------------------------------  

   // Определение пути синтеза кросса
   if (StringFind(FP, "USD") == 3 && StringFind(SP, "USD") == 0)
     WayForCross = 1;
   if (StringFind(FP, "USD") == 0 && StringFind(SP, "USD") == 0)
     WayForCross = 2;
   if (StringFind(FP, "USD") == 3 && StringFind(SP, "USD") == 3)
     WayForCross = 3;
   if (StringFind(FP, "USD") == 0 && StringFind(SP, "USD") == 3)
     WayForCross = 4;
   // -------------------------------

   Tick = MarketInfo(Symbol(), MODE_TICKSIZE);
   
   Activate = True;  
//----
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment("");
   if(ObjectFind("CrossBid") == 0)
     ObjectDelete("CrossBid");
   if(ObjectFind("CrossAsk") == 0)
     ObjectDelete("CrossAsk");
   
//----
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Приведение значений к точности одного тика                       |
//+------------------------------------------------------------------+
double ND(double A)
{
 return(NormalizeDouble(A, Digits));
}  

//+------------------------------------------------------------------+
//| Расчет значения синтетического бида                              |
//+------------------------------------------------------------------+
double CalcBidWayForCross()
{
 switch (WayForCross)
   {
    case 1: return(ND(MarketInfo(FP, MODE_BID)*MarketInfo(SP, MODE_BID)));
    case 2: return(ND(MarketInfo(SP, MODE_BID)/MarketInfo(FP, MODE_ASK)));
    case 3: return(ND(MarketInfo(FP, MODE_BID)/MarketInfo(SP, MODE_ASK)));
    case 4: return(1/(ND(MarketInfo(FP, MODE_ASK)*MarketInfo(SP, MODE_BID))));
   }
}

//+------------------------------------------------------------------+
//| Расчет значения синтетического аска                              |
//+------------------------------------------------------------------+
double CalcAskWayForCross()
{
 switch (WayForCross)
   {
    case 1: return(ND(MarketInfo(FP, MODE_ASK)*MarketInfo(SP, MODE_ASK)));
    case 2: return(ND(MarketInfo(SP, MODE_ASK)/MarketInfo(FP, MODE_BID)));
    case 3: return(ND(MarketInfo(FP, MODE_ASK)/MarketInfo(SP, MODE_BID)));
    case 4: return(1/(ND(MarketInfo(FP, MODE_BID)*MarketInfo(SP, MODE_ASK))));
   }
}

  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   if(!Activate)
    return(0);

   // Расчет синтетических Bid и Ask
   double CalcBid = CalcBidWayForCross();  
   RefreshRates();
   double CalcAsk = CalcAskWayForCross();  
   double n, m;
   // -------------------------------

   // Рисуем уровень синтетического Bid
   if (ShowBid)
     {
      if(ObjectFind("CrossBid") == -1)
        {
         ObjectCreate("CrossBid", OBJ_HLINE, 0, 0, CalcBid); 
         ObjectSet("CrossBid", OBJPROP_COLOR, BidColor);
         ObjectSet("CrossBid", OBJPROP_STYLE, STYLE_DOT);
        } 
       else
        if(!ObjectMove("CrossBid", 0, 1, CalcBid))
           Print("Ошибка перемещения №", GetLastError());
     }
   // ----------------------------------        

   // Рисуем уровень синтетического Ask
   if(ShowAsk)
    {
     if(ObjectFind("CrossAsk") == -1)
       {
        ObjectCreate("CrossAsk", OBJ_HLINE, 0, 0, CalcAsk); 
        ObjectSet("CrossAsk", OBJPROP_COLOR, AskColor);
        ObjectSet("CrossAsk", OBJPROP_STYLE, STYLE_DOT);
       } 
      else
       ObjectMove("CrossAsk", 0, 1, CalcAsk);
    }
   // ----------------------------------        

   Comment("Реальный BID = ", DoubleToStr(Bid, Digits), ", реальный ASK = ", DoubleToStr(Ask, Digits), 
           "\nСинтетик BID = ", DoubleToStr(CalcBid, Digits), ", синтетик ASK = ", DoubleToStr(CalcAsk, Digits),
           "\nРазница BID Синтетика и Реального =", n=(CalcBid-Bid),
           "\, Разница ASK Синтетика и Реального =", m=(CalcAsk-Ask),
           "\nИтог =" (m - n)
           );

   // Выдаем звуковой сигнал о превышении минимальной разности
   if(ND(MathAbs(CalcBid-Bid)) >= ND(AlarmIfPointDifference*Point))
     PlaySound(AlarmFile);
   // --------------------------------------------------------  
    
//----
   return(0);
  }
//+------------------------------------------------------------------+