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

 
Alexey Navoykov:
Где вы видели текстовые хэндлы то? )  Да и у автора же обозначена задача.  А если усложнять условия, то хэндлы могут быть заданы и в виде структуры.
Да... и так:
struct A { int i; };
bool SelectHandle( A& ) { return true; }
A GetHandle() { A a; return a; }
A NewHandle;
datetime time = MACRO100( NewHandle, TimeCurrent());

тоже работает

 
A100:
Да... и так:

тоже работает

Осталось ещё в виде массива )  Причём из него нужно сначала сделать массив байт, а потом перевести в структуру, воспользовавшись фирменной библиотекой TypeToBytes )

 
Alexey Navoykov:

Осталось ещё в виде массива )  Причём из него нужно сначала сделать массив байт, а потом перевести в структуру, воспользовавшись фирменной библиотекой TypeToBytes )

Не могу проверить - у меня нет такого библиотечного файла (build 1961x32). Через неделю сами сможете посмотреть

 
Alexey Navoykov:
Где вы видели текстовые хэндлы то? )  Да и у автора же обозначена задача.  А если усложнять условия, то хэндлы могут быть заданы и в виде структуры.

Дайте, пожалуйста, ссылку на задачу.
Спасибо.

 
Sergey Dzyublik:

Дайте, пожалуйста, ссылку на задачу.
Спасибо.

https://www.mql5.com/ru/forum/1111/page2350#comment_9974834

 

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

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

pavlick_, 2018.12.21 17:23

int MACROS_helper_PrevHandle;
datetime MACROS_helper_time;
#define MACROS(NEW_HANDLE_, FN_)   (MACROS_helper_PrevHandle=GetHandle())*0 == 0 ?  \
                                     (MACROS_helper_time=SelectHandle(NEW_HANDLE_) ? FN_ : 0)*0 == 0 ? \
                                        SelectHandle(MACROS_helper_PrevHandle)*0 == 0 ? MACROS_helper_time : 0 : 0 : 0
К сожалению, этот вариант относится к
Alexey Navoykov:
глобальную переменную использовать.


Над задачей сильно не думал. Сходу решения не нашел, поэтому решил поучиться на форуме. Интриги не интересны, т.к. хочу использовать на практике - Virtual-библа, без которой уже боевые советники не представляю.

Ну раз уже два человека заявили, что есть решение без доп. переменных, покумекаю на выходных.

Уточню, что NewHandle - может быть константой. Т.е. валидный такой вызов

time = MACROS(0, TimeCurrent()); // TimeCurrent из 0-хендла.
time = MACROS(1, TimeCurrent()); // TimeCurrent из 1-хендла.

MACROS(0, SymbolInfoTick(_Symbol, Tick)); // SymbolInfoTick из 0-хендла.

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
Price = MACROS(3, Bid); // Bid из 3-хендла.
 

fxsaber:

Уточню, что NewHandle - может быть константой. Т.е. валидный такой вызов

Все работает:

#include "Простейшее.mqh"
int GetHandle() { return 0; }
bool SelectHandle( int ) { return true; }
#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
void OnStart()
{
        datetime time = MACRO100(0, TimeCurrent());
                 time = MACRO100(1, TimeCurrent());
        MqlTick tick;
        MACRO100(0, SymbolInfoTick(_Symbol, tick));
        double price = MACRO100(3, Bid);
}

Когда еще представится такая возможность... проверить реальный уровень
Судя по обсуждениям... здесь... серьезные проггеры ловко жонглирующие высокопарными словами в т.ч. про ООП и т.д. (я вообще иногда больше половины изречений не понимаю даже)

А что на деле?! мишура? или не все еще подтянулись?
Еще раз подчеркну: было бы что то сложное...неординарное или требующее специальных познаний - написал бы сразу, а здесь - простейшее(!). Поэтому включаем мозг и пишем варианты... или ждём!

 
А можно вынести в отдельную тему начианая с https://www.mql5.com/ru/forum/1111/page2350#comment_9974834 ? Тут всё затеряется, хочется посмотреть как жидко обделается A100.
 
pavlick_:
, хочется посмотреть как жидко обделается A100.

Зачем пустословить? Давайте вы лучше работу создадите на трехзначную цифру и арбитраж решит кто обделался

 
fxsaber:
К сожалению, этот вариант относится к


Над задачей сильно не думал. Сходу решения не нашел, поэтому решил поучиться на форуме. Интриги не интересны, т.к. хочу использовать на практике - Virtual-библа, без которой уже боевые советники не представляю.

Ну хз, по всякому уже думал. Если правильно понимаю, то важна вариативность типа возвращаемого из макроса. На с++ решаемо

//------------------------------------ 1 вариант
template <typename T>
T f(T(*fp)()) {...}
//------------------------------------ 2 вариант
template <typename T>
struct Store {
   static inline T val;
};
int MACROS_helper_PrevHandle;
#define MACROS(NEW_HANDLE_, FN_)   (MACROS_helper_PrevHandle=GetHandle())*0 == 0 ?           \
      (Store<decltype(FN_)>::val=SelectHandle(NEW_HANDLE_) ? FN_ : 0)*0 == 0 ?               \
      SelectHandle(MACROS_helper_PrevHandle)*0 == 0 ? Store<decltype(FN_)>::val : 0 : 0 : 0

А препроцессор gcc вообще так умеет:

#define M(FN_) ({int a=5; ; FN_;})
int ff() {return 50;}

int val = M(ff());

поытки реализовать всё это в мкл закончились провалом. Может лучшее решение допилить:  SelectHandle(new, set_next=INT_MAX). Хотя, может кто удивит хитрым макросом.

Причина обращения: