Ошибки, баги, вопросы - страница 3452

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Anatoli Kazharski, 2024.01.16 16:59

Можно попробовать добавить имя переменной, как строковой параметр. А доступ к значению через CHashMap.

Вот такой вариант:

#include <Arrays\ArrayObj.mqh>
#include <Generic\HashMap.mqh>
//+------------------------------------------------------------------+
//| Variable                                                         |
//+------------------------------------------------------------------+
class Variable : public CObject {
protected:
  string var_name;

public:
  Variable(string name) : var_name(name) {}
  virtual string ToString(void) const = 0;
  virtual string TypeName(void) const = 0;
  virtual string GetName(void) const { return var_name; }
};
//+------------------------------------------------------------------+
//| IntVariable                                                      |
//+------------------------------------------------------------------+
class IntVariable : public Variable {
  int value;

public:
  IntVariable(string name, int v) : Variable(name), value(v) {}
  virtual string ToString(void) const override { return(string(value)); }
  virtual string TypeName(void) const override { return("int"); }
};
//+------------------------------------------------------------------+
//| DoubleVariable                                                   |
//+------------------------------------------------------------------+
class DoubleVariable : public Variable {
  double value;

public:
  DoubleVariable(string name, double v) : Variable(name), value(v) {}
  virtual string ToString(void) const override { return(DoubleToString(value, 8)); }
  virtual string TypeName(void) const override { return("double"); }
};
//+------------------------------------------------------------------+
//| MyClass                                                          |
//+------------------------------------------------------------------+
class MyClass {
  
  CArrayObj vars;
  CHashMap<string, CObject*> map;
  
public:
  MyClass() {}
  
 ~MyClass() {
    for (int i = 0; i < vars.Total(); i++) {
      delete vars.At(i);
    }
    vars.Clear();
    map.Clear();
  }
  
  void Add(Variable *var) {
    vars.Add(var);
    map.TrySetValue(var.GetName(), var);
  }
  
  template<typename T>
  bool Get(string name, T &out_value) {
    
    CObject *obj;
    
    if(map.TryGetValue(name, obj)) {
      Variable *var = (Variable *)obj;
      out_value = (T)var.ToString();
      return true;
    }
    return false;
  }
};
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void) {
  
  MyClass my_class;
  
  my_class.Add(new IntVariable("spread", 10));
  my_class.Add(new DoubleVariable("price", 123.456));
  
  int spread_value;
  if(my_class.Get("spread", spread_value)) {
    Print("IntVariable 'spread': ", spread_value);
  }
  
  double price_value;
  if(my_class.Get("price", price_value)) {
    Print("DoubleVariable 'price': ", price_value);
  }
}
//+------------------------------------------------------------------+

//---

Результат:

IntVariable 'spread': 10
DoubleVariable 'price': 123.456
Yuriy Vasilyev #:

Вы сделали две идентичные записи, потеряв суть вопроса.

Anatoli Kazharski #:

Вот такой вариант:

Спасибо еще раз! Сделал такой вариант с примерами использования.

Input_Struct
Input_Struct
  • www.mql5.com
Структура входных параметров
bred_bred1 #:
Коллеги, с дистрибутивом именно Ф*нама(не знаю можно ли здесь писать),

Проверьте пожалуйста корректность работы функции советника на каком-нибудь фьюче. Похоже критический баг для расчета маржи - всегда возвращает 0.

Если выдаёт значение отличное от нуля напишите что за билд?

Спасибо!

4073:

(SiH4,M15)     Margin is: 13380.75

4078:

(SiH4,H1)     Margin is: 0.0

JRandomTrader #:

4073:

(SiH4,M15)     Margin is: 13380.75

4078:

(SiH4,H1)     Margin is: 0.0

Ага! Значит баг всё таки присутствует, причем плавающий. Если ваши данные верны то
4040 - присутствует,
4073 - присутствует
4078 - отсутствует
4138 - присутствует

Спасибо

fxsaber #:

Отсутствие ошибки в выделенной строке (указатель равен объекту) - правильно?

С точки зрения MQL здесь нет ошибки - есть неявное приведение указателя к объекту:

class A {};
void OnStart()
{
    A* a1 = A(); //(*)
}

(*) равносильна записи в две строки:

    A *a1;
    a1.operator=(A());

И если даже пользователи с опытом не могут элементарно этого понять, то что уже говорить о начинающих, что лишний раз подтверждает ошибочность Вашего утверждения:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2023.12.27 18:08

Поэтому там (в С++) значительно больше потенциальных ошибок у программистов.

A100 #:

С точки зрения MQL здесь нет ошибки - есть неявное приведение указателя к объекту:

(*) равносильна записи в две строки:

Даже если это так, то указатель не инициалезирован же.
Sergey Gridnev #:
Даже если это так, то указатель не инициалезирован же.

А причем здесь компилятор?

class A {
public:
    void f() {}
};
void OnStart()
{
    A *a;
    a.f(); //нормально
}
Речь о сообщениях компилятора, а не о правильности кода как такового
A100 #:

С точки зрения MQL здесь нет ошибки - есть неявное приведение указателя к объекту:

(*) равносильна записи в две строки:

Понимаю, что это некая фишка языка, поэтому не оформлял, как ошибку.

Заметил несовпадение, в графиках, в тестере стратегий. Между изменением баланса(синяя линия) и графиком цен(бары), при наведении мышью.

На скриншоте:

—Закрытие позиции BUY и открытие SELL было 23 января в 11:00;

—При наведении мышью на линию баланса, во всплывающей подсказке, указывается 22 января 17:33/17:36.

Чем это можно объяснить?

Я ожидал, что время и дата изменения баланса, будут совпадать со временем ордеров.

PS Иногда несовпадение достигает двух суток.

Несовпадение по времени (при наведении мышью)