Class 如何从类中读取函数值?
如何在类中读取函数的值 我想在Class 如何从类中读取函数值?,class,trading,mql5,Class,Trading,Mql5,如何在类中读取函数的值 我想在void OnTick(){…} // Print( fican.CheckPatternAllBullish() ); 错误:“candlepatterns.mqh”(60,64)中的指针访问无效 第60行是: double Open(int ind) const { return(m_open.GetData(ind)); 代码是: #include <Expert\Expert.mqh> #include <candlepat
void OnTick(){…}
// Print( fican.CheckPatternAllBullish() );
错误:“candlepatterns.mqh”(60,64)中的指针访问无效
第60行是:
double Open(int ind) const { return(m_open.GetData(ind));
代码是:
#include <Expert\Expert.mqh>
#include <candlepatterns.mqh>
ulong Expert_MagicNumber =3434; //
bool Expert_EveryTick =false; //
//+------------------------------------------------------------------+
//| Global expert object |
//+------------------------------------------------------------------+
CExpert ExtExpert;
CCandlePattern fican;
//+------------------------------------------------------------------+
//| Initialization function of the expert |
//+------------------------------------------------------------------+
int OnInit(){
if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) {//--- failed
printf(__FUNCTION__+": error initializing expert"); ExtExpert.Deinit(); return(INIT_FAILED); }
//--- Creating signal
CExpertSignal *signal = new CExpertSignal;
if(signal==NULL){ printf(__FUNCTION__+": error creating signal"); ExtExpert.Deinit(); return(INIT_FAILED); }
ExtExpert.InitSignal(signal);
//CIndicators *indicators = new CIndicators;
//if(indicators==NULL){ printf(__FUNCTION__+": IND NIJE dignut signal"); ExtExpert.Deinit(); return(INIT_FAILED); }
//ExtExpert.InitIndicators(indicators);
//--- Creating filter CMySignalEnvelopes
//CMySignalEnvelopes *filter0=new CMySignalEnvelopes;
CCandlePattern *filter0 = new CCandlePattern;
if(filter0==NULL){ printf(__FUNCTION__+": error creating filter0"); ExtExpert.Deinit(); return(INIT_FAILED); }
filter0.InitSignal(signal);
filter0.InitIndicators();
filter0.MAPeriod(22);
filter0.ValidationSettings();
signal.AddFilter(filter0); //--- Set filter parameters
//--- Tuning of all necessary indicators
if(!ExtExpert.InitIndicators()){ printf(__FUNCTION__+": error initializing indicators"); ExtExpert.Deinit(); return(INIT_FAILED); }
//if(!filter0.InitIndicators(indicators)){ printf(__FUNCTION__+": error initializing CC "); ExtExpert.Deinit(); return(INIT_FAILED); }
//filter0.ValidationSettings();
//filter0.InitSignal(signal);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| "Tick" event handler function |
//+------------------------------------------------------------------+
void OnTick(){
ExtExpert.OnTick();
//fican.InitIndicators();
//fican.CheckPatternAllBullish();
//Print(fican.CheckPatternAllBullish());
Print("Read price "+ExtExpert.Low(0)+" O1 "+ExtExpert.Open(1)+" C1 "+ExtExpert.Close(1)+" O2 "+ExtExpert.Open(2));
}
//+------------------------------------------------------------------+
//| Deinitialization function of the expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| "Trade" event handler function |
//+------------------------------------------------------------------+
void OnTrade(){
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| "Timer" event handler function |
//+------------------------------------------------------------------+
void OnTimer(){
ExtExpert.OnTimer();
}
错误:“candlepatterns.mqh”(162,20)中的指针访问无效
不清楚您的
烛台模式中的第162行是什么。mqh
,您可以自己检查,它在bool CCandlePattern::InitMA(CIndicators*指示器)
函数附近或中,或者可能在上面、下面-真的不知道是否要将文件复制到记事本中-它显示一个空白行是162。请指出这一点(可能是截图,或者只是告诉函数名和行本身),然后让我们进一步讨论
如果它在
boolcandlepattern::InitMA(CIndicators*indicators)
函数中,那么OnInit()
函数没有正确完成,我想这是最简单的方法——添加一行printf(“%I%s-successful”,\uuuuuuuuuuu line\uuu函数)代码>或只是看看EA是否成功加载到图表上,但我认为它没有,并且在您声明filter0
后初始化过程中的某个地方失败了,因此您需要调试以查看哪一行成功通过,哪一行没有通过(为此,请尝试if(!filter0.InitSignal(signal)){printf(“%i%s-错误”,uuu LINE uuuu,uuu FUNCTION uuu)/*和expert deinit?*/}
对于该行和下面提到的filter0
行,如果这些函数是布尔函数(可能MQ5开发人员将这些函数设置为布尔函数以帮助检测错误?)感谢您的回复感谢您的回复错误“candlepatterns.mqh”(60,64)第60行中的无效指针访问是双开(int-ind)常量{return(m_-Open.GetData(ind));好的,filter0.InitIndicators();”意味着什么?似乎您必须在该函数中传递
CIndicator*ind`作为引用(第43行)?下一步:如果(!ExtExpert.InitIndicators())
-ea文件中的同一个问题,您确定其中不需要任何指示器(我指的是您的CCandlePattern)?如果是,那么我将尝试声明过滤器0
,然后声明信号
,然后将它们与信号.AddFilter(过滤器0)匹配
最后是ExtExpert.InitSignal(signal);
inOnInit()
最后,当我得到这个打印时,我只想得到checkpatternallbulish()的结果(“读取价格”+ExtExpert.Low(0)+“O1”+ExtExpert.Open(1)+“C1”+ExtExpert.Close(1)+“O2”+ExtExpert.Open(2));你能帮我怎么做吗?你把那一行放在哪里以及你收到了什么?你有三个问题要分析并认为自己-null
被传递到InitIndicators()
;Ext.InitIndicators()
(但现在可能不太重要);并重新安排顺序,看看它是否工作得更好
#include <Expert\ExpertSignal.mqh>
//+------------------------------------------------------------------+
//| enumerators |
//+------------------------------------------------------------------+
enum ENUM_CANDLE_PATTERNS // candlestick patterns
{
CANDLE_PATTERN_THREE_BLACK_CROWS = 1,
CANDLE_PATTERN_THREE_WHITE_SOLDIERS = 2,
CANDLE_PATTERN_DARK_CLOUD_COVER = 3,
CANDLE_PATTERN_PIERCING_LINE = 4,
CANDLE_PATTERN_MORNING_DOJI = 5,
CANDLE_PATTERN_EVENING_DOJI = 6,
CANDLE_PATTERN_BEARISH_ENGULFING = 7,
CANDLE_PATTERN_BULLISH_ENGULFING = 8,
CANDLE_PATTERN_EVENING_STAR = 9,
CANDLE_PATTERN_MORNING_STAR = 10,
CANDLE_PATTERN_HAMMER = 11,
CANDLE_PATTERN_HANGING_MAN = 12,
CANDLE_PATTERN_BEARISH_HARAMI = 13,
CANDLE_PATTERN_BULLISH_HARAMI = 14,
CANDLE_PATTERN_BEARISH_MEETING_LINES = 15,
CANDLE_PATTERN_BULLISH_MEETING_LINES = 16
};
//+------------------------------------------------------------------+
//| CCandlePattern class. |
//| Derived from CExpertSignal class. |
//+------------------------------------------------------------------+
class CCandlePattern : public CExpertSignal
{
protected:
//--- indicators
CiMA m_MA;
//--- input parameters
int m_ma_period;
CExpertSignal *m_signal; // storing the pointer to the main signal
public:
//--- class constructor
CCandlePattern();
//--- input parameters initialization methods
void MAPeriod(int period) { m_ma_period=period; }
//--- initialization
virtual bool ValidationSettings();
virtual bool InitIndicators(CIndicators *indicators);
//--- method of setting the pointer to the main signal
virtual bool InitSignal(CExpertSignal *signal=NULL);
//--- method for checking of a certiain candlestick pattern
bool CheckCandlestickPattern(ENUM_CANDLE_PATTERNS CandlePattern);
//--- methods for checking of bullish/bearish candlestick pattern
bool CheckPatternAllBullish();
bool CheckPatternAllBearish();
protected:
//--- indicators initialization methods
bool InitMA(CIndicators *indicators);
//--- methods, used for check of the candlestick pattern formation
double AvgBody(int ind);
double MA(int ind) const { return(m_MA.Main(ind)); }
double Open(int ind) const { return(m_open.GetData(ind)); }
double High(int ind) const { return(m_high.GetData(ind)); }
double Low(int ind) const { return(m_low.GetData(ind)); }
double Close(int ind) const { return(m_close.GetData(ind)); }
double CloseAvg(int ind) const { return(MA(ind)); }
double MidPoint(int ind) const { return(0.5*(High(ind)+Low(ind))); }
double MidOpenClose(int ind) const { return(0.5*(Open(ind)+Close(ind))); }
//--- methods for checking of candlestick patterns
bool CheckPatternThreeBlackCrows();
bool CheckPatternThreeWhiteSoldiers();
bool CheckPatternDarkCloudCover();
bool CheckPatternPiercingLine();
bool CheckPatternMorningDoji();
bool CheckPatternEveningDoji();
bool CheckPatternBearishEngulfing();
bool CheckPatternBullishEngulfing();
bool CheckPatternEveningStar();
bool CheckPatternMorningStar();
bool CheckPatternHammer();
bool CheckPatternHangingMan();
bool CheckPatternBearishHarami();
bool CheckPatternBullishHarami();
bool CheckPatternBearishMeetingLines();
bool CheckPatternBullishMeetingLines();
};
//+------------------------------------------------------------------+
//| CCandlePattern class constructor. |
//| INPUT: no. |
//| OUTPUT: no. |
//| REMARK: no. |
//+------------------------------------------------------------------+
void CCandlePattern::CCandlePattern(){
//--- initialization of protected data
m_used_series=USE_SERIES_OPEN+USE_SERIES_HIGH+USE_SERIES_LOW+USE_SERIES_CLOSE;
//--- set default inputs
m_ma_period=12;
}
//+------------------------------------------------------------------+
//| Validation settings. |
//| INPUT: no. |
//| OUTPUT: true-if settings are correct, false otherwise. |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CCandlePattern::ValidationSettings(){
//--- validation settings of additional filters
if(!CExpertSignal::ValidationSettings()) return(false);
//--- initial data checks
if(m_ma_period<=0)
{
printf(__FUNCTION__+": period MA must be greater than 0");
return(false);
}
//--- ok
return(true);
}
//+------------------------------------------------------------------+
//| Create MA, Open, High, Low and Close time series |
//| INPUT: indicators -pointer of indicator collection. |
//| OUTPUT: true-if successful, false otherwise. |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CCandlePattern::InitIndicators(CIndicators *indicators)
{
//--- check collection
if(indicators==NULL) return(false);
//--- create and initialize MA indicator
if(!InitMA(indicators)) return(false);
//--- create and initialize Open series
if(!InitOpen(indicators)) return(false);
//--- create and initialize High series
if(!InitHigh(indicators)) return(false);
//--- create and initialize Low series
if(!InitLow(indicators)) return(false);
//--- create and initialize Close series
if(!InitClose(indicators)) return(false);
//--- ok
return(true);
}
//+------------------------------------------------------------------+
//| Create MA indicators. |
//| INPUT: indicators -pointer of indicator collection. |
//| OUTPUT: true-if successful, false otherwise. |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CCandlePattern::InitMA(CIndicators *indicators)
{
//--- add MA indicator to collection
if(!indicators.Add(GetPointer(m_MA)))
{
printf(__FUNCTION__+": error adding object");
return(false);
}
//--- initialize MA indicator
if(!m_MA.Create(m_symbol.Name(),m_period,m_ma_period,0,MODE_SMA,PRICE_CLOSE))
{
printf(__FUNCTION__+": error initializing object");
return(false);
}
//--- resize MA buffer
m_MA.BufferResize(50);
//--- ok
return(true);
}
//+------------------------------------------------------------------+
//| Returns the averaged value of candle body size |
//+------------------------------------------------------------------+
double CCandlePattern::AvgBody(int ind){
double candle_body=0;
///--- calculate the averaged size of the candle's body
for(int i=ind; i<ind+m_ma_period; i++){
candle_body+=MathAbs(Open(i)-Close(i));
}
candle_body=candle_body/m_ma_period;
///--- return body size
return(candle_body);
}
//+------------------------------------------------------------------+
//| Checks formation of bullish patterns |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternAllBullish(){
Print("Tuka sam "+Open(1));
return true ;
return(CheckPatternThreeWhiteSoldiers() ||
CheckPatternPiercingLine() ||
CheckPatternMorningDoji() ||
CheckPatternBullishEngulfing() ||
CheckPatternBullishHarami() ||
CheckPatternMorningStar() ||
CheckPatternBullishMeetingLines());
}
//+------------------------------------------------------------------+
//| Checks formation of bearish patterns |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternAllBearish(){
return(CheckPatternThreeBlackCrows() ||
CheckPatternDarkCloudCover() ||
CheckPatternEveningDoji() ||
CheckPatternBearishEngulfing() ||
CheckPatternBearishHarami() ||
CheckPatternEveningStar() ||
CheckPatternBearishMeetingLines());
}
//+------------------------------------------------------------------+
//| Checks formation of Three Black Crows candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternThreeBlackCrows()
{
//--- 3 Black Crows
if((Open(3)-Close(3)>AvgBody(1)) && // long black
(Open(2)-Close(2)>AvgBody(1)) &&
(Open(1)-Close(1)>AvgBody(1)) &&
(MidPoint(2)<MidPoint(3)) && // lower midpoints
(MidPoint(1)<MidPoint(2)))
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Three White Soldiers candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternThreeWhiteSoldiers()
{
//--- 3 White Soldiers
if((Close(3)-Open(3)>AvgBody(1)) && // long white
(Close(2)-Open(2)>AvgBody(1)) &&
(Close(1)-Open(1)>AvgBody(1)) &&
(MidPoint(2)>MidPoint(3)) && // higher midpoints
(MidPoint(1)>MidPoint(2)))
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Dark Cloud Cover candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternDarkCloudCover()
{
//--- Dark cloud cover
if((Close(2)-Open(2)>AvgBody(1)) && // long white
(Close(1)<Close(2)) && // close within previous body
(Close(1)>Open(2)) &&
(MidOpenClose(2)>CloseAvg(1)) && // uptrend
(Open(1)>High(2))) // open at new high
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Piercing Line candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternPiercingLine()
{
//--- Piercing Line
if((Close(1)-Open(1)>AvgBody(1)) && // long white
(Open(2)-Close(2)>AvgBody(1)) && // long black
(Close(2)>Close(1)) && // close inside previous body
(Close(1)<Open(2)) &&
(MidOpenClose(2)<CloseAvg(2)) && // downtrend
(Open(1)<Low(2))) // close inside previous body
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Morning Doji candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternMorningDoji()
{
//--- Morning Doji
if((Open(3)-Close(3)>AvgBody(1)) &&
(AvgBody(2)<AvgBody(1)*0.1) &&
(Close(2)<Close(3)) &&
(Open(2)<Open(3)) &&
(Open(1)>Close(2)) &&
(Close(1)>Close(2)))
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Evening Doji candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternEveningDoji()
{
//--- Evening Doji
if((Close(3)-Open(3)>AvgBody(1)) &&
(AvgBody(2)<AvgBody(1)*0.1) &&
(Close(2)>Close(3)) &&
(Open(2)>Open(3)) &&
(Open(1)<Close(2)) &&
(Close(1)<Close(2)))
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Bearish Engulfing candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternBearishEngulfing()
{
//--- Bearish Engulfing
if((Open(2)<Close(2)) &&
(Open(1)-Close(1)>AvgBody(1)) &&
(Close(1)<Open(2)) &&
(MidOpenClose(2)>CloseAvg(2)) &&
(Open(1)>Close(2)))
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Bullish Engulfing candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternBullishEngulfing()
{
//--- Bullish Engulfing
if((Open(2)>Close(2)) &&
(Close(1)-Open(1)>AvgBody(1)) &&
(Close(1)>Open(2)) &&
(MidOpenClose(2)<CloseAvg(2)) &&
(Open(1)<Close(2)))
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Evening Star candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternEveningStar()
{
//--- Evening Star
if((Close(3)-Open(3)>AvgBody(1)) &&
(MathAbs(Close(2)-Open(2))<AvgBody(1)*0.5) &&
(Close(2)>Close(3)) &&
(Open(2)>Open(3)) &&
(Close(1)<MidOpenClose(3)))
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Morning Star candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternMorningStar()
{
//--- Morning Star
if((Open(3)-Close(3)>AvgBody(1)) &&
(MathAbs(Close(2)-Open(2))<AvgBody(1)*0.5) &&
(Close(2)<Close(3)) &&
(Open(2)<Open(3)) &&
(Close(1)>MidOpenClose(3)))
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Hammer candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternHammer()
{
//--- Hammer
if((MidPoint(1)<CloseAvg(2)) && // down trend
(MathMin(Open(1),Close(1))>(High(1)-(High(1)-Low(1))/3.0)) && // body in upper 1/3
(Close(1)<Close(2)) && (Open(1)<Open(2))) // body gap
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Hanging Man candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternHangingMan()
{
//--- Hanging man
if((MidPoint(1)>CloseAvg(2)) && // up trend
(MathMin(Open(1),Close(1)>(High(1)-(High(1)-Low(1))/3.0)) && // body in upper 1/3
(Close(1)>Close(2)) && (Open(1)>Open(2)))) // body gap
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Bearish Harami candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternBearishHarami()
{
//--- Bearish Harami
if((Close(1)<Open(1)) && // black day
((Close(2)-Open(2))>AvgBody(1)) && // long white
((Close(1)>Open(2)) &&
(Open(1)<Close(2))) && // engulfment
(MidPoint(2)>CloseAvg(2))) // up trend
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Bullish Harami candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternBullishHarami()
{
//--- Bullish Harami
if((Close(1)>Open(1)) && // white day
((Open(2)-Close(2))>AvgBody(1)) && // long black
((Close(1)<Open(2)) &&
(Open(1)>Close(2))) && // engulfment
(MidPoint(2)<CloseAvg(2))) // down trend
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Bearish Meeting Lines candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternBearishMeetingLines()
{
//--- Bearish MeetingLines
if((Close(2)-Open(2)>AvgBody(1)) && // long white
((Open(1)-Close(1))>AvgBody(1)) && // long black
(MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // doji close
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Checks formation of Bullish Meeting Lines candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternBullishMeetingLines()
{
//--- Bullish MeetingLines
if((Open(2)-Close(2)>AvgBody(1)) && // long black
((Close(1)-Open(1))>AvgBody(1)) && // long white
(MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // doji close
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| Initialization signal object |
//+------------------------------------------------------------------+
bool CCandlePattern::InitSignal(CExpertSignal *signal){
m_signal=signal;
return(true);
}
//-------------------------------------------------------------------+
//| Checks formation of a certain candlestick pattern |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckCandlestickPattern(ENUM_CANDLE_PATTERNS CandlePattern)
{
switch(CandlePattern)
{
case CANDLE_PATTERN_THREE_BLACK_CROWS: return(CheckPatternThreeBlackCrows());
case CANDLE_PATTERN_THREE_WHITE_SOLDIERS: return(CheckPatternThreeWhiteSoldiers());
case CANDLE_PATTERN_DARK_CLOUD_COVER: return(CheckPatternDarkCloudCover());
case CANDLE_PATTERN_PIERCING_LINE: return(CheckPatternPiercingLine());
case CANDLE_PATTERN_MORNING_DOJI: return(CheckPatternMorningDoji());
case CANDLE_PATTERN_EVENING_DOJI: return(CheckPatternEveningDoji());
case CANDLE_PATTERN_BEARISH_ENGULFING: return(CheckPatternBearishEngulfing());
case CANDLE_PATTERN_BULLISH_ENGULFING: return(CheckPatternBullishEngulfing());
case CANDLE_PATTERN_EVENING_STAR: return(CheckPatternEveningStar());
case CANDLE_PATTERN_MORNING_STAR: return(CheckPatternMorningStar());
case CANDLE_PATTERN_HAMMER: return(CheckPatternHammer());
case CANDLE_PATTERN_HANGING_MAN: return(CheckPatternHangingMan());
case CANDLE_PATTERN_BEARISH_HARAMI: return(CheckPatternBearishHarami());
case CANDLE_PATTERN_BULLISH_HARAMI: return(CheckPatternBullishHarami());
case CANDLE_PATTERN_BEARISH_MEETING_LINES: return(CheckPatternBearishMeetingLines());
case CANDLE_PATTERN_BULLISH_MEETING_LINES: return(CheckPatternBullishMeetingLines());
}
//---
return(false);
}
//+------------------------------------------------------------------+