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 mi parte, ya me di cuenta de que la programación no es lo mío, pero logré hacerme amigo del MQL5 Master. Sin embargo, al compilar algunos módulos de señales comerciales, aparecen advertencias. ¿Qué tan críticas son estas advertencias y, si no son difíciles, dígame qué debe corregirse en el código del módulo de señales comerciales para eliminar las advertencias que se muestran en la imagen?
Saludos cordiales, Vladímir.
Código del módulo de señales comerciales
//+------------------------------------------------------------------+//| 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 );
}
//+------------------------------------------------------------------+
Ya he comprendido que la programación no es para mí, pero he conseguido hacerme amigo del MQL5 Wizard. Sin embargo, al compilar algunos módulos de señales de comercio, recibo advertencias. ¿Qué tan críticos son estos avisos y, si es posible, por favor aconsejar sobre qué cambiar en el código del módulo de señales de comercio para evitar las advertencias que se muestran en la imagen.
Por favor, indique qué debe corregirse en el código del módulo de señales de comercio para excluir la advertencia del compilador en la línea resaltada en amarillo.
Habéis creado una herramienta tan excelente como el MQL5 Wizard para personas sin conocimientos de programación que pueden generar Asesores Expertos basados en módulos de trading. El sitio web de MQL5 contiene una gran cantidad de interesantes módulos de señales de trading que fueron escritos hace unos años por profesionales de MQL5 y otros miembros del foro de MQL5. Por cierto,¡gracias a todos por vuestro trabajo! Sin embargo, hay un pequeño "pero" que sigue obstaculizando toda la potencia del Asistente MQL5.
Debido a que el lenguaje de programación está en constante desarrollo, le pido que cree una rama que refleje todos los matices de estos cambios y que describa las acciones necesarias en términos de correcciones de código, por ejemplo, en los módulos de señales de comercio para evitar estos problemas:
MrBrooklin:
¡Hola!
Por favor, indíquenos qué debe arreglar en el código del módulo de Señales de Trading para evitar la advertencia del compilador en esa línea, que está resaltada en amarillo.
Sinceramente, Vladimir.
Si mi sugerencia es aceptable, este tema podría titularse, por ejemplo, "Revisión de los módulos de señales de comercio".
Por favor, indique qué debe corregir en el código del módulo de señales de trading para excluir la advertencia del compilador en la línea resaltada en amarillo.
Sinceramente, Vladimir.
¿Por qué se dirige al objeto "m_symbol" en un lugar
int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe);
y de repente a Symbol():
int Bars_=Bars(Symbol(),m_Ind_Timeframe); // ПРЕДУПРЕЖДЕНИЕ В ЭТОЙ СТРОКЕ КОДА: deprecated behavior, hidden method calling will be disabled in a future MQL compiler version
No deberías hacer eso.
Para entender por qué aparece de repente una advertencia sobre la llamada al método oculto, basta con situar el cursor del ratón sobre Symbol y pulsar el botón central del ratón: verá que existe dicho método en
en el archivo de ExpertBase.
Por lo tanto, debe utilizar m_symbol en el módulo de señales.
Por qué se accede al objeto "m_symbol" en un lugar
y de repente a Symbol():
No deberías hacer eso.
Gracias, Vladimir, por el consejo.
El caso es que este módulo se descargó del sitio web y simplemente se compiló en el MetaEditor. No he realizado ninguna otra operación (por ejemplo, cambios en el código, etc.) conel módulo de señales de comercio y la advertencia fue generada por el propio compilador.
Hola.
¿Pueden decirme si hay alguna solución preparada para el backtesting por noticias?
¿Puede decirme qué pasa?
¿Cómo puedo saber el beneficio de una posición cerrada en una entrada?
¿Puede decirme qué pasa?
¿Cómo puedo saber el beneficio de una posición cerrada en una entrada?
Seleccione todas las operaciones de la posición con ticket y sume el beneficio, la comisión y el intercambio de la operación.
¡Hola!
Por mi parte, ya me di cuenta de que la programación no es lo mío, pero logré hacerme amigo del MQL5 Master. Sin embargo, al compilar algunos módulos de señales comerciales, aparecen advertencias. ¿Qué tan críticas son estas advertencias y, si no son difíciles, dígame qué debe corregirse en el código del módulo de señales comerciales para eliminar las advertencias que se muestran en la imagen?
Saludos cordiales, Vladímir.
Código del módulo de señales comerciales
¡Hola!
Ya he comprendido que la programación no es para mí, pero he conseguido hacerme amigo del MQL5 Wizard. Sin embargo, al compilar algunos módulos de señales de comercio, recibo advertencias. ¿Qué tan críticos son estos avisos y, si es posible, por favor aconsejar sobre qué cambiar en el código del módulo de señales de comercio para evitar las advertencias que se muestran en la imagen.
Saludos cordiales, Vladimir.
Código del Módulo de Señales de Trading
El lenguaje se está desarrollando.
Hacer sustituciones: (ctrl+h)
m_open -> m_open_sample
m_close -> m_close_sample
m_expiración -> m_expiración_muestra
La lengua evoluciona.
Hacer sustituciones: (ctrl+h)
m_open -> m_open_sample
m_close -> m_close_sample
m_expiración -> m_expiración_muestra
Gracias, Vladimir, por tu rápida y clara respuesta. Se han eliminado todas las advertencias.
Sinceramente, Vladimir.
¡Hola!
Por favor, indique qué debe corregirse en el código del módulo de señales de comercio para excluir la advertencia del compilador en la línea resaltada en amarillo.
Saludos cordiales, Vladimir.
¡Hola, queridos desarrolladores de MQL5!
Habéis creado una herramienta tan excelente como el MQL5 Wizard para personas sin conocimientos de programación que pueden generar Asesores Expertos basados en módulos de trading. El sitio web de MQL5 contiene una gran cantidad de interesantes módulos de señales de trading que fueron escritos hace unos años por profesionales de MQL5 y otros miembros del foro de MQL5. Por cierto,¡gracias a todos por vuestro trabajo! Sin embargo, hay un pequeño "pero" que sigue obstaculizando toda la potencia del Asistente MQL5.
Debido a que el lenguaje de programación está en constante desarrollo, le pido que cree una rama que refleje todos los matices de estos cambios y que describa las acciones necesarias en términos de correcciones de código, por ejemplo, en los módulos de señales de comercio para evitar estos problemas:
¡Hola!
Por favor, indíquenos qué debe arreglar en el código del módulo de Señales de Trading para evitar la advertencia del compilador en esa línea, que está resaltada en amarillo.
Sinceramente, Vladimir.
Si mi sugerencia es aceptable, este tema podría titularse, por ejemplo, "Revisión de los módulos de señales de comercio".
Sinceramente, Vladimir.
¡Hola!
Por favor, indique qué debe corregir en el código del módulo de señales de trading para excluir la advertencia del compilador en la línea resaltada en amarillo.
Sinceramente, Vladimir.
¿Por qué se dirige al objeto "m_symbol" en un lugar
y de repente a Symbol():
No deberías hacer eso.
Para entender por qué aparece de repente una advertencia sobre la llamada al método oculto, basta con situar el cursor del ratón sobre Symbol y pulsar el botón central del ratón: verá que existe dicho método en
en el archivo de ExpertBase.
Por lo tanto, debe utilizar m_symbol en el módulo de señales.
Por qué se accede al objeto "m_symbol" en un lugar
y de repente a Symbol():
No deberías hacer eso.
Gracias, Vladimir, por el consejo.
El caso es que este módulo se descargó del sitio web y simplemente se compiló en el MetaEditor. No he realizado ninguna otra operación (por ejemplo, cambios en el código, etc.) conel módulo de señales de comercio y la advertencia fue generada por el propio compilador.
Sinceramente, Vladimir.