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

 
MakarFX:

Essayez ceci, ça devrait marcher.

Non. Il continue à émettre une alerte. Voici le code complet et les indulgences. Peut-être que je fais quelque chose de mal.

//+------------------------------------------------------------------+
//|                                                          777.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Покупаем
#property indicator_label1  "Продаём"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Продаём
#property indicator_label2  "Покупаем"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
double      Buy[];            // Буфер для покупок
double      Sell[];           // Буфер для продаж


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0,Buy);
   SetIndexBuffer(1,Sell);  
   // Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
   SetIndexEmptyValue (0, 0);
   SetIndexEmptyValue (1, 0);
   //Определяем стиль отображения индикаторных линий - стрелка
   SetIndexStyle (0, DRAW_ARROW);
   SetIndexStyle (1, DRAW_ARROW); 
   // Установим значки "стрелки" для буферов
   SetIndexArrow(0, 234);  //Стрелка "вниз" для продаж
   SetIndexArrow(1, 233);  //Стрелка "вверх" для покупок
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel(0, "Продаём");
   SetIndexLabel(1, "Покупаем");
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits (Digits);
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ("Мой первый индикатор");
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
 

    int limit=rates_total-prev_calculated-2;
   if(limit<1) return(0);
   for(int i=limit;i>=0;i--)
     {
     
      // Снимем показания индикатора
     double in1b = iCustom(NULL,0,"in1",1,i+1); // индикатор 1 стрелка вверх
     double in1s = iCustom(NULL,0,"in1",0,i+1); // индикатор 1 стрелка вниз
      
     
     
     double in2b = iCustom(NULL,0,"in2",0,i+1); // индикатор 2 стрелка вверх
     double in2s = iCustom(NULL,0,"in2",1,i+1); // индикатор 2 стрелка вниз
    
    Comment("in1v = "+DoubleToString(in1b)+"\n" +"in1n = "+DoubleToString(in1s)+"\n"
    +"in2v = "+DoubleToString(in2b)+"\n" +"in2n = "+DoubleToString(in2s));
     
    if(in1b < 2147483647 && in2b < 2147483647) // индикатор стрелка вверх
        {
         Sell[i]=low[i];
       /*  if(show_alert!=time[i])
           {
            Alert(Symbol()+"BUY М "); show_alert=time[i];
           }*/
        }
   
      if(in1s < 2147483647 && in2s < 2147483647) // индикатор стрелка вниз
        {
         Buy[i]=high[i];
        /* if(show_alert!=time[i])
           {
            Alert(Symbol()+"SELL М "); show_alert=time[i];
           }*/
        }
     }
     
   
     
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Dossiers :
in1.ex4  13 kb
in2.ex4  28 kb
 
jarikn:
Les gars, aidez-moi à créer une alerte pour un indicateur. Je veux tester une combinaison de différents indicateurs, mais j'ai besoin d'une fonction d'alerte. Je veux que l'alerte ne soit affichée qu'une seule fois lorsque la flèche apparaît. Si vous n'êtes pas dur s'il vous plaît aidez-moi à écrire cette fonction, je ne peux pas le faire, les alertes pop up une minute entière ou tout le temps, même mt4 hangs.


Ajouter une variable

si ce n'est pas un signal, la variable devient fausse

si (signal et variable== faux) {

alerte ;

variable=true ;

}

 
Andrey Sokolov:


Ajouter une variable

la variable devient fausse si une nouvelle bougie apparaît

si (signal et variable== faux) {

alerte ;

variable=true ;

}

ne sera pas supérieur à 1 par bougie

Ok. Merci.

 
jarikn:

Ok. Merci.

Je l'ai changé là.

 
Une autre question. Pourquoi cet indicateur est une charge lourde sur le CPU ? J'ouvre 10 paires de devises et mt4 s'embourbe vraiment. En tant que courtier en devises, je ne devrais pas essayer de l'utiliser comme un indicateur mais comme un conseiller expert.
 
