Как написать код удаляющий повторяющиеся ордера MQL4 для mt4? - страница 2

 
Meta Novicok:
Так и написано, открывает по одному ордеру, но иногда бывает открывает 2 и боле ордеров (наверно не успеет проверять)
чиво блъ, как это не успевает проверить, закрывающий советник это не выход, нужно править ошибку в исходном советнике, а то они могут начать перетягивание депозита - один открывает, другой закрывает и так пока депо в 0 не уйдёт, глазом моргнуть не успеешь
 
Ihor Herasko:

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

Советник открывает по одному ордеру, но иногда бывает открывает 2 и боле ордеров (наверно не успевает проверять), надо что, уже потом проверяль, если есть дублирушие ордера, закрыть их. Можно отделный советник
 
Meta Novicok:
Советник открывает по одному ордеру, но иногда бывает открывает 2 и боле ордеров (наверно не успевает проверять), надо что, уже потом проверяль, если есть дублирушие ордера, закрыть их. Можно отделный советник

Вам уже два человека сказали, что нужно исправлять код советника. Принудительное закрытие не решит проблему.

 
Meta Novicok:
Так и написано, открывает по одному ордеру, но иногда бывает открывает 2 и боле ордеров (наверно не успеет проверять)

Может тогда код покажете? А так пока на кофейной гуще все гадают.

 
Alexey Viktorov:

Может тогда код покажете? А так пока на кофейной гуще все

Ihor Herasko:

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

Alexey Viktorov:

Может тогда код покажете? А так пока на кофейной гуще все гадают.

int OnInit()

  {

//---

   

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//---

   

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |




void OnTick()

  {

     if( provPrice(OP_BUY) )

          int ticket = OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-200*Point,Ask+20*Point);

     return;

   

  }


bool provPrice(const int type)

  {

     for(int cnt=0; cnt<OrdersTotal(); cnt++)

     {

          if( !OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) ) continue;

          if( OrderType()!=type ) continue;

          if( (type==OP_BUY ? Ask : Bid) == OrderOpenPrice() ) return(false);

     }

     return(true);

  }

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • www.mql5.com
Ask questions on technical analysis, discuss trading systems and improve your MQL5 programming skills to develop your own trading strategies. Communicate and share your experience with traders from anywhere in the world, answer questions and help beginners — MQL5.community is developing along with you. SymbolInfoTick last price is 0 Hello, i...
 
Meta Novicok:

int OnInit()

  {

//---

   

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//---

   

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |




void OnTick()

  {

     if( provPrice(OP_BUY) )

          int ticket = OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-200*Point,Ask+20*Point);

     return;

   

  }


bool provPrice(const int type)

  {

     for(int cnt=0; cnt<OrdersTotal(); cnt++)

     {

          if( !OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) ) continue;

          if( OrderType()!=type ) continue;

          if( (type==OP_BUY ? Ask : Bid) == OrderOpenPrice() ) return(false);

     }

     return(true);

  }

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

1. даблы не сравнивают ==, только <>

2. Аск и Бид склонны меняться, в том числе туда-сюда (да-да, мне люди знающие говорили, я им верю), в том числе быстрее, чем открытие ордера (понимаю, в это вообще сложно поверить, можете немного посомневаться), и поэтому ордер может открыться не по тому Аск Бид по которому он отправлен (для счетов без реквот , т.е. ЕСN и прочие NDD)

для начала думаю хватит подсказок, а теперь вопрос - а нафига так?)

 
Meta Novicok:
int OnInit()

  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 {
   if( provPrice(OP_BUY) )
     int ticket = OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-200*Point,Ask+20*Point);
     return;   
 }
bool provPrice(const int type)
 {
 for(int cnt=0; cnt<OrdersTotal(); cnt++)
  {
   if( !OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) ) continue;
   if( OrderType()!=type ) continue;
   if( (type==OP_BUY ? Ask : Bid) == OrderOpenPrice() ) return(false);
  }
 return(true);
 }

Измените всего одну строку

  if(NormalizeDouble((type==OP_BUY ? Ask : Bid - OrderOpenPrice()), _Digits) == 0.0)
   return(false);
И пожалуйста научитесь вставлять код в сообщения.
 
Meta Novicok:
Не работает, опят есть дублирушие ордера 

Да... я совсем забыл что 0.0 != -0.0

Попробуйте ещё вариант с абсолютной величиной

  if(fabs(NormalizeDouble((type==OP_BUY ? Ask : Bid - OrderOpenPrice()), _Digits)) == 0.0)
   return(false);
В противном случае давайте разбираться в алгоритме. На сколько разница в цене открытия ордера считается дублирующей?
 
Alexey Viktorov:

Да... я совсем забыл что 0.0 != -0.0

Попробуйте ещё вариант с абсолютной величиной

В противном случае давайте разбираться в алгоритме. На сколько разница в цене открытия ордера считается дублирующей?

Блин, я же написал. Если счёт ЕСН, то хоть один ордер открылся с разницей в 1 пипс от текущей цены, и поехали сначала. Какой тип счета хоть бы написал/а ТС.

 
Aleksey Mavrin:

Блин, я же написал. Если счёт ЕСН, то хоть один ордер открылся с разницей в 1 пипс от текущей цены, и поехали сначала. Какой тип счета хоть бы написал/а ТС.

Проверяль и на ЕСН, и на стандарт, один х.. не работает