//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 20.04.2007 |//| Описание : Возвращает индекс ордера или позиции по тикету |//+----------------------------------------------------------------------------+//| Параметры: |//| ti - тикет ордера, позиции |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+intIndexByTicket(intti, stringsy="", intop=-1, intmn=-1){inti, k=OrdersTotal();
if(sy=="0")sy=Symbol();
for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)){if((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti)return(i);
}}}return(-1);
}
IndexByTicket()函数。
返回票据上的订单或头寸的索引(在已设订单或未结头寸的总列表中的序号)。如果IndexByTicket() 不能找到一个具有所需票据的订单或头寸,它将返回-1。我们可以用函数参数限制要检查的订单或头寸的列表。
我在一个自定义EA中写了IndexByTicket() 函数。我记得,我不能没有它,否则我为什么要写它?但我不记得它在那里是如何使用的,也不记得我为什么实际写了它 :-)找寻顾问的源代码是很无聊的。有数以百计的人。
总之,我不认为举出像我已经举过的那些例子有什么意义。如果我们聪明的话,我们可以想出把参数 "放在 "哪里。如果有人有使用IndexByTicket() 函数的好主意,请在这里发表。我将努力实现它。
一个简短的公告。
取消了SelectByTicket() 和SelectByTicketFromHistory() 函数。我自己不会使用它们,所以我不认为发表它们有什么意义。我们随时欢迎那些希望就这个问题进行讨论的人。我将展示我所有的妄想,就像现在这样。
NumberOfOrders()函数。
这个函数返回订单的数量,在功能上完全覆盖了ExistOrders()。为了用NumberOfOrders() 函数取代ExistOrders( ) 函数,有必要且足以检查返回值,使其大于零。你可以用函数参数限制要检查的订单列表。
如何使用NumberOfOrders()函数的例子。
这里又附上了一个带有上述例子的工作脚本。
NumberOfOrders()函数。
这个函数返回订单的数量,在功能上完全覆盖了ExistOrders()。为了用NumberOfOrders() 函数取代ExistOrders( ) 函数,有必要且足以检查返回值,使其大于零。你可以用函数参数限制要检查的订单列表。
我有点糊涂了。出于某种原因,我看到了一些矛盾之处。就在这里。
"...检查返回值是否大于零是必要的,也是足够的。"
如果你勾选了 "这个,而且只有这个",那么关于订单数量 的函数就没有意义了
这就是我开始接触它的原因。我已经在我的专家顾问中插入了这个功能。我在参数和条件中设置m=1为开仓。
但是,专家顾问仿佛没有看到这个限制!而且它在每个信号下都会开出订单。
这里会有什么问题呢?
我有点糊涂了。出于某些原因,我看到了某种矛盾。就在这里。
"...检查返回值是否大于零是必要和充分的"。
如果我们检查 "这个,而且只有这个",那么订单数量的函数就没有意义了!
嗯...你似乎没有注意到ExistOrders() 和NumberOfOrders() 函数各自返回的信息量。ExistOrders() 函数只返回关于订单存在的 信息,NumberOfOrders() 函数返回关于订单数量 的信息。关于订单数量的信息包含了关于订单存在的信息。当我们需要回答一个订单是否存在的问题时,关于订单数量的信息就是多余的了。这就是为什么我说,如果我们想用NumberOfOrders() 函数取代ExistOrders( ) 函数,我们必须检查NumberOfOrders() 函数返回的值,以确保它大于零。毕竟,很明显,如果这个值等于零,就没有订单,如果这个值大于零,就有订单存在。当我们不需要订单数量的信息时,可以使用ExistOrders() 函数,而当我们不需要订单数量的信息时,可以使用NumberOfOrders() 函数。在这个意义上,NumberOfOrders() 函数完全取代了ExistOrders() 函数。
以下是我开始研究的原因。我已经在我的专家顾问中插入了这个功能。我在参数和条件中设置m=1为开仓。
但是,就像专家顾问没有看到这个约束一样!而且它在每个信号下都会开出订单。
这里可能有什么问题?
谢谢你。得到了这一切。在第一个问题和第二个问题上都是如此。
换句话说,"扩展的 "NumberOfOrders()函数本质上已经包括IndexByTicket( )函数
是的,确实如此。我打开了 OP_BUY和OP_SELL !
仍需举例说明你的下一个函数,它正好与位置一起工作。(不含订单)。
我记得你已经在这个论坛的某个地方发过了。我找不到它。
仍需举例说明你的下一个函数,它正好与位置一起工作。(不含订单)
我已经完成了订单的功能。接下来是职位的职能。大约有30人。
我记得在论坛的某个地方,你已经把它贴出来了。我找不到它。
搜索
亲爱的伊戈尔,我请求你的帮助!我需要添加一个EA,使其可以在多个工具上持仓。有2个EA在工作,标准MACD和Ema,每个有6个位置,但只有一个位置打开...我读了你关于这个问题的评论,但由于我不善于语言,我不明白哪里该加什么...如果你不介意的话,请帮助...抄写Ema顾问...谢谢你!
//+------------------------------------------------------------------+//| Parabolic.mq4 |
//| Vitalik |
//| wwwita@mail.ru |
//+------------------------------------------------------------------+
extern double Lots=0。1;
extern double Pip=5;
extern double MoveBack=3;
extern int chk=0;
extern double SL=20;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double hi=High[1];
double lo=Low[1];
double EMA, EMA1, EMA2, EMA3;
int cnt=0, ticket, total;
EMA=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,1);
EMA1=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,1) 。
EMA2=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,0);
EMA3=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,0);
total=OrdersTotal();
if(total<1)
{
if(AccountFreeMargin()<(1000*Lots)
{
Print("You have no money.Free funds = ", AccountFreeMargin());
return(0);
}
如果(((EMA>EMA1) && (EMA2<EMA3)) || ((EMA<EMA1) && (EMA2>EMA3))
{
chk=1;
Print("position is possible!");
}
如果(chk==1)
{
if(EMA3-EMA2>2*Point && Bid>=(lo+MoveBack*Point))
{
ticket=OrderSend(Symbol(,OP_SELL,Lots,Bid,3,0,0,
"EMA位置:",16385,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET, MODE_TRADES)
Print("Sell order open : " ,OrderOpenPrice());
chk=0;
}
else
{
Print("Error opening SELL order : " ,GetLastError());
return(0);
}
}
if(EMA2-EMA3>2*Point && Ask<=(hi-MoveBack*Point))
{
ticket=OrderSend(Symbol(,OP_BUY,Lots,Ask,3,0,0,
"EMA位置:",16385,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET, MODE_TRADES)
Print("BUY order open : " ,OrderOpenPrice());
chk=0;
}
else
{
Print("Order BUY open error : " ,GetLastError());
return(0);
}
}
}
return(0);
} }
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // is this anopen position?OP_BUY或OP_SELL
OrderSymbol()==Symbol()) //工具匹配?
{
if(OrderType()==OP_BUY) //多头头寸已开
{
//检查是否已经到了平仓时间?
if(Bid>=(OrderOpenPrice()+Pip*Point) )
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓
return(0); //退出
}
if(Bid<=(OrderOpenPrice()-SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓
return(0); //退出
}
}
else //否则这是一个空仓
{
//检查是否已经是平仓时间?
if(Ask<=(OrderOpenPrice()-Pip*Point)
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //平仓
return(0); //退出
}
if(Ask>=(OrderOpenPrice()+SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // Close position
return(0); // exit
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
伊戈尔,我在"处理INI文件的函数库 " 中问过你一个问题,但没有答案 :(