Помогите, пожалуйста, кто чем может!

 

Всем привет.

Есть проблема. Мой советник открывает то количество ордеров, которое ему нравится, хотя должен открывать не более 1 ордера на бар (может открыть 1, а может и пару десятков, если депозит позволяет). Я уже кучу ограничений ставил - не помогает. Вот код. Подскажите, пожалуйста, где ошибка.

Заранее благодарен.

double Lot = 0.1;








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


//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+



  
int start()
{

double Alligator=iAlligator(NULL,0,13,32,8,5,5,3,2,4,MODE_GATORTEETH,1);


      if (Alligator-15*Point>Bid)
      {
        for(int b=0; b<=OrdersTotal(); b++)
        {
                        if (OrderSelect(b,SELECT_BY_POS)==false)
                {

                                if(Low[1]>Low[2] && Bid==Low[2]-1*Point)
                                {
                                Sell();
                        
                                }

                                
                }
                if (OrderSelect(b,SELECT_BY_POS)==true)
                {
                        if(OrderOpenPrice()==Bid)
                        break;
                        if(OrderOpenPrice()!=Bid)
                        {

                                if(Low[1]>Low[2] && Bid==Low[2]-1*Point)
                                {
                                Sell();
                                
                                }

                        }
                }

        }
      }

      
      if (Alligator+15*Point<Ask)
      {
        for(b=0; b<=OrdersTotal(); b++)
        {
                        if (OrderSelect(b,SELECT_BY_POS)==false)
                {

                        if(High[1]<High[2] && Ask==High[2]+1*Point)
                        {
                                Buy();
                                
                                }
                                
                                
                }
                if (OrderSelect(b,SELECT_BY_POS)==true)
                {
                        if(OrderOpenPrice()==Ask)
                        break;
                        if(OrderOpenPrice()!=Ask)
                        {

                        if(High[1]<High[2] && Ask==High[2]+1*Point)
                        {
                                Buy();
                                
                                       }
                                
                        }
                }

        }
      }

  

                    
     
   
   




   return;
}



double Buy ()
{               
RefreshRates();
if(OrdersTotal()==0)
{

OrderSend (Symbol (), OP_BUY, Lot, Ask, 0, Low[1],Ask+50*Point, NULL,0, 0,Green); // Открываемся вверх
Print(GetLastError());
}
   else
   {
   for(int k=0; k<=OrdersTotal(); k++)
      {
         if (OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
         {
            if (OrderOpenPrice()==Ask) 
            break;
            
            else
            {
            OrderSend (Symbol (), OP_BUY, Lot, Ask, 0, Low[1],Ask+50*Point, NULL,0, 0,Green); // Открываемся вверх
            Print(GetLastError());
            }
         }
      }
      
   }
   

return;

}


double Sell ()
{
RefreshRates();
if(OrdersTotal()==0)
{
OrderSend (Symbol (), OP_SELL, Lot, Bid, 0, High[1],Bid-50*Point,NULL ,0, 0,Red); //Открываемся вниз
Print(GetLastError());
}
else
{
for(int k=0; k<=OrdersTotal(); k++)
      {
         if (OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
         {
            if (OrderOpenPrice()==Bid) 
            break;
            
            else
            {
            OrderSend (Symbol (), OP_SELL, Lot, Bid, 0, High[1],Bid-50*Point,NULL ,0, 0,Red); //Открываемся вниз
            Print(GetLastError());
            }
         }
      }
}

return;
}
 
а где проверка на колво ордеров уже выставленных? и подсчёт колва баров.... и отчего ПОИСК не используешь?
 
Aleksander:
а где проверка на колво ордеров уже выставленных? и подсчёт колва баров.... и отчего ПОИСК не используешь?


А разве это не проверка? (Я не программист (прочитал книгу и написал советника), потому заранее прошу прощения если где-то туплю)

for(int k=0; k<=OrdersTotal(); k++)
{
if (OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
{

На сколько я понимаю советник ищет ордера, если они есть (if (OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)) и if (OrderOpenPrice()!=Ask/Bid), то можно открываться. Если нет (фолс), то можно открываться. А на счет открытия на одном баре, то здесь идет проверка if (OrderOpenPrice()==Ask/Bid)break - я так понимаю, это должно решать проблему...

 

if (OrderOpenPrice()==Ask/Bid)break - я так понимаю, это должно решать проблему...

нууу... выставили ордер... через пару тиков Бид изменился... - вот он откроет Ещё 1 сделку - через 2 тика ещё 2...3....4...5 и тд.. при чём тут Бид?

 
Aleksander:

if (OrderOpenPrice()==Ask/Bid)break - я так понимаю, это должно решать проблему...

нууу... выставили ордер... через пару тиков Бид изменился... - вот он откроет Ещё 1 сделку - через 2 тика ещё 2...3....4...5 и тд.. при чём тут Бид?


Здесь делался упор на то, что если цена открытия ордера = текущей цене - ничего не делаем
 
а проверка баров где?
 
Aleksander:
а проверка баров где?

Я так понимаю, что подобную формулировку можно использовать, но, в таком случае, нужно добавить проверку на открытие нового бара?
 

ну типа того :) - я не докапываюсь :) просто хочу чтоб ты самостоятельно решил проблему... размышляй рассуждай и пиши примерчики кода :)

здесь пиши... :)

 
гмм.. а чего хочешь от советника? чтобы выставлялся в направлении выявленного движения торгуемой пары?
 
Maks:

Всем привет.

Есть проблема. Мой советник открывает то количество ордеров, которое ему нравится, хотя должен открывать не более 1 ордера на бар (может открыть 1, а может и пару десятков, если депозит позволяет). Я уже кучу ограничений ставил - не помогает. Вот код. Подскажите, пожалуйста, где ошибка.

Заранее благодарен.


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

1. радует, что код построен из отдельных ф-ций, проще писать и дополнять своим кодом

2. сделайте, как обычно все делают ф-цию подсчета своих ордеров и вызывайте эту ф-ци сразу в первой строчке ф-ции старт, у меня эта ф-ция выглядит так:

void Myorders(){
      int cnt;
      total_order = OrdersTotal()-1;
      my_total_order = 0;
      HaveBuyOrder  = false;
      HaveSellOrder = false;
      for(cnt = total_order; cnt >= 0; cnt--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY)  {HaveBuyOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELL) {HaveSellOrder = true; my_total_order++;}
      }
   }

}

после вызова ф-ции Myorders() у меня в переменных (флаг) HaveBuyOrder и HaveSellOrder признак наличия открытых ордеров, переменные

if (! HaveBuyOrder && MA1>MA2) Buy ();
// если нет открытых ордеров BUY и МАшки MA1>MA2 то вызовем ф-цию Buy ()

HaveBuyOrder и HaveSellOrder и my_total_order описаны глобальными для всего кода, т.е. в самом верху кода-до ф-ции старт, Magic - это магик ордера, он описан в настройках советника (extern int)

перед выставлением ордера я контролирую флаг наличия ордера,

 

можно эту ф-цию расширить и ставить по нескольку ордеров, нужно my_total_order отдельно для BUY и SELL 

попробуйте так контролировать свои ордера 

 
Aleksander:

ну типа того :) - я не докапываюсь :) просто хочу чтоб ты самостоятельно решил проблему... размышляй рассуждай и пиши примерчики кода :)

здесь пиши... :)


ок, спасибо. я все понимаю. просто ломал голову и так и сяк, а он все не слушается. теперь буду работать в этом направлении дальше