Помогите, пожалуйста, как использовать функции от КimIV! - страница 2

 
borilunad:


Большое спасибо за доброе пожелание!

Позвольте объяснить, почему нужно закрыть именно одну позу с наибольшим профитом и не с ТейкПрофитом! Не Вам мне объяснять, что трал более гибок, чем ТП. И нужно закрыть только одну позу, чтобы не нарушать стратегию советника закрывать по тралу и, если сформируется обратный тренд, снова войти в рынок. Может, указать в условии, что нужно закрыть только одну максимальную позицию... Но пока не нашёл, как сравнивать текущий Профит каждой позиции, чтобы выбрать наибольшую, достигшую определённый тестированием процент от текущего на этот момент баланса. Даже закрывая все позиции разом тест показывант лучше результат на истории.

К сожалению, не имею опыта в базовых языках, баловался только дизайном в Директоре на Линго. МQL более строгий, не терпит фривольности. Может, всё-таки есть возможность сравнивать Профиты позиций или нет. Пока находил общий Профит одной пары или портфельный. Но я пока сконцентрируюсь на одной EURUSD.

Большое спасибо за помощь и надеюсь на подсказку, как "Закрыть одну конкретную позицию, достигшую заданную процентом от баланса прибыль". Если "можно", почему бы не "сейчас"? Всего Вам доброго!

Вы не четко ставите задачу...

1) Сколько одновременно может быть у вас открыто позиций? Одна? Много?

а) если одна, то обсуждаемая ф-ция Игоря выполняет свою задачу на 100%

б) если позиций в рынке более одной, то значит должно быть дополнительное условие, какую конкретно позицию (одну) достигшую заданного процента вы хотите закрыть....

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

Как так...

 
lasso:

Вы не четко ставите задачу...

1) Сколько одновременно может быть у вас открыто позиций? Одна? Много?

а) если одна, то обсуждаемая ф-ция Игоря выполняет свою задачу на 100%

б) если позиций в рынке более одной, то значит должно быть дополнительное условие, какую конкретно позицию (одну) достигшую заданного процента вы хотите закрыть....

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

Как так...

Ув. lasso! Ставлю условие чётко. Первая позиция, достигнувшая определённый процент Профита от текущего на этот момент баланса, должна быть закрыта. Потом следущая, когда достигнет этих же параметров от уже увеличившегося баланса. Буду рад, если поможете, где и как узнать, почитать и т.д.

А позиций может быть от 2 до 5, если тренд снова и снова продолжается. Но не всегда первая может иметь больший Профит, т.к. лоты меняются также в зависимости от баланса. И не исключено и хеджирование, если внезапно цена развернулась. Спасибо Вам за внимание!

 

Поскольку это условие невозможно выполнить, буду закрывать эту позицию вручную. Благодарю откликнувшихся на мою просьбу DhP и lasso! И на этом закрываю тему. Всем Удачи!

 
borilunad:

Поскольку это условие невозможно выполнить, буду закрывать эту позицию вручную. Благодарю откликнувшихся на мою просьбу DhP и lasso! И на этом закрываю тему. Всем Удачи!


Реализовать можно конечно, но вот нужно ли...
 
borilunad:

Поскольку это условие невозможно выполнить, буду закрывать эту позицию вручную. Благодарю откликнувшихся на мою просьбу DhP и lasso! И на этом закрываю тему. Всем Удачи!

Как это не возможно? Эти слова у Вас не правильные...

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

Так должно работать. Попробуйте.

Немного переделал Кимовские ф-ции под булевы.

extern double Percent = 10;
double pr; 
 //----

void start()
  {
  int ord_cnt;
  while (true)
     {  
     pr = AccountBalance()*Percent/100;
     
     if (!ClosePosBySizeProfitInCurrency_1Only())  //Закрываем по одной позиции с учётом предыдущих закрытий, используйте с параметрами, со свои маджиком
                                    break; 
     }
...........
............
  } 
  
bool ClosePosBySizeProfitInCurrency_1Only(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  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 (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>pr) 
              if (ClosePosBySelect()) return(true);  // переделано
          }
        }
      }
    }
  }
} 

bool ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        return(true);                                  //переделано
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
              ErrorDescription(err),", try ",it);
        Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
        Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
              "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
} 
 
Vinin:

Реализовать можно конечно, но вот нужно ли...


Доброе утро! Нужно, поэтому пробую с OrderProfit и AccountFreeMargin на разных участках и даёт лучше результаты, чем без них, но даёт ошибку "неправильный тикет".

//-----
  int Orders = OrdersTotal();
  for (int i=0; i<Orders; i++)
  {
    if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if((OrderType() == OP_BUY || OrderType() == OP_SELL)
    && OrderProfit()>=AccountFreeMargin()*Percent/100.0) CLOSE();
    if(OrderSymbol() != Symbol()) continue;
    {
//и т.д.

2011.06.17 09:28:46 2011.06.15 09:45 LiveMA2 EURUSD,M15: SELL CLOSE ERROR:4105
2011.06.17 09:28:46 2011.06.15 09:45 LiveMA2 EURUSD,M15: OrderClose error 4108
2011.06.17 09:28:46 2011.06.15 09:45 LiveMA2 EURUSD,M15: unknown ticket 17 for OrderClose function

 

lasso, доброе утро! сейчас попробую Ваше. Спасибо!

---------------------------

Попробовал. Компиляция даёт ошибки:

'ClosePosBySizeProfitInCurrency_1Only' - too long variable name

Вызов bool сделал там же и так же как вызов функции. Может, нужно какое-нибудь #define или #include?

 
borilunad:


Доброе утро! Нужно.



Тогда нужно начать с сохранения эквити при открытии позиции. Чтобы потом было с чем сравнивать

Или ввести функцию расчета баланса, который был при открытии позиции

 
borilunad:

lasso, доброе утро! сейчас попробую Ваше. Спасибо!

---------------------------

Попробовал. Компиляция даёт ошибки:

'' - too long variable name

Вызов bool сделал там же и так же как вызов функции. Может, нужно какое-нибудь #define или #include?

Давайте изменим имя ф-ции с ClosePosBySizeProfitInCurrency_1Only на ClosePosBySizeProfit_1Only
 
lasso:
Давайте изменим имя ф-ции с ClosePosBySizeProfitInCurrency_1Only на ClosePosBySizeProfit_1Only


Изменил, и сейчас даёт ошибки другая, ClosePosBySelect:

'NumberOfTry' - variable not defined

'clCloseBuy' - variable not defined

'clCloseSell' - variable not defined

Где я их должен defined?

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