Советник на основе OsMA

 
Всем привет, подскажите плиз
я не силен в програмировании, интересует советник, который открывает сделку указанным количеством лотов по пересечению 0 линии индюка OsMA,
держит до образования сигнала в противоположном направлении.
у себя нашел такой код, только в нем что-то не так, может его как-то поправить?

#property copyright ""
#property link ""

int Mn = 2007;
extern int TakeProfit=0;
extern int StopLoss=0;
extern double Lots=0.1;
extern int OsMA_fast_period=10;
extern int OsMA_slow_period=20;
extern int OsMA_signal_period=14;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

double osma=iOsMA(NULL,NULL,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period, PRICE_CLOSE,0);
int ticket=0;


{
if(osma>0)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,TakeProfit,0,Mn,0,Yellow);
if(ticket<=0)
Print("Error opening BUY order : ",GetLastError());
return(0);
}
if(osma<0)
{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss,TakeProfit,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(osma<0)
OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow);
}
if(OrderType()==OP_SELL)
{
if(osma>0)
OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
 
вроде нет переменной отвечающей за количество лотов. А она должна быть и должен быть её контроль Хотя я не спец
 
вот я тоже не спец, мож кто поможет?
 
 Неверно много чего - стопы и профиты в ордерах, при вызове индикатора ПЕРИОД - 0 , а не NULL, условие пересечения  нужно задавать двумя значениями с баров - 0 и 1, ticket - задать глобально. Посмотрите в коде-базе работающий советник и поймете ошибки.
 
нужно поставить в условие открытие ордена следущее
if (OrdersTotal()==0){

что означает, если ордеров нет то..... далее по условию

if (OrdersTotal()==0){

if(osma<0){.............

...............

 
Prival:
вроде нет переменной отвечающей за количество лотов. А она должна быть и должен быть её контроль Хотя я не спец

extern double Lots=0.1;

И по PRICE_CLOSE в советнике может вызвать дребезг открыть-закрыть-открыть-. .. или ставить запрет на повторное открыть/закрыть на одном баре.

И проверка должна быть типа if(osma<0 && prevosma>0) - тогда будет по пересечению (osma - значение на баре #0, prevosma - значение на баре #1).

Хотя я не спец.

To FION

привет, Сергей. Давно не пересекались.

 
Bookkeeper:
Prival:
вроде нет переменной отвечающей за количество лотов. А она должна быть и должен быть её контроль Хотя я не спец

extern double Lots=0.1;


И по PRICE_CLOSE в советнике может вызвать дребезг открыть-закрыть-открыть-. .. или ставить запрет на повторное открыть/закрыть на одном баре.


И проверка должна быть типа if(osma<0 && prevosma>0) - тогда будет по пересечению (osma - значение на баре #0,  prevosma - значение на баре #1).


Хотя я не спец.


 

Большое спасибо за комменты у меня получилось вот что:
#property copyright ""
#property link ""

int Mn = 2007;
extern int TakeProfit=0;
extern int StopLoss=0;
extern double Lots=0.1;
extern int OsMA_fast_period=10;
extern int OsMA_slow_period=20;
extern int OsMA_signal_period=14;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

double osma=iOsMA(NULL,NULL,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period, PRICE_CLOSE,0);
double prevosma=iOsMA(NULL,NULL,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period, PRICE_CLOSE,1);
int ticket=0;
if (OrdersTotal()==0)

{
if(osma>0 && prevosma<0)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,TakeProfit,0,Mn,0,Yellow);
if(ticket<=0)
Print("Error opening BUY order : ",GetLastError());
return(0);
}
if(osma<0 && prevosma>0)
{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss,TakeProfit,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(osma<0 && prevosma>0)
OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow);
}
if(OrderType()==OP_SELL)
{
if(osma>0 && prevosma<0)
OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
}
}
}
return(0);
}
//+------------------------------------------------------------------+


я правильно мысль уловил?
 
//+------------------------------------------------------------------+
extern int TakeProfit=200;
extern int StopLoss=200;
extern double Lots=0.1;
extern int OsMA_fast_period=10;
extern int OsMA_slow_period=20;
extern int OsMA_signal_period=14;
extern int Mn=2007;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
 
double osma=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,0);
double prevosma=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,1);
int ticket=0;
if (OrdersTotal()==0)
{
if(osma>0 && prevosma<=0)
{
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(osma<0 && prevosma>=0)
{
 
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(osma<0 && prevosma>=0)
OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow);
}
if(OrderType()==OP_SELL)
{
if(osma>0 && prevosma<=0)
OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
}
}
}
return(0);
}
//+------------------------------------------------------------------+

Вот так нужно.

2 Bookkepeer . Привет Андрей, видел твой советник, для чемпионата. Индикатор понравился.

 
FION:
//+------------------------------------------------------------------+
extern int TakeProfit=200;
extern int StopLoss=200;
extern double Lots=0.1;
extern int OsMA_fast_period=10;
extern int OsMA_slow_period=20;
extern int OsMA_signal_period=14;
extern int Mn=2007;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
 
double osma=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,0);
double prevosma=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,1);
int ticket=0;
if (OrdersTotal()==0)
{
if(osma>0 && prevosma<=0)
{
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(osma<0 && prevosma>=0)
{
 
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(osma<0 && prevosma>=0)
OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow);
}
if(OrderType()==OP_SELL)
{
if(osma>0 && prevosma<=0)
OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
}
}
}
return(0);
}
//+------------------------------------------------------------------+

 Вот так нужно.


2 Bookkepeer . Привет Андрей, видел твой советник, для чемпионата. Индикатор понравился.  


 


 



большое спасибо
 

Вставил в эксперт условие :

if(Time[0]==prevtime) return(0);//ждём появления нового бара
prevtime = Time[0]; //если появился новый бар -

Но не совсем корректно работает эксперт. По условию покупки if(osma>0 && prevosma<=0) и продажи тож.

Стал вникать и получается, что значительное большинство сделок пропускается (не открывается)! Хотя сигнал, как видно из графика, присутствует. Выяснилось, что не срабатывет

double osma=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,0);

условие из за нулевого бара - получается вот что:

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

А на истории при этом условие воде бы соблюдено! Т.е. предыд.Осма меньше нуля, а текущая Осма больше нуля!

Можно, конечно, взять для работы не первый и нулевой бары, а

второй и первый. Но тогда получается запаздывание со входами и, как результат - снижение профита.

А КАК же решить эту проблему? Чтобы нулевой бар работал корректно?

 
rid:


double osma=iOsMA(NULL,0,OsMA_fast_period,OsMA_slow_period,OsMA_signal_period,PRICE_CLOSE,0);

А КАК же решить эту проблему? Чтобы нулевой бар работал корректно?

Для этого точно нужно знать цену закрытия нулевого бара. А если Вы ее знаете на момент открытия нулевого бара - зачем тогда вообще каким-либо образом напрягаться - просто от цены открытия открывайтесь в сторону цены закрытия, если разность такова, что заработок устраивает ;).


А если серьезно - НИКАК.


Успехов.

Причина обращения: