//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ extern double lots=0.01; extern int SL_in_pips; extern int TP_in_pips; int x2; int init() { if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0) { SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL); Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt."); } if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0) { TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL); Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt."); } x2=1; while(x2!=0) { if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1) { Alert("Ордер типа BUY успешно открыт"); OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0); x2=GetLastError(); if(x2==0) Alert("Ордер типа SELL успешно открыт"); if(x2!=0) Alert("Ордер типа SELL не открыт. Ошибка №: ",x2); }else { x2=GetLastError(); if(x2!=0) Alert("Ордер типа BUY не открыт. Ошибка №: ",x2); } } //---- return(0);
请帮助我改进这个代码,以获得一个简单的专家顾问。实质很简单:我们在当前价位 上开出2个卖出和布伊的头寸,并指定止损。然后当其中一个或两个触发时,我们就开立新的头寸。它的本质似乎很简单,但它仍然不工作 非常感谢!
//+------------------------------------------------------------------+
//| 2DiffOrders.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
extern double lots=0.01;
extern int SL_in_pips;
extern int TP_in_pips;
int x2;
int init()
{
if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0)
{
SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0)
{
TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
x2=1;
while(x2!=0)
{
if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1)
{
Alert("Ордер типа BUY успешно открыт");
OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0);
x2=GetLastError();
if(x2==0)
Alert("Ордер типа SELL успешно открыт");
if(x2!=0)
Alert("Ордер типа SELL не открыт. Ошибка №: ",x2);
}else
{
x2=GetLastError();
if(x2!=0)
Alert("Ордер типа BUY не открыт. Ошибка №: ",x2);
}
}
//----
return(0);
这只是看起来完全正确,但在机器视图中,最后一点可以有不同的值。即2.9999,3或3.00000001
为了摆脱这种误解,在MQL中有一个NormalizeDouble()函数。
是的,NormalizeDouble()有帮助,谢谢。
但仍然不清楚这怎么可能,这似乎是一个简单的除法,如果你用0.5或0.9甚至0.31除以0.1,一切都很正常。
而这里他显然有2.9,这不清楚......计算器更准确 :-)
感谢Reshetov和 splxgf 的帮助。
但还是不清楚这怎么可能,似乎只是一个简单的除法。 而如果你用0.5或0.9甚至0.31除以0.1,也是可以的。
而这里是2.9,这不清楚......计算器更准确 :-)
计算器内置了四舍五入功能。而且它们的解决方式相同,因为它们使用相同的数学协处理器来计算浮点数字。
你好!
能否请你给我一个提示?
我自己也不明白怎么做。
任务。
EA每天都会放1-2个订单。
变量的初始值是手动设置的,可以取1到10的值。
你需要将之前设定的变量以1的增量改为-10的值
在EA的每个工作日,如果当天TP没有被执行,则只增加1。
当TP被执行时,该变量返回值-1。
计算SL并不合适,因为它可以是一个或两个,而且数值每天只能改变一次。
I.e.
变量=1
第1天SL - 变量=2
第2天SL - 变量=3
第3天SL - 变量=4
第4天TP - 变量=1
第5天 SL - 变量 =2
...以此类推。
帮助!
谢谢你。
请帮助我改进这个代码,以获得一个简单的专家顾问。这个想法很简单:我们在当前的价格上建立2个卖出和贝的头寸,并指定止损。然后当其中一个或两个触发时,我们就开立新的头寸。它的本质似乎很简单,但它仍然不工作 非常感谢!
行家们,请帮忙。
有一个代码可以计算单期动量,并将其与大周期整合,然后作为指标输出。
我需要写一个给定周期的指标,找到所得曲线的平均值并作为指标输出。
代码见附件。
#属性 indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_width1 2
//------- 外部指标参数 ----------------------------------------+
外部int MTM_Period = 1;
//extern int MTM_Integr_Period = 1000;
//extern int Applied_Price = 0; // Used price:
// 0 - 价格_关闭
// 1 - price_open
// 2 - 价格_高
// 3 - 价格低
// 4 - 价格_中位数
// 5 - 价格_典型
// 6 - 价格_加权
extern NumberOfBars = 1000; //条数(0-全部)。
//------- 指示器缓冲区 ---------------------------------------------------+
double buf0[];
//+----------------------------------------------------------------------------+
//|自定义指标初始化功能
//+----------------------------------------------------------------------------+
void init() {
SetIndexBuffer (0, buf0)。
SetIndexEmptyValue(0,0)。
SetIndexLabel(0,"i-tm_integr")。
SetIndexStyle(0,DRAW_LINE)。
}
//+----------------------------------------------------------------------------+
//|自定义指标去初始化功能|
//+----------------------------------------------------------------------------+
void deinit() {
评论(")。
}
//+----------------------------------------------------------------------------+
//|自定义指标迭代函数|
//+----------------------------------------------------------------------------+
空白启动() {
int LoopBegin, i,j, per=3;
双重MTM,MTMSUM。
如果(NumberOfBars==0)LoopBegin=Bars-1。
否则LoopBegin=NumberOfBars。
LoopBegin=MathMin(LoopBegin, Bars-1)。
for (i=LoopBegin; i>=0; i--) {
mtm=Close[i]-Close[MTM_Period+i]。
mtmsum=mtmsum+mtm。
buf0[i]=mtmsum。
}
/* for (i=LoopBegin-per;i>=per;i--){
mtm=Close[i]-Close[MTM_Period+i]。
mtmsum[i]=0+mtm。
for (j=per;j<=0;j--){
mtmsum[i]=0+mtmsum[i+j];
mtmsum[i]=mtmsum[i]/per。
buf0[i]=mtmsum[i]。
}
}*/
}
//+----------------------------------------------------------------------------+
行家们,请帮忙。
有一个代码可以计算单期动量,并将其与大周期整合,然后作为指标输出。
我需要写一个给定周期的指标,找到所得曲线的平均值并作为指标输出。
这只是看起来完全正确,但在机器视图中,最后一点可以有不同的值。即2.9999,3或3.00000001
为了摆脱这种误解,MQL有NormalizeDouble()函数
为什么NormalizeDouble()函数不对Ask、Bid、Low等的所有值默认运行?
每个人都上当了,然后不得不 "手动 "修复......奇怪的是,MT不能阅读它自己催生的东西。
谢谢,是否能保证在start()中能得到数据?
你可以尝试使用RefreshRates()--见标准MetaEditor帮助中的例子。
在EA优化 中,有一个 "保存为报告 "的选项,但 "输入参数 "在Internet Explorer中没有显示。
尽管从HTML代码来看,它们是存在的。总的来说,正是为了这些参数才开始优化的。
也许有人知道如何在资源管理器中看到它们?
(也有可能通过单独的命令将它们复制到文本文件,但最好是在IE中看到它们)