Erreurs, bugs, questions - page 1580

 

Erreur de compilation

template<typename T>
class A {
public:
        A( T t1 ) : t( t1 ) {}
        T operator[]( int ) { return t; }
        T t;
};
typedef void (*fn)();
void OnStart()
{
        A<fn> a( OnStart );
        a.operator[]( 0 )(); //нормально
        a[            0 ](); // error: ')' - expression expected
}
 

ArrayIsSeries() produit toujours false dans ce script :

//+------------------------------------------------------------------+
//|                                                     TestCopy.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs

enum enumYN
  {
   enYes=1, // Да
   enNo=0,  // Нет
  };

//--- input parameters
input int Search_Period=10;   // Количество копируемых свечей
int searchPeriod=(Search_Period<1)?1:Search_Period;
input int Delta=2;            // Количество пунктов допуска
int delta=(Delta<0)?0:Delta;
input enumYN AsSeries=enYes;  // Массив array как таймсерия
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;    // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];    // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей
   int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);  // копируем данные
   if(copied>0) {                                                    // если скопировали
      ArraySetAsSeries(array,AsSeries);                              // задаём массив как таймсерию или нет
      ArrayResize(dataCandle,copied);                                // задаём размер структуры равным числу скопированных данных
      ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре
      //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
      for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"
         dataCandle[i].reference_candle.high=array[i].high;          // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;            // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;          // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size=0;                                                 // размер массива совпадающих свечей
         ArrayResize(dataCandle[i].matched_candles,size);            // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                          // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for(int j=0; j<copy_bars; j++) {                            // в цикле от i+1 до copy_bars
            if(j==i) continue;                                       // пропустим свечу "саму себя"
            //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину Point)
            if(NormalizeDouble(delta*Point()-fabs(array[i].high-array[j].high),Digits())>=0) {
               size++;                                               
               ArrayResize(dataCandle[i].matched_candles,size);            // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                          // запишем количество совпадений
               dataCandle[i].matched_candles[size-1].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size-1].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size-1].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   Alert("Array is series: ",ArrayIsSeries(array),
         "\ntime array[0]: ",TimeToString(array[0].time,TIME_DATE|TIME_MINUTES),
         "\ntime array[",string(searchPeriod-1),"]: ",TimeToString(array[ArraySize(array)-1].time,TIME_DATE|TIME_MINUTES));
   for(int i=0; i<ArraySize(dataCandle)-1; i++) {
      string refs_txt="";
      string matched_txt="";
      refs_txt="Свеча "+IntegerToString(i,2,'0')+": время "+TimeToString(dataCandle[i].reference_candle.time)+", high: "+DoubleToString(dataCandle[i].reference_candle.high,Digits())+" имеет совпадений: "+(string)dataCandle[i].number_matched+" шт. ";
      if(dataCandle[i].number_matched>0) {
         for(int j=0; j<ArraySize(dataCandle[i].matched_candles); j++) {
            matched_txt="Совпадение "+IntegerToString(j+1)+": "+TimeToString(dataCandle[i].matched_candles[j].time)+", high: "+DoubleToString(dataCandle[i].matched_candles[j].high,Digits());
            }
         }
      Print(refs_txt,matched_txt);
      }
  }
//+------------------------------------------------------------------+
 
Est-il possible de connaître le PPI(pixels par pouce) dans les paramètres du graphique ? J'en ai vraiment besoin pour mon panneau. WinAPI n'est pas une option.
 
Andrey Voytenko:
Est-il possible de connaître la valeur PPI(pixels par pouce) par le biais des paramètres graphiques ? J'en ai vraiment besoin pour mon panneau. WinAPI n'est pas une option.

Trouvé dans les annonces :

MQL5 : Ajout de la valeur TERMINAL_SCREEN_DPI à la liste des propriétés du terminal client ENUM_TERMINAL_INFO_INTEGER - la résolution de la sortie écran est mesurée en nombre de points par pouce linéaire (DPI). La connaissance de ce paramètre vous permet de dimensionner les objets graphiques de manière à ce qu'ils aient le même aspect sur des moniteurs de résolutions différentes.

Cela aidera-t-il ?
 
Lors de la rédaction d'un article, lorsqu'on essaie d'insérer une image, il n'y a pas de filtre "images uniquement" - le dossier sélectionné affiche absolument tous les fichiers, même ceux qui n'ont rien à voir avec des images.
 
Karputov Vladimir:

Trouvé dans l'annonce : TERMINAL_SCREEN_DPI

Est-ce que ça va aider ?

Oui, c'est ce dont j'ai besoin. Merci.
 
Le CHARTEVENT_MOUSE_MOVE ne fonctionne pas dans l'indicateur OnChartEvent, jusqu'à ce que vous chargiez le conseiller expert sur le graphique.

Veuillez m'aider à résoudre cette erreur,

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

ERREUR ! !! OnChartEvent dans l'indicateur ne fonctionne pas CHARTEVENT_MOUSE_MOVE jusqu'à ce que vous le chargiez sur le graphique EA.

Vladislav Andruschenko, 2016.05.13 12:29

OnChartEvent ne fonctionne pas dans l'indicateur CHARTEVENT_MOUSE_MOVE, jusqu'à ce que vous le chargiez sur le graphique d'Expert Advisor.

Le vrai sabotage.

2016.05.13:23:49.434 Windows 7 Ultimate (PC basé sur x64), IE 11.00, 8 x Intel Core i7-6700 @ 3.40GHz, RAM : 22784 / 32684 Mb, HDD : 16315 / 1498122 Mb, GMT+02:00

Donc.

il y a un indicateur de contrôle

le code est minimal :

void OnChartEvent(const int id,

                  const long &lparam,

                  const double &dparam,

                  const string &sparam)

  {

   Comment(" MOVE \n id="+id+" \n lparam="+lparam+" \n dparam="+dparam+" \n sparam="+sparam
           );


  }

ainsi, lorsque l'indicateur est attaché au graphique - le commentaire n'affiche pas la position actuelle du curseur de la souris,

Si vous cliquez sur le graphique, il affiche les dernières coordonnées et ne les modifie pas en cas de déplacement, c'est-à-dire que le paramètre CHARTEVENT_MOUSE_MOVE ne fonctionne pas dans ce cas.

Le problème ne peut être résolu que de la manière suivante

lorsqu'un Expert Advisor est attaché à un graphique - l'indicateur met ensuite à jour le commentaire normalement, c'est-à-dire qu'il suit le curseur et affiche ses coordonnées.

Même si vous retirez ensuite le conseiller expert du graphique, l'indicateur affiche normalement les coordonnées du curseur.

La séquence d'actions :

1. ouvrir un nouveau graphique

2. Lancez l'indicateur de test

3. Le commentaire n'affiche pas l'indicateurCHARTEVENT_MOUSE_MOVE (id=0)

4. Je place n'importe quel conseiller expert sur le graphique

5. L'indicateur commence à afficher l'actionCHARTEVENT_MOUSE_MOVE (id=10) normalement.


 
Vladislav Andruschenko:
OnChartEvent dans l'indicateur, CHARTEVENT_MOUSE_MOVE ne fonctionne pas, jusqu'à ce que vous téléchargiez le conseiller expert sur le graphique.

Veuillez m'aider à résoudre cette erreur,

La première question que les développeurs vous poseront est la suivante : CHART_EVENT_MOUSE_MOVE est-il activé ?
 
Alexander Puzanov:
La première question que les développeurs vous poseront est la suivante : CHART_EVENT_MOUSE_MOVE est-il activé ?

Merci. Quelque chose que je ne savais pas. . . .. .... ...

 

Après la dernière mise à jour du terminal, les ordres SELL STOP et BUY STOP dans le testeur sont exécutés aux prix d'achat et de vente, mais pas au prix de passage de l'ordre - ceci est seulement dans les prix d'ouverture en mode test.

Raison: