Помогите разобраться с ЛОКированием позиции

 

Здравствуйте,

Пожалуйста помогите разобраться с Локированием позиций

Набранный мною код позиций не Локирует

Ошибку найти не могу - не хватает опыта

Для упрощения рассм. только Локирование BUY позиций

Рассмотрите, пожалйста, возможность упрощения кода

Что хотел сделать: Открывается позиция BUY одновременно с отложенным ордером SELL

Если отложенный ордер SELL срабатывает - Удаляем из BUY TakeProfit

Если BUY получил Profit - удаляем отложенный SELL, который шел к нему в паре--

Если при этом существовует Локированная пара BUY-SELL - то закрываем эту пару

Каждой паре присваивается MagicNumber, равный номеру предыдущей пары +1

Благодарю за оказанную помощь.

#property copyright "Mr.Red" 
#property link ""

extern double TakeProfit = 20,
Lock=50;

extern double Lots = 0.1;
//extern double StopLoss =40;
bool New_Bar=false;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
int M=1;// меджик намбер
if(OrderSelect(0,SELECT_BY_POS, MODE_TRADES)==true)
{
M++;
}
//+------------------------------------------------------------------+
for(int i=0;i< OrdersHistoryTotal();i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )==true)// поиск и проверка позиции БАЙ
{
if (OrderSymbol()==Symbol()&& OrderType() == OP_BUY&&
OrderMagicNumber()==M && OrderProfit()>0) // если БАЙ получил текущий ПРОФИТ то
{
for(int a=0; a<OrdersTotal(); a++)
{
OrderSelect(a, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderType() == OP_SELLSTOP&& OrderMagicNumber()==M) // то находим отложенный СЕЛЛ
{
OrderDelete(OrderTicket(),Red); // и закрываем его
}
}


for(int s=0; s<OrdersTotal(); s++)
{
if(OrderSelect(s, SELECT_BY_POS, MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol()&&OrderType() == OP_SELL&& OrderMagicNumber()==M-1) // ищем пару СЕЛЛ БАЙ что бы закрыть замок (если он есть)
{
for(int w=0; w<OrdersTotal(); w++)
{
OrderSelect(w, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderType() == OP_BUY&& OrderMagicNumber()==M-1) // находим пару
{
OrderClose(OrderTicket(),Lots,Bid,3, Yellow); // и закрываем сначала БАЙ

for(int y=0; y<OrdersTotal(); y++)
{
OrderSelect(y, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderType() == OP_SELL&& OrderMagicNumber()==M-1) // ищем СЕЛЛ
{
OrderClose(OrderTicket(),Lots,Ask,3, Yellow); //закрываем СЕЛЛ
}
}
}
}
}
}
}
}
}
}
for(int n=0; n<OrdersTotal(); n++)
{
if(OrderSelect(n, SELECT_BY_POS, MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol()&&OrderType() == OP_SELL&&
OrderMagicNumber()==M) //если открылся ЛОК то
{
for(int q=0; q<OrdersTotal(); q++)//ищем бай
{
OrderSelect(q, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderType() == OP_BUY&& OrderMagicNumber()==M) //
{
OrderModify (OrderTicket(), OrderOpenPrice(), 0, 0, 0, Blue); // удаляем ТЕЙК ПРОФИТ из БАЯ
}
}
}
}
}
//--------------------------------------------------------------------
Fun_New_Bar();
if (New_Bar==false)
return;
int ticket;


if(.... ..)// Условие входа в сделку, если наступил новый бар
{

ticket=OrderSend(Symbol(),OP_BUY,Lots, Ask,3,
0,Ask+TakeProfit*Point, 0,M,0,
Red);
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Lock*Point,0,
0,0, 0,M,0,
Red);
Alert (GetLastError());

return;
}

}


//--------------------------------------------------------------------
void Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
}
//--------------------------------------------------------------------

Файлы:
Причина обращения: