Полезные функции от KimIV - страница 87

 
keekkenen писал(а) >>

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

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

 

ордеров новых, конечно, не открывает ?

 
keekkenen 17.07.2009 15:48
hope писал(а) >>не тем же. Закрывается треть лота (по одному из условий - допустим цена достигла +150 пп). Вторая треть закроется, допустим, когда +300 пп от открытия и т.д..

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

...........................

"....нельзя дробить лот..." - почему? Технически давно реализовано, а благодаря Roger и KimIV на стр.85 ушёл от ошибки 131 нормализовав лоты. К тому же утверждение "...один ордер - один лот, если отрыли ордер лотом 3, то нельзя дробить лот как вы хотите - сначала 1, потом 1..." неправильное: ордер - он же лот - состоит из объёма: 0.03, 0.3, 3... и спокойно закрывается частями: 0.01, 0.1, 1...так?

 

А суть моей последней просьбы была такова: возможно ли закрыть ВСЕ позиции не прибегая к массивам, а использовав стандартные подсчёты и сплюсовав их по типу

   BuyTotalOp=0;                                // Количество Buy ордеров
   SellTotalOp=0;                               // Количество Sell ордеров
   for (int i=1; i<=OrdersTotal(); i++)         // Цикл перебора ордер
      {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         if (OrderType()==OP_BUY)
           {
            BuyTotalOp++;                         // Счётчик ордеров Buy

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

Игорь - мы зря дербаним твою ветку?

 

Закрыть все по одной паре но разношерстные, можно, например так:

б,с,с,б,б,с,б обьёмом 1,2,1,2,2,1,2 общим перекрытым обьёмом 1-2-1+2+2-1+2=3 лота

Суммируем, получаем сумлот бай 3 лота и выставляем встречный этого обьёма селл 3 лота

а затем закрываем клозе би.

*

Впрочем на вопрос: возможно ли закрыть ВСЕ позиции ?

да можно, последовательно друг за другом, скриптом это быстро, аап! и всё...

Сами скрипты или функции закрытия публиковались не раз...

Причём настроив их можно закрывать как всё разом, так и по критериям, например:

- по конкретному символу

- только баи или только селлы

- только профитные

Соответственно возможны и комбинации критериев...

 

Помогите пожалуйста закрыть ордер по любому вам удобнаму условию  а то не как неполучается

Заранее спасибо

Файлы:
help.rar  7 kb
 

Закроет всё!!!

void CloseAll() 
{ 
   for (int i=OrdersTotal()-1; i>=0; i--) 
      { 
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if (OrderType()==OP_BUY      ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),100); 
      if (OrderType()==OP_SELL     ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),100); 
      if (OrderType()==OP_BUYSTOP  ) OrderDelete(OrderTicket()); 
      if (OrderType()==OP_SELLSTOP ) OrderDelete(OrderTicket()); 
      if (OrderType()==OP_BUYLIMIT ) OrderDelete(OrderTicket()); 
      if (OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket()); 
      }  
}

Закроет лишь открытые позы.

void CloseAll2() 
{ 
   for (int i=OrdersTotal()-1; i>=0; i--) 
      { 
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if (OrderType()==OP_BUY      ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),100); 
      if (OrderType()==OP_SELL     ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),100); 
      } 
}

Пример вызова.

// Скрипт. Закрыть все ордера.mq4 -----------------------------------
#include <WinUser32.mqh> 

void start() 
   { 
   if(MessageBox("Закрыть (удалить) все ордера?",
   "Скрипт",MB_YESNO|MB_ICONQUESTION)!=IDYES) return; 
   CloseAll(); 
   } 

Скрипт закрытия полностью.

// Скрипт. Закрыть все.mq4 -----------------------------------
#property copyright "herurg@bk.ru" 
#include <WinUser32.mqh> 

void start() 
   { 
   if(MessageBox("Закрыть (удалить) все ордера?",
   "Скрипт",MB_YESNO|MB_ICONQUESTION)!=IDYES) return; 
   CloseAll(); 
   } 

void CloseAll() 
{ 
   for (int i=OrdersTotal()-1; i>=0; i--) 
      { 
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if (OrderType()==OP_BUY      ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),100); 
      if (OrderType()==OP_SELL     ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),100); 
      if (OrderType()==OP_BUYSTOP  ) OrderDelete(OrderTicket()); 
      if (OrderType()==OP_SELLSTOP ) OrderDelete(OrderTicket()); 
      if (OrderType()==OP_BUYLIMIT ) OrderDelete(OrderTicket()); 
      if (OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket()); 
      }  
}
 

Ким Вы лучший. Снимаю перед Вами шляпу.

Изучил все Ваши функции, но вот негаразд один, или гаразд. Теперь пишу когда функции, пишу из головы, а в голове то Ваши функции :-) 

Очень много функций Ваших полезныхх изучал еще на начле карьеры программиста. 

Спасибо.

 
gince >>:

Помогите пожалуйста закрыть ордер по любому вам удобнаму условию  а то не как неполучается

Заранее спасибо

Пояснение

Стратегия закрытия ордера неважна может быть любая  Помогите с помощю функций Кима сделать закрытие ордера


int start()
{
  //----
  //Print (ExpertName);
  if(Bars<20) return(0);
  if (CheckNevBar)
  if (!NevBar()) return(0);
   
  TradesInThisSymbol = ExistPositions(sy);
  if(TradesInThisSymbol > 0) return(0);
   
  if(AccountFreeMargin() < MarginMin) 
  {
  //Print("Not enough money to trade Strategy:", ExpertName);
  return(0);
  }
  sy=Symbol();
  Lots = GetSizeLot( sy, LotsWayChoice, LotsPercent, LotsDeltaDepo, LotsDepoForOne, LotsMax);
   
   
  if (CheckForOpen_Sell())
  OpenPosition(sy, OP_SELL, Lots);           // Тут  работает
  if (CheckForOpen_Buy())
  OpenPosition(sy, OP_BUY, Lots);            // Тут  работает
  
  if(CheckForClose_Buy())
  ClosePositions(sy, OP_BUY);                 // Тут  у меня что то неработает
  if(CheckForClose_Sell())  
  ClosePositions(sy, OP_SELL);               // Тут  у меня что то неработает
  
  //----
  return(0);
}

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

bool CheckForClose_Buy()
  {
  Indicat_Var();
  if (ExistPositions(sy, OP_BUY, MagicNumber))
  {
  if(VininI_fast_trend == -1)return(true);   // Тут любое условие на закрытие
  //if(BB_MACD_2 > 0)return(true);           // Тут любое условие на закрытие
  else
  return(false);
  }  
  }
//------------------------
bool CheckForClose_Sell()
  {
  Indicat_Var();
  if (NumberOfPositions(sy, OP_SELL, MagicNumber) >0)
  {
  if(VininI_fast_trend == 1)return(true);         // Тут любое условие на закрытие
  //if(BB_MACD_1 > 0)                             // Тут любое условие на закрытие
  //return(true);
  else
  return(false);  
  }
  }
 
Тут у меня что то неработает   это означаеи что незакрывает  Ошибок невыбрасывает
Причина обращения: