[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 768

 
FoxUA:


мне просто надо функцию вызвать и все, надо просто одна строчка " если ордеров больше на один чем .... то" и все а вы тут целую функцию мне предлагаете

вот как у меня хранятся данные о ордерах


Это несложная запишите в библиотеку .

На вход подаются тип подсчитываемого ордера и его магик, возвращает кол-во открытых или установленных ордеров .

int ChPos( int TypePos,int Magic) 
{
// возвращает кол-во позицй которые открыты или выставленн отложками с магиком  Magic 
   int i;
   int count=0 ;
   for( i=0; i < OrdersTotal(); i++)         
   {
      if(OrderSelect(i,SELECT_BY_POS)==true) 
       {                                   
           if(OrderType()==OP_BUY && TypePos==OP_BUY && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_SELL && TypePos==OP_SELL && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_BUYLIMIT && TypePos==OP_BUYLIMIT && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_BUYSTOP && TypePos==OP_BUYSTOP && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_SELLLIMIT && TypePos==OP_SELLLIMIT && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_SELLSTOP && TypePos==OP_SELLSTOP && Magic==OrderMagicNumber()){count++;}
       }
    }   
return(count);
}

можно использовать например так

if ((FastEma - SmallEma) > Compartor*Point && ChPos(OP_BUY,1111) < OpenPosition) 

 
ivandurak:


Это несложная запишите в библиотеку .

На вход подаются тип подсчитываемого ордера и его магик, возвращает кол-во открытых или установленных ордеров .

можно использовать например так

if ((FastEma - SmallEma) > Compartor*Point && ChPos(OP_BUY,1111) < OpenPosition)

такая функция у меня есть и она мне не нужна, мне надо
просто одна строчка " если ордеров больше на один чем .... то" и все

мои даные с такойже функции которую вы показали хранятся тут

int total_order;            // переменная в которой хранится общее количество открытых ордеров в терминале
int my_total_order;         // переменная в которой хранится общее количество открытых ордеров с нашим Magic

а вот как выглядит она сама

void Myorders(){
      int cnt;
      total_order = OrdersTotal();
      my_total_order = 0;
      HaveBuyOrder          = false;
      HaveSellOrder         = false;
      HaveBuyStopOrder      = false;
      HaveSellStopOrder     = false;
      HaveBuyLimitOrder     = false;
      HaveSellLimitOrder    = false;
      HaveBuyLimitOrderEnd  = false;
      HaveSellLimitOrderEnd = false;      
      for(cnt = total_order - 1; cnt >= 0; cnt--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Curr_symb && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY)       {HaveBuyOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELL)      {HaveSellOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYSTOP)   {HaveBuyStopOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLSTOP)  {HaveSellStopOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrderEnd = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrderEnd = true; my_total_order++;}
} } }
 

Кажется догнал  

static  int aaa = OrdersHistoryTotal()+ OrdersTotal() 

 if (ваше условие && aaa <  OrdersHistoryTotal()+ OrdersTotal() ) 

  {

     операторы  

      aaa=OrdersHistoryTotal()+ OrdersTotal()

  } 

Если  так,то с учетом магиков  все равно лучше в функцию . Вы можете озвучить над чем колдуете . Логика какая то странноватая если правильно понял,нужно производить действия если открылся еще один ордер .Не проще ли открывать ордера не более чем OpenPosition . 

П С  Ваша функция ворвращает общее кол-во открытых ордеров и выставленных отложек .Сколько ордеров OP_BUY, если при этом есть OP_BUYLIMIT OP_SELLLIMIT OP_SELL и др она не выдает .

 
ivandurak:

да стем я разобрался, теперь проблема с функцией if не как не пойму в чем прокол де я шо е так зделал

if(bt==1&&bl==7) 
{OpenBuyStopOrder(Lot,PRBidS);
OpenBuyLimitOrder(Lot*3,PRAskL); 
  if (HaveBuyLimitOrderEnd== true) 
  {ModifyBuyStopOrder(PRAskS);  // Выбираем            
  } }          
  

общем суть таkая шо первое значение исполnяется к ниму притензий нет

а вот это не кaк не хочет if (HaveBuyLimitOrderEnd== true)
{ModifyBuyStopOrder(PRAskS); // Выбираем
} }

словами это звучит так если есть ордер HaveBuyLimitOrderEnd то модарнизируем его с переменой ценой PRAskS

вот чтото не правельnо а что не могу понять, значение HaveBuyLimitOrderEnd беру из void Myorders() код выше постом

а да в это значение if(bt==1&&bl==7) является главным тобиш если оно истино исполняем все шо ниже


да скорей всего чтото с HaveBuyLimitOrderEnd== true ибо ставил OrderLots()==3*Lot все работает токо оно наченает модифиирывать все ордера с лотом 0.3

 
void Myorders(){
      int cnt;
      total_order = OrdersTotal();
      my_total_order = 0;
      HaveBuyOrder          = false;
      HaveSellOrder         = false;
      HaveBuyStopOrder      = false;
      HaveSellStopOrder     = false;
      HaveBuyLimitOrder     = false;
      HaveSellLimitOrder    = false;
      HaveBuyLimitOrderEnd  = false;
      HaveSellLimitOrderEnd = false;      
      for(cnt = total_order - 1; cnt >= 0; cnt--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Curr_symb && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY)       {HaveBuyOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELL)      {HaveSellOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYSTOP)   {HaveBuyStopOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLSTOP)  {HaveSellStopOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrderEnd = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrderEnd = true; my_total_order++;}
} } }
Обратите внимание, что выделено красным . Тип торговых ордеров одинаков, а переменные в труе устанавливаются разные, так и должно быть .
 
