double lostProfit(ulong ticket)
{
Print("****** "+__FUNCTION__+"******");
if(HistoryOrderSelect(ticket))
{
ulong pos_ID = HistoryOrderGetInteger(ticket,ORDER_POSITION_ID);
if(my_History.SelectByIndex(pos_ID)) // possible loss of data due to type conversion
{
Print("****** "+string(equity_plus[arr_size-1] - my_History.TakeProfit())+" ******");
return(equity_plus[arr_size-1] - my_History.TakeProfit());
}
elsePrint("--- Не выбрана позиция по ID "+string(pos_ID));
}
elsePrint("--- Не выбран ордер по тикету "+string(ticket));
return(0.0);
}
Позиция с магиком 2810292634423737, тикетом 2 и лотом 0.1 успешно закрыта.
****** lostProfit******
--- Не выбрана позиция по ID 2
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
Por mim, já percebi que programação não é minha, mas consegui fazer amizade com o MQL5 Master. No entanto, ao compilar alguns módulos de sinais de negociação, aparecem avisos. Quão críticos são esses avisos e, se não forem difíceis, diga-me o que precisa ser corrigido no código do módulo de sinais de negociação para eliminar os avisos mostrados na imagem.
Com os melhores cumprimentos, Vladimir.
Código do módulo de sinais de negociação
//+------------------------------------------------------------------+//| SampleSignal.mqh |//| Copyright 2010, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2010, MetaQuotes Software Corp."#property link"http://www.mql5.com"//+------------------------------------------------------------------+//| включаемые файлы |//+------------------------------------------------------------------+#include <Expert\ExpertSignal.mqh>
// wizard description start//+------------------------------------------------------------------+//| Description of the class |//| Title=Сигнал по пересечению ценой скользящей средней |//| со входом на последующем откате |//| Type=SignalAdvanced |//| Name=Sample |//| Class=CSampleSignal |//| Page= |//| Parameter=PeriodMA,int,12 |//| Parameter=ShiftMA,int,6 |//| Parameter=MethodMA,ENUM_MA_METHOD,MODE_EMA |//| Parameter=AppliedMA,ENUM_APPLIED_PRICE,PRICE_CLOSE |//| Parameter=Limit,double,0.0 |//| Parameter=StopLoss,double,50.0 |//| Parameter=TakeProfit,double,50.0 |//| Parameter=Expiration,int,10 |//+------------------------------------------------------------------+// wizard description end//+------------------------------------------------------------------+//| Класс CSampleSignal. |//| Назначение: Класс генератора торговых сигналов по пересечению |//| ценой скользящей средней |//| со входом на последующем откате. |//| Является производным от класса CExpertSignal. |//+------------------------------------------------------------------+class CSampleSignal : public CExpertSignal
{
protected :
CiMA m_MA; // объект для доступа к значениям скользящей средней
CiOpen m_open; // объект для доступа к ценам открытия баров
CiClose m_close; // объект для доступа к ценам закрытия баров//--- параметры настройкиint m_period_ma; // период усреднения средней скользящейint m_shift_ma; // смещение средней скользящей по оси времениENUM_MA_METHOD m_method_ma; // метод усреднения средней скользящейENUM_APPLIED_PRICE m_applied_ma; // объект усреднения средней скользящейdouble m_limit; // уровень установки отложенного ордера относительно средней скользящейdouble m_stop_loss; // уровень установки ордера "stop loss" относительно цены открытияdouble m_take_profit; // уровень установки ордера "take profit" относительно цены открытияint m_expiration; // время "жизни" отложенного ордера в барахpublic :
CSampleSignal();
//--- методы установки параметров настройкиvoid PeriodMA( int value) { m_period_ma=value; }
void ShiftMA( int value) { m_shift_ma=value; }
void MethodMA( ENUM_MA_METHOD value) { m_method_ma=value; }
void AppliedMA( ENUM_APPLIED_PRICE value) { m_applied_ma=value; }
void Limit( double value) { m_limit=value; }
void StopLoss( double value) { m_stop_loss=value; }
void TakeProfit( double value) { m_take_profit=value; }
void Expiration( int value) { m_expiration=value; }
//--- метод проверки параметров настройкиvirtualbool ValidationSettings();
//--- метод проверки параметров настройкиvirtualbool InitIndicators(CIndicators* indicators);
//--- методы генерации сигналов входа в рынокvirtualbool CheckOpenLong( double & price, double & sl, double & tp, datetime & expiration);
virtualbool CheckOpenShort( double & price, double & sl, double & tp, datetime & expiration);
//--- методы генерации сигналов модификации отложенных ордеровvirtualbool CheckTrailingOrderLong(COrderInfo* order, double & price);
virtualbool CheckTrailingOrderShort(COrderInfo* order, double & price);
protected :
//--- метод инициализации объектовbool InitMA(CIndicators* indicators);
bool InitOpen(CIndicators* indicators);
bool InitClose(CIndicators* indicators);
//--- методы доступа к данным объектовdouble MA( int index) { return (m_MA.Main(index)); }
double Open( int index) { return (m_open.GetData(index)); }
double Close( int index) { return (m_close.GetData(index)); }
};
//+------------------------------------------------------------------+//| Конструктор CSampleSignal. |//| INPUT: нет. |//| OUTPUT: нет. |//| REMARK: нет. |//+------------------------------------------------------------------+void CSampleSignal::CSampleSignal()
{
//--- установка значений по-умолчанию
m_period_ma = 12 ;
m_shift_ma = 6 ;
m_method_ma = MODE_EMA ;
m_applied_ma = PRICE_CLOSE ;
m_limit = 0.0 ;
m_stop_loss = 50.0 ;
m_take_profit= 50.0 ;
m_expiration = 10 ;
}
//+------------------------------------------------------------------+//| Проверка параметров настройки. |//| INPUT: нет. |//| OUTPUT: true-если настройки правильные, иначе false. |//| REMARK: нет. |//+------------------------------------------------------------------+bool CSampleSignal::ValidationSettings()
{
//--- проверка параметровif (m_period_ma<= 0 )
{
printf ( __FUNCTION__ + ": период скользящей средней должен быть больше нуля" );
return ( false );
}
//--- успешное завершениеreturn ( true );
}
//+------------------------------------------------------------------+//| Инициализация индикаторов и таймсерий. |//| INPUT: indicators - указатель на объект-коллекцию |//| индикаторов и таймсерий. |//| OUTPUT: true-в случае успешного завершения, иначе false. |//| REMARK: нет. |//+------------------------------------------------------------------+bool CSampleSignal::InitIndicators(CIndicators* indicators)
{
//--- проверка указателяif (indicators== NULL ) return ( false );
//--- инициализация скользящей среднейif (!InitMA(indicators)) return ( false );
//--- инициализация таймсерии цен открытияif (!InitOpen(indicators)) return ( false );
//--- инициализация таймсерии цен закрытияif (!InitClose(indicators)) return ( false );
//--- успешное завершениеreturn ( true );
}
//+------------------------------------------------------------------+//| Инициализация скользящей средней. |//| INPUT: indicators - указатель на объект-коллекцию |//| индикаторов и таймсерий. |//| OUTPUT: true-в случае успешного завершения, иначе false. |//| REMARK: нет. |//+------------------------------------------------------------------+bool CSampleSignal::InitMA(CIndicators* indicators)
{
//--- инициализация объекта скользящей среднейif (!m_MA.Create(m_symbol.Name(),m_period,m_period_ma,m_shift_ma,m_method_ma,m_applied_ma))
{
printf ( __FUNCTION__ + ": ошибка инициализации объекта" );
return ( false );
}
m_MA.BufferResize( 3 +m_shift_ma);
//--- добавление объекта в коллекциюif (!indicators.Add( GetPointer (m_MA)))
{
printf ( __FUNCTION__ + ": ошибка добавления объекта" );
return ( false );
}
//--- успешное завершениеreturn ( true );
}
//+------------------------------------------------------------------+//| Инициализация таймсерии цен открытия. |//| INPUT: indicators - указатель на объект-коллекцию |//| индикаторов и таймсерий. |//| OUTPUT: true-в случае успешного завершения, иначе false. |//| REMARK: нет. |//+------------------------------------------------------------------+bool CSampleSignal::InitOpen(CIndicators* indicators)
{
//--- инициализация объекта таймсерииif (!m_open.Create(m_symbol.Name(),m_period))
{
printf ( __FUNCTION__ + ": ошибка инициализации объекта" );
return ( false );
}
//--- добавление объекта в коллекциюif (!indicators.Add( GetPointer (m_open)))
{
printf ( __FUNCTION__ + ": ошибка добавления объекта" );
return ( false );
}
//--- успешное завершениеreturn ( true );
}
//+------------------------------------------------------------------+//| Инициализация таймсерии цен закрытия. |//| INPUT: indicators - указатель на объект-коллекцию |//| индикаторов и таймсерий. |//| OUTPUT: true-в случае успешного завершения, иначе false. |//| REMARK: нет. |//+------------------------------------------------------------------+bool CSampleSignal::InitClose(CIndicators* indicators)
{
//--- инициализация объекта таймсерииif (!m_close.Create(m_symbol.Name(),m_period))
{
printf ( __FUNCTION__ + ": ошибка инициализации объекта" );
return ( false );
}
//--- добавление объекта в коллекциюif (!indicators.Add( GetPointer (m_close)))
{
printf ( __FUNCTION__ + ": ошибка добавления объекта" );
return ( false );
}
//--- успешное завершениеreturn ( true );
}
//+------------------------------------------------------------------+//| Проверка выполнения условия для покупки. |//| INPUT: price - ссылка для размещения цены открытия, |//| sl - ссылка для размещения цены stop loss, |//| tp - ссылка для размещения цены take profit, |//| expiration - ссылка для размещения времени истечения. |//| OUTPUT: true-если условие выполнено, иначе false. |//| REMARK: нет. |//+------------------------------------------------------------------+bool CSampleSignal::CheckOpenLong( double & price, double & sl, double & tp, datetime & expiration)
{
//--- подготовка данныхdouble spread=m_symbol.Ask()-m_symbol.Bid();
double ma =MA( 1 );
double unit =PriceLevelUnit();
//--- проверка условияif (Open( 1 )<ma && Close( 1 )>ma && ma>MA( 2 ))
{
price=m_symbol.NormalizePrice(m_symbol.Bid()+m_limit*unit);
sl =m_symbol.NormalizePrice(price-m_stop_loss*unit);
tp =m_symbol.NormalizePrice(price+m_take_profit*unit);
expiration+=m_expiration* PeriodSeconds (m_period);
//--- условие выполненоreturn ( true );
}
//--- условие не выполненоreturn ( false );
}
//+------------------------------------------------------------------+//| Проверка выполнения условия для продажи. |//| INPUT: price - ссылка для размещения цены открытия, |//| sl - ссылка для размещения цены stop loss, |//| tp - ссылка для размещения цены take profit, |//| expiration - ссылка для размещения времени истечения. |//| OUTPUT: true-если условие выполнено, иначе false. |//| REMARK: нет. |//+------------------------------------------------------------------+bool CSampleSignal::CheckOpenShort( double & price, double & sl, double & tp, datetime & expiration)
{
//--- подготовка данныхdouble ma =MA( 1 );
double unit=PriceLevelUnit();
//--- проверка условияif (Open( 1 )>ma && Close( 1 )<ma && ma<MA( 2 ))
{
price=m_symbol.NormalizePrice(m_symbol.Bid()+m_limit*unit);
sl =m_symbol.NormalizePrice(price+m_stop_loss*unit);
tp =m_symbol.NormalizePrice(price-m_take_profit*unit);
expiration+=m_expiration* PeriodSeconds (m_period);
//--- условие выполненоreturn ( true );
}
//--- условие не выполненоreturn ( false );
}
//+------------------------------------------------------------------+//| Проверка выполнения условия для модификации ордера на покупку. |//| INPUT: order - указатель на объект-ордер, |//| price - ссылка для размещения новой цены открытия. |//| OUTPUT: true-если условие выполнено, иначе false. |//| REMARK: нет. |//+------------------------------------------------------------------+bool CSampleSignal::CheckTrailingOrderLong(COrderInfo* order, double & price)
{
//--- проверка указателяif (order== NULL ) return ( false );
//--- подготовка данныхdouble spread =m_symbol.Ask()-m_symbol.Bid();
double ma =MA( 1 );
double unit =PriceLevelUnit();
double new_price=m_symbol.NormalizePrice(ma-m_limit*unit+spread);
//--- проверка условияif (order.PriceOpen()==new_price) return ( false );
price=new_price;
//--- условие выполненоreturn ( true );
}
//+------------------------------------------------------------------+//| Проверка выполнения условия для модификации ордера на продажу. |//| INPUT: order - указатель на объект-ордер, |//| price - ссылка для размещения новой цены открытия. |//| OUTPUT: true-если условие выполнено, иначе false. |//| REMARK: нет. |//+------------------------------------------------------------------+bool CSampleSignal::CheckTrailingOrderShort(COrderInfo* order, double & price)
{
//--- проверка указателяif (order== NULL ) return ( false );
//--- подготовка данныхdouble ma =MA( 1 );
double unit=PriceLevelUnit();
double new_price=m_symbol.NormalizePrice(ma+m_limit*unit);
//--- проверка условияif (order.PriceOpen()==new_price) return ( false );
price=new_price;
//--- условие выполненоreturn ( true );
}
//+------------------------------------------------------------------+
Já compreendi que a programação não é para mim, mas consegui fazer amizade com o MQL5 Wizard. No entanto, ao compilar alguns módulos de sinais de negociação, recebo avisos. Quão críticos são estes avisos e, se possível, aconselhar sobre o que alterar no código do módulo de sinais de negociação para evitar os avisos mostrados na imagem.
Criou uma ferramenta tão excelente como o MQL5 Wizard para pessoas sem conhecimentos de programação que podem gerar Expert Advisors com base em módulos de negociação. O website da MQL5 contém muitos módulos de sinais comerciais interessantes que foram escritos há alguns anos por profissionais da MQL5 e outros membros do fórum da MQL5. A propósito,obrigado a todos vós pelo vosso trabalho! No entanto, há um pequeno "mas" que continua a dificultar todo o poder do MQL5 Wizard.
Devido ao facto de a linguagem de programação estar em constante desenvolvimento, peço-vos que criem um ramo que reflicta todas as nuances destas alterações e descreva as acções necessárias em termos de correcções de código, por exemplo, em módulos de sinais comerciais para evitar tais questões:
MrBrooklin:
Olá!
Aconselha-se o que deve ser corrigido no código do módulo Sinais de Negociação para evitar o aviso do compilador nessa linha, que está destacado a amarelo.
Atenciosamente, Vladimir.
Se a minha sugestão for aceitável, este tópico poderia ser intitulado, por exemplo, "Revisão dos Módulos de Sinais Comerciais".
Por favor, informe o que deve corrigir no código do módulo de sinais comerciais para excluir o aviso do compilador na linha destacada em amarelo.
Atenciosamente, Vladimir.
Porque se dirige ao objecto "m_symbol" num só lugar
int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe);
e depois de repente para Symbol():
int Bars_=Bars(Symbol(),m_Ind_Timeframe); // ПРЕДУПРЕЖДЕНИЕ В ЭТОЙ СТРОКЕ КОДА: deprecated behavior, hidden method calling will be disabled in a future MQL compiler version
Não deve fazer isso.
Para compreender porque é que de repente existe um aviso sobre a chamada do método oculto, basta colocar o cursor do rato no Símbolo e premir o botão central do rato: verá que existe tal método em
no ficheiro da ExpertBase.
Por conseguinte, deve utilizar o símbolo m_ no módulo de sinais.
Porque é que acede ao objecto "m_symbol" num só lugar
e depois de repente para Symbol():
Não deve fazer isso.
Obrigado, Vladimir, pela dica!
A questão é que este módulo foi descarregado do sítio web e simplesmente compilado no MetaEditor. Não realizei outras operações (por exemplo, alterações de código, etc.) como módulo de sinais comerciais e o aviso foi gerado pelo próprio compilador.
Olá.
Pode dizer-me, por favor, se existe alguma solução pronta para os testes de retrocesso por notícias?
Pode dizer-me o que está errado?
Como posso saber o lucro de uma posição fechada num bilhete?
Pode dizer-me o que está errado?
Como posso saber o lucro de uma posição fechada num bilhete?
Seleccionar todas as transacções na posição de ticketed e somar o lucro da transacção, a comissão e a troca.
Olá!
Por mim, já percebi que programação não é minha, mas consegui fazer amizade com o MQL5 Master. No entanto, ao compilar alguns módulos de sinais de negociação, aparecem avisos. Quão críticos são esses avisos e, se não forem difíceis, diga-me o que precisa ser corrigido no código do módulo de sinais de negociação para eliminar os avisos mostrados na imagem.
Com os melhores cumprimentos, Vladimir.
Código do módulo de sinais de negociação
Olá!
Já compreendi que a programação não é para mim, mas consegui fazer amizade com o MQL5 Wizard. No entanto, ao compilar alguns módulos de sinais de negociação, recebo avisos. Quão críticos são estes avisos e, se possível, aconselhar sobre o que alterar no código do módulo de sinais de negociação para evitar os avisos mostrados na imagem.
Com os melhores cumprimentos, Vladimir.
Código do Módulo de Sinal Comercial
A língua está a desenvolver-se.
Efectuar substituições: (ctrl+h)
m_open -> m_open_sample
m_close -> m_close_sample
m_expiration -> m_expiration_sample
A língua está a evoluir.
Efectuar substituições: (ctrl+h)
m_open -> m_open_sample
m_close -> m_close_sample
m_expiration -> m_expiration_sample
Obrigado, Vladimir, pela sua resposta rápida e clara. Todos os avisos foram eliminados.
Atenciosamente, Vladimir.
Olá!
Por favor, informe o que deve ser corrigido no código do módulo de sinais comerciais para excluir o aviso do compilador na linha destacada em amarelo.
Com os melhores cumprimentos, Vladimir.
Olá, caros programadores da MQL5!
Criou uma ferramenta tão excelente como o MQL5 Wizard para pessoas sem conhecimentos de programação que podem gerar Expert Advisors com base em módulos de negociação. O website da MQL5 contém muitos módulos de sinais comerciais interessantes que foram escritos há alguns anos por profissionais da MQL5 e outros membros do fórum da MQL5. A propósito,obrigado a todos vós pelo vosso trabalho! No entanto, há um pequeno "mas" que continua a dificultar todo o poder do MQL5 Wizard.
Devido ao facto de a linguagem de programação estar em constante desenvolvimento, peço-vos que criem um ramo que reflicta todas as nuances destas alterações e descreva as acções necessárias em termos de correcções de código, por exemplo, em módulos de sinais comerciais para evitar tais questões:
Olá!
Aconselha-se o que deve ser corrigido no código do módulo Sinais de Negociação para evitar o aviso do compilador nessa linha, que está destacado a amarelo.
Atenciosamente, Vladimir.
Se a minha sugestão for aceitável, este tópico poderia ser intitulado, por exemplo, "Revisão dos Módulos de Sinais Comerciais".
Atenciosamente, Vladimir.
Olá!
Por favor, informe o que deve corrigir no código do módulo de sinais comerciais para excluir o aviso do compilador na linha destacada em amarelo.
Atenciosamente, Vladimir.
Porque se dirige ao objecto "m_symbol" num só lugar
e depois de repente para Symbol():
Não deve fazer isso.
Para compreender porque é que de repente existe um aviso sobre a chamada do método oculto, basta colocar o cursor do rato no Símbolo e premir o botão central do rato: verá que existe tal método em
no ficheiro da ExpertBase.
Por conseguinte, deve utilizar o símbolo m_ no módulo de sinais.
Porque é que acede ao objecto "m_symbol" num só lugar
e depois de repente para Symbol():
Não deve fazer isso.
Obrigado, Vladimir, pela dica!
A questão é que este módulo foi descarregado do sítio web e simplesmente compilado no MetaEditor. Não realizei outras operações (por exemplo, alterações de código, etc.) como módulo de sinais comerciais e o aviso foi gerado pelo próprio compilador.
Atenciosamente, Vladimir.