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

 
Alexey Belyakov:

Bonjour !

J'ai du mal avec une question, dites-moi comment la résoudre.

L'idée est la suivante : je trace une ligne au niveau du maximum précédent de la bougie. Je veux que la ligne soit décalée en fonction du maximum précédent.

Qui m'empêche de modifier le prix de la ligne sur les ticks lorsque j'en ai besoin ?

//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   PRH;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи

  if (rs1 >= rt) // условие для построения уровней (если верхняя тень предыдущей свечи, больше, или равна телу этой же всечи, то...   
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
    Comment("ЦЕНА МАКС =======", PRH, "\n"); // комментарий пред. максимума
  }
}
//+------------------------------------------------------------------+
Dossiers :
 
Pouvez-vous m'expliquer comment MT5 peut connaître à partir de l'historique le prix et l'heure de la première transaction lors de l'ouverture d'une position et le prix et l'heure de la première transaction lors de la fermeture de cette position ? L'objectif est d'obtenir un tableau de points d'entrée à partir de l'historique, car il m'arrive d'utiliser l'équité lorsque je trade manuellement, et je veux donc comprendre si cela est efficace ou non. Je ne connais rien aux opérations de trading, j'utilise une classe, où ces fonctions n'ont pas été implémentées :(
 
Aleksei Beliakov:
Il existe 2 options
1. Supprimer un objet avant de le créer
2. Fixer un prix après la création de l'objet

Salut homonyme !)


void OnTick()
  {
//---
   double   o1 = iOpen(Symbol(),Period(),1);
   double   h1 = iHigh(Symbol(),Period(),1);
   double   l1 = iLow(Symbol(),Period(),1);
   double   c1 = iClose(Symbol(),Period(),1);
   double   c0 = iClose(Symbol(),Period(),0);
   double   rt = 0;
   double   rs1 = 0;
   double   rs2 = 0;
   
rt=MathAbs(c1-o1)/_Point; //размер тела свечи
rs1=MathAbs(h1-c1)/_Point;// размер верхней тени свечи
rs2=MathAbs(l1-c1)/_Point; // размер нижней тени свечи

ObjectDelete(0,"HL");

if ((rs1>=rt)&&(c1>o1)) //[для ростовых свечей] условие для построения уровней (если верхняя тень предыдущей свечи, больше, или равна телу этой же свечи, то...   
{
double PRH=iHigh(Symbol(),_Period,1); // то это будет максимум
ObjectCreate(0,"HL",OBJ_HLINE,0,_Period,PRH); // и строим по этому максимуму, горизонтальную линию
}

ObjectDelete(0,"lL");

if ((rs2>=rt)&&(c1<o1)) // [для падающих свечей]условие для построения уровней (если нижняя тень предыдущей свечи, больше, или равна телу этой же свечи, то...   
{
double PRL=iLow(Symbol(),_Period,1); // то это будет минимум
ObjectCreate(0,"lL",OBJ_HLINE,0,_Period,PRL); // и строим по этому минимум, горизонтальную линию
}
}

J'ai envisagé l'option 1, quelque chose de proche. Mais ce qui n'est pas correct se produit d'une manière ou d'une autre. Au début, les étapes se déroulent comme prévu, puis c'est la débandade.

 
Mihail Matkovskij:

Et qui vous empêche de modifier simplement le prix de la ligne sur les ticks lorsque vous en avez besoin ?


//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH;
  double   PRL;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1>= rt)&&(c1>o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
   if ((rs2>= rt)&&(c1<o1)) //условия для падающих свечей 
  {
    PRL = iLow(NULL, PERIOD_CURRENT, 1);
    hLine.Price(0, PRL);  
  }
  
  
}
//+------------------------------------------------------------------+

Eh bien, en quelque sorte, oui. Si vous ajoutez des conditions juste un peu, il y a un problème. Il dessine une ligne. Ce qu'il lui faut, c'est : s'il n'y a pas de nouveau haut/bas, il est sauvegardé.

 
Alexey Belyakov:


Eh bien, en quelque sorte, oui. Si vous ajoutez des conditions juste un peu, il y a un problème. Il dessine une ligne. Ce qu'il lui faut, c'est : s'il n'y a pas de nouveau haut/bas, il est sauvegardé.

Je ne sais pas, qui t'empêche d'ajouter une autre ligne pour Low... ?

//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine, lLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH;
  double   PRL;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1 >= rt) && (c1 > o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
  if ((rs2 >= rt) && (c1 < o1)) //условия для падающих свечей 
  {
    PRL = iLow(NULL, PERIOD_CURRENT, 1);
    lLine.Price(0, PRL);  
  }
}
//+------------------------------------------------------------------+

Vous pouvez ajouter toute une série de lignes ou d'autres objets et marquer chaque bas et haut avec. Quel est le problème... ?

 
Aleksey Vyazmikin:
Veuillez m'indiquer comment obtenir le prix et l'heure de la première transaction lors de l'ouverture d'une position et le prix et l'heure de la première transaction pour fermer cette position à partir de l'historique. Mon objectif est d'obtenir un tableau de points d'entrée à partir de l'historique, car il m'arrive d'utiliser l'équité lorsque je trade manuellement, et je veux donc savoir si cela est efficace ou non. Je ne connais rien aux opérations de trading, j'utilise une classe, où ces fonctions n'ont pas été implémentées :(

HistorySelectByPosition vous aidera à

Il existe alors plusieurs options :

  • Prenez des transactions, vérifiez la propriétéDEAL_ENTRY_IN ou DEAL_ENTRY_OUT pour entrer ou sortir du marché et prenez le prix et l'heure de cette transaction.
  • Prenez les commandes. Avec l'indice 0, il s'agit d'une entrée sur le marché, respectivement OrdersTotal()-1 d'une sortie du marché.
  • Le mieux est de prendre les deux. Le fait est que si la position est ouverte avec un slippage, le prix de la transaction ≠ le prix de l'ordre. En conséquence, prenez ce dont vous avez besoin.
Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 
Existe-t-il un moyen de déclarer un tas de tampons de manière compacte dans mt5 ?
 
Mihail Matkovskij:

Je ne sais pas, qui t'empêche d'ajouter une autre ligne pour Low... ?

Vous pouvez ajouter toute une série de lignes ou d'autres objets et marquer chaque bas et haut avec eux. Quel est le problème... ?

Oui ! Il fonctionne correctement ! Merci Mihail !


Et si vous avez percé la ligne de fond et que vous devez la supprimer après le perçage, comme :

if (c0<PRL)  
  {
  lLine.Delete(0,"lLine"); 
  }

N'est-ce pas ?

 
Alexey Belyakov:

Oui ! Il fonctionne comme il se doit ! Merci Mihail !


Et si la ligne de fond est poinçonnée et que vous devez la supprimer quand elle est poinçonnée, comme :

N'est-ce pas ?

Le programme n'utilise que deux lignes pour mettre en évidence les niveaux. Pourquoi le supprimer et le recréer si vous pouvez simplement le mettre à 0... ?

lLine.Price(0, 0.0);

La ligne ne sera pas visible sur le graphique... Et ensuite vous pouvez le montrer à nouveau :

lLine.Price(0, PRL);
 
Mihail Matkovskij:

Le programme n'utilise que deux lignes pour mettre en évidence les niveaux. Pourquoi supprimer et recréer alors que vous pouvez simplement le mettre à 0... ?

La ligne ne sera pas visible sur le graphique... Et ensuite vous pouvez le montrer à nouveau :

Comme ça ? Ou est-il nécessaire de déclarer quelque chose d'autre dans OnInit ?

if (c0<PRL)  
{
lLine.Price(0,0.0);
}