Pouvez-vous me dire comment rendre un objet sélectionnable par programme ? Je n'ai rien trouvé de tel dans l'aide.
 

Bonjour à tous, J'ai un indicateur qui montre l'angle de la tendance en degrés (non normalisé cependant). Tout va bien sur la carte. Elle peut se situer sur la courbe d'angle elle-même (bleu) ou sur sa courbe moyenne (vert) - Fig. 1. Lorsque l'on appelle l'indicateur dans le conseiller expert par le biais de double Custom = iCustom(Symbol(), window, "Angle", 0, 1), le programme produit des chiffres énormes - Figure 2. La fenêtre de dialogue - période du graphique, "Angle" - nom de l'indicateur, 0 - tampon zéro où la ligne bleue est calculée (je peux mettre 1 - tampon vert MA, mais le résultat sera similaire), 1 - décalage. Quel pourrait être le problème ?

Figure 1

Figure 2

 
Tango_X:
Pourriez-vous me dire comment rendre un objet sélectionnable ? Je n'ai rien trouvé de tel dans l'aide.

OBJPROP_SÉLECTIONNÉ

Sélection d'objets

mql5

mql4

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Свойства объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
J'ai écrit un EA et tout semble fonctionner. Mais le fait est que les ordres doivent être fermés au moment du franchissement des bordereaux. Pour être plus précis, seul le premier ordre est fermé, et peu importe dans quel sens il est passé, le journal génère alors l'erreur OrderClose error 4051. Quel est le problème ?
   //-----------------------------------------------------------
     if (CountSell() == 0 && mama1<mama2 && cci>verh && cci1>verh && cci<cci1)
      {
      tiket = OrderSend(Symbol(), OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0, Red);
      if (tiket>0)
         {
         SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
         TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
            if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на продажу");
         } else Print("Ошибка открытия ордера на продажу");
      }
    if (CountBuy() == 0 && mama1>mama2 && cci<nuz && cci1<nuz && cci>cci1)
      {
      tiket = OrderSend(Symbol(), OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
      if (tiket>0)
         {
         SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
         TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
           if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
           Print("Ошибка модификации ордера на покупку");
         } else Print("Ошибка открытия ордера на покупку");
      }  
      
      if(mama1>mama2 && CountSell()>0)
      {
         for(int i = OrdersTotal() -1;i>=0; i--)
         {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            {
            if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            OrderClose(OrderType(),OrderLots(),Ask,Slippage,Black);
            }
         }
         
      }
       if(mama1<mama2 && CountBuy()>0)
      {
         for(int i = OrdersTotal() -1;i>=0; i--)
         {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            {
            if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            OrderClose(OrderType(),OrderLots(),Bid,Slippage,Black);
            }
         }
         
      }
 
Tango_X:
Pouvez-vous me dire comment programmer la sélection d'un objet ? Je n'ai rien trouvé de tel dans l'aide.

Si vous utilisez la fonction standard de création d'objet, le paramètre par défaut est sélection = true. Par exemple, pour la ligne de tendance, la 4e ligne en partant du bas :

bool TrendCreate(const long            chart_ID = 0,      // ID графика
                 const string          name = "TrendLine", // имя линии
                 const int             sub_window = 0,    // номер подокна
                 datetime              time1 = 0,         // время первой точки
                 double                price1 = 0,        // цена первой точки
                 datetime              time2 = 0,         // время второй точки
                 double                price2 = 0,        // цена второй точки
                 const color           clr = clrRed,      // цвет линии
                 const ENUM_LINE_STYLE style = STYLE_SOLID, // стиль линии
                 const int             width = 4,         // толщина линии
                 const bool            back = false,      // на заднем плане
                 const bool            selection = true, // выделить для перемещений
                 const bool            ray_right = false, // продолжение линии вправо
                 const bool            hidden = true,     // скрыт в списке объектов
                 const long            z_order = 0)       // приоритет на нажатие мышью
Raison: