If you use indicator_levelwidth greater than 1, only indicator_levelstyle that metatrader will allow is STYLE_SOLID (solid line). Also, you can specify only one color, style and width for all levels (if you need more than one color, style or width for levels, you either have to use buffers or objects - horizontal line, for example)
You can use the SetLevelStyle() function too for that purpose,with same limitations as described above
[PHP]
void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)
是否可以为指标水平线添加颜色、样式和重量?
你好。
我想知道是否有人能告诉我是否有可能在指标水平线上添加颜色、样式和重量?
作为一个初学者,我想为RSI水平线指定样式和颜色,我想知道是否可以通过添加更多的代码来实现,例如,在行中。#property indicator_level1 70 ?
如果可能的话,如果有人能告诉我,我将非常感激。
谢谢。
Laurus
...
是的,你可以
使用以下属性:
#property indicator_levelstyle
#property indicator_levelwidth
[/PHP]
If you use indicator_levelwidth greater than 1, only indicator_levelstyle that metatrader will allow is STYLE_SOLID (solid line). Also, you can specify only one color, style and width for all levels (if you need more than one color, style or width for levels, you either have to use buffers or objects - horizontal line, for example)
You can use the SetLevelStyle() function too for that purpose,with same limitations as described above
[PHP]
void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)
你好。
我想知道是否有人能告诉我,是否可以为指标水平线添加颜色、样式和重量?
作为一个初学者,我想为RSI水平线指定样式和颜色,我想知道是否可以通过添加更多的代码来实现,例如,在行中。#property indicator_level1 70 ?
如果可能的话,如果有人能告诉我,我将非常感激。
谢谢。
Laurus谢谢你的回答,Mladen,你的帮助总是非常令人感激。
你所写的正是我所担心的。当涉及到功能部分时,我还没有想到。
如果你看一下图片,你会发现我希望它是这样的。作为妥协,我使用了普通的水平线,但由于我用指标本身画趋势线,所以这不是一个好的解决方案。
谢谢。
Laurus
...
看了你的图片,似乎这是你唯一可以应用的解决方案(使用对象)。使用绘图缓冲区 会简单地耗尽你的绘图缓冲区,你无法绘制你在该指标上使用的所有数值。有时我们仍然在为metatraders 4的决定 "买单",即只有8个绘图缓冲区。
谢谢你的回答,Mladen,你的帮助总是非常令人感激。
你所写的正是我所担心的。当涉及到函数部分时,我还是不明白。
如果你看一下图片,你会看到我希望它是怎样的。作为妥协,我使用了普通的水平线,但由于我用指标本身画趋势线,所以这不是一个好的解决方案。
谢谢。
Laurus外部DLL返回奇怪的结果
嗨!
下面是一个非常简单的调用外部DLL的例子。当与策略测试器 一起使用时,日志应该显示从0开始的递增数字。
然而,结果却很奇怪。日志中的第一行显示一个大数字(即18472),然后正常增加一段时间,直到它开始一次跳动约10步,有时超过100步。
谁能向我解释一下这其中的原因,以及如何纠正它?
谢谢!
// MyExpert.mql //
#import "MyDLL.dll"
int Test();
#import
void start(){
Print(Test());
}[/CODE]
// MyDLL.def //
LIBRARY MyDLL
EXPORTS
Test
[CODE]
// MyDLL.dll //
int i= 0;
int __stdcall Test() {
i++;
return i;
}指标的有趣代码问题
大家好。
我正在努力学习MT4编程,此刻我正在开发一个PinBar检测指标,它告诉我买入或卖出。我特别为4小时图开发了这个指标,因为有特殊的买入或卖出规则。检测的规则如下。
蜡烛的主体<=蜡烛长度的35%。
至少有一个蜡烛芯>=50%的蜡烛长度。
到目前为止,我用该指标检测这些条形图没有问题。
然而,下一条规则告诉我买入或卖出。
我放大了1小时图,并查看了4小时图上形成针状条的4个条。
我使用iClose函数 在1小时图上拾取该阵型的第一个和最后一个柱子的收盘值。
但是......按照现在的程序,我总是在1小时图上看第一个和最后一个蜡烛。而这是不对的。它必须是形成的第一个和最后一个棒,而不是图表上的。
下面是我现在的代码,其中有错误的iClose函数。
{
Buy = Close;
SetLevel(true,i+1,Close);
}我还没有能够在那个特定的4小时蜡烛的背景中找到正确的1小时蜡烛。
有谁能给我解决问题的答案吗?
我把它修好了。
int H1BarNumber;
H4BarTime = Time;
H1BarNumber = iBarShift(NULL, PERIOD_H1, H4BarTime);非常感谢!
雅各布
看了你的图片,似乎这是你唯一可以应用的解决方案(使用对象)。使用绘图缓冲区会简单地耗尽你的绘图缓冲区,你无法在该指标上绘制你所使用的所有数值。有时我们仍然在为metatraders 4的决定 "买单",只有8个绘图缓冲区
对不起,我的答复太晚了,Mladen,谢谢你澄清了这个问题。关于你写的内容,至少现在我知道了。
谢谢你。
劳鲁斯
关于入学标准的帮助
嗨,伙计们。
我正在尝试使用MA做一个进入标准。我的进入标准很简单,我想在快速MA与慢速MA在蜡烛收盘时向上交叉时进入多头交易,而不是当前的蜡烛,反之亦然。
我目前的情况是,我的EA将在快速MA与慢速MA向上交叉时触发多头交易,反之亦然,然而该蜡烛尚未收盘,有时当蜡烛收盘时,最终的MA可能没有向上交叉,因此,我不应该触发该特定的交易,然而系统却触发了它,因为它已经向上交叉了一次,又回来了。这对短线交易也是一样的
我已经这样做了几天了,没有任何进展。谁能给我一些启示,我应该如何去做?谢谢。
//---输入参数
extern double TakeProfit=2700.0;
extern double Lots=0.1;
extern double StopLoss=2500.0;
//+------------------------------------------------------------------+
//| 专家初始化函数 |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//|专家的去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
int Crossed (double line1 , double line2)
{
static int last_direction = 0;
static int current_dirction = 0;
if(line1>line2)current_dirction = 1; //向上
如果(line1<line2)current_dirction = 2; //向下
如果(current_dirction != last_direction) //改变了
{
last_direction = current_dirction;
返回(last_direction)。
}
否则
{
返回(0)。
}
}
//+------------------------------------------------------------------+
//|专家启动功能|
//+------------------------------------------------------------------+
int start()
{
//----
int cnt, ticket, total;
双短Ema, 长Ema。
如果(Bars<100)
{
Print("小于100的条数")。
return(0);
}
如果(TakeProfit<10)
{
Print("TakeProfit小于10")。
return(0); // 检查TakeProfit
}
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。
longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0)。
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
{
如果(isCrossed == 1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point, Ask+TakeProfit*Point,
"My EA",12345,0,Green)。
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
否则 Print("打开BUY订单错误。",GetLastError())。
return(0);
}
如果(isCrossed == 2)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,
Bid-TakeProfit*Point, "My EA",12345,0,Red)。
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Sell order opened : ",OrderOpenPrice());
}
否则 Print("打开卖出订单错误。",GetLastError())。
return(0);
}
return(0);
}
return(0);
}
//+------------------------------------------------------------------+
感谢并问候
特伦斯
...
特伦斯
试着改变这些线条。
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);[/PHP]
to something like this :
[PHP] int isCrossed = 0;
double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);
double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);
double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);
double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);
double diff1 = shortEma1-longEma1;
double diff2 = shortEma2-longEma2;
if ((diff1*diff2)<0)
{
if (shortEma1>longEma1)
isCrossed = 1;
else isCrossed = 2;
}
这样一来,你甚至不需要交叉函数,它将在一个封闭的柱子上检查交叉。
你们好。
我正在尝试使用MA做一个进入标准。我的进入标准很简单,我想在快速MA与慢速MA在蜡烛收盘时向上交叉时进入多头交易,而不是在当前的蜡烛上,反之亦然。
我目前的情况是,我的EA将在快速MA与慢速MA向上交叉时触发多头交易,反之亦然,然而该蜡烛尚未收盘,有时当蜡烛收盘时,最终的MA可能没有向上交叉,因此,我不应该触发该特定的交易,然而系统却触发了它,因为它已经向上交叉了一次,又回来了。这对短线交易也是一样的
我已经这样做了几天了,没有任何进展。谁能给我一些启示,我应该如何去做?谢谢。
//---输入参数
extern double TakeProfit=2700.0;
extern double Lots=0.1;
extern double StopLoss=2500.0;
//+------------------------------------------------------------------+
//| 专家初始化函数 |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//|专家的去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
int Crossed (double line1 , double line2)
{
static int last_direction = 0;
static int current_dirction = 0;
if(line1>line2)current_dirction = 1; //向上
如果(line1<line2)current_dirction = 2; //向下
如果(current_dirction != last_direction) //改变了
{
last_direction = current_dirction;
return (last_direction);
}
否则
{
返回(0)。
}
}
//+------------------------------------------------------------------+
//|专家启动功能|
//+------------------------------------------------------------------+
int start()
{
//----
int cnt, ticket, total;
双短Ema, 长Ema。
如果(Bars<100)
{
Print("小于100的条数")。
return(0);
}
如果(TakeProfit<10)
{
Print("TakeProfit小于10")。
return(0); // 检查TakeProfit
}
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。
longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0)。
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
{
如果(isCrossed == 1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point, Ask+TakeProfit*Point,
"My EA",12345,0,Green)。
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
否则 Print("打开BUY订单错误。",GetLastError())。
return(0);
}
如果(isCrossed == 2)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,
Bid-TakeProfit*Point, "My EA",12345,0,Red)。
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Sell order opened : ",OrderOpenPrice());
}
否则 Print("打开卖出订单错误。",GetLastError())。
return(0);
}
return(0);
}
return(0);
}
//+------------------------------------------------------------------+
谢谢和问候
特伦斯Terrance
试着改变这几行。
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);[/PHP]
to something like this :
[PHP] int isCrossed = 0;
double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);
double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);
double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);
double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);
double diff1 = shortEma1-longEma1;
double diff2 = shortEma2-longEma2;
if ((diff1*diff2)<0)
{
if (shortEma1>longEma1)
isCrossed = 1;
else isCrossed = 2;
}
嗨,Mladen,我试了一下你告诉我的方法,效果很好。但是,我不太理解这些代码背后的逻辑。为什么你要把iMA的移位设置为1和2,为什么你要这样编码。(diff1*diff2)<0)也是如此?对不起,我目前还在学习阶段。
谢谢和问候
Terrance