I have created an EA using mql5 generator. In this case, it does not use grid, but it is not necessary, since the problem starts directly from the function double TradesCenterPrice(ENUM_ORDER_TYPE type)
Of course, the question is posted on the forum because it doesn't use a custom library. Use the library #include <Trade\PositionInfo.mqh>
Remember, the problem is that, when executing this function, the BUY price is obtained even when what is there is a SELL
The library is in the attachments
Let's see the code of the EA (Created adhoc for the forum to try to reproduce the bug with the CPositionInfo library): The code is in the attachments
//+------------------------------------------------------------------+//| Forum EA.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2022, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"//+------------------------------------------------------------------+//| Include |//+------------------------------------------------------------------+#include <Expert\Expert.mqh>
//--- available signals#include <Expert\Signal\SignalMACD.mqh>
//--- available trailing#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management#include <Expert\Money\MoneyFixedLot.mqh>
#include <Trade\PositionInfo.mqh>
CPositionInfo Position;
//+------------------------------------------------------------------+//| Inputs |//+------------------------------------------------------------------+//--- inputs for expertinputstring Expert_Title ="Forum EA"; // Document nameulong Expert_MagicNumber =15438; //bool Expert_EveryTick =false; ////--- inputs for main signalinputint Signal_ThresholdOpen =10; // Signal threshold value to open [0...100]inputint Signal_ThresholdClose =10; // Signal threshold value to close [0...100]inputdouble Signal_PriceLevel =0.0; // Price level to execute a dealinputdouble Signal_StopLevel =50.0; // Stop Loss level (in points)inputdouble Signal_TakeLevel =50.0; // Take Profit level (in points)inputint Signal_Expiration =4; // Expiration of pending orders (in bars)inputint Signal_MACD_PeriodFast =12; // MACD(12,24,9,PRICE_CLOSE) Period of fast EMAinputint Signal_MACD_PeriodSlow =24; // MACD(12,24,9,PRICE_CLOSE) Period of slow EMAinputint Signal_MACD_PeriodSignal=9; // MACD(12,24,9,PRICE_CLOSE) Period of averaging of differenceinputENUM_APPLIED_PRICE Signal_MACD_Applied =PRICE_CLOSE; // MACD(12,24,9,PRICE_CLOSE) Prices seriesinputdouble Signal_MACD_Weight =1.0; // MACD(12,24,9,PRICE_CLOSE) Weight [0...1.0]//--- inputs for moneyinputdouble Money_FixLot_Percent =10.0; // Percentinputdouble Money_FixLot_Lots =0.1; // Fixed volume//+------------------------------------------------------------------+//| Global expert object |//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+//| Initialization function of the expert |//+------------------------------------------------------------------+intOnInit()
{
//--- Initializing expertif(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
{
//--- failedprintf(__FUNCTION__+": error initializing expert");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Creating signal
CExpertSignal *signal=new CExpertSignal;
if(signal==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating signal");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.StopLevel(Signal_StopLevel);
signal.TakeLevel(Signal_TakeLevel);
signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalMACD
CSignalMACD *filter0=new CSignalMACD;
if(filter0==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating filter0");
ExtExpert.Deinit();
return(INIT_FAILED);
}
signal.AddFilter(filter0);
//--- Set filter parameters
filter0.PeriodFast(Signal_MACD_PeriodFast);
filter0.PeriodSlow(Signal_MACD_PeriodSlow);
filter0.PeriodSignal(Signal_MACD_PeriodSignal);
filter0.Applied(Signal_MACD_Applied);
filter0.Weight(Signal_MACD_Weight);
//--- Creation of trailing object
CTrailingNone *trailing=new CTrailingNone;
if(trailing==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating trailing");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Add trailing to expert (will be deleted automatically))if(!ExtExpert.InitTrailing(trailing))
{
//--- failedprintf(__FUNCTION__+": error initializing trailing");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Set trailing parameters//--- Creation of money object
CMoneyFixedLot *money=new CMoneyFixedLot;
if(money==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating money");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Add money to expert (will be deleted automatically))if(!ExtExpert.InitMoney(money))
{
//--- failedprintf(__FUNCTION__+": error initializing money");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Set money parameters
money.Percent(Money_FixLot_Percent);
money.Lots(Money_FixLot_Lots);
//--- Check all trading objects parametersif(!ExtExpert.ValidationSettings())
{
//--- failed
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Tuning of all necessary indicatorsif(!ExtExpert.InitIndicators())
{
//--- failedprintf(__FUNCTION__+": error initializing indicators");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- okreturn(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Deinitialization function of the expert |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+//| "Tick" event handler function |//+------------------------------------------------------------------+voidOnTick()
{
ExtExpert.OnTick();
Comment("Center Price Buys: ",TradesCenterPrice(ORDER_TYPE_BUY),
"\nCenter Price Sells: ",TradesCenterPrice(ORDER_TYPE_SELL));
}
//+------------------------------------------------------------------+//| "Trade" event handler function |//+------------------------------------------------------------------+voidOnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+//| "Timer" event handler function |//+------------------------------------------------------------------+voidOnTimer()
{
ExtExpert.OnTimer();
}
double TradesCenterPrice(ENUM_ORDER_TYPE type)
{
double center = 0;
int count = 0;
for(int i = 0; i < PositionsTotal(); i++)
{
if(Position.SelectByIndex(i) && Position.Type() == type)
{
center += Position.PriceOpen();
count++;
}
}
if(count == 0)
return 0;
return center / count;
}
And let's see the result of Comment even when it looks like what's on the chart is a SELL trade. (The comment shows the price for BUY, not for SELL)
Center Price Buys: 1.23096
Center Price Sells: 0.0
I think it is unnecessary to respond to the accusations that have been made here. It seems to me that the forum is to collaborate, not to discuss.
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
I have created an EA using mql5 generator. In this case, it does not use grid, but it is not necessary, since the problem starts directly from the function double TradesCenterPrice(ENUM_ORDER_TYPE type)
Of course, the question is posted on the forum because it doesn't use a custom library. Use the library #include <Trade\PositionInfo.mqh>
Remember, the problem is that, when executing this function, the BUY price is obtained even when what is there is a SELL
The library is in the attachments
Let's see the code of the EA (Created adhoc for the forum to try to reproduce the bug with the CPositionInfo library): The code is in the attachments
And let's see the result of Comment even when it looks like what's on the chart is a SELL trade. (The comment shows the price for BUY, not for SELL)
Center Price Buys: 1.23096
Center Price Sells: 0.0
I think it is unnecessary to respond to the accusations that have been made here. It seems to me that the forum is to collaborate, not to discuss.
How do you know that they've made an update to this class recently?
I assume they have since the bug that returned wrong tickets 15 days ago . That was critical too . But it is an assumption as there are no announcements.
But you weren't very cooperative, and I've suspected that maybe there is a potentially serious bug,
And also you caught me in a bad day in general.
My apologise for this.
I will not be able to check this until tomorrow (as I am away from my computer),
But I'm pretty certain that I've found the problem in your code (well, 2 problems actually).
Your name choice of the CPositionInfo instance is what made this one slip from my eyes,
But now, after giving a closer look to the code you've provided today, I had noticed it.
Firstly-
The function that returns the position type is PositionType(),
Since you've named the CPositionInfo instance 'Position', at a glance it is easily missed, as it still reads as Position Type,
However, in your code you are calling Type() and not PositionType(),
So code should be changed from-
To-
Second-
PositionType() return is of type ENUM_POSITION_TYPE and not ENUM_ORDER_TYPE,
So below should also be changed from this-
To this-
So it seems that CPositionInfo is no longer a suspect for this bug.
I think you may be right. Since a value was returned I didn't think that precisely that could be wrong. I'll check it tomorrow when I start work. Thank you for your answer, it has been very clever!!!
Allow the use of cookies to log in to the MQL5.com website.
Please enable the necessary setting in your browser, otherwise you will not be able to log in.
You are signed in. Two-factor authentication has been disabled. Set it up again and scan a new QR code, or continue with two-factor authentication disabled.
Of course, the question is posted on the forum because it doesn't use a custom library. Use the library #include <Trade\PositionInfo.mqh>
Remember, the problem is that, when executing this function, the BUY price is obtained even when what is there is a SELL
The library is in the attachments
Let's see the code of the EA (Created adhoc for the forum to try to reproduce the bug with the CPositionInfo library): The code is in the attachments
And let's see the result of Comment even when it looks like what's on the chart is a SELL trade. (The comment shows the price for BUY, not for SELL)
Center Price Buys: 1.23096
Center Price Sells: 0.0
I think it is unnecessary to respond to the accusations that have been made here. It seems to me that the forum is to collaborate, not to discuss.
Of course, the question is posted on the forum because it doesn't use a custom library. Use the library #include <Trade\PositionInfo.mqh>
Remember, the problem is that, when executing this function, the BUY price is obtained even when what is there is a SELL
The library is in the attachments
Let's see the code of the EA (Created adhoc for the forum to try to reproduce the bug with the CPositionInfo library): The code is in the attachments
And let's see the result of Comment even when it looks like what's on the chart is a SELL trade. (The comment shows the price for BUY, not for SELL)
Center Price Buys: 1.23096
Center Price Sells: 0.0
I think it is unnecessary to respond to the accusations that have been made here. It seems to me that the forum is to collaborate, not to discuss.
Thanks , that helps a lot
Hey
How do you know that they've made an update to this class recently?
I assume they have since the bug that returned wrong tickets 15 days ago . That was critical too . But it is an assumption as there are no announcements.
Sorry if I came off as a bit tough/harsh,
But you weren't very cooperative, and I've suspected that maybe there is a potentially serious bug,
And also you caught me in a bad day in general.
My apologise for this.
I will not be able to check this until tomorrow (as I am away from my computer),
But I'm pretty certain that I've found the problem in your code (well, 2 problems actually).
Your name choice of the CPositionInfo instance is what made this one slip from my eyes,
But now, after giving a closer look to the code you've provided today, I had noticed it.
Firstly-
The function that returns the position type is PositionType(),
Since you've named the CPositionInfo instance 'Position', at a glance it is easily missed, as it still reads as Position Type,
However, in your code you are calling Type() and not PositionType(),
So code should be changed from-
To-
Second-
PositionType() return is of type ENUM_POSITION_TYPE and not ENUM_ORDER_TYPE,
So below should also be changed from this-
To this-
So it seems that CPositionInfo is no longer a suspect for this bug.
Sorry if I came off as a bit tough/harsh,
But you weren't very cooperative, and I've suspected that maybe there is a potentially serious bug,
And also you caught me in a bad day in general.
My apologise for this.
I will not be able to check this until tomorrow (as I am away from my computer),
But I'm pretty certain that I've found the problem in your code (well, 2 problems actually).
Your name choice of the CPositionInfo instance is what made this one slip from my eyes,
But now, after giving a closer look to the code you've provided today, I had noticed it.
Firstly-
The function that returns the position type is PositionType(),
Since you've named the CPositionInfo instance 'Position', at a glance it is easily missed, as it still reads as Position Type,
However, in your code you are calling Type() and not PositionType(),
So code should be changed from-
To-
Second-
PositionType() return is of type ENUM_POSITION_TYPE and not ENUM_ORDER_TYPE,
So below should also be changed from this-
To this-
So it seems that CPositionInfo is no longer a suspect for this bug.
Sorry if I came off as a bit tough/harsh,
But you weren't very cooperative, and I've suspected that maybe there is a potentially serious bug,
And also you caught me in a bad day in general.
My apologise for this.
I will not be able to check this until tomorrow (as I am away from my computer),
But I'm pretty certain that I've found the problem in your code (well, 2 problems actually).
Your name choice of the CPositionInfo instance is what made this one slip from my eyes,
But now, after giving a closer look to the code you've provided today, I had noticed it.
Firstly-
The function that returns the position type is PositionType(),
Since you've named the CPositionInfo instance 'Position', at a glance it is easily missed, as it still reads as Position Type,
However, in your code you are calling Type() and not PositionType(),
So code should be changed from-
To-
Second-
PositionType() return is of type ENUM_POSITION_TYPE and not ENUM_ORDER_TYPE,
So below should also be changed from this-
To this-
So it seems that CPositionInfo is no longer a suspect for this bug.
wow , good catch