Эксперта на основе OsMA
Например так:
OsMAPrevious = iCustom(NULL, 0, "OsMA", FastEMA, SlowEMA, SignalSMA, 0, 1); OsMACurrent = iCustom(NULL, 0, "OsMA", FastEMA, SlowEMA, SignalSMA, 0, 0);ну или так же как у тебя с помощью iOsMA()
OsMAPrevious = iOsMA(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 1); OsMACurrent = iOsMA(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 0);
достаточно будет написать if(osma>0.0002...и т.д.) -> открытие ордера.
а как задать условие торговли, к примеру если значение индикатора osma > 0.0002 тогда только можно торговать...
достаточно будет написать if(osma>0.0002...и т.д.) -> открытие ордера.
Ну и пойдет он ставить ордера один за другим, пока выполняется условие. Надо отслеживать событие изменения значения индикатора при переходе через заданный уровень. Типа, только что он был ниже 0,0002, а тут уже больше 0,0002. В этот момент и должен выдаваться однократный сигнал, который приведет к открытию одного ордера. Грубо говоря, рассчитываем значение индикатора на двух последовательных барах, обычно на первом и втором, поскольку нулевой "болтается" и сравниваем их значения с заданным уровнем.
если(осма(1)>порог и осма(2)<=порог) открываем ордер
код вот такой:
int start()
{
double osma0=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_OPEN,0);
double osma1=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,1);
double osma2=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,2);
double osma3=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,3);
int ticket=0;
if (OrdersTotal()==0)
{
if(osma1<0.0002 && osma2<0.0002 && osma3<0.0002 && osma3>osma2 && osma2>osma1 && osma0>osma1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,0,Mn,0,Yellow);
if(ticket<=0)
Print("Error opening BUY order : ",GetLastError());
return(0);
}
if(osma1>0.0002 && osma2>0.0002 && osma3>0.0002 && osma3<osma2 && osma2<osma1 && osma0<osma1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,0,Mn,0,Red);
if(ticket<=0)
Print("Error opening BUY order : ",GetLastError());
}
и условие, как вы видите в нем четко прописано,
но эксперт почему-то открывает ордера на покупку когда индикатор находится выше 0.0002, и на продажу соответственно когда OsMA находится ниже 0.0002, а
по условию такого быть не должно, не могу понять в чем причина...подскажите.
\end_of_program' - ending bracket '}' expected
Во-вторых, не вижу четко прописанного условия, уж извиняйте. Я бы написал проще.
if(osma1<=0.0002 && osma2> 0.0002) {buy } if(osma1> 0.0002 && osma2<=0.0002) {sell}
При твоем условии все зависит от уровня...точнее вход осуществляется при пересечении, при моем же условии при смене тенденции.
когда OsMA выше уровня 0.0002 и 3-е значение ОсМА меньше 2-го, 2-е меньше 1-го, и нулевой (текущий бар) меньше 1-го (т..е. меньше предыдущего), то SELL.
Восходящее движение индикатора ОсМА в течении 3-х баров, и на 4-м падение, тогда продажа....а он мне при таком раскладе все равно покупает Не могу понять почему.
//+------------------------------------------------------------------+
extern int TakeProfit=30;
extern int StopLoss=30;
extern double Lots=1.0;
extern int OsMA_fast_period=12;
extern int OsMA_slow_period=26;
extern int OsMA_signal_period=9;
extern int Mn=2010;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double osma0=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_OPEN,0);
double osma1=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,1);
double osma2=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,2);
double osma3=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,3);
int ticket=0;
if (OrdersTotal()==0)
{
// Если Все 3 последних бара <-0.00045, и если 3>2,2>1,1<0 то покупать
// Если Все 3 последних бара >0.00055, и если 3<2,2<1,1>0 то продавать
/*if(osma1<0 && osma2<0 && osma3<0 && osma3>osma2 && osma2>osma1 && osma0>osma1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,0,Mn,0,Yellow);
if(ticket<=0)
Print("Error opening BUY order : ",GetLastError());
return(0);
}
*/
if(osma1>0 && osma2>0 && osma3>0 && osma3<osma2 && osma2<osma1 && osma0<osma1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,0,Mn,0,Red);
if(ticket<=0)
Print("Error opening BUY order : ",GetLastError());
}
}
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderMagicNumber()==Mn && OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
if(osma0<0 && osma1>=0)
OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow);
}
if(OrderType()==OP_SELL)
{
if(osma0>0 && osma1<=0)
OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
Насколько я понял торговую систему то задача купить когда OsMA снизу начинает расти, а продать когда она с верху начинает падать, я правильно понял?
Так вот "с низу" это -0.0002, а не 0.0002 и с логикой проверки условий тоже косяк.
Если я правильно понял систему то надо вот так:
if (OrdersTotal()==0){ if(osma1 < -0.0002 && osma2 < -0.0002 && osma3 < -0.0002 && osma3 < osma2 && osma2 < osma1 && osma0 < osma1){ ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Bid+TakeProfit*Point,0,Mn,0,Yellow); if(ticket<=0)Print("Error opening BUY order : ",GetLastError()); return(0); } if(osma1 > 0.0002 && osma2 > 0.0002 && osma3 > 0.0002 && osma3 > osma2 && osma2 > osma1 && osma0 > osma1){ ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,Ask-TakeProfit*Point,0,Mn,0,Red); if(ticket<=0)Print("Error opening BUY order : ",GetLastError()); return(0); } }И еще, правильная цена закрытия ордера BUY это BID (в том числе и для значений TakeProfit/StopLoss),
тоже и для SELL правильная будет ASK (в том числе и для значений TakeProfit/StopLoss).
if ( osma1 > 0.0002 && osma2 > 0.0002 && osma3 > 0.0002 && osma3 > osma2 && osma2 > osma1 && osma0 > osma1 )Вот так выглядит условие, написанное Анатолием для sell. Все максимально читабельно и очень удобно при правке.
подскажите пожалуйста никак не могу найти образец эксперта на основе осма...
мне нужно задать все изначально, чтобы мне только условие осталось прописать.
Точнее:
В MACD вводятся некие переменные
"Для облегчения кодирования и ускорения доступа применяется предварительное помещение данных во внутренние переменные.
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);
"
после чего задается условие, так вот мне интересно как из осма также данные вытащить во временные переменные.....подскажите пожалуйста...спасибо.