Требуется помощь - немного подкорректировать код

Flex

Интересующийся
Здравствуйте.
Имеется в наличии простенький советник, хотел его своими силами модифицировать, но после полу-дня копаний понял что не смогу.

На данный момент советник при пересечении линиями стохастиков опр. уровня открывает ордер. А требуется сделать так, чтобы он не при простом пересечении открывал ордер, а лишь при обратном.
Т.е. стох идет вверх, пересекает опр. уровень (на данный момент в это время и открывается ордер), потом возвращается обратно, пересекая заново этот уровень - и вот только здесь надо открывать ордер.

Мне кажется, что доработка не сложная. Помогите, плиз!

Вот код:

Эксперт работает по индикатору "Stochastic-X8".
Зададим верхний уровень от которого будет открываться СЕЛЛ - "H_level".
Зададим нижний уровень от которого будет открываться БАЙ - "L_level".

1. Каждой линии стохастиков назначается весовой коэффициент,
который станет равен "+1", если линия пересечет уровень "H_level".
Весовой коэффициент, станет равен "-1", если линия пересечет уровень "L_level".
Если "N" линий будут выше уровня "H_level",
сумма весовых коэффициентов будет равна "N".
Если "N" линий будут ниже уровня "L_level",
сумма весовых коэффициентов будет равна "-N".

2. При работе эксперта будем считать, что если сумма весовых коэффициентов
больше значения "Summa", тогда будет открыт SELL
или если меньше "-Summa", тогда будет открыт BUY. //

*/
// Эксперт открывает сделки при пробитии индикатором уровней
// "H_level", "L_level"

extern int Takepr = 0; // тейкпрофит
extern int Stopls = 0; // стоплосс

extern string ind_name = "Stochastic-X8";//название индикатора
extern int Stoch_D = 48; //первый параметр индикатора
extern int Stoch_K = 8; //второй параметр индикатора
extern int Stoch_S = 16; //трeтий параметр индикатора
extern double Koef = 1.1; //четв. параметр индикатора
extern int H_level = 90; //уровень индикатора для открытия ордеров
extern int L_level = 40; //уровень индикатора для открытия ордеров
extern int Summa = 4; //уровень индикатора для открытия ордеров


extern double lots = 0.1;
extern int magic = 111200;
extern int slipp = 30;
int num_buy,num_sell;
double tp, sl;
double D10,D11,D12,D13,D14,D15,D16,D17;
double K10,K11,K12,K13,K14,K15,K16,K17;
double S10,S11,S12,S13,S14,S15,S16,S17;


int start()
{

int INDI = ma_ind ();

num_buy=0;num_sell=0;
if (OrdersTotal() > 0)
{for(int i = 0; i < OrdersTotal(); i++)
{OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderType() == OP_BUY && OrderMagicNumber()==magic)
{num_buy++;
if (INDI >= Summa )
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slipp, Blue);
}

if (OrderType() == OP_SELL && OrderMagicNumber()==magic)
{num_sell++;
if (INDI <= -Summa )
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slipp, Red);
}
}
}

// Покупка
if ( INDI <= -Summa && num_buy==0 )
{RefreshRates();
if(Stopls==0)sl=0;else sl = MathMin(Ask-Stopls*Point, Bid-MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);
if(Takepr==0)tp=0;else tp = MathMax(Ask+Takepr*Point, Bid+MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);
OrderSend(Symbol(), OP_BUY, lots,nd0(Ask),slipp,nd0(sl),nd0(tp),WindowExpertName()+"-"+Symbol(), magic, 0, Blue);
}

// Продажа
if ( INDI >= Summa && num_sell==0 )
{RefreshRates();
if(Stopls==0)sl=0;else sl = MathMax(Bid+Stopls*Point, Ask+MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);
if(Takepr==0)tp=0;else tp = MathMin(Bid-Takepr*Point, Ask-MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);
OrderSend(Symbol(), OP_SELL, lots,nd0(Bid),slipp,nd0(sl),nd0(tp),WindowExpertName()+"-"+Symbol(), magic, 0, Red);
}

return(0);
}

int ma_ind () {

int rezult0=0,rezult1=0,rezult2=0,rezult3=0,rezult4=0,rezult5=0,rezult6=0,rezult7=0;

HideTestIndicators(True);
double ma01 = iStochastic(NULL,0,D10,K10,S10,3,1,0,1);
double ma11 = iStochastic(NULL,0,D11,K11,S11,3,1,0,1);
double ma21 = iStochastic(NULL,0,D12,K12,S12,3,1,0,1);
double ma31 = iStochastic(NULL,0,D13,K13,S13,3,1,0,1);
double ma41 = iStochastic(NULL,0,D14,K14,S14,3,1,0,1);
double ma51 = iStochastic(NULL,0,D15,K15,S15,3,1,0,1);
double ma61 = iStochastic(NULL,0,D16,K16,S16,3,1,0,1);
double ma71 = iStochastic(NULL,0,D17,K17,S17,3,1,0,1);

if ( H_level < ma01 ) rezult0= 1;
if ( L_level > ma01 ) rezult0=-1;
if ( H_level < ma11 ) rezult1= 1;
if ( L_level > ma11 ) rezult1=-1;
if ( H_level < ma21 ) rezult2= 1;
if ( L_level > ma21 ) rezult2=-1;
if ( H_level < ma31 ) rezult3= 1;
if ( L_level > ma31 ) rezult3=-1;
if ( H_level < ma41 ) rezult4= 1;
if ( L_level > ma41 ) rezult4=-1;
if ( H_level < ma51 ) rezult5= 1;
if ( L_level > ma51 ) rezult5=-1;
if ( H_level < ma61 ) rezult6= 1;
if ( L_level > ma61 ) rezult6=-1;
if ( H_level < ma71 ) rezult7= 1;
if ( L_level > ma71 ) rezult7=-1;

return(rezult0+rezult1+rezult2+rezult3+rezult4+rezult5+rezult6+rezult7);
}

double nd0(double DBL) {return(NormalizeDouble(DBL,Digits));}

int init() {
D10=Stoch_D;D11=D10*Koef;D12=D11*Koef;D13=D12*Koef;D14=D13*Koef;D15=D14*Koef;D16=D15*Koef;D17=D16*Koef;
K10=Stoch_K;K11=K10*Koef;K12=K11*Koef;K13=K12*Koef;K14=K13*Koef;K15=K14*Koef;K16=K15*Koef;K17=K16*Koef;
S10=Stoch_S;S11=S10*Koef;S12=S11*Koef;S13=S12*Koef;S14=S13*Koef;S15=S14*Koef;S16=S15*Koef;S17=S16*Koef;
return(0);
}
 

Flex

Интересующийся
Все еще надеюсь на помощь, простите за наглость :).
Мне кажется (я не программер), что там совсем немного надо подкорректировать...может я не прав, конечно
 

ale002

::: __,,,^._.^,,,__ :::
На данный момент советник при пересечении линиями стохастиков опр. уровня открывает ордер. А требуется сделать так, чтобы он не при простом пересечении открывал ордер, а лишь при обратном.

Это т.е. надо дождаться, когда сумма станет больше чем Summa, а дальше что?

вар А: сумма упадёт ниже чем Summa (хотя-бы один стох выйдет из зоны)

вар Б: сумма упадёт до нуля (т.е. ВСЕ стохастики выйдут из зоны)

?
 

Flex

Интересующийся
Мне кажется, оба варианта жизнеспособны.
ну а если они еще и по реализации похожи, то с благодарностью приму оба :)))!
Может и самому тебе пригодится, советник как минимум не сливной даже сейчас.
 
Верх