кривой стоп

 

пытаюсь прикрутить стоп лосс, вписывая в тикет Bid-StopLoss*Point для лонга и Ask+StopLoss*Point для шорта, выдает ')' - wrong parameters count

extern double TakeProfit = 600;
extern double StopLoss = 100;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double MacdCurrent, MacdPrevious, SignalCurrent;
double SignalPrevious, MaCurrent, MaPrevious;
int cnt=0, ticket, total;
// первичные проверки данных
// важно удостовериться что эксперт работает на нормальном графике и
// пользователь правильно выставил внешние переменные (Lots, StopLoss,
// TakeProfit, TrailingStop)
// в нашем случае проверяем только TakeProfit
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0); // проверяем TakeProfit
}
if(StopLoss<10)
{
Print("StopLoss less than 10");
return(0); // проверяем StopLoss
}
// ради упрощения и ускорения кода, сохраним необходимые
// данные индикаторов во временных переменных
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

total=OrdersTotal();
if(total<1)
{
// нет ни одного открытого ордера
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// проверяем на возможность встать в длинную позицию (BUY)
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,Bid-StopLoss*Point,"macd sample",16384,0,Blue);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
// проверяем на возможность встать в короткую позицию (SELL)
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,Ask+StopLoss*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
// переходим к важной части эксперта - контролю открытых позиций
// 'важно правильно войти в рынок, но выйти - еще важнее...'
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // это открытая позиция? OP_BUY или OP_SELL
OrderSymbol()==Symbol()) // инструмент совпадает?
{
if(OrderType()==OP_BUY) // открыта длинная позиция
{
// проверим, может уже пора закрываться?
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
return(0); // выходим
}
// проверим - может можно/нужно уже трейлинг стоп ставить?
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // иначе это короткая позиция
{
// проверим, может уже пора закрываться?
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
return(0); // выходим
}
// проверим - может можно/нужно уже трейлинг стоп ставить?
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
// конец.

 
delyus:

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,Ask+StopLoss*Point,"macd sample",16384,0,Red);

Дожились, количество аргументов в функции посчитать не можем ;)
 
delyus писал (а):
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,Ask+StopLoss*Point,"macd sample",16384,0,Red);

Вот это неправильно. При открытии ордера StopLoss и TakeProfit расчитываются от правильных цен.

Правильной ценой открытия Buy является Ask.
Правильной ценой для расчёта StopLoss и TakeProfit является цена закрытия ордера, для ордера Buy это цена Bid.
Правильной ценой открытия Sell является Bid.
Правильной ценой для расчёта StopLoss и TakeProfit является цена закрытия ордера, для ордера Sell это цена Ask.

Смотрите здесь: Учебник по MQL4 Торговые операции Характеристики ордеров и правила проведения торговых операций .

 

СК,

до правильных цен еще далеко, хотя бы без ошибок скомпилировтаь бы для начала)) лично мне кажется перебор с кол-вом для тикета, что-нибудь убрать бы оттуда)))

 
delyus:

до правильных цен еще далеко, хотя бы без ошибок скомпилировтаь бы для начала)) лично мне кажется перебор с кол-вом для тикета, что-нибудь убрать бы оттуда)))

Дожились, уже и конкретных ответов на поставленный вопрос не видим...
 

компостер,

вот бы пришел хто и подправил те две строки))) кстати, раньше я так вставлял стопы и тейки и прокатывало, на сей раз почему-то нет. а сам я всего лишь на уровне вставить кастом индюки и стандарты типа тейка, стопа, мм и мэджика. еще повставлять копи-пейстом с других экспертов. ну чуть-чуть понаписать еще несложное пожалуй. а тут гляжу не получается, прямо растерялся даже как-то)

 
delyus:

вот бы пришел хто и подправил те две строки)))

Делюс, я же ПАЛЬЦЕМ ТКНУЛ в ошибку! Сложно 2 символа удалить?!?!?!?!
 

Чтобы писать программы нужно понимать ещё одно простое, но важное условие.

Программистская деятельность требует соответствующего уровня культуры (от всех нас ожидается, что он должен быть высоким). До тех пор, пока в голове бродят мысли типа "до правильных цен еще далеко", "вот бы пришел хто и подправил" или "прокатывало", ничего получаться и не будет. Программирование требует строгой дисциплины и твёрдых знаний. Нельзя "немножко знать", так же как нельзя быть "немножко беременным". Программист либо знает (и тогда он может написать что-то работоспособное и полезное), либо не знает (и тогда у него только один путь - узнать).

Для того, чтобы узнать, есть два способа:
1. Писать программы наугад, постоянно ошибаясь и дёргая всех вокруг вопросом "а как правильно?" (революционный способ).
2. Взять Учебник и всё узнать, постепенно и последовательно привыкая к терминологии и овладевая знаниями (академический способ).

История многократно подтверждала, что академический способ в конечном счёте всегда даёт лучший результат.

 
komposter:
delyus:

вот бы пришел хто и подправил те две строки)))

Делюс, я же ПАЛЬЦЕМ ТКНУЛ в ошибку! Сложно 2 символа удалить?!?!?!?!


Один из них 0, адругой запятая.

Но то что пальцем ткнул, действительно. Выделено жирным шрифтом что нужно удалить.

 
вот черт! кстати, я так и думал)))) к учебнику я обращаюсь по мере необходимости и своего шаблона еще не сделал. точнее сделал, но советники не всегда работают, хотя ошибок не выдают. видимо тут как и везде важно знать тонкости и наработать опыт. блин, ну неужели нельзя сделать учебник в одном зип? ну пусть с ошибками пока будет, но лучше уж будет чем нет.
 
но делать советники увлекательно кншн, такое удовольствие надо освоить самому, в этом вы правы. жаль что я пока могу воплотить не все свои идеи, на некоторые пока еще не придумано и индикаторов)) так что самое интересное еще впереди. еще раз прошу учебник в зип-файле для качки, а то буду сохранять страницы по одному, чтоб вам было стыдно))
Причина обращения: