С ходу ошибка - не знаю, правда, в ней ли дело:
for(cnt=1;cnt<=OrdersTotal();cnt++)
замените на
for(cnt=0;cnt<OrdersTotal();cnt++)
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--;
}
что-то подозрительное, но пальцем указать не могу :)
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++)
for(cnt=1;cnt<=OrdersTotal();cnt++)
замените на
for(cnt=0;cnt<OrdersTotal();cnt++)
Да, это верно, исправил.
Еще:
Highest(NULL,0,MODE_HIGH,NBars,0)];
В МТ4 изменили порядок аргументов.
Highest(NULL,0,MODE_HIGH,NBars,0)];
В МТ4 изменили порядок аргументов.
Каким образом изменен? В словаре вроде также.
sum+=MathAbs(Open[pos]-Close[pos]);
вы ведь используете Close нулевого бара - в реале, у вас его не будет
вы ведь используете Close нулевого бара - в реале, у вас его не будет
В реале будет текущая цена - она и будет Close.
prevtime = Time[0];
не достигается, если раньше выход по return
не достигается, если раньше выход по return
Здесь можно поподробнее, выход по какому 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--;
}
что-то подозрительное, но пальцем указать не могу :)
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)
в названиях индикаторов лучше не использовать кирилицу, тем более с пробелами
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот что у меня есть:
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); }