Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 75

 
MisterD:
Снова привет, подскажите пожалуйста где допущена ошибка в следующем коде ?
Вызываю цикл в момент "deinit"
Ордера удаляет все, кроме последнего.
Я так понимаю, что скорей всего ошибка в этой строчке >> for (int i=1; i<=OrdersTotal(); i++) <<
Однако логически вроде всё верно... что я упустил ?
Заранее спасибо!


Цикл сделай наоборот

//-------------------------------------------------------------------------------------------
for (int i=OrdersTotal()-1; i>=0; i--)
{
   if (OrderSelect(i,SELECT_BY_POS)==true)
   {
      int Type=OrderType();
      if (OrderSymbol()!= Symbol() || Type <2)continue;
      int Ticket=OrderTicket();
      bool Modify =OrderDelete(Ticket);
      if (Modify == true) Alert ("Ордер Удалён");continue;
      if (Modify != true) Alert ("Удаление ордера не удалась");
   }
} 
//-------------------------------------------------------------------------------------------
 
MisterD:
Снова привет, подскажите пожалуйста где допущена ошибка в следующем коде ?
Вызываю цикл в момент "deinit"
Ордера удаляет все, кроме последнего.
Я так понимаю, что скорей всего ошибка в этой строчке >> for (int i=1; i<=OrdersTotal(); i++) <<
Однако логически вроде всё верно... что я упустил ?
Заранее спасибо!

//-------------------------------------------------------------------------------------------
for (int i=1; i<=OrdersTotal(); i++)
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
int Type=OrderType();
if (OrderSymbol()!= Symbol() || Type <2)continue;
int Ticket=OrderTicket();
bool Modify =OrderDelete(Ticket);
if (Modify == true) Alert ("Ордер Удалён");continue;
if (Modify != true) Alert ("Удаление ордера не удалась");
continue;
}
}
//-------------------------------------------------------------------------------------------


Попробуйте так:

for(int i=OrdersTotal()-1;i>=0;i--) {
  if(OrderSelect(i,......................
 

добрый день. нужна небольшая помощь.имеется функция она закрывает один самый жирный по профиту лот.

нужно это дело зациклить

и подскажите как этим пользоваться пожалуста например если акаунт эквити больше 5 пунктов то должна сработать функция

void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  } 

}

 
sannin:

добрый день. нужна небольшая помощь.имеется функция она закрывает один самый жирный по профиту лот.

нужно это дело зациклить

и подскажите как этим пользоваться пожалуста например если акаунт эквити больше 5 пунктов то должна сработать функция

5 пунктов (для 4-рёх знаков) - на реальном рынке при количестве ордеров большем чем 3-4, легко превратятся (по результатам удаления) в минус. :)))

P.S. Как я понимаю, вам нужен готовый код, а алгоритм решения такой задачи вам бесполезен?!

 
TarasBY:
5 пунктов (для 4-рёх знаков) - на реальном рынке при количестве ордеров большем чем 3-4, легко превратятся (по результатам удаления) в минус. :)))


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

я вот с функциями еще не работал в таком виде .. поэтому вот прошу поддержки

 
Добрый день, возникла проблема с разработкой советника, не закрывает ордера, хотя в условиях прописано закрытие по индикатору, прошу объяснить в чём дело, заранее спасибо
Файлы:
 
sannin:


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

я вот с функциями еще не работал в таком виде .. поэтому вот прошу поддержки

Для начала подсчитываете линию БУ совокупной позиции по инструменту (это для определения условий на закрытие ордеров по достижению профитности в пп.):

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Определение Уровня БезУбытка по символу                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_BreakEven (string fs_Symbol,     // Symbol
                       double fd_DeltaLots,  // разность объемов ордеров Buy и Sell
                       double fd_Profit)     // текущий профит по открытым ордера
{
    if (fd_DeltaLots == 0.) return (0.);
    double ld_BU = 0., ld_tickvalue = MarketInfo (fs_Symbol, MODE_TICKVALUE);   // цена одного пункта
//----
    //---- Уровень общего безубытка для открытых ордеров
    if (fd_DeltaLots > 0.) ld_BU = MarketInfo (fs_Symbol, MODE_BID) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
    else if (fd_DeltaLots < 0.) ld_BU = MarketInfo (fs_Symbol, MODE_ASK) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
//----
    return (ld_BU);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Затем высчитываете разницу м\у текущей ценой и линией БезУбытка, если "разность устраивает", прступаем к процедуре удаления ордеров. Для начала функция поиска Тикета самого профитного\убыточного ордера:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Получаем Тикет самого прибыльного/убыточного ордера                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_TicketWithControlProfit (string fs_Symbol = "",  // Инструмент
                                  int fi_Magic = -1,      // Magic
                                  int fi_Type = -1,       // OrderType
                                  int fi_TypeProfit = 0)  // Профитность ордера среди остальных ордеров:
                                                          // >= 0 -  с самым большим профитом;
                                                          // < 0 - самый убыточный
{
    double ld_Profit = 0., ld_curProfit;
    int    li_Total = OrdersTotal(), li_Ticket = -1;
//----
    if (fs_Symbol == "") fs_Symbol = Symbol();
    if (fi_TypeProfit < 0) ld_Profit = 10000000000.;
    for (int i = li_Total - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != fs_Symbol) continue;
        if (fi_Magic > -1) if (OrderMagicNumber() != fi_Magic) continue;
        if (fi_Type > -1) if (OrderType() != fi_Type) continue;
        if (fi_Type > 1) continue;
        ld_curProfit = OrderProfit() + OrderSwap() + OrderCommission();
        if (fi_TypeProfit >= 0) {if (ld_Profit <= ld_curProfit) continue;}
        else if (ld_Profit >= ld_curProfit) continue;
        ld_Profit = ld_curProfit;
        li_Ticket = OrderTicket();
    }
//----
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Удаление можно организовать в обоих направлениях. Удаляем:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция закрытия "своих" ордеров по признаку                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fClose_AllOrdersByProfit (string fs_Symbol = "",  // Инструмент
                              int fi_Magic = -1,      // Magic
                              int fi_Type = -1,       // OrderType
                              int fi_TypeProfit = 0)  // Направление закрытия ордеро по профитности:
                                                      // >= 0 - начиная от самого большого профита;
                                                      // < 0 - начиная от самого маленького профита;
{
    int li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit),
        li_cnt = 0;
//----
    while (li_Ticket > 0)
    {
         //---- Здесь вставите свою процедуру закрытия 
         //---- что-то типа:
         //ClosePosByTicket (li_Ticket);
         li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit);
         li_cnt++;
    }
//----
    return (li_cnt);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Собрать дальше нужный агрегат не составляет большого труда: придётся осилить или идти в джобу... :)

 
хочу присвоить переменной значение цены.

a=(NormalizeDouble(OrderOpenPrice(),5));


но почему-то цена рисуется четырех значная по евре 1,3360

подскажите ошибку?
 
lottamer:
хочу присвоить переменной значение цены.



но почему-то цена рисуется четырех значная по евре 1,3360

подскажите ошибку?

Может ДЦ четырёхзначный? Или выводите цену без DoubleToStr(YourPrice,5)
 
Sepulca:

Может ДЦ четырёхзначный? Или выводите цену без DoubleToStr(YourPrice,5)


ДЦ пятизначный...

что значит БЕЗ DoubleToStr(YourPrice,5) ? у меня DoubleToStr(YourPrice,5) нигде не было

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