//+------------------------------------------------------------------+//| ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ |//| Функции передаётся тикет позиции, расстояние от курса открытия, |//| на котором трейлинг запускается (пунктов) и "шаг", с которым он |//| переносится (пунктов) |//| Пример: при +30 стоп на +10, при +40 - стоп на +20 и т.д. |//+------------------------------------------------------------------+void TrailingStairs(int ticket,int trldistance,int trlstep)
{
double nextstair; // ближайшее значение курса, при котором будем менять стоплосс// проверяем переданные значенияif ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
{
Print("Трейлинг функцией TrailingStairs() невозможен из-за некорректности значений переданных ей аргументов.");
return(0);
}
// если длинная позиция (OP_BUY)if (OrderType()==OP_BUY)
{
// расчитываем, при каком значении курса следует скорректировать стоплосс// если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэдif ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
nextstair = OrderOpenPrice() + trldistance*Point;
// иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэдelse
nextstair = OrderStopLoss() + trldistance*Point;
// если текущий курс (Bid) >= nextstair и новый стоплосс точно лучше текущего, корректируем последнийif (Bid>=nextstair)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()) && (OrderOpenPrice() + trlstep*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
}
else
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
}
// если короткая позиция (OP_SELL)if (OrderType()==OP_SELL)
{
// расчитываем, при каком значении курса следует скорректировать стоплосс// если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэдif ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
nextstair = OrderOpenPrice() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
// иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэдelse
nextstair = OrderStopLoss() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
// если текущий курс (Аск) >= nextstair и новый стоплосс точно лучше текущего, корректируем последнийif (Ask<=nextstair)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()) && (OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
}
else
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
}
}
以下是它的完整代码,将被插入到以下位置
//+------------------------------------------------------------------+void TrailingStairs(int ticket,int trldistance)
{
int Spred=Ask - Bid;
if (OrderType()==OP_BUY)
{
if((Bid-OrderOpenPrice())>(Point*trldistance))
{
if(OrderStopLoss()<Bid-Point*trldistance || (OrderStopLoss()==0))
{
OrderModify(ticket,OrderOpenPrice(),Bid-Point*trldistance,OrderTakeProfit(),0,Green);
if (PolLots)
if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
{
OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Ask,3,Green);
}
else
{
OrderClose(ticket,OrderLots(),Ask,3,Green);
}
}
}
}
else
{
if((OrderOpenPrice()-Ask)>(Point*trldistance))
{
if((OrderStopLoss()>(Ask+Point*trldistance)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*trldistance,OrderTakeProfit(),0,Red);
if (PolLots)
if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
{
OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Bid,3,Green);
}
else
{
OrderClose(ticket,OrderLots(),Bid,3,Green);
}
}
}
}
}
3.标准的'阶梯式'拖尾。
这种类型的拖尾是对标准拖尾的一种修改。如果我没有记错的话,KimIV 也曾经创造过类似的模型(但是因为相对来说比较好...:),它与标准的追踪不同,追踪止损不是按点转移的(例如,追踪止损在距离30点时为+31,在+32时为+2,等等)。例如,追踪距离为40点,止损距离为10点,当我们达到+40点时,止损将移至+10点,在我们达到+50点利润(40点+步长)之前没有任何变化(也就是说,我们给了价格一定的自由度,这是此算法的重点),只有在+50点时,止损将从+10点移至+20点,在+60点,止损将移至+30点,以此类推。
参数:
ticket - 唯一的订单号(在调用函数withOrderSelect()之前选择);
trldistance - 我们 "拖网 "的距离(点)(不低于MarketInfo(Symbol(),MODE_STOPLEVEL));
trlstep - 改变止损的 "步骤"(点)(不低于1)。
如果trlstep=1,这个功能将与标准的追踪止损没有区别。这种算法的主要 "特点",还是在于为汇率提供了一些 "移动的自由"--只有在价格 "四处游荡 "之后,才会提高止损。这种跟踪算法 我是在V. Barishpolts已经提到的 "移动通道 "战术规则的描述中第一次遇到的。
=================
专家顾问中的这一条很有意思
以下是它的完整代码,将被插入到以下位置
这个
我建议开始修改你喜欢的EA,而不是把它插入你自己的EA中--结果几乎一样,但会有更少的麻烦。
此外,阅读和理解别人的代码的能力将派上用场......
我建议开始修改你喜欢的EA,而不是把它插入你自己的EA中--结果几乎一样,但会有更少的麻烦。
此外,阅读和理解别人的代码的能力将派上用场......
只要他想拥有,就不可能拥有!
)))这就是每个人的开始...然后--越往林子里走,游击队就越胖......
你能告诉我如何在EA中写代码吗?
哪些会形成某一时期的高点和低点(如10.45-11.15)?
我在9点开启了EA-->当它在10点45分时,它开启并开始监控。 当一个条形图在11点15分关闭时(例如15分钟图),它读取并继续监控,例如我已经确定了高点和低点,并在离这些线不远的地方下单。
我预先感谢你的反馈。
我搞不清楚是用什么原理来连接电车的。
事实上,它应该只是工作
我搞不清楚是用什么原理来连接电车的。
毕竟,它应该,事实上,只是工作。
没有任何东西和任何人会 "只是工作"。
你需要了解这个特定的线索在搜索什么,在什么条件下搜索,以什么步骤搜索,是否有任何附加条件。
如果你把拖网代码拆开,一切都会变得清晰,但 "即插即用 "的原则并不能带来好的结果....。