откуда, до куда, что и в каких условиях измерялось ?
просто OrderSendAsync MODIFY и до непосредственно следующей операции 5 сек ??
очень странный, пугающий, неправдоподобный результат - надо перепроверять тесты
Замерил время до и после функции, посчитал разницу и получил 5 секунд. В боевых советниках все замеряется, чтобы потом было больше информации разобрать нештатную ситуацию. Увидел это.
Понадобилось создать структуры, которым можно было бы задавать различные правила действий внутри, но при этом манипулировать ими между собой, как одинаковыми.
Понадобилось создать структуры, которым можно было бы задавать различные правила действий внутри, но при этом манипулировать ими между собой, как одинаковыми.
Примененный прием оформил на таком примере.
К сожалению, не понял, почему в ООП-языках нет интерфейсов для статических методов.
А как ты это представляешь?
Любая функция имеет свой адрес в сегменте .text.
Любая функция-член (метод), первым параметром неявно принимает указатель this.
Статические методы не принимают указатель this и, по сути своей, являются синтаксическим "сахаром", являясь, де-факто обычными функциями.
При вызове виртуальной функции, адрес исполняемой функции берется из таблицы виртуальных функций, указатель на которую неявно содержится в классе, в котором объявлена виртуальная функция. Инициализация указателя на исполняемую функцию происходит при создании экземпляра объекта, логика при этом примерно такая (специально, что бы всем неофитам понятно было, на mql пишу:
class Base;
class A;
class B;
void FooClassA(Base* p);
void FooClassC(Base* p);
typedefvoid(*_Foo)(Base*);
class Base{
public:
Base(): foo(NULL){}
void Foo() {foo(&this);}
protected:
_Foo foo;
};
class A: public Base{
public:
A():a(100){foo = FooClassA;}
int a;
};
class B: public A{
public:
B():b(-100){}
int b;
};
class C: public B{
public:
C(){foo = FooClassC;}
int Get() {return a+b;}
};
void FooClassA(Base* p){PrintFormat("%s: %i",__FUNCTION__,dynamic_cast<A*>(p).a);}
void FooClassC(Base* p){PrintFormat("%s: %i",__FUNCTION__,dynamic_cast<C*>(p).Get());}
voidOnStart(){
A a;
B b;
C c;
Base* p = &a;
p.Foo();
p=&b;
p.Foo();
p=&c;
p.Foo();
}
Естественно, реально там все не так, но механизм инициализации указателя на функцию именно такой. Соответственно, никак, от слова вообще, невозможно, в компилируемом ЯП, сделать так как ты хочешь.
В C++ вот такая шаблонная магия есть:
#include <iostream>
#include <variant>
struct A
{
int a = 100;
int Get() { return a; }
};
struct B :A
{
int b = -100;
};
struct C :B
{
int Get() { return a + b; }
};
using BaseImpl = std::variant<A, B, C>;
struct Base : BaseImpl
{
using BaseImpl::BaseImpl;
int Get() { return std::visit([](auto&& arg) { return arg.Get(); }, static_cast<BaseImpl&>(*this)); }
};
int main()
{
Base a = A();
Base b = B();
Base c = C();
std::cout << a.Get() << ", " << b.Get() << ", " << c.Get() << std::endl; //100, 100, 0
b = C();
std::cout << a.Get() << ", " << b.Get() << ", " << c.Get() << std::endl; //100, 0, 0return0;
}
Любая функция-член (метод), первым параметром неявно принимает указатель this.
Статические методы не принимают указатель this и, по сути своей, являются синтаксическим "сахаром", являясь, де-факто обычными функциями.
При вызове виртуальной функции, адрес исполняемой функции берется из таблицы виртуальных функций, указатель на которую неявно содержится в классе, в котором объявлена виртуальная функция. Инициализация указателя на исполняемую функцию происходит при создании экземпляра объекта, логика при этом примерно такая (специально, что бы всем неофитам понятно было, на mql пишу:
Естественно, реально там все не так, но механизм инициализации указателя на функцию именно такой.
Если речь про мое сожалению по поводу возможностей интерфейсов. То мне хочется исключительно синтаксическое ограничение навесить на классы/структуры. Т.е. только на этапе компиляции, как это происходит с тем же модификатором const. Для самоконтроля, короче.
никак, от слова вообще, невозможно, в компилируемом ЯП, сделать так как ты хочешь.
Выше написал костыль. Хотел получить нечто уже встроенное для таких случаев.
Возможно, изобрел велосипед, не знаю. Если кто-то знает более элегантные решения, то прошу поделиться.
Раньше(еще в старых билдах компилятора) можно было использовать класс до его объявления:
class A;
class B
{
public: A a;
public: int Val;
};
class A
{
public: B * b;
public: int Test() {return b.Val + 1;}
};
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnStart()
{
B b;
b.a.b = GetPointer(b);
b.Val = 1;
Print(b.a.Test());
}
Но теперь при компиляции получаем ошибку:
undefined class 'A' cannot be used
Придумал два решения, как это можно обойти.
1. Через базовый класс:
class A0
{
public: virtualint Test() {return0;}
};
class B
{
public: A0 * a;
public: int Val;
};
class A: public A0
{
public: A(B * source) {b = source;}
public: B * b;
public: virtualint Test() {return b.Val + 1;}
};
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnStart()
{
B b;
A a(GetPointer(b));
b.a = GetPointer(a);
b.Val = 1;
Print(b.a.Test());
}
2. Через вложенный класс:
class B
{
class A
{
public: B * b;
public: int Test() {return b.Val + 1;}
};
public: A a;
public: int Val;
};
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnStart()
{
B b;
b.a.b = GetPointer(b);
b.Val = 1;
Print(b.a.Test());
}
Второе решение, как по мне, оптимальнее чем первое.
Замеряете длительность и получаете результат. У меня случилось на TRADE_ACTION_MODIFY.
откуда, до куда, что и в каких условиях измерялось ?
просто OrderSendAsync MODIFY и до непосредственно следующей операции 5 сек ??
очень странный, пугающий, неправдоподобный результат - надо перепроверять тесты
откуда, до куда, что и в каких условиях измерялось ?
просто OrderSendAsync MODIFY и до непосредственно следующей операции 5 сек ??
очень странный, пугающий, неправдоподобный результат - надо перепроверять тесты
Замерил время до и после функции, посчитал разницу и получил 5 секунд. В боевых советниках все замеряется, чтобы потом было больше информации разобрать нештатную ситуацию. Увидел это.
Понадобилось создать структуры, которым можно было бы задавать различные правила действий внутри, но при этом манипулировать ими между собой, как одинаковыми.
Примененный прием оформил на таком примере.
К сожалению, не понял, почему в ООП-языках нет интерфейсов для статических методов.
К сожалению, не понял, почему в ООП-языках нет интерфейсов для статических методов.
Приходится лепить такой ужас.
Понадобилось создать структуры, которым можно было бы задавать различные правила действий внутри, но при этом манипулировать ими между собой, как одинаковыми.
Примененный прием оформил на таком примере.
К сожалению, не понял, почему в ООП-языках нет интерфейсов для статических методов.
А как ты это представляешь?
Любая функция имеет свой адрес в сегменте .text.
Любая функция-член (метод), первым параметром неявно принимает указатель this.
Статические методы не принимают указатель this и, по сути своей, являются синтаксическим "сахаром", являясь, де-факто обычными функциями.
При вызове виртуальной функции, адрес исполняемой функции берется из таблицы виртуальных функций, указатель на которую неявно содержится в классе, в котором объявлена виртуальная функция. Инициализация указателя на исполняемую функцию происходит при создании экземпляра объекта, логика при этом примерно такая (специально, что бы всем неофитам понятно было, на mql пишу:
Естественно, реально там все не так, но механизм инициализации указателя на функцию именно такой. Соответственно, никак, от слова вообще, невозможно, в компилируемом ЯП, сделать так как ты хочешь.
В C++ вот такая шаблонная магия есть:
Любая функция имеет свой адрес в сегменте .text.
Любая функция-член (метод), первым параметром неявно принимает указатель this.
Статические методы не принимают указатель this и, по сути своей, являются синтаксическим "сахаром", являясь, де-факто обычными функциями.
При вызове виртуальной функции, адрес исполняемой функции берется из таблицы виртуальных функций, указатель на которую неявно содержится в классе, в котором объявлена виртуальная функция. Инициализация указателя на исполняемую функцию происходит при создании экземпляра объекта, логика при этом примерно такая (специально, что бы всем неофитам понятно было, на mql пишу:
Естественно, реально там все не так, но механизм инициализации указателя на функцию именно такой.
Спасибо за подробное объяснение с примером!
А как ты это представляешь?
Если речь про мое сожалению по поводу возможностей интерфейсов. То мне хочется исключительно синтаксическое ограничение навесить на классы/структуры. Т.е. только на этапе компиляции, как это происходит с тем же модификатором const. Для самоконтроля, короче.
никак, от слова вообще, невозможно, в компилируемом ЯП, сделать так как ты хочешь.
Выше написал костыль. Хотел получить нечто уже встроенное для таких случаев.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Новая версия платформы MetaTrader 5 build 3950: Снятие/пополнение в терминале и обновленный торговый отчет
fxsaber, 2023.09.19 23:25
Как избавиться от ошибок?Первый раз __LINE__/__COUNTER__ передаются внутри маркоса в виде текста, второй - числа.
Придумал два решения, как это можно обойти.
1. Через базовый класс:
2. Через вложенный класс: