Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 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() советника, в конце блока инициализации модуля управления капиталом.
Вручную добавлять в OnInit()? Получается через Мастер никак не сделать того что хочу?