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

 
fxsaber:

ArraySort est facile à écrire pour les structures simples.

Écrit par
#include <TypeToBytes.mqh>

template <typename T>
void Swap( T &Value1, T &Value2 )
{
  const T Tmp = Value1;
  
  Value1 = Value2;
  Value2 = Tmp;
}

// Сортировка массива любого простого типа
template <typename T>
bool MyArraySort( T &Array[] )
{
  if (!ArraySort(Array))
  {
    const int Size = ArraySize(Array);
    
    for (int i = 0; i < Size - 1; i++)
    {
      const T Tmp = Array[i];
      
      for (int j = i + 1; j < Size; j++)
        if (_R(Tmp) == Array[j]) // TypeToBytes.mqh
        {
          Swap(Array[i + 1], Array[j]);
          
          i++;
        }
    }      
  }
  
  return(true);
}

// Возвращает количество различных элементов массива, которых не меньше Repeat
template <typename T>
int Strange( const T &InArray[], const int Repeat = 2 )
{
  int Res = 0;  
  
  T Array[];
  
  const int Size = ArraySize(InArray);
  
  if ((ArrayCopy(Array, InArray) == Size) && MyArraySort(Array))
  {    
    int Tmp = 1;
    
    for (int i = 1; i < Size; i++, Tmp++)
      if (_R(Array[i - 1]) != Array[i]) // TypeToBytes.mqh
      {
        if (Tmp >= Repeat)
          Res++;
        
        Tmp = 0;
      }
      
    if (Tmp >= Repeat)    
      Res++;
  }

  return(Res);
}

void OnStart()
{
  int Array[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};  
  const int Size = ArraySize(Array);

  MqlTick Ticks[], NullTick = {0};
  ArrayResize(Ticks, Size);        
  
  for (int i = 0; i < Size; i++)
  {
    Ticks[i] = NullTick;
    
    Ticks[i].time = Array[i];
  }
  
  for (int i = 1; i <= 4; i++)
  {
    Print(Strange(Array, i));
    
    Print(Strange(Ticks, i));
  }
}
 

Bonsoir, veuillez m'aider avec l'EA que j'ai écrit, si on peut l'appeler ainsi.

En général, l'EA fait ce que j'attendais d'elle. Mais il y a un étrange problème.

1) Dans certains cas, au lieu d'ordres en attente, il ouvre d'abord une position de vente avec 0,02 lot. Bien que selon le script, il ne devrait pas. (erreur quelque part). Je ne comprends pas à quoi cela est lié, parfois tout se passe bien et parfois le premier ouvre un Sell.

Veuillez m'aider à résoudre cette erreur. Je veux donner à mon EA quelques commentaires généraux sur mes écrits et mes erreurs. J'ai réalisé mon premier Conseiller Expert, puissiez-vous le juger sévèrement.

//+------------------------------------------------------------------+
//|                                               ALEXANDROS_001.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
input double perv_Lot=0.01;
input double  shag1=40;
input double  profit=20;
input double  koredor=10;
input int    magic=907;
input int    slipage=10;
int ret,ORD=0,ic;
//
void OnTick()
  {

//-----ищет цену последнего открытого ордера---------------------------------------------------------------
  double OpenPrice = 0.0;
  
     int    orders=OrdersTotal();    
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol())continue;
        if(  OrderType()==OP_SELL||OrderType()==OP_BUY)
        
           OpenPrice = OrderOpenPrice();
                    break;
        }

//------если нет открытых позиций открывает два отложника------------------------------------------------------
  int kolpos=0;
   for (int pos=0; pos<OrdersTotal(); pos++)
  {
   OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
   if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)
   kolpos++;  
    }
    if (kolpos==0)
    {
    OrderSend(Symbol(),OP_BUYSTOP,perv_Lot,Ask+shag1*Point,slipage,0,0,NULL,magic,0,clrGreen);
    OrderSend(Symbol(),OP_SELLSTOP,perv_Lot,Bid-shag1*Point,slipage,0,0,NULL,magic,0,clrRed);
    }
