初学者的问题 MQL4 MT4 MetaTrader 4 - 页 100

 

大家好,能不能帮我找到EA代码中的一个错误,我想我已经看完了,代码中似乎都写得很正确,但程序不知道为什么不能正常交易!我想知道为什么?这个想法是这样的:顾问必须寻找两个相同方向的长蜡烛(蜡烛之间的长度在顾问中可以调整,即在两个最低或最高蜡烛之间,取决于方向),如果相反方向的价格突破了最后一根蜡烛的最低或最高值,交易应该打开(文件所附图表中的示例图片情况)。顾问应该在每个合适的情况下打开交易,但由于某些原因,它只在几天之间的交易窗口打开交易。情况是这样的,谁也不难从程序员的角度出发,请帮助,修复错误。EA代码见下文,以及附件中的文件。


//+-----------------------------------------------------------------------------------------------+

//|间隔_烛光。ǞǞǞ

//|Copyright 2017, Vladim |

//|vk.com/id229534564 |

//|邮件。Vladim120385@yandex.ru |

//+-----------------------------------------------------------------------------------------------+

#property copyright "Copyright 2017, Vladim"

#财产链接 "vk.com/id229534564"

#财产版本 "1.00"

#属性严格


//---- EA参数

extern string paramEA = ""; // Parameters EA

外部双倍体积 = 0.01; // 体积

外部双倍止损 = 5; // 止损。

外部双倍的takeProfit = 1.5; // TakeProfit

extern double maxSpacing = 150; // MaxSpacing

extern double minSpacing = 30; // MinSpacing

外来的双倍TrailingStop = 0; // TrailingStop

extern int magic = 127; // Magic


//--全局变量

datetime newCandle;

int提示。


//+-----------------------------------------------------------------------------------------------+

int OnInit()

{

return(INIT_SUCCEEDED)。

}

//+-----------------------------------------------------------------------------------------------+

空白的OnDeinit(const int reason)。

{

}

//+-----------------------------------------------------------------------------------------------+

空白的OnTick()

{

if(newCandle != Time[0]) FindPattern();

newCandle = Time[0];

}

//+-----------------------------------------------------------------------------------------------+

void OpenOrder(int type) // 打开一个市场订单

{

if(type == OP_BUY) if(OrderSend(_Symbol, OP_BUY, volume, Ask, 0, 0, 0, "", magic, 0) )SetSLTP(OP_BUY)。

if(type == OP_SELL) if(OrderSend(_Symbol, OP_SELL, volume, Bid, 0, 0, 0, 0, " ", magic, 0))SetSLTP(OP_SELL)。

}

//+-----------------------------------------------------------------------------------------------+

void SetSLTP(int type) //设置止损单

{

double sl = 0;

double tp = 0;

如果(type == OP_BUY)

for(int i = 0; i < OrdersTotal(); i++)

如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

如果(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_BUY && OrderStopLoss() == 0)

{

sl = NormalizeDouble(Low[1] - stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() + (OrderOpenPrice() - Low[1])* takeProfit, Digits)。

如果(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) 返回。

}

如果(type == OP_SELL)

for(int i = 0; i < OrdersTotal(); i++)

如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

如果(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_SELL && OrderStopLoss() == 0)

{

sl = NormalizeDouble(High[1] + stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() - (High[1] - OrderOpenPrice() )* takeProfit, Digits)。

如果(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) 返回。

}

}

//+-----------------------------------------------------------------------------------------------+

void FindPattern() // 寻找烛台之间的长距离

{

如果(High[1] < High[2] && Bid > High[1] && Low[1] < Low[2])

{

double spacing = NormalizeDouble((High[2] - High[1]) / _Point, 0);

如果(maxSpacing >= spacing && minSpacing <= spacing)

OpenOrder(OP_BUY)。

}

如果(Low[1] > Low[2] && Bid < Low[1] && High[1] > High[2])

{

double spacing = NormalizeDouble((Low[1] - Low[2]) / _Point, 0);

如果(maxSpacing >= spacing && minSpacing <= spacing)

OpenOrder(OP_SELL)。

}

{

如果(TrailingStop!=0) TrailingStop()。

}

}

//+-----------------------------------------------------------------------------------------------+

空白的 "尾随停止"(TrailingStop)。

{

双重StLo,OSL,OOP。

bool error=true。

for (int i=0; i<OrdersTotal(); i++)

{

如果(OrderSelect(i, SELECT_BY_POS))

{

tip = OrderType()。

如果(提示<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

{

OSL = NormalizeDouble(OrderStopLoss(),Digits)。

OOP = NormalizeDouble(OrderOpenPrice(),Digits)。

如果(tip==0)

{

StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits)。

如果(StLo < OOP)继续。

如果(StLo > OSL)

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White) 。


}

如果(提示==1)

{

StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);

如果(StLo > OOP)继续。

如果(StLo < OSL || OSL==0 )

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White) 。

}

if (!error) Alert("Error TrailingStop",GetLastError()," ",Symbol()," SL ",StLo);

}

}

}

}

//+-----------------------------------------------------------------------------------------------+

附加的文件:
 
Vladim1203:

大家好,能不能帮我找到EA代码中的一个错误,我想我已经全部看完了,代码中似乎写得很正确,但程序不知道为什么不能正常交易!我想知道为什么?这个想法是这样的:顾问必须寻找两个相同方向的长蜡烛(蜡烛之间的长度在顾问中可以调整,即在两个最低或最高蜡烛之间,取决于方向),如果相反方向的价格突破了最后一根蜡烛的最低或最高值,交易应该打开(文件所附图表中的示例图片情况)。顾问应该在每个合适的情况下打开交易,但由于某些原因,它只在几天之间的交易窗口打开交易。情况是这样的,谁也不难从程序员的角度出发,请帮助,修复错误。EA代码如下,也见于附件文件。

也许已经够了,你在每个主题中都堆积了帖子,而自己却在创造自己的帖子。

 
kuzhakov:

你好。
你能告诉我如何按时间限制EA交易吗?
我尝试了论坛上的很多方法,但都没有用,我对写作一点都不了解。
如果你能直接指出要放什么,那就更好了。


启动后插入,eXpert将每天在终端上以特定的时间间隔进行交易。


int val=Hour();
 double min=Minute();
 double Dl = val + min/100;  
 double L = xxxx+xxxx/100; //час + минуты вместо хххх - это начало времени
 double P = xxxx+xxxx/100; //час + минуты вместо хххх - это конец времени
 if(Dl<L)return;
 if(Dl>P)return;
 
Vladim1203:

大家好,能不能帮我找到EA代码中的一个错误,我想我已经看完了,代码中似乎都写得很正确,但是程序不知道为什么不能正常交易!我想知道为什么?这个想法是这样的:顾问必须寻找两个相同方向的长蜡烛(蜡烛之间的长度在顾问中可以调整,即在两个最低或最高蜡烛之间,取决于方向),如果相反方向的价格突破了最后一根蜡烛的最低或最高值,交易应该打开(文件所附图表中的示例图片情况)。顾问应该在每个合适的情况下打开交易,但由于某些原因,它只在几天之间的交易窗口打开交易。情况是这样的,谁也不难从程序员的角度出发,请帮助,修复错误。见下面的EA代码,也见附件文件。


检查买入和卖出的条件

 
Vladim1203:

大家好,能不能帮我找到EA代码中的一个错误,我想我已经看完了,代码中似乎都写得很正确,但是程序不知道为什么不能正常交易!我想知道为什么?这个想法是这样的:顾问必须寻找两个相同方向的长蜡烛(蜡烛之间的长度在顾问中可以调整,即在两个最低或最高蜡烛之间,取决于方向),如果相反方向的价格突破了最后一根蜡烛的最低或最高值,交易应该打开(文件所附图表中的示例图片情况)。顾问应该在每个合适的情况下打开交易,但由于某些原因,它只在几天之间的交易窗口打开交易。情况是这样的,谁也不难从程序员的角度出发,请帮助,修复错误。请看下面的EA代码以及附件中的文件。

最好先写出EA的部分内容,将发现的蜡烛标记在图表上,这样一切都会变得清晰。而下面这几行在你的情况下是不必要的。

extern string paramEA    = "";     // Parameters EA

и

//+-----------------------------------------------------------------------------------------------+
int OnInit()
{
   
   return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 

请帮助社区...

从论坛上下载了卡尔曼滤波指标(源代码附后)。
图表上的一切都很好。


当我试图在专家顾问中读取它时,以下一行



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

输出同样的大数字,显然与指标无关。

会是什么呢?

附加的文件:
 
MikeZv:

来自社区的帮助...

从论坛上下载了卡尔曼滤波指标(源代码附后)。
图表上的一切都很好。


当我试图在专家顾问中读取它时,以下一行



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

输出同样的大数字,显然与指标无关。

这可能是什么?

EMPTY_VALUE

指标缓冲区 中的空值

2147483647 (0x7FFFFFFFF)

 
Alekseu Fedotov:

EMPTY_VALUE

指标缓冲区 中的空值

2147483647 (0x7FFFFFFFF)


:)我已经找到了...
为什么会出现?

 
MikeZv:

:)我已经找到了...
但为什么会出现呢?


该指标有2个数组,因为有2种颜色。当条形图上有第一种颜色的线时,第二种颜色的数组就等于EMPTY_VALUE

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1)。

iValue = EMPTY_VALUE,那么1条杠上的线就是橙色。(因为数组blue = EMPTY_VALUE)

 
Nikolay Ivanov:

该指标有2个数组,因为有2种颜色。当条形图上有第一种颜色的线时,第二种颜色的数组就等于EMPTY_VALUE

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1)。

iValue = EMPTY_VALUE,那么1条杠上的线就是橙色。(因为蓝色数组 = EMPTY_VALUE)


谢谢,尼古拉...
我从这两条线上取材。
然后我把它们合并成一个(留下一个缓冲区)。同样的结果。

我有这样一个问题。
该指标有一个变量draw_begin=500,即从结束时(从最新鲜的烛台开始)绘制图表的烛台数量。
而当我们使用iCustom()方法提取指标值时,这500个点是从哪个蜡烛图开始计算的?
为什么它很重要 - draw_begin不仅用于绘图,而且还参与指标的计算 ...