Помогите с трейлингом
for(cnt=1;cnt<=OrdersTotal();cnt++)
замените на
for(cnt=0;cnt<OrdersTotal();cnt++)
Highest(NULL,0,MODE_HIGH,NBars,0)];
В МТ4 изменили порядок аргументов.
sum+=MathAbs(Open[pos]-Close[pos]);
вы ведь используете Close нулевого бара - в реале, у вас его не будет
prevtime = Time[0];
не достигается, если раньше выход по return
if(pos<Length) pos=Length;
for(i=1;i<Length;i++,pos--)
sum+=MathAbs(Open[pos]-Close[pos]);
while(pos>=0)
{
sum+=MathAbs(Open[pos]-Close[pos]);
Buffer[pos]=(sum/Length)*10000;
sum-=MathAbs(Open[pos+Length-1]-Close[pos+Length-1]);
pos--;
}
что-то подозрительное, но пальцем указать не могу :)
OrderModify(OrderTicket(),Ask,Low[1],OrderTakeProfit(),0,Blue);
bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE) Функция модифицирует (изменяет) параметры ранее открытых позиций или отложенных ордеров Возвращает ИСТИНА при успешном завершении функции. Возвращает ЛОЖЬ при неудачном завершении функции. Для того чтобы получить информацию об ошибке, вызовите GetLastError(). Параметры ticket - Уникальный порядковый номер ордера. price - Новая цена открытия (только для отложенных ордеров). stoploss - Новый уровень ограничения убытка (stoploss). takeprofit - Новый уровень получения прибыли (profit-taking). expiration - Дата/серверное время истечения ордера (только для отложенных ордеров). arrow_color - Цвет стрелки на графике.Если параметр отсутствует или его значение равно CLR_NONE, то символ стрелки на графике не отображается.
Новую цену (второй параметр) можно устанавливать только для отложенных ордеров, а ты пытаешься изменить цену сделки тогда , когда она уже совершена. Вместо Ask поставь OrderOpenPrice( ) или наверняка можно пропустить этот параметр т.е. просто две запятые подряд, или поставить 0 (попробуй).
for(cnt=1;cnt<=OrdersTotal();cnt++)
замените на
for(cnt=0;cnt<OrdersTotal();cnt++)
Да, это верно, исправил.
Highest(NULL,0,MODE_HIGH,NBars,0)];
В МТ4 изменили порядок аргументов.
Каким образом изменен? В словаре вроде также.
вы ведь используете Close нулевого бара - в реале, у вас его не будет
В реале будет текущая цена - она и будет Close.
не достигается, если раньше выход по return
Здесь можно поподробнее, выход по какому return?
for(i=1;i<Length;i++,pos--)
sum+=MathAbs(Open[pos]-Close[pos]);
while(pos>=0)
{
sum+=MathAbs(Open[pos]-Close[pos]);
Buffer[pos]=(sum/Length)*10000;
sum-=MathAbs(Open[pos+Length-1]-Close[pos+Length-1]);
pos--;
}
что-то подозрительное, но пальцем указать не могу :)
Здесь вроде все верно, индикатор нормально работает. Это я в Moving Average подглядел.
Новую цену (второй параметр) можно устанавливать только для отложенных ордеров, а ты пытаешься изменить цену сделки тогда , когда она уже совершена. Вместо Ask поставь OrderOpenPrice( ) или наверняка можно пропустить этот параметр т.е. просто две запятые подряд, или поставить 0 (попробуй).
Попробовал, не помогает. В тестере трейлинг должен ведь работать?
трейлинг работает, впрочем это выражение не верно т.к. встроенного трейлинга в советнике нет, а код должен отрабатывать за исключением объявленных ограничений
трейлинг работает, впрочем это выражение не верно т.к. встроенного трейлинга в советнике нет, а код должен отрабатывать за исключением объявленных ограничений
В логах ничего не нашел, каким образом он работает, у меня что есть этот код, что нет - один, извините, хрен да редька.
if (OrdersTotal()==1) return(0); // нет ни одного открытого ордера
ты артист однако, вначале старт сразу выкидываешь советника, конечно ни о каких трейлингах не может быть речи, т.к.
1. коммент не верный (если есть один ордер)
2. при его наличии советник прекращает работу, а он у тебя после первогй сработки старт единственный
и дальше ты его всегда return(0)
Вот что у меня есть:
extern int Length=2; extern double NBars=5; extern double TakeProfit=200; extern double TrailingStop=20; double Lots=1.0; extern double StopLoss=30; double Points; double Slippage=0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- TODO: Add your code here. Points = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- TODO: Add your code here. Comment(""); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- TODO: Add your code here. double prevtime=0,Tail=2,AverageCur=0,AveragePre=0,Total=0; int cnt=0; double SLSell=0,SLBuy=0; if ((Bars<200) || (TakeProfit<10)) return(0); // на графике менее 200 баров - выходим // неверные параметры тейкпрофита if (OrdersTotal()==1)return(0); // нет ни одного открытого ордера if (AccountFreeMargin()<1000) return(0); // денег нет - выходим if (prevtime==Time[0]) return(0); SLSell=High[Highest(NULL,0,MODE_HIGH,NBars,0)]; SLBuy=Low[Lowest(NULL,0,MODE_LOW,NBars,0)]; if ((Close[3] > Open[3]) && ((Close[3] - Open[3]) > iCustom(NULL,0,"Среднее тело бара", Length,1,0)) && (MathMin(Close[2],Open[2])>=Close[3]) && (Close[1] < Open[1]) && (High[3]<High[2]) && (MathAbs(Open[3]-Close[3])>MathAbs(Open[2]-Close[2])) && (Close[1] < Close[3])) { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SLSell,Bid-TakeProfit*Points,"Вечерняя звезда",003,0,Green); SetIndexArrow(0,226); return(0); } if ((Close[3] < Open[3]) //&& ((Open[3] - Close[3]) > 0.0010) && (MathMax(Close[2],Open[2]) <= Close[3]) && (Close[1] > Open[1]) && (Low[3]>Low[2]) //&& (MathAbs(Open[3]-Close[3])>MathAbs(Open[2]-Close[2])) && (MathAbs(Open[3]-Close[3])>iCustom(NULL,0,"Среднее тело бара", Length,1,4)) && (Close[1] > Close[3])) { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SLBuy,Ask+TakeProfit*Points,"Утренняя звезда",006,0,Purple); SetIndexArrow(0,225); return(0); } for(cnt=1;cnt<=OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if (OrderType()<=OP_SELL && // это открытая позиция? OP_BUY или OP_SELL OrderSymbol()==Symbol()) // инструмент совпадает? { if (OrderType()==OP_BUY) // открыта длинная позиция { if (Open[1]<Close[1]) { OrderModify(OrderTicket(),Ask,Low[1],OrderTakeProfit(),0,Blue); return(0); } } else { if (Open[1]>Close[1]) { OrderModify(OrderTicket(),Bid,High[1],OrderTakeProfit(),0,Blue); return(0); } } } } prevtime = Time[0]; //---- return(0); }Это используемый индикатор:
#property indicator_separate_window #property indicator_minimum 0.0000 #property indicator_maximum 50 extern int Length=8; #property indicator_color1 Plum double Buffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexBuffer(0,Buffer); SetIndexDrawBegin(0,Length); SetIndexShift(0,0); //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int ExtCountedBars=0; ExtCountedBars=IndicatorCounted(); double sum=0; int i,pos=Bars-ExtCountedBars-1; //---- initial accumulation if(pos<Length) pos=Length; for(i=1;i<Length;i++,pos--) sum+=MathAbs(Open[pos]-Close[pos]); while(pos>=0) { sum+=MathAbs(Open[pos]-Close[pos]); Buffer[pos]=(sum/Length)*10000; sum-=MathAbs(Open[pos+Length-1]-Close[pos+Length-1]); pos--; } //---- return(0); }