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
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
Pour ma part, j'ai déjà réalisé que la programmation n'est pas la mienne, mais j'ai réussi à me lier d'amitié avec le MQL5 Master. Cependant, lors de la compilation de certains modules de signaux de trading, des avertissements apparaissent. Dans quelle mesure ces avertissements sont-ils critiques, et s'ils ne sont pas difficiles, dites-moi ce qui doit être corrigé dans le code du module des signaux de trading afin d'éliminer les avertissements affichés dans l'image.
Cordialement, Vladimir.
Code du module des signaux de trading
//+------------------------------------------------------------------+//| 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'ai déjà compris que la programmation n'est pas pour moi, mais j'ai réussi à me faire des amis avec l'assistant MQL5. Cependant, lors de la compilation de certains modules de signaux de trading, je reçois des avertissements. Quelle est la gravité de ces avertissements et, si possible, veuillez indiquer ce qu'il faut changer dans le code du module de signaux de trading pour éviter les avertissements montrés dans l'image.
Veuillez indiquer ce qui doit être corrigé dans le code du module de signaux de trading pour exclure l'avertissement du compilateur dans la ligne surlignée en jaune.
Vous avez créé un excellent outil comme l'assistant MQL5 pour les personnes n'ayant aucune connaissance en programmation qui peuvent générer des conseillers experts basés sur des modules de trading. Le site web du MQL5 contient de nombreux modules de signaux de trading intéressants qui ont été écrits il y a quelques années par des professionnels du MQL5 et d'autres membres du forum du MQL5. Au fait,merci à tous pour votre travail ! Cependant, il y a un petit "mais" qui continue à entraver la pleine puissance de l'assistant MQL5.
En raison du fait que le langage de programmation est en développement constant, je vous demande de créer une branche reflétant toutes les nuances de ces changements et décrivant les actions nécessaires en termes de corrections de code, par exemple, dans les modules de signaux de trading pour éviter de tels problèmes :
MrBrooklin:
Bonjour !
Veuillez indiquer ce que vous devez corriger dans le code du module Trading Signals pour éviter l'avertissement du compilateur dans cette ligne, qui est surlignée en jaune.
Sincèrement, Vladimir.
Si ma suggestion est acceptable, ce sujet pourrait être intitulé, par exemple, "Révision des modules de signaux de trading".
Veuillez indiquer ce que vous devez corriger dans le code du module de signaux de trading pour exclure l'avertissement du compilateur dans la ligne surlignée en jaune.
Sincèrement, Vladimir.
Pourquoi s'adresser à l'objet "m_symbol" à un seul endroit ?
int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe);
puis soudainement à Symbol() :
int Bars_=Bars(Symbol(),m_Ind_Timeframe); // ПРЕДУПРЕЖДЕНИЕ В ЭТОЙ СТРОКЕ КОДА: deprecated behavior, hidden method calling will be disabled in a future MQL compiler version
Tu ne devrais pas faire ça.
Pour comprendre pourquoi il y a soudainement un avertissement concernant l'appel de la méthode cachée, il suffit de placer le curseur de la souris sur Symbol et d'appuyer sur le bouton central de la souris : vous verrez qu'il existe une telle méthode dans le fichier
dans le fichier ExpertBase.
Par conséquent, vous devez utiliser m_symbol dans le module des signaux.
Pourquoi accéder à l'objet "m_symbol" à un seul endroit ?
puis soudainement à Symbol() :
Vous ne devriez pas faire ça.
Merci, Vladimir, pour le conseil !
Le fait est que ce module a été téléchargé du site web et simplement compilé dans MetaEditor. Je n'ai pas effectué d'autres opérations (par exemple, des modifications de code, etc.) avecle module de signaux de négociation et l'avertissement a été généré par le compilateur lui-même.
Bonjour.
Pouvez-vous me dire s'il existe une solution prête à l'emploi pour le backtesting par news ?
Pouvez-vous me dire ce qui ne va pas ?
Comment connaître le bénéfice d'une position fermée sur un ticket ?
Pouvez-vous me dire ce qui ne va pas ?
Comment connaître le bénéfice d'une position fermée sur un ticket ?
Sélectionnez toutes les transactions dans la position cochée et additionnez le bénéfice, la commission et le swap de la transaction.
Bonjour!
Pour ma part, j'ai déjà réalisé que la programmation n'est pas la mienne, mais j'ai réussi à me lier d'amitié avec le MQL5 Master. Cependant, lors de la compilation de certains modules de signaux de trading, des avertissements apparaissent. Dans quelle mesure ces avertissements sont-ils critiques, et s'ils ne sont pas difficiles, dites-moi ce qui doit être corrigé dans le code du module des signaux de trading afin d'éliminer les avertissements affichés dans l'image.
Cordialement, Vladimir.
Code du module des signaux de trading
Bonjour !
J'ai déjà compris que la programmation n'est pas pour moi, mais j'ai réussi à me faire des amis avec l'assistant MQL5. Cependant, lors de la compilation de certains modules de signaux de trading, je reçois des avertissements. Quelle est la gravité de ces avertissements et, si possible, veuillez indiquer ce qu'il faut changer dans le code du module de signaux de trading pour éviter les avertissements montrés dans l'image.
Meilleures salutations, Vladimir.
Code du module Trading Signal
La langue se développe.
Faire des substitutions : (ctrl+h)
m_open -> m_open_sample
m_close -> m_close_sample
m_expiration -> m_expiration_échantillon
La langue évolue.
Faire des substitutions : (ctrl+h)
m_open -> m_open_sample
m_close -> m_close_sample
m_expiration -> m_expiration_échantillon
Merci, Vladimir, pour votre réponse rapide et claire. Tous les avertissements ont été éliminés.
Sincèrement, Vladimir.
Bonjour !
Veuillez indiquer ce qui doit être corrigé dans le code du module de signaux de trading pour exclure l'avertissement du compilateur dans la ligne surlignée en jaune.
Meilleures salutations, Vladimir.
Bonjour, chers développeurs de MQL5 !
Vous avez créé un excellent outil comme l'assistant MQL5 pour les personnes n'ayant aucune connaissance en programmation qui peuvent générer des conseillers experts basés sur des modules de trading. Le site web du MQL5 contient de nombreux modules de signaux de trading intéressants qui ont été écrits il y a quelques années par des professionnels du MQL5 et d'autres membres du forum du MQL5. Au fait,merci à tous pour votre travail ! Cependant, il y a un petit "mais" qui continue à entraver la pleine puissance de l'assistant MQL5.
En raison du fait que le langage de programmation est en développement constant, je vous demande de créer une branche reflétant toutes les nuances de ces changements et décrivant les actions nécessaires en termes de corrections de code, par exemple, dans les modules de signaux de trading pour éviter de tels problèmes :
Bonjour !
Veuillez indiquer ce que vous devez corriger dans le code du module Trading Signals pour éviter l'avertissement du compilateur dans cette ligne, qui est surlignée en jaune.
Sincèrement, Vladimir.
Si ma suggestion est acceptable, ce sujet pourrait être intitulé, par exemple, "Révision des modules de signaux de trading".
Sincèrement, Vladimir.
Bonjour !
Veuillez indiquer ce que vous devez corriger dans le code du module de signaux de trading pour exclure l'avertissement du compilateur dans la ligne surlignée en jaune.
Sincèrement, Vladimir.
Pourquoi s'adresser à l'objet "m_symbol" à un seul endroit ?
puis soudainement à Symbol() :
Tu ne devrais pas faire ça.
Pour comprendre pourquoi il y a soudainement un avertissement concernant l'appel de la méthode cachée, il suffit de placer le curseur de la souris sur Symbol et d'appuyer sur le bouton central de la souris : vous verrez qu'il existe une telle méthode dans le fichier
dans le fichier ExpertBase.
Par conséquent, vous devez utiliser m_symbol dans le module des signaux.
Pourquoi accéder à l'objet "m_symbol" à un seul endroit ?
puis soudainement à Symbol() :
Vous ne devriez pas faire ça.
Merci, Vladimir, pour le conseil !
Le fait est que ce module a été téléchargé du site web et simplement compilé dans MetaEditor. Je n'ai pas effectué d'autres opérations (par exemple, des modifications de code, etc.) avecle module de signaux de négociation et l'avertissement a été généré par le compilateur lui-même.
Sincèrement, Vladimir.