如何编码? - 页 344

 
mladen:

tkuan77

你必须找到最后一个收盘条,并查看最后一个收盘条的日期是否与当前日期相同。

你可以使用类似这样的函数来获得最后一个收盘的时间。

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

然后你可以检查日期是否相同

你好,mladen。

但是我在哪里插入这部分代码?很抱歉问这个问题,因为我自己对编码还很陌生,似乎还搞不清楚For循环的工作原理。

谢谢

阮先生

 
tkuan77:

你好,mladen。

但是我在哪里插入这部分代码?很抱歉问这个问题,因为我自己对编码还很陌生,而且似乎还搞不清楚For循环的工作原理。

谢谢

瑞安

阮先生

像这样。

如果(TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime()))// 没有交易

 
mladen:

瑞安

类似这样的情况:

如果(TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime()))// 没有交易

嗨,mladen,我已经把代码加进去了,但它似乎发出了某种形式的全局变量错误。另外,我注意到你有一个没有定义的变量MagicNumber,请问这是做什么的?我已经把它加到了int下,但我不确定这个变量有什么用。

请指教。再次感谢您的耐心解答。

//---- 输入参数

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

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

//| 专家初始化函数|

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

int init()

{

//----

//----

return(0);

}

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

//|专家的去初始化功能|

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

int deinit()

{

//----

//----

return(0);

}

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

//|专家启动功能|

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

int start()

{

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

//-- 触发贸易

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

int ticket, total, MagicNumber;

double TP_Value, SL_Value;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

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

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime() >CloseTime)

CloseTime = OrderCloseTime()。

}

return(CloseTime)。

}

total = OrdersTotal(); // 检查当前开放的交易总数

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime() ))

{

如果((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1])。

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

如果((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1])。

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

如果((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1])。

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

}

如果(Hour()==Entry_Hour_1st &&((Low[1] - Low[0]) > 0.00100) &&((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()) )

{

如果((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1])。

SL_Value = (High[1] + 0.0010)。

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

如果((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1])。

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

如果((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1])。

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

}

}

return(0);

}

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

 
tkuan77:

嗨,mladen,我已经把代码加进去了,但它似乎出现了某种形式的全局变量错误。另外,我注意到你有一个没有定义的变量MagicNumber,请问这是做什么用的?我已经把它加到了int下,但我不确定这个变量有什么用。

请指教。再次感谢您的耐心解答。

//---- 输入参数

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

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

//| 专家初始化函数 |

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

int init()

{

//----

//----

return(0);

}

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

//|专家的去初始化功能|

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

int deinit()

{

//----

//----

return(0);

}

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

//|专家启动功能|

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

int start()

{

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

//-- 触发贸易

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

int ticket, total, MagicNumber;

double TP_Value, SL_Value;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

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

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime() >CloseTime)

CloseTime = OrderCloseTime()。

}

return(CloseTime)。

}

total = OrdersTotal(); // 检查当前开放的交易总数

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime() ))

{

如果((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1])。

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

如果((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1])。

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

如果((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1])。

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

}

如果(Hour()==Entry_Hour_1st &&((Low[1] - Low[0]) > 0.00100) &&((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()) )

{

如果((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1])。

SL_Value = (High[1] + 0.0010)。

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

如果((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1])。

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

如果((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1])。

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

}

}

return(0);

}

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

这是一个函数

把它移到start()函数的主体之外

 

mladen:

那是一个函数

把它移到start()函数的主体之外

嗨,mladen,我试着把这个函数 移出启动函数,然而,我的EA仍然每天触发超过1次交易,而不是限制每天只触发1次交易。

谢谢你的指点。

疑问

//---- 输入参数

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

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

//| 专家初始化函数 |

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

int init()

{

//----

//----

return(0);

}

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

//|专家的去初始化功能|

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

int deinit()

{

//----

//----

return(0);

}

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

//|专家启动功能|

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

int MagicNumber;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

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

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime() >CloseTime)

CloseTime = OrderCloseTime()。

}

return(CloseTime)。

}

int start()

