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 Торговые операции Характеристики ордеров и правила проведения торговых операций .
СК,
до правильных цен еще далеко, хотя бы без ошибок скомпилировтаь бы для начала)) лично мне кажется перебор с кол-вом для тикета, что-нибудь убрать бы оттуда)))
до правильных цен еще далеко, хотя бы без ошибок скомпилировтаь бы для начала)) лично мне кажется перебор с кол-вом для тикета, что-нибудь убрать бы оттуда)))
компостер,
вот бы пришел хто и подправил те две строки))) кстати, раньше я так вставлял стопы и тейки и прокатывало, на сей раз почему-то нет. а сам я всего лишь на уровне вставить кастом индюки и стандарты типа тейка, стопа, мм и мэджика. еще повставлять копи-пейстом с других экспертов. ну чуть-чуть понаписать еще несложное пожалуй. а тут гляжу не получается, прямо растерялся даже как-то)
вот бы пришел хто и подправил те две строки)))
Чтобы писать программы нужно понимать ещё одно простое, но важное условие.
Программистская деятельность требует соответствующего уровня культуры (от всех нас ожидается, что он должен быть высоким). До тех пор, пока в голове бродят мысли типа "до правильных цен еще далеко", "вот бы пришел хто и подправил" или "прокатывало", ничего получаться и не будет. Программирование требует строгой дисциплины и твёрдых знаний. Нельзя "немножко знать", так же как нельзя быть "немножко беременным". Программист либо знает (и тогда он может написать что-то работоспособное и полезное), либо не знает (и тогда у него только один путь - узнать).
Для того, чтобы узнать, есть два способа:
1. Писать программы наугад, постоянно ошибаясь и дёргая всех вокруг вопросом "а как правильно?" (революционный способ).
2. Взять Учебник и всё узнать, постепенно и последовательно привыкая к терминологии и овладевая знаниями (академический способ).
История многократно подтверждала, что академический способ в конечном счёте всегда даёт лучший результат.
вот бы пришел хто и подправил те две строки)))
Один из них 0, адругой запятая.
Но то что пальцем ткнул, действительно. Выделено жирным шрифтом что нужно удалить.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
пытаюсь прикрутить стоп лосс, вписывая в тикет 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);
}
// конец.