Не пойму в чем причина? открывает только BY, закрывает всегда в минусе

 
Всем здрасьте. Написал код советника на основе данных стохастика. Зеленая пересекает красную линию снизу вверх - покупаем. Наоборот продаем.
Вот код
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net/"
///--------------------------------------------------------------- 1 --
// Численные значения для М30
extern double StopLoss =200; // SL для открываемого ордера
extern double TakeProfit =50; // ТР для открываемого ордера
extern int pisto=0; //Stochastic индикатор период
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
extern double Lots =0.1; // Жестко заданное колич. лотов
extern double Prots =0.07; // Процент свободных средств
bool Work=true; // Эксперт будет работать.
string Symb; // Название финанс. инструмента
//--------------------------------------------------------------- 2 --
int start()
{
int
Total, // Количество ордеров в окне
Tip=-1, // Тип выбран. ордера (B=0,S=1)
Ticket; // Номер ордера
double
KPeriod, // Значен. Stochastic _1 текущее
DPeriod, // Значен. Stochastic _2 текущее
Lot, // Колич. лотов в выбран.ордере
Lts, // Колич. лотов в открыв.ордере
Min_Lot, // Минимальное количество лотов
Step, // Шаг изменения размера лота
Free, // Текущие свободные средства
One_Lot, // Стоимость одного лота
Price, // Цена выбранного ордера
SL, // SL выбранного ордера
TP; // TP выбранного ордера
bool
Ans =true, // Ответ сервера после закрытия
Cls_B=true, // Критерий для закрытия Buy
Cls_S=true, // Критерий для закрытия Sell
Opn_B=true, // Критерий для открытия Buy
Opn_S=true; // Критерий для открытия Sell

//--------------------------------------------------------------- 3 --
// Предварит.обработка
if(Bars < DPeriod) // Недостаточно баров
{
Alert("Недостаточно баров в окне. Эксперт не работает.");
return; // Выход из start()
}
if(Work==false) // Критическая ошибка
{
Alert("Критическая ошибка. Эксперт не работает.");
return; // Выход из start()
}
//----------------------------------------------------------------4 ----


//--------------------------------------------------------------- 5 --
// Учёт ордеров
Symb=Symbol(); // Название фин.инстр.
Total=0; // Количество ордеров
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
if (OrderSymbol()!=Symb)continue; // Не наш фин. инструм
if (OrderType()>1) // Попался отложенный
{
Alert("Обнаружен отложенный ордер. Эксперт не работает.");
return; // Выход из start()
}
Total++; // Счётчик рыночн. орд
if (Total>1) // Не более одного орд
{
Alert("Несколько рыночных ордеров. Эксперт не работает.");
return; // Выход из start()
}
Ticket=OrderTicket(); // Номер выбранн. орд.
Tip =OrderType(); // Тип выбранного орд.
Price =OrderOpenPrice(); // Цена выбранн. орд.
SL =OrderStopLoss(); // SL выбранного орд.
TP =OrderTakeProfit(); // TP выбранного орд.
Lot =OrderLots(); // Количество лотов
}
}
//--------------------------------------------------------------- 6 --
// Торговые критерии
int P=KPeriod;
int B=DPeriod;
int A=Slowing;
// ------------------------------------------------------------------
double L_1=iCustom(NULL,0,"Stochastic",P,B,A,1,0);
double L_5=iCustom(NULL,0,"Stochastic",P,B,A,2,0);
if (KPeriod > DPeriod + Slowing*Point) // Если разница между
{ // .. 1 и 2 большая
Opn_B=true; // Критерий откр. Buy
Cls_S=true; // Критерий закр. Sell
}
if (KPeriod < DPeriod - Slowing*Point) // Если разница между
{ // .. 1 и 2 большая
Opn_S=true; // Критерий откр. Sell
Cls_B=true; // Критерий закр. Buy
}
//--------------------------------------------------------------- 7 --
// Закрытие ордеров
while(true) // Цикл закрытия орд.
{
if (Tip==0 && Cls_B==true) // Открыт ордер Buy..
{ //и есть критерий закр
Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
RefreshRates(); // Обновление данных
Ans=OrderClose(Ticket,Lot,Bid,2); // Закрытие Buy
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Buy ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
if (Tip==1 && Cls_S==true) // Открыт ордер Sell..
{ // и есть критерий закр
Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");
RefreshRates(); // Обновление данных
Ans=OrderClose(Ticket,Lot,Ask,2); // Закрытие Sell
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Sell ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
break; // Выход из while
}
//--------------------------------------------------------------- 8 --
// Стоимость ордеров
RefreshRates(); // Обновление данных
Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Миним. колич. лотов
Free =AccountFreeMargin(); // Свободн средства
One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
Step =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размера
if (Lots > 0) // Если заданы лоты,то
Lts =Lots; // с ними и работаем
else // % свободных средств
Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия
if(Lts < Min_Lot) Lts=Min_Lot; // Не меньше минимальн
if (Lts*One_Lot > Free) // Лот дороже свободн.
{
Alert(" Не хватает денег на ", Lts," лотов");
return; // Выход из start()
}
//--------------------------------------------------------------- 9 --
// Открытие ордеров
while(true) // Цикл закрытия орд.
{
if (Total==0 && Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данных

TP=Bid + New_Stop(TakeProfit)*Point; // Вычисление TP откр.
Alert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy
if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
if (Total==0 && Opn_S==true) // Открытых орд. нет +
{ // критерий откр. Sell
RefreshRates(); // Обновление данных

TP=Ask - New_Stop(TakeProfit)*Point; // Вычисление TP откр.
Alert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Открытие Sel
if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Sell ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
break; // Выход из while
}

При компиляции ошибок нет
При тестировании получилось, что открывает и закрывает сделки только BY, При этом закрывает всегда в минусе
Все сделки в минусе и только BY
Не пойму в чем причина
Файлы:
vklnqqzfv.mq4  13 kb
 

Вставьте код через кнопку SRC на верхней панели, а то в таком виде никто читать не будет. Добавьте в код вывод переменных в Print и Comment, посмотрите в журнале и в логах, что происходит при открытии позиций? Поступает сигнал, а ордер не открывается по ошибке? Не поступает сигнал вообще? Не работают логические условия? Вы сами все увидите.

Вот я вам дал какой-никакой, а ответ. А кто мне ответит: почему так? И buy, и sell открываются, все условия работают, все сигналы поступают в соответствии с ТЗ. а прибыли все равно нет... И если бы в одном советнике, а то ведь практически во всех! Не иначе, глюк какой в МТ...

 
granit77 писал(а) >>

..... все сигналы поступают в соответствии с ТЗ. а прибыли все равно нет... И если бы в одном советнике, а то ведь практически во всех! Не иначе, глюк какой в МТ...

Именно так! У меня тот же случай!

Наконец-то обнаружилась причина всех бед!

Правда, у меня еще коварнее бывает! В тестере есть прибыль, а в реале слив!

Но теперь я знаю, что это глюк виноват...

 
eduty писал(а) >>
Всем здрасьте. Написал код советника на основе данных стохастика. Зеленая пересекает красную линию снизу вверх - покупаем. Наоборот продаем.
Вот код
При тестировании получилось, что открывает и закрывает сделки только BY, При этом закрывает всегда в минусе
Все сделки в минусе и только BY
Не пойму в чем причина

Я не вникал в код, но обратил внимание, что вы стохастик задаете через iCustom. А зачем?

Кроме того, я не уверен - что вы правильно задаёте условия входа!

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

if (KPeriod > DPeriod + Slowing*Point)

Я бы, кстати, в таких аналог. случ. брал в скобки сумму. Чтоб не думалось...

 

double L_1=iCustom(NULL,0,"Stochastic",P,B,A,1,0);
double L_5=iCustom(NULL,0,"Stochastic",P,B,A,2,0);

Зачем их считать? Или так - где их воткнуть?

 
rid писал(а) >>

Я не вникал в код, но обратил внимание, что вы стохастик задаете через iCustom. А зачем?

Кроме того, я не уверен - что вы правильно задаёте условия входа!

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

if (KPeriod > DPeriod + Slowing*Point)

Я бы, кстати, в таких аналог. случ. брал в скобки сумму. Чтоб не думалось...

Я ошибку понял, но не могу сообразить где и на что изменить

и где брать в скобки сумму

 
FION писал(а) >>

double L_1=iCustom(NULL,0,"Stochastic",P,B,A,1,0);
double L_5=iCustom(NULL,0,"Stochastic",P,B,A,2,0);

Зачем их считать? Или так - где их воткнуть?

А как по вашему мнению нужно было сделать?

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