Эксперта на основе OsMA

 
Привет всем!
подскажите пожалуйста никак не могу найти образец эксперта на основе осма...
мне нужно задать все изначально, чтобы мне только условие осталось прописать.
Точнее:
В 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);

"
после чего задается условие, так вот мне интересно как из осма также данные вытащить во временные переменные.....подскажите пожалуйста...спасибо.
 
kadir-06 >>:
...подскажите пожалуйста никак не могу найти образец эксперта на основе осма...
Пример.
 
Из осма можно вытащить функцией iCustom().
Например так:
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);

 
спасибо.....очень выручили!
 
а как задать условие торговли, к примеру если значение индикатора osma > 0.0002 тогда только можно торговать...
достаточно будет написать if(osma>0.0002...и т.д.) -> открытие ордера.
 
kadir-06 >>:
а как задать условие торговли, к примеру если значение индикатора 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, а 
по условию такого быть не должно, не могу понять в чем причина...подскажите.
 
kadir-06 >>:
...и условие, как вы видите в нем четко прописано...
Во-первых, со скобочками у Вас некомплект, но это разбирайтесь сами. Компилятор Вами недоволен.
\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);
}
//+------------------------------------------------------------------+
 
Скобки это похоже просто ошибка вставки, потому что если у kadir-06 поз. открывались значит с этим все норм., но все же для наглядности кода лучше пользоваться кнопочкой "SRC".
Насколько я понял торговую систему то задача купить когда 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.
      if (
            osma1 > 0.0002 && 
            osma2 > 0.0002 && 
            osma3 > 0.0002 && 
            osma3 > osma2  && 
            osma2 > osma1  && 
            osma0 > osma1
         )
Вот так выглядит условие, написанное Анатолием для sell. Все максимально читабельно и очень удобно при правке.
Причина обращения: