помогите убрать открытие лишних ордеров

 

int start() // Спец. функция start
{
double M_0, M_1, // Значение MAIN на 0 и 1 барах
S_0, S_1; // Значение SIGNAL на 0 и 1барах
int i,ii, summaord;
summaord=OrdersTotal();
//--------------------------------------------------------------------
// Обращение к функции техн.индикат.
M_0 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_MAIN, 0);// 0 бар,M_0 на нулевом баре имеет это значение
M_1 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_MAIN, 1);// 1 бар,M_1 на предыдущем баре имеет это значение
S_0 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_SIGNAL,0);// 0 бар,S_0 на нулевом баре имеет это значение
S_1 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_SIGNAL,1);// 1 бар,S_1 на предыдущем баре имеет это значение
//--------------------------------------------------------------------


if( M_0 >= S_0 && M_1 < S_1 )
{
if( summaord<1)
{
Alert("сигнальная пересекает трендовую с верху вниз. открываем покупку.OP_BUY");
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
Print("BUY order opened : ",OrderOpenPrice());
}
for ( i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(Symbol(),MODE_SPREAD));

if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,0,0,Green);
return(0);

}

}
}

}
if( M_0 <= S_0 && M_1 > S_1 )
{
if( summaord<1)
{

Alert("сигнальная пересекает трендовую снизу вверх открываем продажу OP_SELL.");
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0);
Print("SELL order opened : ",OrderOpenPrice());
}
for ( ii=0;ii<OrdersTotal();ii++)
{
if(OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderType()==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(Symbol(),MODE_SPREAD));
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,0,0,Red);

}
}
}

}

return(0);
}

Когда ордер закрывается по трейлинг стопу, цикл заканчивается, идет снова проверка условия if( M_0 >= S_0 && M_1 < S_1 ) и если бар еще не сменился (т.е. условие сново становится верным) снова открывается ордер (((

но по задумке -при этом условии- должен быть открыт только один ордер не важно, закроется ли он по SL или нет! И также один ордер должен открываться при противоположном условии

if( M_0 <= S_0 && M_1 > S_1 )

Как мне это осуществить??? помогите пожалуйсто

 

вот что получается

 

для начала вставьте код через кнопку "SRC"

 
Поставь защиту "на одном баре один ордер".
if( summaord<1&&bBars!=Bars)
{ bBars=Bars;
....
......
........
}
 

А лучше вести правильный подсчет ордеров

2 Urain опят не спишь ?

 
Urain писал(а) >>
Поставь защиту "на одном баре один ордер".

Попробовал, но тогда ордера начинают открываться на следующем баре...

Вобщем этот вариант не подошел(((

 
xrust писал(а) >>

для начала вставьте код через кнопку "SRC"

int start()                          // Спец. функция start
{
double M_0, M_1,               // Значение MAIN на 0 и 1 барах
       S_0, S_1;               // Значение SIGNAL на 0 и 1барах
int i,ii, summaord,bBars;
summaord=OrdersTotal();
    //-------------------------------------------------------------------- 
                                       // Обращение к функции техн.индикат.
M_0 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_MAIN,  0);// 0 бар ,M_0 на нулевом баре имеет это значение
M_1 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_MAIN,  1);// 1 бар ,M_1 на предыдущем баре имеет это значение
S_0 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_SIGNAL,0);// 0 бар ,S_0 на нулевом баре имеет это значение
S_1 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_SIGNAL,1);// 1 бар ,S_1 на предыдущем баре имеет это значение
    //--------------------------------------------------------------------  
      

            if( M_0 >= S_0 && M_1 < S_1 )
               {
                if( summaord<1)
                   { 
                  
                Alert("сигнальная пересекает трендовую с верху вниз. открываем покупку.OP_BUY");                
                OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
                Print("BUY order opened : ",OrderOpenPrice());
                     }
                      for ( i=0;i<OrdersTotal();i++)
                           {
                            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
                            if(OrderType()==OP_SELL)
                    OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(Symbol(),MODE_SPREAD));
                    
                               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                                   {
                                    if(OrderStopLoss()<Bid-Point*TrailingStop)
                                       {
                                        OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,0,0,Green);
                                       return(0);
                                                                          
                                        }
                                   
                                   }
                       }
                        
                }
             if( M_0 <= S_0 && M_1 > S_1 ) 
                {
                 if( summaord<1)
                   {
                   
                 Alert("сигнальная пересекает трендовую снизу вверх открываем продажу OP_SELL.");
                 OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0);
                 Print("SELL order opened : ",OrderOpenPrice());
                    }
                       for ( ii=0;ii<OrdersTotal();ii++)
                            {
                             if(OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)==true)
                             if(OrderType()==OP_BUY)
                    OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(Symbol(),MODE_SPREAD));
                            if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                                 {
                                   if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                                       {
                                         OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,0,0,Red);
                                            
                                       }
                                  }
                            }
                      
                 }
          
                 return(0);
}                

Вот код программы, пока ничего не получилось

 

Совет на будущее - скобки одинаковой глубины залегания ставь четко одна под другой, и так же строки.

А после if() всегда {}. Здорово дисциплинирует. И видно на какой глубине находишься.

Программа не симметрично написана.

 

Алгоритм и логика совершенно кривые. Телега впереди лошади.

- если кривые пересеклись.

- если ордеров нету. - входим с продажей.

- выбираем этот ордер (единственный) и проверяем - может он БАЙ ??!! Абсурд. Делать это надо до того.

- если цена откр-я минус АСК больше трала, то СтопЛосс минус АСК тем более! Это при первой модификации.

При последующих проверять по СтопЛосс. И желательно ввести шаг модификации, иначе можешь засыпать сервак запросами.

Вот в таком духе, в таком разрезе.

Удачи.