//--------------определяет если есть открытые позиции---------------------------------------------------------------------  
    int order=0;
   for (int pos=0; pos<OrdersTotal(); pos++)
  {
   OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
   if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)
  
   if(OrderType()==OP_SELL||OrderType()==OP_BUY) //если это продажи или покупки считаем что сделки открыты
  
   order++;
    }
    if(order>0)
//--------------- находит и удаляет отложки.---------------------------------------------------------------
    {
    
    for(ic=OrdersTotal()-1;ic>=0;ic--)
                   {
                  if(OrderSelect(ic,SELECT_BY_POS,MODE_TRADES)==false) continue;
                  if (OrderSymbol()==Symbol())
                  {                  
                  if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)//если это отложки то удаляем
                  {
                  ret=OrderDelete(OrderTicket());//удалил отложки
                  }
                  }}
//--------------ищем последний открытый ордер-------------------------------------    
                  for(ic=OrdersTotal()-1;ic>=0;ic--)
                   {
                  if(OrderSelect(ic,SELECT_BY_POS,MODE_TRADES)==false) continue;
                  if (OrderSymbol()==Symbol()&&OrderMagicNumber()==magic&&OrderOpenPrice()==OpenPrice)
                  
                  
                  {
                
                  double minus=NormalizeDouble( Ask-OpenPrice,Digits);
                  double plus= NormalizeDouble(Ask-OpenPrice,Digits);
                  if(Digits==3)
                   {
                    minus=minus*100;
                    plus=plus*100;
                   }
                   if(Digits==5)
                   {
                   minus=minus*10000;
                   plus=plus*10000;
                   }
  //-------------если последний открытый ордер SELL--------------------------------------------------------------                
                  if (OrderType()==OP_SELL)
                  {
                  if(plus<=-profit)
                  {
                  for(int i=OrdersTotal()-1;i>=0;i--)
                  {
                  OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
                  if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,slipage,0);
                  if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,slipage,0);
                  }
                  }
//---------------а если цена пошла в минус---------------------------------------------------------------------------                
                 if( minus>=koredor)
                  {
                  double Lot=OrderLots();
                  OrderSend(Symbol(),OP_BUY,Lot*2,Ask,slipage,0,0,NULL,magic,0,clrRed);// открываем BUY с удвоеным лотом
                  }
                  }
                  double minusbuy=NormalizeDouble(Ask-OpenPrice,Digits);
                  double plusbuy=NormalizeDouble(Ask-OpenPrice,Digits);
                   if(Digits==3)
                   {
                    minusbuy=minusbuy*100;
                    plusbuy=plusbuy*100;
                   }
                   if(Digits==5)
                   {
                   minusbuy=minusbuy*10000;
                   plusbuy=plusbuy*10000;
                   }
//-----------------если последний ордер Buy--------------------------------------------------------------------------------
                  if (OrderType()==OP_BUY)
                  {
                   if(plusbuy>=profit)//-------если цена пошла в плюс-------------------------------------------------------
                  {
                  for(int i=OrdersTotal()-1;i>=0;i--)
                  {
                  OrderSelect(i,SELECT_BY_POS,MODE_TRADES);//---находим и закрываем все открытые ордера--------------------
                  if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,slipage,0);
                  if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,slipage,0);
                  }
                  }
//-----------------------------а если цена пошла в минус------------------------------------------------------------------                
                  if(minusbuy<=-koredor)
                  {
                  Comment("Ордеров -",order);
                  double Lot=OrderLots();
                  OrderSend(Symbol(),OP_SELL,Lot*2,Bid,slipage,0,0,NULL,magic,0,clrRed);//открываем ордер SELL с удвоенным лотом----
                  }
                  }
   }}}}

 
Alexandr Nevadovschi:

Bonsoir, veuillez m'aider avec l'EA que j'ai écrit, si on peut l'appeler ainsi.

En général, l'EA fait ce que j'attendais d'elle. Mais il y a un étrange problème.

1) Dans certains cas, au lieu d'ordres en attente, il ouvre d'abord une position de vente avec 0,02 lot. Bien que selon le script, il ne devrait pas. (erreur quelque part). Je ne comprends pas à quoi cela est lié, parfois tout se passe bien et parfois le premier ouvre un Sell.

Veuillez m'aider à résoudre cette erreur. Je veux donner à mon EA quelques commentaires généraux sur mes écrits et mes erreurs. C'est ma première EA, alors jugez sévèrement.


Utilisez d'abord le styler (Ctrl +,) et corrigez tous les commentaires que le compilateur, il y en a beaucoup.

Puis, ceci :

                  double minusbuy=NormalizeDouble(Ask-OpenPrice,Digits);
                  double plusbuy=NormalizeDouble(Ask-OpenPrice,Digits);
                   if(Digits==3)
                   {
                    minusbuy=minusbuy*100;
                    plusbuy=plusbuy*100;
                   }
                   if(Digits==5)
                   {
                   minusbuy=minusbuy*10000;
                   plusbuy=plusbuy*10000;
                   }

se transforme facilement et sans effort en ceci :

                  double minusbuy=NormalizeDouble((Ask-OpenPrice)/_Point,Digits);
                  double plusbuy=minusbuy;

De même et au-dessus du code.

Cependant, il n'est pas clair pourquoi la demande compte à la fois pour les achats et les ventes, et les calculs sont effectués AVANT que le type d'ordre soit défini. Et OpenPrice est en quelque sorte trop éloigné pour être détecté plusieurs cycles plus tôt.

 
Vitalie Postolache:


Utilisez d'abord le styler (Ctrl+,) et corrigez toutes les remarques qui ont été données par le compilateur, il y en a beaucoup.

Puis, ceci :

                  double minusbuy=NormalizeDouble(Ask-OpenPrice,Digits);
                  double plusbuy=NormalizeDouble(Ask-OpenPrice,Digits);
                   if(Digits==3)
                   {
                    minusbuy=minusbuy*100;
                    plusbuy=plusbuy*100;
                   }
                   if(Digits==5)
                   {
                   minusbuy=minusbuy*10000;
                   plusbuy=plusbuy*10000;
                   }

se transforme facilement et sans effort en ceci :

                  double minusbuy=NormalizeDouble((Ask-OpenPrice)/_Point,Digits);
                  double plusbuy=minusbuy;

De même et au-dessus par code.

Bien qu'il ne soit pas clair pourquoi la demande compte à la fois pour les achats et les ventes, et les calculs sont effectués AVANT que le type de commande soit défini. OpenPrice est aussi en quelque sorte trop déterminé et même quelques cycles plus tôt.


Merci, je vais essayer de le réparer.
 

Salutations. Pouvez-vous me dire pourquoi, lors du test, il est indiqué " cannot open file 'E:\MT4-1\Alpari Limited MT4\MQL4\indicators/ Indicator parameters WmiFor.ex4' [2] " ?

Il y a un indicateur, il fonctionne. https://www.mql5.com/ru/code/10394

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern string WmiFor             = "Параметры индикатора WmiFor";
extern bool IsTopCorner = true; // Информационный блок в верхнем углу?
extern int Offset = 1; // Смещение исходного образца в барах (для проверки надежности прогноза) [1..]
extern bool IsOffsetStartFixed = true; // Фиксировано ли начало образца
extern bool IsOffsetEndFixed = false; // Фиксирован ли конец образца
extern int PastBars = 24; // Размер образца в барах, который ищется на истории [3..]
extern int ForecastBars = 24; // На сколько баров вперед делать прогноз [1..]
extern int MaxAlts = 5; // Искать указанное кол-во лучших образцов [1..100]
extern bool ShowCloud = true; // Показывать ли облако
extern bool ShowBestPattern = true; // Показывать ли максимально близкий образец
extern bool IsExactTime = true; // Должно ли совпадать время образцов (для учета эффекта сессий)
extern datetime MinDate = D'01.01.2001'; // Минимальная дата образца
extern int PeriodMA = 2; // Периуд сглаженной средней
extern double ScalePercents = 90.0; // Рассматривать только образцы с этим минимальным процентом совпадения
extern color IndicatorCloudColor = Sienna; // Цвет облака похожих вариантов
extern color IndicatorBestPatternColor = DodgerBlue; // Цвет самого похожего образца
extern color IndicatorVLinesColor = Sienna; // Цвет вертикальных линий-границ образца
extern color IndicatorTextColor = MediumBlue; // Цвет текста инф.блока
extern color IndicatorTextWarningColor = Tomato; // Цвет предупреждений в тестовом инф.блоке
extern int XCorner = 5; // Отступ инф.блока индикатора от правой границы графика
extern int YCorner = 5; // Отступ инф.блока индикатора от верхней границы графика
extern string FontName = "Arial"; // Шрифт тестового инф.блока
extern int FontSize = 7; // Размер шрифта тестового инф.блока

