Друзья... помогите, пожалуйста, разобраться с советником...

 

Друзья, пишу советника на основе индикатора, ранее опубликованного одним из экспертов-трейдеров на данном форуме.


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


заранее ОГРОМНОЕ спасибо вам.


//+------------------------------------------------------------------+
//|
//|
//|
//+------------------------------------------------------------------+

// StopLoss level
extern double sl = 50;
extern double lots = 1; //0.01 -> 1
extern int MagicNumber = 87878;
static int prevtime = 0;

//Глобальные переменные для trailing-stop
extern double tr_st_buy = 30;//50;
extern double tr_st_sell = 30;//50;

extern double pribavlenie = 30;//50;
extern double pribavlenie1 = 30;//50;

//===================================================================
//Глобальные переменные, отслеживающие наличие открытого ордера
double sell_order_open;
double buy_order_open;

//===================================
extern int period=8;//12;
extern int porog =3;
extern int metod =1;
extern int metod2=1;
extern int prise =0;

//===================================
int state_xma=0;
int change_state=0;
//========================================

//===================================
// ЗАМЕНЯЕМ ИНДИКАТОР АС на АО (и, поэтому, не используем средние)
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//========================================
//Проверка на наличие необходимого количества средств на счете
if(AccountFreeMargin()<100) // деньги кончились
{
Print("деньги кончились = ", AccountFreeMargin());
return(0);
}

//========================================
if(Time[0] == prevtime)
return(0);
prevtime = Time[0];
int spread = 3;
//----
if(IsTradeAllowed())
{
RefreshRates();
spread = MarketInfo(Symbol(), MODE_SPREAD);
}
else
{
prevtime = Time[1];
return(0);
}

//=============================================

sell_order_open = 0;
buy_order_open = 0;
//=============================================

//==============================================
double
M_0, M_1, // Значение MAIN на 0 и 1 барах
S_0, S_1, // Значение SIGNAL на 0 и 1 бар
St_M_0, St_M_1, // Значение MAIN на 0 и 1 барах
St_S_0, St_S_1; // Значение SIGNAL на 0 и 1 бар

Comment("colour = " + xma_coloured() + "state_change = "+change_state);
string period = 0 ; //PERIOD_H1 PERIOD_M30
string Sym= Symbol();
//===============


state_xma=0;
change_state=0;


//=============================================
int ticket = -1;
// check for opened position
int total = OrdersTotal();
//----
for(int i = total - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
// check for symbol & magic number
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
int prevticket = OrderTicket();
// long position is opened
if(OrderType() == OP_BUY)
{
// check profit

if ( (xma_coloured()== 1) ) //
{
if ((xma_coloured()== 1) )//
{
PlaySound("Close.wav");

OrderClose(OrderTicket(), lots, Bid, 2, Green);
buy_order_open = 0;
// tr_st_buy = pribavlenie;//
}

else
{

}

}

//========================================================================
// Трейлинг

if (Bid - OrderOpenPrice()>=tr_st_buy* Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(),Bid - pribavlenie*Point,OrderOpenPrice()+ (sl*1+spread)*Point, 0, Blue); //sl*1
tr_st_buy = tr_st_buy+pribavlenie;
}


//SarTrailingStop();
//========================================================================

// short position is opened
}

else
{
// check profit

if ( (xma_coloured()== -1) ) //
{
if ( (xma_coloured()== -1) ) //
{
PlaySound("Close.wav");

OrderClose(OrderTicket(), lots, Ask, 2, Green);
sell_order_open = 0;
// tr_st_sell = pribavlenie1;
}
else
{

}

//=================================================================
}


//========================================================================
// Трейлинг

if (OrderOpenPrice() - Ask >= tr_st_sell* Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + pribavlenie*Point, Ask - (sl*1 +spread) *Point, 0, Blue);
tr_st_sell = tr_st_sell+pribavlenie;
}

//========================================================================



}

}
}
//Выставляем ордера на покупку или продажу==========================
// check for long or short position possibility

//--------------------------------------------------


if ( (xma_coloured()== -1)&& (change_state==2) ) //
{
//--------------------------------------------------
if ( buy_order_open==0 )
{
//================================================
PlaySound("Buy_sound.wav");

//===============================================
//long
ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0, "Buy", MagicNumber, 0, Blue); // 0->Bid + (sl*1+spread)*Point
//----
if(ticket < 0)
{
Sleep(30000);
prevtime = Time[1];
}
//-------------------------------------------------
buy_order_open = 1;
}
//===============================================
}



if ( (xma_coloured()==1)&& (change_state==1) ) //
{
//--------------------------------------------------
if ( sell_order_open==0 )
{
//================================================
PlaySound("Sell_sound.wav");
//===============================================
// short
ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0, "Sell", MagicNumber, 0, Red); // 0-> Ask - (sl*1 +spread) *Point
if(ticket < 0)
{
Sleep(30000);
prevtime = Time[1];
}
//-------------------------------------------------
sell_order_open = 1;
}
//===============================================

}

//===============================================
return(0);
}
//==============================================================
int xma_coloured(){
int limit;
double tmp1,tmp2;
int colour = 0;

int i;

i=0;

//--------------------------------
tmp1=iMA(Symbol(),0,period,0,metod,prise,i);
tmp2=iMA(Symbol(),0,period,1,metod2,prise,i);
if(MathAbs(tmp1-tmp2)>=porog*Point)
{
if(Open[0]<=tmp2)//Close[1]
{
//сигнал на продажу
colour=1;


if (state_xma==1)
{
change_state=0;// уже был сигнал на продажу, подтвердили его наличие
}
else
if (state_xma!=1)
{
state_xma=1;
change_state=1; //поступил сигнал на продажу после флета или восходящей тенденци
return(colour);
}

}

// else
if(Open[0] >tmp2) //Open[i] >tmp2
{
//сигнал на покупку
colour = -1;

if (state_xma==2)
{
change_state=0;// уже был сигнал на покупку, подтвердили его наличие
}
else
if (state_xma!=2)
{
state_xma=2;
change_state=2; //поступил сигнал на покупку после флета или нисходящей тенденции
return(colour);
}

}

}
else
{
state_xma=0;

}


//--------------------------------
return (colour);
}
//=============================================================




 

Дружище!

Если хочешь чтоб кто-нибудь ковырял твой кривой код, детально комментируй каждую строку.

Особенно в части логики, что и почему.

И алгоритм неплохо написать словами. Кратко.