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

 
Maxim Kuznetsov:

quelque chose comme ça :

string level="Level"+IntegerToString(iTime(_Symbol,iBarShift(OrderCloseTime())); // ид.уровня - по времени бара (!! не по тикету)

if (ObjectFind(level)‌==-1) {

  // гор.вектора нет - видимо первый ордер из закрытых на баре

  // сделать горизонтальную линию‌

  ObjectCreate(0,level,OBJ_TREND,0,OrderCloseTime(),OrderClosePrice(),OrderCloseTime()+PeriodSeconds(_Period)*3,OrderClosePrice);

 // указывающую только вправо‌

  ObjectSetInteger(level,‌OBJPROP_RAY,1);

  ObjectSetInteger(level,OBJPROP_RAYLEFT,0);

‌ // украсить её как-то :-)

 ObjectSetInteger(level,OBJPROP_‌COLOR,....)

 ....‌

} else {

  // гор.уровень есть - значит были ордера закрытые на этом баре

  // по фантазии - обновить метки/корректировать уровень/etc‌

}‌

int TotalPos=-1;

void start()
 
{
 // остальной код

//--
  if(OrdersTotal()!=TotalPos) { // не мучаем каждый тик
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      History();

  
     }
  }}} TotalPos=OrdersTotal(); // запомним количество
//--
}
 
 
 
 void History() {
  string Ticket=(string)OrderTicket();
  color col=Red;
  if(OrderType()==0)col=Blue;
  datetime a=OrderOpenTime();
  double b=OrderOpenPrice();
  datetime c=OrderCloseTime();
  double d=OrderClosePrice();
  double prSep=OrderProfit()+OrderCommission()+OrderSwap();
  double prAll=0;
  int    cn=0;
  string hTicket;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;
      }
   }}}
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
     
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
     
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
 
   Ticket=cn>1?hTicket:Ticket;
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_ANCHOR,0);
   ObjectSetText(Ticket+"Profit",DoubleToString(prAll,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+Period()*60*2);
}

Utiliser un vecteur comme indicateur de niveau est une erreur. .... pas bon ....((

Et si on faisait bouger un cheval)

Dans la recherche par niveau, utilisez le principe de la sommation des bénéfices au niveau du prix dont l'enregistrement existe déjà...

Par exemple : ici, nous avons fait un essai et additionné les bénéfices avec un délai de 60 secondes.

 for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;

Ensuite, nous devons trouver un enregistrement :

Si le nombre de bénéfices accumulés au niveau > 1, alors c'est notre ordre - notre niveau, à partir de ce niveau nous tirons un rayon

 

Salutations.

Je prévois un EA avec des fonctions qui, à chaque tick, bouclent les ordres disponibles qu'il a créés et agissent en fonction de la situation.

Pouvez-vous me conseiller sur la façon de créer des variables distinctes pour chaque nouvelle commande et pour que des boucles supplémentaires puissent les utiliser ? (Je suppose que c'est quelque chose comme Peremennaja+ticket=12345 ;)

 
Andrey Sokolov:

Salutations.

Je prévois un EA avec des fonctions qui, à chaque tick, bouclent les ordres disponibles qu'il a créés et agissent en fonction de la situation.

Pouvez-vous me conseiller sur la façon de créer des variables distinctes pour chaque nouvelle commande et pour que des boucles supplémentaires puissent les utiliser ? (Je suppose que c'est quelque chose comme Peremennaja+ticket=12345 ;)

De préférence, un réseau ou même un réseau de structures.
 
Alexey Viktorov:
Mieux vaut un tableau ou même un tableau de structures.

Je suis désolé, pouvez-vous développer ?
 
Andrey Sokolov:

Excusez-moi, pourriez-vous entrer dans les détails ?


Ici et ici.

Une structure et un tableau de type structure sont créés. En dehors de tout le code.

struct trade_settings
  {
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
   uchar  slippage;     // значение допустимого проскальзывания
  };
//--- создали массив типа trade_settings
trade_settings my_set[];
// присвоить значение нулевому индексу массива в основном коде
my_set[0].take = что_то;
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
 

Bonjour.

Aidez-moi à trouver l'intersection de la ligne horizontale"ResisL" et de laligne de tendance par l'angle"TrndL".

TRA
 
Nikolay Fedyay:

Bonjour.

Aidez-moi à trouver l'intersection de la ligne horizontale"ResisL" et de laligne de tendance par l'angle"TrndL".

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(double left_bar, double left_price, double right_bar, double right_price, double bar_to_search) {
  return((right_bar==left_bar)?left_price:(right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
}
//+------------------------------------------------------------------+
Si vous connaissez deux points de coordonnées de la ligne de pente et les collez comme paramètres de cette fonction, la sortie vous donnera le prix du point sur la barre_à_rechercher. Il ne reste plus qu'à appeler cette fonction dans la boucle de la barre et à comparer la valeur qu'elle renvoie avec le prix de la ligne horizontale. Si sur la dernière barre du cycle, la valeur renvoyée par la fonction était inférieure ou égale au prix de la ligne horizontale, et que sur la barre actuelle du cycle, la valeur renvoyée par la fonction est supérieure au prix de la ligne, alors les coordonnées X du point d'intersection seront le temps correspondant à l'indice du cycle et les coordonnées Y seront le prix renvoyé par la fonction.
 
Artyom Trishkin:

Merci.

Et si vous voulez connaître le point de croisement lorsqu'il n'y a pas encore de barres, c'est-à-dire à une date ultérieure.

 
Nikolay Fedyay:

Merci.

Et si vous voulez connaître le point de croisement lorsqu'il n'y a pas encore de barres, c'est-à-dire à une date ultérieure.

Je n'ai pas encore essayé cette fonction - je dois l'expérimenter.

 
Artyom Trishkin:

Je n'ai pas encore essayé cette fonction - je dois l'expérimenter.

S'il vous plaît, si vous trouvez le temps d'expérimenter, partagez le résultat.

Parce que je n'ai aucune idée de ce qu'il faut expérimenter
.