Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Или модуль управления капиталом. Что именно выбрать, то тут нужно подробнее уже смотреть.
Не очень понятная концепция. Есть сигналы на открытие позы, но ведь бывают и на закрытие. Можно было бы тоже на них накрутить голосования и пр. и все это в дополнение к трейлингу.
И как часто меняются базовые классы? Если бы я написал свой модуль сигналов с предыдущей версией мастера то сейчас бы мне пришлось его переделывать.
Просто интересно, кто-нибудь по-серьезному пользуется этим мастером и базовыми классами экспертов или это только для лентяев, кто совсем ничего не хочет сам руками делать?
Или модуль управления капиталом. Что именно выбрать, то тут нужно подробнее уже смотреть.
Простите не силен в ООП не поможете разобраться.
Вот я сделал модуль торговых сигналов назовем его СMySignal.mqh. Теперь хочу реализовать свои сигналы на закрытие. Для этого создаю свой модуль управления капитал CMyMoney.mqh так как в CExpert есть такой вызов:
protected:
CExpertMoney *m_money;
bool CExpert::CheckClose(void)
{double lot;
//--- position must be selected before call
if((lot=m_money.CheckClose(GetPointer(m_position)))!=0.0)
return(CloseAll(lot));
Но я хочу использовать методы класса CMySignal в логике закрытия, я не хочу снова производить все вычисления в CMyMoney. Поэтому в CMyMoney я пишу что-то вроде такого:
class CMyMoney : public CExpertMoney
protected:
//--- input parametersvirtual bool CheckCloseLong(void);
virtual bool CheckCloseShort(void);
CMySignal *filter0;
...
double CMyMoney::CheckClose(CPositionInfo *position)
{
double lot;
lot=position.Volume();
if(position.PositionType()==POSITION_TYPE_BUY)
{
//--- check the possibility of closing the long position
if(filter0.CheckCloseLong(lot))
Print(__FUNCTION__+": close long position signal detected. Lot to be closed ",lot);
}
else
{
//--- check the possibility of closing the short position
if(filter0.CheckCloseShort(lot))
Print(__FUNCTION__+": close short position signal detected. Lot to be closed ",lot);
}
return(lot);
}
И переношу всю логику закрытия в класс CMySignal:
class CMySignal : public CExpertSignal
public:
virtual bool CheckCloseLong(double &lot);
virtual bool CheckCloseShort(double &lot);
bool CMySignal::CheckCloseLong(double &lot)
{
//логика закрытия Long
}
bool CMySignal::CheckCloseShort(double &lot)
{
//логика закрытия Short
}
Но получается что я уже как бы имею дело с новым объектом filter0, а не с уже прежде созданным. Я должен по новой инициализировать данные для него (индикаторы и прочее). Как мне получить доступ к уже существующему объекту класса CMySignal? Надеюсь понятно изложил =)
Всё это должно работать через Мастер стандартным образом, поэтому я не меняю никаких базовых классов. Все изменения возможны только в моих модулях торговых сигналов и управления капиталом.
Простите не силен в ООП не поможете разобраться.
Вот я сделал модуль торговых сигналов назовем его СMySignal.mqh. Теперь хочу реализовать свои сигналы на закрытие. Для этого создаю свой модуль управления капитал CMyMoney.mqh так как в CExpert есть такой вызов:
protected:
CExpertMoney *m_money;
bool CExpert::CheckClose(void)
{double lot;
//--- position must be selected before call
if((lot=m_money.CheckClose(GetPointer(m_position)))!=0.0)
return(CloseAll(lot));
Но я хочу использовать методы класса CMySignal в логике закрытия, я не хочу снова производить все вычисления в CMyMoney. Поэтому в CMyMoney я пишу что-то вроде такого:
class CMyMoney : public CExpertMoney
protected:
//--- input parametersvirtual bool CheckCloseLong(void);
virtual bool CheckCloseShort(void);
CMySignal *filter0;
...
double CMyMoney::CheckClose(CPositionInfo *position)
{
double lot;
lot=position.Volume();
if(position.PositionType()==POSITION_TYPE_BUY)
{
//--- check the possibility of closing the long position
if(filter0.CheckCloseLong(lot))
Print(__FUNCTION__+": close long position signal detected. Lot to be closed ",lot);
}
else
{
//--- check the possibility of closing the short position
if(filter0.CheckCloseShort(lot))
Print(__FUNCTION__+": close short position signal detected. Lot to be closed ",lot);
}
return(lot);
}
И переношу всю логику закрытия в класс CMySignal:
class CMySignal : public CExpertSignal
public:
virtual bool CheckCloseLong(double &lot);
virtual bool CheckCloseShort(double &lot);
bool CMySignal::CheckCloseLong(double &lot)
{
//логика закрытия Long
}
bool CMySignal::CheckCloseShort(double &lot)
{
//логика закрытия Short
}
Но получается что я уже как бы имею дело с новым объектом filter0, а не с уже прежде созданным. Я должен по новой инициализировать данные для него (индикаторы и прочее). Как мне получить доступ к уже существующему объекту класса CMySignal? Надеюсь понятно изложил =)
Всё это должно работать через Мастер стандартным образом, поэтому я не меняю никаких базовых классов. Все изменения возможны только в моих модулях торговых сигналов и управления капиталом.
У меня вопрос по второй "простыне" - зачем Вы в модуль управления капиталом вставляете "CMySignal *filter0;"?
filter0 это объект класса моего модуля торговых сигналов CMySignal. Создается в основном файле эксперта:
CMySignal *filter0=new CMySignal;
filter0 это объект класса моего модуля торговых сигналов CMySignal. Создается в основном файле эксперта:
CMySignal *filter0=new CMySignal;
Посмотрите реализацию передачи указателя на главный сигнал в модуль сигнала (Мастер MQL5: Как научить эксперта открывать отложенные ордера по любым ценам):
В соответствии с нашей схемой реализации идеи необходимо объявить внутреннюю переменную, в которой будет храниться указатель на главный сигнал.
Так как эта переменная должна быть внутренней (с областью видимости только внутри класса генератора торговых сигналов), добавлять ее будем в следующий блок кода:
Также обратите внимание, что в коде я удалил переменные, которые не будут применяться.
Метод, с помощью которого мы будем сохранять указатель на главный сигнал, объявим в другом блоке кода - "метод установки указателя на главный сигнал". Также были удалены некоторые лишние методы.
Возможно это то, что Вам нужно. Только указатель на главный сигнал Вы будете передавать в модуль управления капиталом.
Посмотрите реализацию передачи указателя на главный сигнал в модуль сигнала (Мастер MQL5: Как научить эксперта открывать отложенные ордера по любым ценам):
Возможно это то, что Вам нужно. Только указатель на главный сигнал Вы будете передавать в модуль управления капиталом.
Зачем мне указатель на главынй сигнал если мне нужен указатель на мой сигнал, наследник класса CExpertSignal? Я хочу его получить в моем модуле управления капиталом, наследнике CExpertMoney.
Хорошо. Зайдём с другой стороны. В вашем модуле управления капиталом нужно объявить такую переменную:
CMySignal *m_signal; // храним ссылку на свой сигнал сигнали такой метод:
и его реализация
Теперь можно из модуля управления капиталом пробовать обращаться к своему сигналу через
Хорошо. Зайдём с другой стороны. В вашем модуле управления капиталом нужно объявить такую переменную:
и такой метод:
и его реализация
Теперь можно из модуля управления капиталом пробовать обращаться к своему сигналу через
InitSignal где-то вызываться должен предварительно?
Invalid pointer access при вызове метода моего модуля сигналов
InitSignal где-то вызываться должен предварительно?
Конечно нужно вызывать "InitSignal" ранее: из OnInit() советника, в конце блока инициализации модуля управления капиталом.