Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Веди личную переписку в профиле. Это безопасно!
Vt
21
Vt 2016.04.09 13:05 
Все прив! Прошу помочь разобраться. Пишу советник для nano-счета, то есть где 4-разрядная пунктовая система после запятой и фиксированный спред (к примеру на евродолларе).
Задача советника: открывать локированные позиции на уровнях цены, когда Bid будет на цене, где последняя цифра цены будет 0. То есть продажа должна моментально открыться по Bid когда последняя цифра - 0, и сразу же покупка по Ask.

В чем проблема:
Советник должен работать так, что если он уже открыл сделки, то он не должен их снова открывать, если Bid встанет на тот же уровень, где он их уже открыл, и где сделки еще не закрыты.
Самые первые 2 сделки (то есть локированные покупка с продажей) открываются по условию что Bid достиг 0 в младшем разряде и тиковый объем текущей свечи меньше 2.
Все последующие идут с предварительной проверкой по Bid и на открытые ордера: если уже открыты сделки по такой-то цене продажи или покупки, то советник их не должен совершать повторно. НО!!! Однако советник это условие игнорирует, и открывает сделки по условию Bid тысячами!!!

Вот поэтому не знаю, что нужно еще добавить (или убрать) в коде. Дело в том, что ставить проверку на тиковые объемы на текущей свече - неправильно, поскольку будут пропущены многие сделки, которые должны открыться, особенно если использовать большие таймфреймы.

Код (проблемные места подписаны красными комментами):
//Основные настройки

extern double Lot=0.01; //Lot
extern int TP=10; //TP



//Скорость

int Numerator=0; //Счетчик сделок
extern double LotScorer=0.01; //Приплюсовывание лота



//Работа с показателем Bid

int BidDiv=0; //Остаток деления Bid, умноженного на 10000
int BidInt=0; //Bid, умноженный на 10000


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int start()
  {
   
      int Magic=111111;
   

      BidInt=Bid*10000; //Умножаем Bid на 10000
            
      BidDiv=BidInt%10; //Делим результат на 10, получаем остаток
      

      ///////////ЕСЛИ НЕТ СДЕЛОК/////////////////
      if
         (  
               BidDiv==0 //Если остаток равен 0
            &&
               Volume[0]<2 //И тиковый объем текущей свечи меньше 2
            &&
               OrdersTotal()==0 //И еще нет ордеров
         )   
            { 
               OrderSend (Symbol(), OP_SELL, Lot+Numerator*LotScorer,  Bid,  3,  0,  Bid-TP*Point,  "Sell", Magic,   0, Crimson);       //Открывается продажа по цене Bid, кратная 10
               OrderSend (Symbol(), OP_BUY,  Lot+Numerator*LotScorer,  Ask,  3,   0,  Ask+TP*Point,  "Buy", Magic,   0, DeepSkyBlue);   //Открывается покупка по цене Ask
               
               Numerator++;
            }

      
      ///////////ЕСЛИ ЕСТЬ СДЕЛКИ/////////////////
      if
         (
               BidDiv==0 //Если остаток равен 0
            &&
               OrdersTotal()>0 //И есть открытые ордера
         )
            {
               for(int i=OrdersTotal()-1; i>=0; i--)
                  {
                     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                        {
                           
                           if(OrderType()==OP_SELL && OrderOpenPrice()!=Bid) //Если ордер - ордер продажи, и цена продажи в ордере не равна текущему Bid
                              {
                                 OrderSend (Symbol(), OP_SELL, Lot+Numerator*LotScorer,  Bid,  3,  0,  Bid-TP*Point,  "Sell", Magic,   0, Crimson);
                                 Numerator++;
                              }
                           
                           if(OrderType()==OP_BUY && OrderOpenPrice()!=Ask) //Если ордер - ордер покупки, и цена покупки в ордере не равна текущему Ask
                              {
                                 OrderSend (Symbol(), OP_BUY,  Lot+Numerator*LotScorer,  Ask,  3,   0,  Ask+TP*Point,  "Buy", Magic,   0, DeepSkyBlue);
				 Numerator++;   
                              }
                              
                        }
                  }
            }
                    
      
     
 
     
      return(0);
   
   }
  
Boris
3883
Boris 2016.04.09 16:33  
Ошиблись в логике условий! Нельзя требовать открытие строго по цене! Только начиная с этой и больше (>=) или меньше (<=)! Цена всё время в движении (Bid) плюс плавающий спред (Ask)! Больше не стал смотреть, наверняка другие огрехи есть. Смотрите примеры в базе кодов, попробуйте в тестере, дёмке, поэкспериментируйте с ними, а потом уж беритесь за своё! Удачи!
Vt
21
Vt 2016.04.10 22:56  
borilunad:
Ошиблись в логике условий! Нельзя требовать открытие строго по цене! Только начиная с этой и больше (>=) или меньше (<=)! Цена всё время в движении (Bid) плюс плавающий спред (Ask)! Больше не стал смотреть, наверняка другие огрехи есть. Смотрите примеры в базе кодов, попробуйте в тестере, дёмке, поэкспериментируйте с ними, а потом уж беритесь за своё! Удачи!
Я уже разобрался, вопрос снят. Необходимо было добавить еще одну обработку в цикле и break, теперь все прекрасно работает.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий