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

 
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). Хотя, может кто удивит хитрым макросом.

 
fxsaber:

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

Интересно, кто такое заявлял?  PrevHandle в любом случае нужно где-то хранить.

 

столкнулся с такой проблемой:

обновилась Windows, после обновления в терминале отвалилось подключение к аккаунту сообщества, после ввода логина и пароля пришлось устанавливать советник купленный в маркете заново (использовать новую активацию), если после каждого обновления Windows придется использовать новую активацию то они закончатся очень быстро, как с этим быть, может кто сталкивался??

 
Alexey Navoykov:

Интересно, кто такое заявлял?  PrevHandle в любом случае нужно где-то хранить.

Возможно, не правильно понял

 
fxsaber:

Ну как ваши успехи?

Вот это должно работать как ожидается:

int MACROS_helper_PrevHandle;
template <typename T>
T macros_helper_fn(T t)  {SelectHandle(MACROS_helper_PrevHandle); return t;}     
#define MACROS(NEW_HANDLE_, FN_)  ((MACROS_helper_PrevHandle=GetHandle())*0 == 0 ?     \
                                    SelectHandle(NEW_HANDLE_) ? macros_helper_fn(FN_) : 0 : 0)
Переброс через функция не просто так.