{

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

//-- 触发贸易

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

int ticket, total;

双TP_Value, SL_Value。

total = OrdersTotal(); // 检查当前开放的交易总数

如果(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())

{

如果((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // 多头机构的价值

SL_Value = (Low[1] - 0.0010); // 对多头来说总是一样的

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

如果((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // 空头主体的价值

SL_Value = (Low[1] - 0.0010); // 对多头来说总是一样的

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

如果((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // 包括头部和尾部的整个蜡烛的值

SL_Value = (Low[1] - 0.0010); // 对多头来说总是一样的。

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

}

如果(Hour()==Entry_Hour_1st &&((Low[1] - Low[0]) > 0.00100) &&((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()) )

{

如果((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // 多头机构的价值

SL_Value = (High[1] + 0.0010); // 对空头来说总是一样的

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

如果((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // 空头主体的价值

SL_Value = (High[1] + 0.0010); // 对空头来说总是一样的

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

如果((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // 包括头部和尾部的整个蜡烛的值

SL_Value = (High[1] + 0.0010); // 对空头来说总是一样的。

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

}

}

return(0);

}

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

 
tkuan77:

嗨,mladen,我试着将该功能移出启动功能,然而,我的EA仍然每天触发1次以上的交易,而不是限制在每天只触发1次交易。

谢谢你的指点。

疑问

//---- 输入参数

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

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

//| 专家初始化函数 |

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

int init()

{

//----

//----

return(0);

}

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

//|专家的去初始化功能|

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

int deinit()

{

//----

//----

return(0);

}

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

//|专家启动功能|

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

int MagicNumber;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

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

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime() >CloseTime)

CloseTime = OrderCloseTime()。

}

return(CloseTime)。

}

int start()

{

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

//-- 触发贸易

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

int ticket, total;

双TP_Value, SL_Value。

total = OrdersTotal(); // 检查当前开放的交易总数

如果(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())

{

如果((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // 多头机构的价值

SL_Value = (Low[1] - 0.0010); // 对多头来说总是一样的

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

如果((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // 空头主体的价值

SL_Value = (Low[1] - 0.0010); // 对多头来说总是一样的

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

如果((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // 包括头部和尾部的整个蜡烛的值

SL_Value = (Low[1] - 0.0010); // 对多头来说总是一样的。

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green)。

返回(0)。

}

}

如果(Hour()==Entry_Hour_1st &&((Low[1] - Low[0]) > 0.00100) &&((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()) )

{

如果((Close[1] - Open[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // 多头机构的价值

SL_Value = (High[1] + 0.0010); // 对空头来说总是一样的

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

如果((Open[1] - Close[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // 空头主体的价值

SL_Value = (High[1] + 0.0010); // 对空头来说总是一样的

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

如果((Open[1] - Close[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // 包括头部和尾部的整个蜡烛的值

SL_Value = (High[1] + 0.0010); // 对空头来说总是一样的。

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red)。

返回(0)。

}

}

}

return(0);

}

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

tkuan77

替换掉这个:

if(total < 1)

替换为这句话。

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) ;

而且它不应该再这样做了

 
mladen:

tkuan77

替换这个:

if(total < 1)

换成这个:

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) 。

而且它不应该再这样做了

你好mladen,在我输入代码后,不是每天触发一次交易,而是一次触发多次交易,直到账户爆仓。会不会是由于某些触发机制造成的?

请注意

 

你好mladen,我有这样一段特殊的代码,在我有一笔交易运行后,我将关闭所有的待定交易。我如何设置为在我触发交易后只取消我当前的待定交易而不是所有未来的待定交易?

谢谢.....

int new_del()

{

int i,a;

int total = OrdersTotal();

string comentario,par;

for (i=total-1; i >=0; i--)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES)。

如果(OrderType()==OP_BUY || OrderType()==OP_SELL)

{

for (a=total-1; a >=0; a--)

{

OrderSelect(a,SELECT_BY_POS,MODE_TRADES)。

comentario=OrderComment();

par=StringSubstr(comentario,0,6)。

如果(OrderType()==OP_SELLSTOP)// && comentario==Symbol())

{

OrderDelete(OrderTicket())。

Print("Deleting SELL_STOP"," Ordertype:",OrderType())。

return(1);

}

如果(OrderType()==OP_BUYSTOP)// && par==Symbol())

{

OrderDelete(OrderTicket())。

Print("Deleting BUY_STOP"," Ordertype:",OrderType())。

return(1);

}

}

}

}

}

 
tkuan77:
你好,我有这样一段特殊的代码,在我有一笔交易运行后,会关闭我所有的待定交易。我如何设置为在我触发交易后,只取消我当前存在的待定交易,而不是所有未来的待定交易?

thanks.....

int new_del()

{

int i,a;

int total = OrdersTotal();

string comentario,par;

for (i=total-1; i >=0; i--)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES)。

如果(OrderType()==OP_BUY || OrderType()==OP_SELL)

{

for (a=total-1; a >=0; a--)

{

OrderSelect(a,SELECT_BY_POS,MODE_TRADES)。

comentario=OrderComment();

par=StringSubstr(comentario,0,6)。

如果(OrderType()==OP_SELLSTOP)// && comentario==Symbol())

{

OrderDelete(OrderTicket())。

Print("Deleting SELL_STOP"," Ordertype:",OrderType())。

return(1);

}

如果(OrderType()==OP_BUYSTOP)// && par==Symbol())

{

OrderDelete(OrderTicket())。

Print("Deleting BUY_STOP"," Ordertype:",OrderType())。

return(1);

}

}

}

}

}

tkuan77

当前待定交易 "是什么意思,"未来待定交易 "是什么意思?

 
mladen:

tkuan77

目前的待定交易 "是什么意思?"未来的待定交易 "又是什么意思?

Hi mladen,

当前待定交易是指:一旦满足条件,EA将设置2个待定交易(1个多头和1个空头)。因此,如果说多头交易被触发,EA将自动取消空头交易。

未来的待定交易是指:在EA取消之前的待定交易后,如果再次满足条件,EA应该再设置2个待定交易(1个多头和1个空头)。然而,如果EA目前有一个正在运行的交易,EA将自动取消EA试图设置的任何待定订单

我想做的是,在交易被触发后,让系统只取消当前的待定交易。 感谢帮助。

问候