double Index0, Index1, Index2, Index3, Index4, Index5;

void OnTick()
  {

Index0 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 0, 3);

Index1 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 1, 3);

Index2 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 2, 3);

Index3 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 3, 3);

Index4 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 4, 3);

Index5 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 5, 3);

Comment ( "0==", DoubleToString(Index0,Digits), "     1==", DoubleToString(Index1,Digits),  "      2==", DoubleToString(Index2,Digits),
"     3==", DoubleToString(Index3,Digits),"     4==", DoubleToString (Index4, Digits), "     5==", DoubleToString (Index5, Digits));
  
  }
//+------------------------------------------------------------------+


 
Andrey Sokolov:

Salutations. Pouvez-vous me dire pourquoi, lors du test, il est indiqué " cannot open file 'E:\MT4-1\Alpari Limited MT4\MQL4\indicators/ Indicator parameters WmiFor.ex4' [2] " ?

Il y a un indicateur, il fonctionne. https://www.mql5.com/ru/code/10394

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern string WmiFor             = "Параметры индикатора WmiFor";

void OnTick()
  {

Index5 = iCustom(NULL, 0, WmiFor, IsTopCorner, Offset, IsOffsetStartFixed, IsOffsetEndFixed, PastBars, ForecastBars, MaxAlts, ShowCloud, ShowBestPattern, IsExactTime, MinDate, PeriodMA,
ScalePercents, IndicatorCloudColor, IndicatorBestPatternColor, IndicatorVLinesColor, IndicatorTextColor, IndicatorTextWarningColor, XCorner, YCorner, FontName, FontSize, 5, 3);

Comment ( "0==", DoubleToString(Index0,Digits), "     1==", DoubleToString(Index1,Digits),  "      2==", DoubleToString(Index2,Digits),
"     3==", DoubleToString(Index3,Digits),"     4==", DoubleToString (Index4, Digits), "     5==", DoubleToString (Index5, Digits));
  
  }
//+------------------------------------------------------------------+
Lisez la documentation sur"iCustom", et comment accéder correctement à l'indicateur.
 
Vitaly Muzichenko:
Lisez la documentation sur"iCustom", et comment accéder correctement à l'indicateur.


Merci.

J'ai oublié les guillemets, espèce d'idiot.

 

Bonjour !

Aidez-moi à trouver ce qui ne va pas. J'ai besoin de sortir le prix lorsque la ligne est traversée par une barre. J'ai écrit le code.

int start() {

double pr=ObjectGetValueByShift("line",0) ;

Alerte (pr) ;

return(0);}

line est le nom de la ligne.

Ce code affiche toujours "0". Qu'est-ce qu'il y a ?

 
Kot:

Bonjour !

Aidez-moi à trouver ce qui ne va pas. J'ai besoin de sortir le prix lorsque la ligne est traversée par une barre. J'ai écrit le code.

int start() {

double pr=ObjectGetValueByShift("line",0) ;

Alerte (pr) ;

return(0);}

line est le nom de la ligne.

Ce code affiche toujours "0". Qu'est-ce qu'il y a ?


Avez-vous uneligne de tendance?

Et passe visuellement au-dessus(en dessous) de la barre 0, non, cochez la case dans les propriétés, faisceau.

 

Bonjour à tous !

Question, sur insta, lorsque vous essayez d'envoyer un ordre, il est dit que les arrêts sont faux.

Voici la ligne elle-même :

OrderSend(Symbol(),OP_BUYSTOP,Lots,HiP,3,0,0,NULL,111,0,clrBlue) ;

Stop Loss et Take Points ont 0. Si je fixe un nombre dans Stop Loss, tout est normal.

Je n'ai pas besoin de Stop Loss. Que dois-je faire ?