ivandurak:
Обратите внимание, что выделено красным . Тип торговых ордеров одинаков, а переменные в труе устанавливаются разные, так и должно быть .

да так и должно быть ибо там разне функции открытия и запрос я делаю не по OrderType() а запрашую флаг тобиш открыт ли он, но проблема скорее Hе в этой функции ибо остальные запросы тоже не фурычат это я первый пo п авшийся кинул, И ОНО ПО ТОЙ ФУНКЦИИ НOРМАЛЬНО ОТКРЫВАЕТ

ТАК ЧТО ПРОБЛЕМА ИМЕНО С ЗАПРОСОМ В ОПЕРАТОРЕ

 

Похоже проблема в другом месте. Но надо веь код наверно увидеть.

 
Vinin:

Похоже проблема в другом месте. Но надо веь код наверно увидеть.


точно не в другом все остальное работает роблема имено в том что запрос (HaveBuyLimitOrderEnd== true) не правельный вот и ломаю гоову как ему еще сказать что надо модифицирывать и удалять,

или само построение зпроса не верно

if(bs==1&&bl==3)
{OpenBuyLimitOrderEnd(Lot*15,PRAskL);

if (HaveBuyLimitOrderEnd== true)

{ModifyBuyStopOrder(PRAskS);
} }

 
FoxUA:

да так и должно быть ибо там разне функции открытия и запрос я делаю не по OrderType() а запрашую флаг тобиш открыт ли он, но проблема скорее Hе в этой функции ибо остальные запросы тоже не фурычат это я первый пo п авшийся кинул, И ОНО ПО ТОЙ ФУНКЦИИ НOРМАЛЬНО ОТКРЫВАЕТ

ТАК ЧТО ПРОБЛЕМА ИМЕНО С ЗАПРОСОМ В ОПЕРАТОРЕ

if(bt==1&&bl==7) 
{OpenBuyStopOrder(Lot,PRBidS);
OpenBuyLimitOrder(Lot*3,PRAskL); 
  if (HaveBuyLimitOrderEnd== true) 
  {ModifyBuyStopOrder(PRAskS);  // Выбираем            
  } }         


А вот интересно в функциях выделенных красным устанавливается флаг HaveBuyLimitOrderEnd  в труе .Если нет то вам надо перед if вызвать  Myorders(). Иначе фиг знает что там находится . И на всякий случай  , флаги  (переменные ) 

HaveBuyOrder = false;
HaveSellOrder = false;
HaveBuyStopOrder = false;
HaveSellStopOrder = false;
HaveBuyLimitOrder = false;
HaveSellLimitOrder = false;
HaveBuyLimitOrderEnd = false;
HaveSellLimitOrderEnd = false;
 должны быть определены на глобальном уровне .

 
ivandurak:


А вот интересно в функциях выделенных красным устанавливается флаг HaveBuyLimitOrderEnd в труе .Если нет то вам надо перед if вызвать Myorders(). Иначе фиг знает что там находится . И на всякий случай, флаги (переменные )

HaveBuyOrder = false;
HaveSellOrder = false;
HaveBuyStopOrder = false;
HaveSellStopOrder = false;
HaveBuyLimitOrder = false;
HaveSellLimitOrder = false;
HaveBuyLimitOrderEnd = false;
HaveSellLimitOrderEnd = false;
должны быть определены на глобальном уровне .

это на глабальном уровне


bool HaveBuyOrder; // флаг наличия открытых рыночных ордеров на покупку
bool HaveSellOrder; // флаг наличия открытых рыночных ордеров на продажу
bool HaveBuyStopOrder; // флаг наличия открытых отложеных ордеров на покупку
bool HaveSellStopOrder; // флаг наличия открытых отложеных ордеров на продажу
bool HaveBuyLimitOrder; // флаг наличия открытых отложеных ордеров на покупку
bool HaveSellLimitOrder; // флаг наличия открытых отложеных ордеров на продажу
bool HaveBuyLimitOrderEnd; // флаг наличия открытых отложеных ордеров на покупку
bool HaveSellLimitOrderEnd; // флаг наличия открытых отложеных ордеров на продажу

это в функции открытия ордера

ticket = OrderSend(Curr_symb,OP_BUYSTOP, Lot, PRAskS, Slippage, SL, TP, 0, Magic, 0, CLR_NONE);
if (ticket > 0) {
HaveBuyStopOrder = true;

if (OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES)) Print("функция для выставления ордера BuyStop : ", OrderOpenPrice());
}
else Print("Ошибка № ", GetLastError(), " функция для выставления ордера BuyStop",MarketInfo(Curr_symb,MODE_ASK));
return(ticket);
}

ТАК ЧТО ГОВАРЮШ ВСЕ ОСТАЛЬНОЕ РАБОТАЕТ

Причина обращения: