Questions des débutants MQL4 MT4 MetaTrader 4 - page 147

 

EA doit lire à partir d'un fichier un tableau de données sous la forme : date integer1 integer2 integer3 integer4, peut être de n'importe quel type de fichier, sauf bin.

файл скопировал в папку C:\Users\Михаил\AppData\Roaming\MetaQuotes\Tester\1B9501BF48F2354A4685940A72752910\Agent-127.0.0.1-3000\MQL5\Files\qqq.scv

il est supprimé de ce dossier.

Voici le code.


int File()
{
int P=0;

int filehandle=FileOpen("qqq.csv",FILE_READ|FILE_CSV,","); 
if(filehandle!=INVALID_HANDLE) 
     { 
     datetime d = FileReadDatetime(filehandle);
   int I=FileReadNumber(filehandle);
     FileClose(filehandle);
     Comment(d+" "+I);
     }
     else {Comment("qqq.csv");}
return P;

}

pouvez-vous spécifier le chemin du dossier à partir duquel le fichier ne sera pas supprimé par le testeur ? J'ai compris que tous les fichiers sont supprimés de ce dossier pendant les tests, mais lorsque le fichier est créé par programme, il est placé dans ce dossier.

 
Mikhail Simakov:

EA doit lire à partir d'un fichier un tableau de données sous la forme : date integer1 integer2 integer3 integer4, peut être de n'importe quel type de fichier, sauf bin.

файл скопировал в папку C:\Users\Михаил\AppData\Roaming\MetaQuotes\Tester\1B9501BF48F2354A4685940A72752910\Agent-127.0.0.1-3000\MQL5\Files\qqq.scv

il est supprimé de ce dossier.

Voici le code.

Peut-être faut-il préciser le chemin du dossier à partir duquel le fichier ne sera pas supprimé par le testeur ? J'ai compris que tous les fichiers sont supprimés de ce dossier lors des tests, mais lors de la création programmatique d'un fichier, celui-ci est placé dans ce dossier.

Peut-être devrions-nous utiliser FileCopy avec le drapeau FILE_COMMON. Le nouveau test fonctionne à partir de zéro, cela pourrait être un problème.

 
Konstantin Nikitin:

Vous devriez peut-être utiliser FileCopy avec l'option FILE_COMMON. Le nouveau test fonctionne à partir de zéro, cela peut être un problème.

cela fonctionne si vous copiez le fichier dans un dossier pendant le test ))) maintenant pour trouver le délimiteur

 

J'ai commencé à écrire un panneau de trading en MQL4 et voici le paradoxe. Tout semble correct, mais chaque fois que je change de TF, les lignes et le texte des autres indicateurs sont dessinés au-dessus de mon panneau.

Voici ce que j'ai vérifié : lors de la modification du TF, le paramètre OBJPROP_BACK = false. Cela signifie que tout va bien de ce côté.

Des idées sur ce sujet ?

P.S. En fait, je l'ai vérifié maintenant et le code source (que j'ai pris comme prototype) se comporte de la même manière. Après avoir modifié TF, il dessine des lignes normales au-dessus du panneau et des lignes créées par les indicateurs qui n'utilisent pas OOP.
https://www.mql5.com/ru/code/19220
Infopanel
Infopanel
  • www.mql5.com
Пример создания простого и быстрого меню с поддержкой нескольких языков. В примере выводится информация о цене, времени до следующего бара, балансе счета, количестве ордеров. Данный пример можно использовать в качестве шаблона для создания своих разработок. Минус данного метода при добавлении, удалении или редактировании объектов необходимо...
 
Goya7:

J'ai commencé à écrire un panneau de trading en MQL4 et voici le paradoxe. Tout semble correct, mais chaque fois que je change de TF, les lignes et le texte des autres indicateurs sont dessinés au-dessus de mon panneau.

Voici ce que j'ai vérifié : lors de la modification du TF, le paramètre OBJPROP_BACK = false. Donc tout va bien de ce côté.

Des idées sur ce sujet ?

P.S. En fait, je l'ai vérifié maintenant, le code source (que j'ai pris comme prototype) se comporte de la même façon. Après avoir modifié TF, il dessine des lignes normales au-dessus du panneau et des lignes créées par les indicateurs qui n'utilisent pas OOP.
https://www.mql5.com/ru/code/19220

Lorsque l'on change d'horizon temporel, les objets créés par d'autres programmes sont supprimés et de nouveaux sont créés immédiatement. Dans le panneau, les objets ne sont pas supprimés, ils sont donc "anciens". Sur le graphique, le principe "celui qui est le dernier est en haut" s'applique.

Vous devez supprimer les objets du panneau avec DeInit(), puis en créer de nouveaux.

 
Goya7:

J'ai commencé à écrire un panneau de trading en MQL4 et voici le paradoxe. Tout semble correct, mais chaque fois que je change de TF, les lignes et le texte des autres indicateurs sont dessinés au-dessus de mon panneau.

Voici ce que j'ai vérifié : lorsque le TF est modifié, le paramètre OBJPROP_BACK = false. Donc, tout va bien de ce côté.

Des idées sur ce sujet ?

P.S. En fait, je l'ai vérifié maintenant, le code source (que j'ai pris comme prototype) se comporte de la même façon. Après avoir modifié TF, il dessine des lignes normales au-dessus du panneau et des lignes créées par les indicateurs qui n'utilisent pas OOP.
https://www.mql5.com/ru/code/19220
Vitaly Muzichenko:

Lorsque l'on change d'horizon temporel, les objets créés par d'autres programmes sont supprimés et de nouveaux sont créés immédiatement. Dans le panneau, les objets ne sont pas supprimés, ils sont donc "anciens". Sur le graphique, le principe "celui qui est le dernier est en haut" s'applique.

Vous devez supprimer les objets du panneau à l'aide de la fonction DeInit(), puis en créer de nouveaux.

il est préférable d'attraper la création d'un nouvel objet dans les événements et de redessiner le panneau.

 
Vitaly Muzichenko:

Lorsque vous changez d'heure, les objets créés par d'autres programmes sont supprimés et de nouveaux sont créés immédiatement. Dans le panneau, les objets ne sont pas supprimés, ils sont donc "anciens". Le principe du "dernier en haut est le dernier en haut" s'applique dans le graphique.

Vous devez supprimer les objets du panneau à l'aide de la fonction DeInit(), puis en créer de nouveaux.

Merci pour ces réflexions. Dans DeInit(), ils sont supprimés, bien sûr. Lors du changement de TF, la procédure Init() est exécutée, mais quelque chose me dit que le panneau n'est pas redessiné. A savoir, j'ai expérimenté et installé un autre panneau, qui se trouve territorialement à la place du mien, puis je l'ai supprimé. Le mien a également disparu (avant le changement de TF) - il ne s'agit donc pas d'un redécoupage. ((
Pouvez-vous m'en dire un peu plus sur la façon de le redessiner ?


Taras Slobodyanik:

il est préférable d'attraper la création d'un nouvel objet dans les événements et de redessiner le panneau.

Dites-moi comment faire, je ne suis qu'un programmeur d'une demi-heure. :)
 
int OnInit()
{
ChartSetInteger(0,CHART_EVENT_OBJECT_CREATE,true);
}


void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
//событие создания нового объекта на чарте
if(id==CHARTEVENT_OBJECT_CREATE && StringFind(sparam, prefix, 0)<0)
   {
   //удаляем панель и рисуем заново

   ChartRedraw();
   }
}

ps. Je viens de me souvenir - vous devez également vérifier le nom de l'objet créé pour vous assurer qu'il ne s'agit pas de votre objet (préfixe le nom de vos objets).
ou au lieu du nom, comparez le type d'objet.

 
Citoyens, dites-moi si je le fais bien ! !! J'ai besoin que le conseiller expert négocie lorsque le prix n'est pas entré dans la zone 30 ou 70, et lorsqu'il l'est, il ne négocie pas ! Est-ce la bonne façon de procéder ?

RSI3 = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE, 1) ;
RSI4 = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE, 2) ;

bool RSItf = RSI3 > 30 && 30 > RSI4 ;
if(RSItf == true)
{
}
else
{
ordersend(_Symbol, OP_SELL, lot, Bid, Slippage, 0, 0, NULL, Magic, 0, clrRed) ;
}
bool RSItf = RSI3 > 70 && 70> RSI4 ;
if(RSItf == true)
{
}
else
{
ordersend(_Symbol, OP_BUY, lot, Ask, Slippage, 0, 0, NULL, Magic, 0, clrBlue) ;
}
 
ponochka:
Citoyens, dites-moi si je le fais bien ! !! J'ai besoin que le conseiller expert négocie lorsque le prix n'est pas entré dans la zone 30 ou 70, et lorsqu'il l'est, il ne négocie pas ! Est-ce la bonne façon de procéder ?

C'est quelque chose comme ça, pour autant que je comprenne, vous avez besoin

int RSIPeriod = 0, Slippage = 5, Magic = 1234;
double lot = 0.1;

void OnStart()
{
     double RSI3 = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE, 1),
            RSI4 = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE, 2);
     int ticket = 0;
     
     if(RSI3 <= 30 && RSI4 <= 30)
          ticket = OrderSend(_Symbol, OP_SELL, lot, Bid, Slippage, 0, 0, NULL, Magic, 0, clrRed);
     
     if(RSI3 >= 70 && RSI4 >= 70)
          ticket = OrderSend(_Symbol, OP_BUY, lot, Ask, Slippage, 0, 0, NULL, Magic, 0, clrBlue);
}
Raison: